9 #include <ecl/modules/eclBhabhaTCollector/ECLBhabhaTCollectorModule.h>
10 #include <framework/dataobjects/EventMetaData.h>
11 #include <framework/gearbox/Const.h>
12 #include <ecl/dbobjects/ECLCrystalCalib.h>
13 #include <ecl/dbobjects/ECLReferenceCrystalPerCrateCalib.h>
14 #include <ecl/dataobjects/ECLDigit.h>
15 #include <ecl/dataobjects/ECLCalDigit.h>
16 #include <mdst/dataobjects/ECLCluster.h>
17 #include <mdst/dataobjects/Track.h>
18 #include <mdst/dataobjects/HitPatternCDC.h>
19 #include <tracking/dataobjects/RecoTrack.h>
20 #include <ecl/digitization/EclConfiguration.h>
21 #include <analysis/utility/PCmsLabTransform.h>
22 #include <analysis/ClusterUtility/ClusterUtils.h>
23 #include <boost/optional.hpp>
24 #include <ecl/geometry/ECLGeometryPar.h>
44 m_ElectronicsDB("ECLCrystalElectronics"),
45 m_ElectronicsTimeDB("ECLCrystalElectronicsTime"),
46 m_FlightTimeDB("ECLCrystalFlightTime"),
47 m_PreviousCrystalTimeDB("ECLCrystalTimeOffset"),
48 m_CrateTimeDB("ECLCrateTimeOffset"),
52 setDescription(
"This module generates sum of all event times per crystal");
54 addParam(
"timeAbsMax", m_timeAbsMax,
55 "Events with fabs(getTimeFit) > m_timeAbsMax "
56 "are excluded", (
short)80);
58 addParam(
"minCrystal", m_minCrystal,
59 "First CellId to handle.", 1);
60 addParam(
"maxCrystal", m_maxCrystal,
61 "Last CellId to handle.", 8736);
63 addParam(
"saveTree", m_saveTree,
64 "If true, TTree 'tree' with more detailed event info is saved in "
65 "the output file specified by HistoManager",
68 addParam(
"looseTrkZ0", m_looseTrkZ0,
"max Z0 for loose tracks (cm)", 10.);
69 addParam(
"tightTrkZ0", m_tightTrkZ0,
"max Z0 for tight tracks (cm)", 2.);
70 addParam(
"looseTrkD0", m_looseTrkD0,
"max D0 for loose tracks (cm)", 2.);
71 addParam(
"tightTrkD0", m_tightTrkD0,
"max D0 for tight tracks (cm)", 0.5);
72 addParam(
"skipTrgSel", skipTrgSel,
"boolean to skip the trigger skim selection",
false);
74 addParam(
"hadronEventT0_TO_bhabhaEventT0_correction", m_hadronEventT0_TO_bhabhaEventT0_correction,
75 "CDC bhabha t0 bias correction (ns)", 0.);
78 setPropertyFlags(c_ParallelProcessingCertified);
90 m_dbgTree_electrons =
new TTree(
"tree_electrons",
"Debug data for bhabha time calibration - one entry per electron");
91 m_dbgTree_electrons->Branch(
"EventNum", &m_tree_evtNum)->SetTitle(
"Event number");
92 m_dbgTree_electrons->Branch(
"CrystalCellID", &m_tree_cid)->SetTitle(
"Cell ID, 1..8736");
93 m_dbgTree_electrons->Branch(
"ADCamplitude", &m_tree_amp)->SetTitle(
"Amplitude, ADC units");
94 m_dbgTree_electrons->Branch(
"maxEcrystalEnergy", &m_tree_en)->SetTitle(
"Max Energy Crystal Energy, GeV");
95 m_dbgTree_electrons->Branch(
"maxEcrystalEnergyDIVclusterE",
96 &m_tree_E1Etot)->SetTitle(
"Max Energy Crystal Fraction Energy of Cluster");
97 m_dbgTree_electrons->Branch(
"E1divE2crystal",
98 &m_tree_E1E2)->SetTitle(
"Max Energy Crystal DIV second max energy crystal in cluster");
99 m_dbgTree_electrons->Branch(
"E1crystal_DIV_p", &m_tree_E1p)->SetTitle(
"Max Energy Crystal in cluster DIV track p");
100 m_dbgTree_electrons->Branch(
"timetsPreviousTimeCalibs",
101 &m_tree_timetsPreviousTimeCalibs)->SetTitle(
"Time t_psi after application of previous Ts, ns");
102 m_dbgTree_electrons->Branch(
"E_DIV_p", &m_E_DIV_p)->SetTitle(
"E DIV p");
103 m_dbgTree_electrons->Branch(
"timeF", &m_tree_timeF)->SetTitle(
"Time F, ns");
104 m_dbgTree_electrons->Branch(
"time_t_psi", &m_tree_time)->SetTitle(
"Time t_psi for Ts, ns");
105 m_dbgTree_electrons->Branch(
"quality", &m_tree_quality)->SetTitle(
"ECL FPGA fit quality, see Confluence article");
106 m_dbgTree_electrons->Branch(
"t0", &m_tree_t0)->SetTitle(
"T0, ns");
107 m_dbgTree_electrons->Branch(
"t0_unc", &m_tree_t0_unc)->SetTitle(
"T0 uncertainty, ns");
108 m_dbgTree_electrons->Branch(
"CrateID", &m_crystalCrate)->SetTitle(
"Crate id for crystal");
109 m_dbgTree_electrons->Branch(
"runNum", &m_runNum)->SetTitle(
"Run number");
111 m_dbgTree_electrons->SetAutoSave(10);
115 m_dbgTree_tracks =
new TTree(
"tree_tracks",
"Debug data for bhabha time calibration - one entry per track");
116 m_dbgTree_tracks->Branch(
"d0", &m_tree_d0)->SetTitle(
"d0, cm");
117 m_dbgTree_tracks->Branch(
"z0", &m_tree_z0)->SetTitle(
"z0, cm");
118 m_dbgTree_tracks->Branch(
"p", &m_tree_p)->SetTitle(
"track momentum, GeV");
119 m_dbgTree_tracks->Branch(
"charge", &m_charge)->SetTitle(
"track electric charge");
120 m_dbgTree_tracks->Branch(
"Num_CDC_hits", &m_tree_nCDChits)->SetTitle(
"Num CDC hits");
122 m_dbgTree_tracks->SetAutoSave(10);
125 m_dbgTree_crystals =
new TTree(
"tree_crystals",
126 "Debug data for bhabha time calibration - one entry per electron - one entry per crystal");
127 m_dbgTree_crystals->Branch(
"clustCrysE_DIV_maxEcrys",
128 &m_tree_clustCrysE_DIV_maxEcrys)->SetTitle(
"E of crystal i from cluster / E of max E crystal");
129 m_dbgTree_crystals->Branch(
"Crystal_E", &m_tree_clustCrysE) ->SetTitle(
"E of crystal i from cluster");
130 m_dbgTree_crystals->Branch(
"time_t_psi", &m_tree_time)->SetTitle(
"Time for Ts, ns");
131 m_dbgTree_crystals->Branch(
"Crystal_cell_ID", &m_tree_cid)->SetTitle(
"Cell ID, 1..8736");
132 m_dbgTree_crystals->Branch(
"quality", &m_tree_quality)->SetTitle(
"ECL FPGA fit quality, see Confluence article");
134 m_dbgTree_crystals->SetAutoSave(10);
138 m_dbgTree_event =
new TTree(
"tree_event",
"Debug data for bhabha time calibration - one entry per event");
139 m_dbgTree_event->Branch(
"massInvTracks", &m_massInvTracks)->SetTitle(
"Invariant mass of the two tracks");
141 m_dbgTree_event->SetAutoSave(10);
144 m_dbgTree_evt_allCuts =
new TTree(
"tree_evt_allCuts",
145 "Debug data for bhabha time calibration - one entry per event after all the cuts");
146 m_dbgTree_evt_allCuts->Branch(
"EclustPlus", &m_tree_enPlus)->SetTitle(
"Energy of cluster with +ve charge, GeV");
147 m_dbgTree_evt_allCuts->Branch(
"EclustNeg", &m_tree_enNeg)->SetTitle(
"Energy of cluster with -ve charge, GeV");
148 m_dbgTree_evt_allCuts->Branch(
"clustTimePos", &m_tree_tClustPos)->SetTitle(
"Cluster time of cluster with +ve charge, GeV");
149 m_dbgTree_evt_allCuts->Branch(
"clustTimeNeg", &m_tree_tClustNeg)->SetTitle(
"Cluster time of cluster with -ve charge, GeV");
150 m_dbgTree_evt_allCuts->Branch(
"maxEcrysTimePosClust",
151 &m_tree_maxEcrystPosClust)->SetTitle(
"Time of maximum energy crystal in cluster with +ve charge, GeV");
152 m_dbgTree_evt_allCuts->Branch(
"maxEcrysTimeNegClust",
153 &m_tree_maxEcrystNegClust)->SetTitle(
"Time of maximum energy crystal in cluster with -ve charge, GeV");
154 m_dbgTree_evt_allCuts->Branch(
"t0", &m_tree_t0)->SetTitle(
"T0, ns");
155 m_dbgTree_evt_allCuts->Branch(
"t0_ECL_closestCDC", &m_tree_t0_ECLclosestCDC)->SetTitle(
"T0 ECL closest to CDC t0, ns");
156 m_dbgTree_evt_allCuts->Branch(
"t0_ECL_minChi2", &m_tree_t0_ECL_minChi2)->SetTitle(
"T0 ECL with smallest chi squared, ns");
158 m_dbgTree_evt_allCuts->SetAutoSave(10);
162 m_dbgTree_crys_allCuts =
new TTree(
"m_dbgTree_crys_allCuts",
163 "Debug data for bhabha time calibration - one entry per crystal per cluster entry after all cuts");
165 m_dbgTree_crys_allCuts->Branch(
"runNum", &m_runNum)->SetTitle(
"Run number");
166 m_dbgTree_crys_allCuts->Branch(
"EventNum", &m_tree_evtNum)->SetTitle(
"Event number");
167 m_dbgTree_crys_allCuts->Branch(
"m_tree_ECLCalDigitTime",
168 &m_tree_ECLCalDigitTime)
169 ->SetTitle(
"Time of a crystal within the cluster after application of previous calibrations except t0, ns");
170 m_dbgTree_crys_allCuts->Branch(
"m_tree_ECLCalDigitE", &m_tree_ECLCalDigitE)->SetTitle(
"Energy of crystal, GeV");
171 m_dbgTree_crys_allCuts->Branch(
"m_tree_ECLDigitAmplitude",
172 &m_tree_ECLDigitAmplitude)->SetTitle(
"Amplitude of crystal signal pulse");
173 m_dbgTree_crys_allCuts->Branch(
"timetsPreviousTimeCalibs",
174 &m_tree_timetsPreviousTimeCalibs)->SetTitle(
"Time t_psi after application of previous Ts, ns");
175 m_dbgTree_crys_allCuts->Branch(
"t0", &m_tree_t0)->SetTitle(
"T0, ns");
176 m_dbgTree_crys_allCuts->Branch(
"t0_ECL_closestCDC", &m_tree_t0_ECLclosestCDC)->SetTitle(
"T0 ECL closest to CDC t0, ns");
177 m_dbgTree_crys_allCuts->Branch(
"t0_ECL_minChi2", &m_tree_t0_ECL_minChi2)->SetTitle(
"T0 ECL with smallest chi squared, ns");
178 m_dbgTree_crys_allCuts->Branch(
"CrystalCellID", &m_tree_cid)->SetTitle(
"Cell ID, 1..8736");
180 m_dbgTree_crys_allCuts->SetAutoSave(10);
188 m_dbgTree_allCuts =
new TTree(
"tree_allCuts",
189 "Debug data for bhabha time calibration - one entry per max E crystal entry after cuts");
191 m_dbgTree_allCuts->Branch(
"time_t_psi", &m_tree_time)->SetTitle(
"Time t_psi for Ts, ns");
192 m_dbgTree_allCuts->Branch(
"crateID", &m_crystalCrate)->SetTitle(
"Crate id for crystal");
193 m_dbgTree_allCuts->Branch(
"EventNum", &m_tree_evtNum)->SetTitle(
"Event number");
194 m_dbgTree_allCuts->Branch(
"runNum", &m_runNum)->SetTitle(
"Run number");
195 m_dbgTree_allCuts->Branch(
"CrystalCellID", &m_tree_cid)->SetTitle(
"Cell ID, 1..8736");
196 m_dbgTree_allCuts->Branch(
"maxEcrystalEnergy", &m_tree_en)->SetTitle(
"Max Energy Crystal Energy, GeV");
197 m_dbgTree_allCuts->Branch(
"maxEcrystalEnergyDIVclusterE",
198 &m_tree_E1Etot)->SetTitle(
"Max Energy Crystal Fraction Energy of Cluster");
199 m_dbgTree_allCuts->Branch(
"E1divE2crystal",
200 &m_tree_E1E2)->SetTitle(
"Max Energy Crystal DIV second max energy crystal in cluster");
201 m_dbgTree_allCuts->Branch(
"E1crystalDIVp", &m_tree_E1p)->SetTitle(
"Max Energy Crystal in cluster DIV track p");
202 m_dbgTree_allCuts->Branch(
"timetsPreviousTimeCalibs",
203 &m_tree_timetsPreviousTimeCalibs)->SetTitle(
"Time t_psi after application of previous Ts, ns");
204 m_dbgTree_allCuts->Branch(
"massInvTracks", &m_massInvTracks)->SetTitle(
"Invariant mass of the two tracks");
205 m_dbgTree_allCuts->Branch(
"t0", &m_tree_t0)->SetTitle(
"T0, ns");
206 m_dbgTree_allCuts->Branch(
"t0_ECL_closestCDC", &m_tree_t0_ECLclosestCDC)->SetTitle(
"T0 ECL closest to CDC t0, ns");
207 m_dbgTree_allCuts->Branch(
"t0_ECL_minChi2", &m_tree_t0_ECL_minChi2)->SetTitle(
"T0 ECL with smallest chi squared, ns");
209 m_dbgTree_allCuts->Branch(
"clusterTime", &m_tree_tClust)->SetTitle(
"Cluster time of cluster with +ve charge, GeV");
211 m_dbgTree_allCuts->SetAutoSave(10);
218 B2INFO(
"ECLBhabhaTCollector: Experiment = " << m_EventMetaData->getExperiment() <<
219 " run = " << m_EventMetaData->getRun());
223 int nbins = m_timeAbsMax * 8;
224 int max_t = m_timeAbsMax;
225 int min_t = -m_timeAbsMax;
228 auto TimevsCrysPrevCrateCalibPrevCrystCalib =
new TH2F(
"TimevsCrysPrevCrateCalibPrevCrystCalib",
229 "Time t psi - ts - tcrate (previous calibs) vs crystal cell ID;crystal cell ID;Time t_psi with previous calib (ns)",
230 8736, 1, 8736 + 1, nbins, min_t, max_t);
231 registerObject<TH2F>(
"TimevsCrysPrevCrateCalibPrevCrystCalib", TimevsCrysPrevCrateCalibPrevCrystCalib);
233 auto TimevsCratePrevCrateCalibPrevCrystCalib =
new TH2F(
"TimevsCratePrevCrateCalibPrevCrystCalib",
234 "Time t psi - ts - tcrate (previous calibs) vs crate ID;crate ID;Time t_psi previous calib (ns)",
235 52, 1, 52 + 1, nbins, min_t, max_t);
236 registerObject<TH2F>(
"TimevsCratePrevCrateCalibPrevCrystCalib", TimevsCratePrevCrateCalibPrevCrystCalib);
238 auto TimevsCrysNoCalibrations =
new TH2F(
"TimevsCrysNoCalibrations",
239 "Time tpsi vs crystal cell ID;crystal cell ID;Time t_psi (ns)", 8736, 1, 8736 + 1, nbins, min_t, max_t);
240 registerObject<TH2F>(
"TimevsCrysNoCalibrations", TimevsCrysNoCalibrations);
242 auto TimevsCrateNoCalibrations =
new TH2F(
"TimevsCrateNoCalibrations",
243 "Time tpsi vs crate ID;crate ID;Time t_psi (ns)", 52, 1, 52 + 1, nbins, min_t, max_t);
244 registerObject<TH2F>(
"TimevsCrateNoCalibrations", TimevsCrateNoCalibrations);
246 auto TimevsCrysPrevCrateCalibNoCrystCalib =
new TH2F(
"TimevsCrysPrevCrateCalibNoCrystCalib",
247 "Time tpsi - tcrate (previous calib) vs crystal cell ID;crystal cell ID;Time t_psi including previous crate calib (ns)",
248 8736, 1, 8736 + 1, nbins, min_t, max_t);
249 registerObject<TH2F>(
"TimevsCrysPrevCrateCalibNoCrystCalib", TimevsCrysPrevCrateCalibNoCrystCalib);
251 auto TimevsCrateNoCrateCalibPrevCrystCalib =
new TH2F(
"TimevsCrateNoCrateCalibPrevCrystCalib",
252 "Time tpsi - ts (previous calib) vs crate ID;crate ID;Time t_psi including previous crystal calib (ns)",
253 52, 1, 52 + 1, nbins, min_t, max_t);
254 registerObject<TH2F>(
"TimevsCrateNoCrateCalibPrevCrystCalib", TimevsCrateNoCrateCalibPrevCrystCalib);
257 auto TsDatabase =
new TH1F(
"TsDatabase",
";cell id;Ts from database", 8736, 1, 8736 + 1);
258 registerObject<TH1F>(
"TsDatabase", TsDatabase);
260 auto TsDatabaseUnc =
new TH1F(
"TsDatabaseUnc",
";cell id;Ts uncertainty from database", 8736, 1, 8736 + 1);
261 registerObject<TH1F>(
"TsDatabaseUnc", TsDatabaseUnc);
263 auto TcrateDatabase =
new TH1F(
"TcrateDatabase",
";cell id;Tcrate from database", 8736, 1, 8736 + 1);
264 registerObject<TH1F>(
"TcrateDatabase", TcrateDatabase);
266 auto TcrateUncDatabase =
new TH1F(
"TcrateUncDatabase",
";cell id;Tcrate uncertainty from database", 8736, 1, 8736 + 1);
267 registerObject<TH1F>(
"TcrateUncDatabase", TcrateUncDatabase);
270 auto tcrateDatabase_ns =
new TH1F(
"tcrateDatabase_ns",
";crate id;tcrate derived from database", 52, 1, 52 + 1);
271 registerObject<TH1F>(
"tcrateDatabase_ns", tcrateDatabase_ns);
274 auto databaseCounter =
new TH1I(
"databaseCounter",
275 ";A database was read in;Number of times database was saved to histogram", 1, 1, 2);
276 registerObject<TH1I>(
"databaseCounter", databaseCounter);
279 auto numCrystalEntriesPerEvent =
new TH1F(
"numCrystalEntriesPerEvent",
280 ";Number crystal entries;Number of events", 15, 0, 15);
281 registerObject<TH1F>(
"numCrystalEntriesPerEvent", numCrystalEntriesPerEvent);
283 auto cutflow =
new TH1F(
"cutflow",
";Cut label number;Number of events passing cut", 20, 0, 20);
284 registerObject<TH1F>(
"cutflow", cutflow);
286 auto maxEcrsytalEnergyFraction =
new TH1F(
"maxEcrsytalEnergyFraction",
287 ";Maximum energy crystal energy / (sum) cluster energy;Number", 22, 0, 1.1);
288 registerObject<TH1F>(
"maxEcrsytalEnergyFraction", maxEcrsytalEnergyFraction);
290 auto refCrysIDzeroingCrate =
new TH1F(
"refCrysIDzeroingCrate",
";cell id;Boolean - is reference crystal", 8736, 1, 8736 + 1);
291 registerObject<TH1F>(
"refCrysIDzeroingCrate", refCrysIDzeroingCrate);
293 auto CDCEventT0Correction =
new TH1F(
"CDCEventT0Correction",
";;CDC event t0 offset correction [ns]", 1, 1, 2);
294 registerObject<TH1F>(
"CDCEventT0Correction", CDCEventT0Correction);
298 m_eventT0.isRequired();
300 m_eclClusterArray.isRequired();
301 m_eclCalDigitArray.isRequired();
302 m_eclDigitArray.isRequired();
304 B2INFO(
"hadronEventT0_TO_bhabhaEventT0_correction = " << m_hadronEventT0_TO_bhabhaEventT0_correction <<
305 " ns correction to CDC event t0 will be applied");
307 B2INFO(
"skipTrgSel = " << skipTrgSel);
313 int cutIndexPassed = 0;
314 getObjectPtr<TH1F>(
"cutflow")->Fill(cutIndexPassed);
315 B2DEBUG(22,
"Cutflow: no cuts: index = " << cutIndexPassed);
316 B2DEBUG(22,
"Event number = " << m_EventMetaData->getEvent());
324 if (!m_TrgResult.isValid()) {
325 B2WARNING(
"SoftwareTriggerResult required to select bhabha event is not found");
331 const std::map<std::string, int>& fresults = m_TrgResult->getResults();
332 if (fresults.find(
"software_trigger_cut&skim&accept_bhabha") == fresults.end()) {
333 B2WARNING(
"Can't find required bhabha trigger identifier");
337 const bool eBhabha = (m_TrgResult->getResult(
"software_trigger_cut&skim&accept_bhabha") ==
339 B2DEBUG(22,
"eBhabha (trigger passed) = " << eBhabha);
349 getObjectPtr<TH1F>(
"cutflow")->Fill(cutIndexPassed);
350 B2DEBUG(22,
"Cutflow: Trigger cut passed: index = " << cutIndexPassed);
359 bool ECLchannelMapHasChanged = m_channelMapDB.hasChanged();
360 if (ECLchannelMapHasChanged) {
361 B2INFO(
"ECLBhabhaTCollectorModule::collect() " <<
LogVar(
"ECLchannelMapHasChanged", ECLchannelMapHasChanged));
362 if (!m_crystalMapper->initFromDB()) {
363 B2FATAL(
"ECLBhabhaTCollectorModule::collect() : Can't initialize eclChannelMapper!");
370 if (m_ElectronicsDB.hasChanged()) {
371 m_Electronics = m_ElectronicsDB->getCalibVector();
373 if (m_ElectronicsTimeDB.hasChanged()) {
374 m_ElectronicsTime = m_ElectronicsTimeDB->getCalibVector();
376 if (m_FlightTimeDB.hasChanged()) {
377 m_FlightTime = m_FlightTimeDB->getCalibVector();
382 if (m_PreviousCrystalTimeDB.hasChanged()) {
383 m_PreviousCrystalTime = m_PreviousCrystalTimeDB->getCalibVector();
384 m_PreviousCrystalTimeUnc = m_PreviousCrystalTimeDB->getCalibUncVector();
387 B2DEBUG(29,
"Finished checking if previous crystal time payload has changed");
388 if (m_CrateTimeDB.hasChanged()) {
389 m_CrateTime = m_CrateTimeDB->getCalibVector();
390 m_CrateTimeUnc = m_CrateTimeDB->getCalibUncVector();
392 B2DEBUG(29,
"Finished checking if previous crate time payload has changed");
393 B2DEBUG(29,
"m_CrateTime size = " << m_CrateTime.size());
394 B2DEBUG(25,
"Crate time +- uncertainty [0]= " << m_CrateTime[0] <<
" +- " << m_CrateTimeUnc[0]);
395 B2DEBUG(25,
"Crate time +- uncertainty [8735]= " << m_CrateTime[8735] <<
" +- " << m_CrateTimeUnc[8735]);
397 B2DEBUG(29,
"Finished checking if previous crate time payload has changed");
398 if (m_RefCrystalsCalibDB.hasChanged()) {
399 m_RefCrystalsCalib = m_RefCrystalsCalibDB->getReferenceCrystals();
401 B2DEBUG(29,
"Finished checking if reference crystal cell ids payload has changed");
404 B2DEBUG(25,
"ECLBhabhaTCollector:: loaded ECLCrystalTimeOffset from the database"
405 <<
LogVar(
"IoV", m_PreviousCrystalTimeDB.getIoV())
406 <<
LogVar(
"Checksum", m_PreviousCrystalTimeDB.getChecksum()));
407 B2DEBUG(25,
"ECLBhabhaTCollector:: loaded ECLCrateTimeOffset from the database"
408 <<
LogVar(
"IoV", m_CrateTimeDB.getIoV())
409 <<
LogVar(
"Checksum", m_CrateTimeDB.getChecksum()));
410 B2DEBUG(25,
"ECLBhabhaTCollector:: loaded ECLCrystalElectronics from the database"
411 <<
LogVar(
"IoV", m_ElectronicsDB.getIoV())
412 <<
LogVar(
"Checksum", m_ElectronicsDB.getChecksum()));
413 B2DEBUG(25,
"ECLBhabhaTCollector:: loaded ECLCrystalElectronicsTime from the database"
414 <<
LogVar(
"IoV", m_ElectronicsTimeDB.getIoV())
415 <<
LogVar(
"Checksum", m_ElectronicsTimeDB.getChecksum()));
416 B2DEBUG(25,
"ECLBhabhaTCollector:: loaded ECLCrystalFlightTime from the database"
417 <<
LogVar(
"IoV", m_FlightTimeDB.getIoV())
418 <<
LogVar(
"Checksum", m_FlightTimeDB.getChecksum()));
419 B2DEBUG(25,
"ECLBhabhaTCollector:: loaded ECLReferenceCrystalPerCrateCalib from the database"
420 <<
LogVar(
"IoV", m_RefCrystalsCalibDB.getIoV())
421 <<
LogVar(
"Checksum", m_RefCrystalsCalibDB.getChecksum()));
431 vector<float> Crate_time_ns(52, 0.0);
434 for (
int crysID = 1; crysID <= 8736; crysID++) {
435 int crateID_temp = m_crystalMapper->getCrateID(crysID);
436 Crate_time_ns[crateID_temp - 1] = m_CrateTime[crysID] * TICKS_TO_NS;
446 for (
int crateID_temp = 1; crateID_temp <= 52; crateID_temp++) {
447 getObjectPtr<TH1F>(
"refCrysIDzeroingCrate")->Fill(m_RefCrystalsCalib[crateID_temp - 1] + 0.001);
452 for (
int crysID = 1; crysID <= 8736; crysID++) {
453 getObjectPtr<TH1F>(
"TsDatabase")->SetBinContent(crysID + 0.001, m_PreviousCrystalTime[crysID - 1]);
454 getObjectPtr<TH1F>(
"TsDatabaseUnc")->SetBinContent(crysID + 0.001, m_PreviousCrystalTimeUnc[crysID - 1]);
455 getObjectPtr<TH1F>(
"TcrateDatabase")->SetBinContent(crysID + 0.001, m_CrateTime[crysID - 1]);
456 getObjectPtr<TH1F>(
"TcrateUncDatabase")->SetBinContent(crysID + 0.001, m_CrateTimeUnc[crysID - 1]);
459 B2INFO(
"ECLBhabhaTCollector:: ECLCrystalTimeOffset from the database information:"
460 <<
LogVar(
"IoV", m_PreviousCrystalTimeDB.getIoV())
461 <<
LogVar(
"Checksum", m_PreviousCrystalTimeDB.getChecksum()));
462 B2INFO(
"First event so print out previous ts values");
463 for (
int crysID = 1; crysID <= 8736; crysID++) {
464 B2INFO(
"cid = " << crysID <<
", Ts previous = " << m_PreviousCrystalTime[crysID - 1]);
466 m_storeCalib =
false;
472 for (
int crateID_temp = 1; crateID_temp <= 52; crateID_temp++) {
473 getObjectPtr<TH1F>(
"tcrateDatabase_ns")->SetBinContent(crateID_temp + 0.001, Crate_time_ns[crateID_temp - 1]);
478 getObjectPtr<TH1I>(
"databaseCounter")->SetBinContent(1, 1);
483 getObjectPtr<TH1F>(
"CDCEventT0Correction")->SetBinContent(1, m_hadronEventT0_TO_bhabhaEventT0_correction);
490 double evt_t0_unc = -1;
491 double evt_t0_ECL_closestCDC = -1;
492 double evt_t0_ECL_minChi2 = -1;
495 if (!m_eventT0.isValid()) {
498 }
else if (!m_eventT0->hasTemporaryEventT0(Const::EDetector::CDC)) {
504 getObjectPtr<TH1F>(
"cutflow")->Fill(cutIndexPassed);
505 B2DEBUG(22,
"Cutflow: Event t0 exists: index = " << cutIndexPassed);
510 vector<EventT0::EventT0Component> evt_t0_list = m_eventT0->getTemporaryEventT0s(Const::EDetector::CDC);
511 evt_t0 = evt_t0_list.back().eventT0;
512 evt_t0_unc = evt_t0_list.back().eventT0Uncertainty;
516 evt_t0 = evt_t0 + m_hadronEventT0_TO_bhabhaEventT0_correction;
520 if (m_eventT0->hasTemporaryEventT0(Const::EDetector::ECL)) {
521 vector<EventT0::EventT0Component> evt_t0_list_ECL = m_eventT0->getTemporaryEventT0s(Const::EDetector::ECL);
524 double smallest_CDC_ECL_t0_diff = fabs(evt_t0_list_ECL[0].eventT0 - evt_t0);
525 int smallest_CDC_ECL_t0_diff_idx = 0;
526 for (
long unsigned int ECLi = 0; ECLi < evt_t0_list_ECL.size(); ECLi++) {
527 double tempt_ECL_t0 = evt_t0_list_ECL[ECLi].eventT0;
528 if (fabs(tempt_ECL_t0 - evt_t0) < smallest_CDC_ECL_t0_diff) {
529 smallest_CDC_ECL_t0_diff = fabs(tempt_ECL_t0 - evt_t0);
530 smallest_CDC_ECL_t0_diff_idx = ECLi;
534 evt_t0_ECL_closestCDC = evt_t0_list_ECL[smallest_CDC_ECL_t0_diff_idx].eventT0;
535 B2DEBUG(26,
"evt_t0_ECL_closestCDC = " << evt_t0_ECL_closestCDC);
539 double smallest_ECL_t0_minChi2 = evt_t0_list_ECL[0].quality;
540 int smallest_ECL_t0_minChi2_idx = 0;
542 B2DEBUG(26,
"evt_t0_list_ECL[0].quality = " << evt_t0_list_ECL[0].quality
543 <<
", with ECL event t0 = " << evt_t0_list_ECL[0].eventT0);
545 for (
long unsigned int ECLi = 0; ECLi < evt_t0_list_ECL.size(); ECLi++) {
546 B2DEBUG(26,
"evt_t0_list_ECL[" << ECLi <<
"].quality = " << evt_t0_list_ECL[ECLi].quality
547 <<
", with ECL event t0 = " <<
548 evt_t0_list_ECL[ECLi].eventT0);
549 if (evt_t0_list_ECL[ECLi].quality < smallest_ECL_t0_minChi2) {
550 smallest_ECL_t0_minChi2 = evt_t0_list_ECL[ECLi].quality;
551 smallest_ECL_t0_minChi2_idx = ECLi;
555 evt_t0_ECL_minChi2 = evt_t0_list_ECL[smallest_ECL_t0_minChi2_idx].eventT0;
557 B2DEBUG(26,
"evt_t0_ECL_minChi2 = " << evt_t0_ECL_minChi2);
558 B2DEBUG(26,
"smallest_ECL_t0_minChi2_idx = " << smallest_ECL_t0_minChi2_idx);
569 m_EperCrys.resize(8736);
570 m_eclCalDigitID.resize(8736);
571 m_eclDigitID.resize(8736);
575 for (
auto& eclCalDigit : m_eclCalDigitArray) {
576 int tempCrysID = eclCalDigit.getCellId() - 1;
577 m_EperCrys[tempCrysID] = eclCalDigit.getEnergy();
578 m_eclCalDigitID[tempCrysID] = idx;
583 for (
auto& eclDigit : m_eclDigitArray) {
584 int tempCrysID = eclDigit.getCellId() - 1;
585 m_eclDigitID[tempCrysID] = idx;
601 double maxp[2] = {0., 0.};
602 int maxiTrk[2] = { -1, -1};
603 int nTrkAll = tracks.getEntries();
611 for (
int iTrk = 0; iTrk < nTrkAll; iTrk++) {
615 if (not tempTrackFit) {
continue;}
619 double z0 = tempTrackFit->
getZ0();
620 double d0 = tempTrackFit->
getD0();
630 m_tree_nCDChits = nCDChits;
633 m_dbgTree_tracks->Fill();
641 if (fabs(d0) > m_looseTrkD0) {
644 if (fabs(z0) > m_looseTrkZ0) {
664 if (fabs(d0) > m_tightTrkD0) {
667 if (fabs(z0) > m_tightTrkZ0) {
675 if (charge > 0) {icharge = 1;}
676 if (p > maxp[icharge]) {
678 maxiTrk[icharge] = iTrk;
687 if (nTrkTight != 2) {
692 getObjectPtr<TH1F>(
"cutflow")->Fill(cutIndexPassed);
693 B2DEBUG(22,
"Cutflow: Two tight tracks: index = " << cutIndexPassed);
696 if (nTrkLoose != 2) {
701 getObjectPtr<TH1F>(
"cutflow")->Fill(cutIndexPassed);
702 B2DEBUG(22,
"Cutflow: No additional loose tracks: index = " << cutIndexPassed);
708 bool oppositelyChargedTracksPassed = maxiTrk[0] != -1 && maxiTrk[1] != -1;
709 if (!oppositelyChargedTracksPassed) {
714 getObjectPtr<TH1F>(
"cutflow")->Fill(cutIndexPassed);
715 B2DEBUG(22,
"Cutflow: Oppositely charged tracks: index = " << cutIndexPassed);
724 double trkEClustLab[2] = {0., 0.};
725 double trkEClustCOM[2] = {0., 0.};
728 TLorentzVector trkp4Lab[2];
729 TLorentzVector trkp4COM[2];
732 int crysIDMax[2] = { -1, -1 };
733 double crysEMax[2] = { -1, -1 };
734 double crysE2Max[2] = { -1, -1 };
735 int numClustersPerTrack[2] = { 0, 0 };
737 double clusterTime[2] = {0, 0};
741 vector<double> time_ECLCaldigits_bothClusters;
742 vector<int> cid_ECLCaldigits_bothClusters;
743 vector<double> E_ECLCaldigits_bothClusters;
744 vector<double> amp_ECLDigits_bothClusters;
745 vector<int> chargeID_ECLCaldigits_bothClusters;
747 for (
int icharge = 0; icharge < 2; icharge++) {
748 if (maxiTrk[icharge] > -1) {
749 B2DEBUG(22,
"looping over the 2 max pt tracks");
752 if (not tempTrackFit) {
continue;}
754 trkp4COM[icharge] = boostrotate.
rotateLabToCms() * trkp4Lab[icharge];
755 trkpLab[icharge] = trkp4Lab[icharge].Rho();
756 trkpCOM[icharge] = trkp4COM[icharge].Rho();
762 auto eclClusterRelationsFromTracks = tracks[maxiTrk[icharge]]->getRelationsTo<
ECLCluster>();
763 for (
unsigned int clusterIdx = 0; clusterIdx < eclClusterRelationsFromTracks.size(); clusterIdx++) {
765 B2DEBUG(22,
"Looking at clusters. index = " << clusterIdx);
766 auto cluster = eclClusterRelationsFromTracks[clusterIdx];
767 bool goodClusterType =
false;
771 goodClusterType =
true;
772 numClustersPerTrack[icharge]++;
775 if (goodClusterType) {
777 clusterTime[icharge] = cluster->getTime();
779 auto eclClusterRelations = cluster->getRelationsTo<
ECLCalDigit>(
"ECLCalDigits");
782 for (
unsigned int ir = 0; ir < eclClusterRelations.size(); ir++) {
783 const auto calDigit = eclClusterRelations.object(ir);
784 int tempCrysID = calDigit->
getCellId() - 1;
785 double tempE = m_EperCrys[tempCrysID];
787 int eclDigitIndex = m_eclDigitID[tempCrysID];
788 ECLDigit* ecl_dig = m_eclDigitArray[eclDigitIndex];
791 if (tempE > crysEMax[icharge]) {
793 crysE2Max[icharge] = crysEMax[icharge];
795 crysEMax[icharge] = tempE;
796 crysIDMax[icharge] = tempCrysID;
799 if (tempE > crysE2Max[icharge] && tempCrysID != crysIDMax[icharge]) {
800 crysE2Max[icharge] = tempE;
807 B2DEBUG(26,
"calDigit(ir" << ir <<
") time = " << calDigit->getTime() <<
"ns , with E = " << tempE <<
" GeV");
808 time_ECLCaldigits_bothClusters.push_back(calDigit->getTime());
809 cid_ECLCaldigits_bothClusters.push_back(tempCrysID);
810 E_ECLCaldigits_bothClusters.push_back(tempE);
811 amp_ECLDigits_bothClusters.push_back(ecl_dig->
getAmp());
812 chargeID_ECLCaldigits_bothClusters.push_back(icharge);
817 trkEClustCOM[icharge] = trkEClustLab[icharge] * trkpCOM[icharge] / trkpLab[icharge];
822 E_DIV_p[icharge] = trkEClustCOM[icharge] / trkpCOM[icharge];
834 int numCrystalsPassingCuts = 0;
836 int crystalIDs[2] = { -1, -1};
837 int crateIDs[2] = { -1, -1};
838 double ts_prevCalib[2] = { -1, -1};
839 double tcrate_prevCalib[2] = { -1, -1};
840 double times_noPreviousCalibrations[2] = { -1, -1};
841 bool crystalCutsPassed[2] = {
false,
false};
842 double crystalEnergies[2] = { -1, -1};
843 double crystalEnergies2[2] = { -1, -1};
845 for (
int iCharge = 0; iCharge < 2; iCharge++) {
846 int crystal_idx = crysIDMax[iCharge];
847 int eclCalDigitIndex = m_eclCalDigitID[crystal_idx];
848 int eclDigitIndex = m_eclDigitID[crystal_idx];
850 ECLDigit* ecl_dig = m_eclDigitArray[eclDigitIndex];
851 ECLCalDigit* ecl_cal = m_eclCalDigitArray[eclCalDigitIndex];
856 auto amplitude = ecl_dig->
getAmp();
857 crystalEnergies[iCharge] = en;
860 double time = ecl_dig->
getTimeFit() * TICKS_TO_NS - evt_t0;
863 time -= m_ElectronicsTime[cid - 1] * TICKS_TO_NS;
864 time -= m_FlightTime[cid - 1];
869 double energyTimeShift = m_ECLTimeUtil->energyDependentTimeOffsetElectronic(amplitude * m_Electronics[cid - 1]) * TICKS_TO_NS;
871 B2DEBUG(29,
"cellid = " << cid <<
", amplitude = " << amplitude <<
", time before t(E) shift = " << time <<
872 ", t(E) shift = " << energyTimeShift <<
" ns");
873 time -= energyTimeShift;
877 if (cid < m_minCrystal || cid > m_maxCrystal)
continue;
880 if (fabs(time) > m_timeAbsMax)
continue;
886 crystalIDs[iCharge] = cid;
887 crateIDs[iCharge] = m_crystalMapper->getCrateID(ecl_cal->
getCellId());
890 ts_prevCalib[iCharge] = m_PreviousCrystalTime[cid - 1] * TICKS_TO_NS;
891 tcrate_prevCalib[iCharge] = m_CrateTime[cid - 1] * TICKS_TO_NS;
892 times_noPreviousCalibrations[iCharge] = time;
895 B2DEBUG(26,
"iCharge = " << iCharge);
896 B2DEBUG(26,
"crateIDs[iCharge] = " << crateIDs[iCharge]);
897 B2DEBUG(26,
"times_noPreviousCalibrations[iCharge] = " << times_noPreviousCalibrations[iCharge]);
898 B2DEBUG(26,
"tcrate_prevCalib[iCharge] = " << tcrate_prevCalib[iCharge]);
899 B2DEBUG(26,
"ts_prevCalib[iCharge] = " << ts_prevCalib[iCharge]);
902 crystalCutsPassed[iCharge] =
true;
906 crystalEnergies2[iCharge] = crysE2Max[iCharge];
912 m_tree_amp = ecl_dig->
getAmp();
914 m_tree_E1Etot = en / trkEClustLab[iCharge];
915 m_tree_E1E2 = en / crystalEnergies2[iCharge];
916 m_tree_E1p = en / trkpLab[iCharge];
917 m_tree_timetsPreviousTimeCalibs = time - ts_prevCalib[iCharge] - tcrate_prevCalib[iCharge];
918 m_tree_timeF = ecl_dig->
getTimeFit() * TICKS_TO_NS;
922 m_tree_t0_unc = evt_t0_unc;
923 m_E_DIV_p = E_DIV_p[iCharge];
924 m_tree_evtNum = m_EventMetaData->getEvent();
925 m_crystalCrate = m_crystalMapper->getCrateID(ecl_cal->
getCellId());
926 m_runNum = m_EventMetaData->getRun();
929 m_dbgTree_electrons->Fill();
934 getObjectPtr<TH1F>(
"maxEcrsytalEnergyFraction")->Fill(en / trkEClustLab[iCharge]);
944 bool E_DIV_p_instance_passed[2] = {
false,
false};
945 double E_DIV_p_CUT = 0.7;
946 for (
int icharge = 0; icharge < 2; icharge++) {
947 E_DIV_p_instance_passed[icharge] = E_DIV_p[icharge] > E_DIV_p_CUT;
949 if (!E_DIV_p_instance_passed[0] || !E_DIV_p_instance_passed[1]) {
954 getObjectPtr<TH1F>(
"cutflow")->Fill(cutIndexPassed);
955 B2DEBUG(22,
"Cutflow: E_i/p_i > " << E_DIV_p_CUT <<
": index = " << cutIndexPassed);
961 double invMassTrk = (trkp4Lab[0] + trkp4Lab[1]).M();
962 double invMass_CUT = 0.9;
963 m_massInvTracks = invMassTrk;
967 m_dbgTree_event->Fill();
971 bool invMassCutsPassed = invMassTrk > (invMass_CUT * boostrotate.
getCMSEnergy());
972 if (!invMassCutsPassed) {
977 getObjectPtr<TH1F>(
"cutflow")->Fill(cutIndexPassed);
978 B2DEBUG(22,
"Cutflow: m(track 1+2) > " << invMass_CUT <<
"*E_COM = " << invMass_CUT <<
" * " << boostrotate.
getCMSEnergy() <<
979 " : index = " << cutIndexPassed);
984 for (
int iCharge = 0; iCharge < 2; iCharge++) {
985 if (crystalCutsPassed[iCharge]) {
986 getObjectPtr<TH2F>(
"TimevsCrysPrevCrateCalibPrevCrystCalib")->Fill((crystalIDs[iCharge]) + 0.001,
987 times_noPreviousCalibrations[iCharge] - ts_prevCalib[iCharge] - tcrate_prevCalib[iCharge] , 1);
988 getObjectPtr<TH2F>(
"TimevsCratePrevCrateCalibPrevCrystCalib")->Fill((crateIDs[iCharge]) + 0.001,
989 times_noPreviousCalibrations[iCharge] - ts_prevCalib[iCharge] - tcrate_prevCalib[iCharge], 1);
990 getObjectPtr<TH2F>(
"TimevsCrysNoCalibrations")->Fill((crystalIDs[iCharge]) + 0.001, times_noPreviousCalibrations[iCharge], 1);
991 getObjectPtr<TH2F>(
"TimevsCrateNoCalibrations")->Fill((crateIDs[iCharge]) + 0.001, times_noPreviousCalibrations[iCharge], 1);
992 getObjectPtr<TH2F>(
"TimevsCrysPrevCrateCalibNoCrystCalib")->Fill((crystalIDs[iCharge]) + 0.001,
993 times_noPreviousCalibrations[iCharge] - tcrate_prevCalib[iCharge], 1);
994 getObjectPtr<TH2F>(
"TimevsCrateNoCrateCalibPrevCrystCalib")->Fill((crateIDs[iCharge]) + 0.001,
995 times_noPreviousCalibrations[iCharge] - ts_prevCalib[iCharge] , 1);
998 numCrystalsPassingCuts++;
1006 if (crystalCutsPassed[0] || crystalCutsPassed[1]) {
1009 getObjectPtr<TH1F>(
"cutflow")->Fill(cutIndexPassed);
1010 B2DEBUG(22,
"Cutflow: At least one crystal time and quality cuts passed: index = " << cutIndexPassed);
1012 getObjectPtr<TH1F>(
"numCrystalEntriesPerEvent")->Fill(numCrystalsPassingCuts);
1017 for (
int iCharge = 0; iCharge < 2; iCharge++) {
1018 if (crystalCutsPassed[iCharge]) {
1020 m_tree_evtNum = m_EventMetaData->getEvent();
1021 m_tree_cid = crystalIDs[iCharge];
1023 m_tree_time = times_noPreviousCalibrations[iCharge];
1024 m_crystalCrate = crateIDs[iCharge];
1025 m_runNum = m_EventMetaData->getRun();
1026 m_tree_en = crystalEnergies[iCharge];
1027 m_tree_E1Etot = crystalEnergies[iCharge] / trkEClustLab[iCharge];
1028 m_tree_E1E2 = crystalEnergies[iCharge] / crystalEnergies2[iCharge];
1029 m_tree_E1p = crystalEnergies[iCharge] / trkpLab[iCharge];
1030 m_tree_timetsPreviousTimeCalibs = times_noPreviousCalibrations[iCharge] - ts_prevCalib[iCharge] - tcrate_prevCalib[iCharge];
1032 m_tree_t0_ECLclosestCDC = evt_t0_ECL_closestCDC;
1033 m_tree_t0_ECL_minChi2 = evt_t0_ECL_minChi2;
1034 m_tree_tClust = clusterTime[iCharge];
1036 m_massInvTracks = invMassTrk;
1039 m_dbgTree_allCuts->Fill();
1048 if (crystalCutsPassed[0] && crystalCutsPassed[1] &&
1049 numClustersPerTrack[0] == 1 && numClustersPerTrack[1] == 1) {
1050 m_tree_enNeg = trkEClustLab[0];
1051 m_tree_enPlus = trkEClustLab[1];
1052 m_tree_tClustNeg = clusterTime[0];
1053 m_tree_tClustPos = clusterTime[1];
1054 m_tree_maxEcrystPosClust = times_noPreviousCalibrations[0] - ts_prevCalib[0] - tcrate_prevCalib[0];
1055 m_tree_maxEcrystNegClust = times_noPreviousCalibrations[1] - ts_prevCalib[1] - tcrate_prevCalib[1];
1057 m_tree_t0_ECLclosestCDC = evt_t0_ECL_closestCDC;
1058 m_tree_t0_ECL_minChi2 = evt_t0_ECL_minChi2;
1062 m_dbgTree_evt_allCuts->Fill();
1068 B2DEBUG(26,
"m_tree_maxEcrystPosClust + evt_t0 = " << m_tree_maxEcrystPosClust + evt_t0);
1069 B2DEBUG(26,
"m_tree_maxEcrystNegClust + evt_t0 = " << m_tree_maxEcrystNegClust + evt_t0);
1070 B2DEBUG(26,
"CDC evt_t0 = " << evt_t0);
1071 B2DEBUG(26,
"ECL min chi2 even t0, m_tree_t0_ECL_minChi2 = " << m_tree_t0_ECL_minChi2);
1075 for (
long unsigned int digit_i = 0; digit_i < time_ECLCaldigits_bothClusters.size(); digit_i++) {
1076 m_runNum = m_EventMetaData->getRun();
1077 m_tree_evtNum = m_EventMetaData->getEvent();
1078 m_tree_ECLCalDigitTime = time_ECLCaldigits_bothClusters[digit_i];
1079 m_tree_ECLCalDigitE = E_ECLCaldigits_bothClusters[digit_i];
1080 m_tree_ECLDigitAmplitude = amp_ECLDigits_bothClusters[digit_i];
1082 m_tree_t0_ECLclosestCDC = evt_t0_ECL_closestCDC;
1083 m_tree_t0_ECL_minChi2 = evt_t0_ECL_minChi2;
1084 m_tree_timetsPreviousTimeCalibs = times_noPreviousCalibrations[chargeID_ECLCaldigits_bothClusters[digit_i]] -
1085 ts_prevCalib[chargeID_ECLCaldigits_bothClusters[digit_i]] -
1086 tcrate_prevCalib[chargeID_ECLCaldigits_bothClusters[digit_i]];
1087 m_tree_cid = cid_ECLCaldigits_bothClusters[digit_i];
1091 m_dbgTree_crys_allCuts->Fill();
1098 B2DEBUG(26,
"This was for event number = " << m_tree_evtNum);
Calibration collector module base class.
Class to provide momentum-related information from ECLClusters.
const TVector3 GetIPPosition()
Returns default IP position from beam parameters.
static const ChargedStable pion
charged pion particle
This module generates time vs crystal 2D histograms to later (in eclBhabhaTAlgorithm) find time cryst...
void collect() override
Select events and crystals and accumulate histograms.
void prepare() override
Define histograms and read payloads from DB.
void inDefineHisto() override
Replacement for defineHisto() in CalibrationCollector modules.
virtual ~ECLBhabhaTCollectorModule()
Module destructor.
Class to store calibrated ECLDigits: ECLCalDigits.
int getCellId() const
Get Cell ID.
double getEnergy() const
Get Calibrated Energy.
DB object to store correspondence table of type (Crate id, ShaperDSP id, Channel id) <-> (ECL CellID)
@ c_nPhotons
CR is split into n photons (N1)
Class to store ECL digitized hits (output of ECLDigi) relation to ECLHit filled in ecl/modules/eclDig...
int getAmp() const
Get Fitting Amplitude.
int getQuality() const
Get Fitting Quality.
int getCellId() const
Get Cell ID.
int getTimeFit() const
Get Fitting Time.
General DB object to store one reference crystal per per ECL crate for calibration purposes.
static constexpr double m_rf
accelerating RF, http://ptep.oxfordjournals.org/content/2013/3/03A006.full.pdf
unsigned short getNHits() const
Get the total Number of CDC hits in the fit.
Values of the result of a track fit with a given particle hypothesis.
short getChargeSign() const
Return track charge (1 or -1).
TLorentzVector get4Momentum() const
Getter for the 4Momentum at the closest approach of the track in the r/phi projection.
TVector3 getMomentum() const
Getter for vector of momentum at closest approach of track in r/phi projection.
double getD0() const
Getter for d0.
double getZ0() const
Getter for z0.
HitPatternCDC getHitPatternCDC() const
Getter for the hit pattern in the CDC;.
Class to store variables with their name which were sent to the logging service.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
@ c_accept
Accept this event.
Abstract base class for different kinds of events.