LDMX Software
HcalTrigPrimDigiProducer.cxx
1#include "Hcal/HcalTrigPrimDigiProducer.h"
2
4#include "Hcal/HcalTriggerGeometry.h"
5#include "Recon/Event/CaloTrigPrim.h"
7#include "Recon/Event/HgcrocTrigDigi.h"
9
10namespace hcal {
12 framework::Process& process)
13 : Producer(name, process) {}
14
16 digiCollName_ = ps.getParameter<std::string>("digiCollName");
17 digiPassName_ = ps.getParameter<std::string>("digiPassName");
19 ps.getParameter<std::string>("condObjName", "HcalTrigPrimDigiConditions");
20}
21
23 const HcalTriggerGeometry& geom = getCondition<HcalTriggerGeometry>(
24 HcalTriggerGeometry::CONDITIONS_OBJECT_NAME);
25
26 const ldmx::HgcrocDigiCollection& hcalDigis =
28
29 // get the calibration object
30 const conditions::IntegerTableCondition& conditions =
31 getCondition<conditions::IntegerTableCondition>(condObjName_);
32
33 // construct the calculator...
34 ldmx::HgcrocTriggerCalculations calc(conditions);
35
36 // Loop over the digis
37 for (unsigned int ix = 0; ix < hcalDigis.getNumDigis(); ix++) {
38 const ldmx::HgcrocDigiCollection::HgcrocDigi pdigi = hcalDigis.getDigi(ix);
40
41 if (!tid.null()) {
42 int tot = 0;
43 if (pdigi.soi().isTOTComplete()) tot = pdigi.soi().tot();
44 calc.addDigi(pdigi.id(), tid.raw(), pdigi.soi().adc_t(), tot);
45 }
46 }
47
48 // Now, we compress the digis
49 calc.compressDigis(4);
50 const float hgc_compress_factor = 2;
51
52 // const std::map<unsigned int, uint8_t> results;
53 const std::map<unsigned int, uint8_t>& results = calc.compressedEnergies();
54 ldmx::HgcrocTrigDigiCollection tdigis;
55 // ldmx::CaloTrigPrimCollection tdigisUC; // sums without any compression
56 // applied
57
58 for (auto result : results) {
59 if (result.second > 0) {
60 tdigis.push_back(ldmx::HgcrocTrigDigi(result.first, result.second));
61 // tdigisUC.push_back( ldmx::CaloTrigPrim(result.first,
62 // hgc_compress_factor*ldmx::HgcrocTrigDigi::compressed2Linear(result.second))
63 // );
64 }
65 }
66
67 // build STQs from the quads (w/ compressed energies)
68 stq_tps.clear();
69 for (auto result : results) {
70 if (result.second > 0) {
71 const ldmx::HcalTriggerID quad_id(result.first);
72 const std::vector<ldmx::HcalDigiID> precisions_ids =
73 geom.contentsOfQuad(quad_id);
74 if (precisions_ids.size() == 0) {
75 std::cout << "Failing HcalTriggerID(" << quad_id.section() << ','
76 << quad_id.layer() << ',' << quad_id.superstrip() << ','
77 << quad_id.end() << ')' << std::endl;
78 EXCEPTION_RAISE("TrigToPrecIDMismatch",
79 "Attempted to lookup a nonexistent HcalDigiID from an "
80 "HcalTriggerID");
81 }
82 const ldmx::HcalDigiID prec_id(precisions_ids.front().raw());
83 const ldmx::HcalTriggerID stq_id = geom.belongsToSTQ(prec_id);
84 auto ptr = stq_tps.find(stq_id.raw());
85 int linear_charge =
86 hgc_compress_factor *
88 if (ptr != stq_tps.end()) {
89 ptr->second += linear_charge;
90 } else {
91 stq_tps[stq_id.raw()] = linear_charge;
92 }
93 }
94 }
95
96 ldmx::CaloTrigPrimCollection stq_digis;
97 for (auto result : stq_tps) {
98 if (result.second > 0) {
99 stq_digis.push_back(ldmx::CaloTrigPrim(result.first, result.second));
100 }
101 }
102
103 event.add(getName(), tdigis);
104 // event.add(getName()+"Uncompress", tdigisUC);
105 event.add("hcalTrigPrimDigiSTQs", stq_digis);
106}
107} // namespace hcal
108DECLARE_PRODUCER_NS(hcal, HcalTrigPrimDigiProducer);
#define DECLARE_PRODUCER_NS(NS, CLASS)
Macro which allows the framework to construct a producer given its name during configuration.
Class that translates HCal ID into positions of strip hits.
Class that represents a digitized hit in a calorimeter cell readout by an HGCROC.
Class that contains the Hgcroc Trigger algorithms, used for both Ecal and Hcal.
std::string getName() const
Get the processor name.
Implements an event buffer system for storing event data.
Definition Event.h:41
Class which represents the process under execution.
Definition Process.h:36
Class encapsulating parameters for configuring a processor.
Definition Parameters.h:27
T getParameter(const std::string &name) const
Retrieve the parameter of the given name.
Definition Parameters.h:89
std::map< unsigned int, unsigned int > stq_tps
map of digis to the super trigger primitives
void produce(framework::Event &event) override
Produce HcalTrigPrimDigis and put them into the event bus using the HcalDigis as input.
std::string digiCollName_
Digi Collection Name to use as input.
std::string digiPassName_
Digi Pass Name to use as input.
void configure(framework::config::Parameters &) override
Grabs configure parameters from the python config file.
HcalTrigPrimDigiProducer(const std::string &name, framework::Process &process)
Constructor.
std::string condObjName_
Conditions object for the calibration information.
defines the relationship between HCal strips and CMB quad trigger primitives and provides geometry in...
ldmx::HcalTriggerID belongsToQuad(ldmx::HcalDigiID precisionCell) const
Returns which trigger cell this precision cell is associated with, or a null id if there is no such a...
std::vector< ldmx::HcalDigiID > contentsOfQuad(ldmx::HcalTriggerID triggerCell) const
Returns the set of precision (full-granularity/DAQ) cells which are associated with the given trigger...
Contains the trigger output for generic calo objects.
bool null() const
Definition DetectorID.h:60
RawValue raw() const
Definition DetectorID.h:68
Extension of HcalAbstractID providing access to HCal digi information.
Definition HcalDigiID.h:13
Extension of DetectorID providing access to HCal trigger cell.
int superstrip() const
Get the value of the 'superstrip' field from the ID.
int end() const
Get the value of the 'end' field from the ID.
int layer() const
Get the value of the layer field from the ID.
One DIGI signal coming from the HGC ROC.
unsigned int id() const
Get the ID for this DIGI.
HgcrocDigiCollection::Sample soi() const
Get the sample of interest from this DIGI.
int adc_t() const
Get the ADC measurement from this sample.
int tot() const
Get the TOT measurement from this sample.
bool isTOTComplete() const
Get the second flag from the sample checking if TOT is complete at this sample.
Represents a collection of the digi hits readout by an HGCROC.
const HgcrocDigi getDigi(unsigned int digiIndex) const
Get samples for the input digi index.
unsigned int getNumDigis() const
Get total number of digis.
Contains the trigger output for a single trigger hgcroc channel.
static uint32_t compressed2Linear(uint8_t comp)
Static conversion from compressed -> linear 18b.
Contains the core logic for the Hgcroc trigger calculations.
void addDigi(unsigned int id, unsigned int tid, int adc, int tot)
Determine the linear charge for the given channel, using the calibration information,...
const std::map< unsigned int, uint8_t > & compressedEnergies() const
Access the map of trigger ids to compressed energies.
void compressDigis(int cells_per_trig)
Convert the linear charges to compressed charges, with a division depending on the number of cells su...