ATLAS Offline Software
Loading...
Searching...
No Matches
EventReaderAlg.cxx
Go to the documentation of this file.
1// Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
2
4
8
9#include "Identifier/Identifier.h"
11
12#include "CaloGeoHelpers/CaloSampling.h"
13
16
18
19#include <bitset>
20#include "CLHEP/Units/SystemOfUnits.h"
21#include "TTree.h"
22#include "xAODEgamma/EgammaxAODHelpers.h" //for getAssociatedTopoClusters
23
24
25using CLHEP::twopi;
26using CLHEP::GeV;
27using CLHEP::pi;
28
29EventReaderAlg::EventReaderAlg( const std::string& name, ISvcLocator* pSvcLocator ) :
30 EventReaderBaseAlg(name, pSvcLocator)
31 , m_ntsvc("THistSvc/THistSvc", name)
32 {}
33
35 ATH_MSG_INFO ("Initializing " << name() << "...");
36 ATH_MSG_INFO ("(EventReader) Initializing conditions...");
37
38 // Conditions
41 ATH_CHECK(m_noiseCDOKey.initialize()); //---- retrieve the noise CDO
42 ATH_CHECK(m_lumiDataKey.initialize() );
43 ATH_CHECK(m_pedestalKey.initialize());
44 ATH_CHECK(m_adc2MeVKey.initialize());
45 ATH_CHECK(m_ofcKey.initialize());
46 ATH_CHECK(m_shapeKey.initialize());
47 ATH_CHECK(m_minBiasAvgKey.initialize());
48 ATH_CHECK(m_fSamplKey.initialize());
50 ATH_MSG_DEBUG(" (EventReader) Condition Keys initialized!");
51
52 // Containers
53 ATH_CHECK(m_eventInfoSgKey.initialize());
54 ATH_CHECK(m_primVertSgKey.initialize());
55 ATH_CHECK(m_caloClusSgKey.initialize());
58 ATH_CHECK(m_electronCntSgKey.initialize());
59 ATH_CHECK(m_truthEventCntSgKey.initialize());
60 ATH_CHECK(m_larEMBHitCntSgKey.initialize());
61 ATH_CHECK(m_larDigitCntSgKey.initialize());
62 ATH_CHECK(m_larRawChCntSgKey.initialize());
63 ATH_CHECK(m_allCaloCellCntSgKey.initialize());
64 ATH_MSG_DEBUG(" (EventReader) Container Keys initialized!");
65
66 // -- Retrieve ID Helpers --
67 ATH_CHECK( detStore()->retrieve(m_onlineLArID, "LArOnlineID") ); // get online ID info from LAr (online)
68 ATH_CHECK( detStore()->retrieve (m_calocell_id, "CaloCell_ID") );
69 ATH_CHECK( m_larCablingKey.initialize());
70
71 StatusCode sc = detStore()->retrieve(m_caloIdMgr);
72 if (sc.isFailure()) {
73 ATH_MSG_ERROR(" Unable to retrieve CaloIdManager from DetectoreStore");
74 return StatusCode::FAILURE;
75 }
76 else{
77 m_larem_id = m_caloIdMgr->getEM_ID();
78 m_larhec_id = m_caloIdMgr->getHEC_ID();
79 m_larfcal_id = m_caloIdMgr->getFCAL_ID();
80 }
81 // -------------------------
82
83 // Book the variables to save in the *.root
84 m_Tree = new TTree("dumpedData", "dumpedData");
85 m_secondTree = new TTree("lumiblockData", "lumiblockData");
86
87 ATH_MSG_DEBUG("Booking branches...");
88 bookBranches(m_Tree); // book TTree with branches
90
91 if (!m_ntsvc->regTree("/rec/tree1", m_Tree).isSuccess()) {
92 ATH_MSG_ERROR("could not register tree [dumpedData]");
93 return StatusCode::FAILURE;
94 }
95 if (!m_ntsvc->regTree("/rec/tree2", m_secondTree).isSuccess()) {
96 ATH_MSG_ERROR("could not register tree [database]");
97 return StatusCode::FAILURE;
98 }
99
100 if (m_doTagAndProbe && m_doElecSelectByTrackOnly) ATH_MSG_INFO("Entering single_e mode...");
101 else if (m_doTagAndProbe && !m_doElecSelectByTrackOnly) ATH_MSG_INFO("Entering Zee T&P mode...");
102 else {
103 ATH_MSG_ERROR("No valid electron chain selected!");
104 return StatusCode::FAILURE;
105 }
106
107 return StatusCode::SUCCESS;
108}
109
111 ATH_MSG_DEBUG ("Executing " << name() << "...");
112 ATH_MSG_DEBUG("Cleanning of event variables...");
113 const EventContext& ctx = getContext();
114 clear(); // clear all variables selected to dump to the output NTuple.
115
116 // Conditions
117 if (!m_isMC){
118
119 if (!m_EneRescalerFldr.empty()){
121 const coral::Blob& blob = (**EneRescalerHdl)["CaloCondBlob16M"].data<coral::Blob>();
122 if (blob.size()<3) ATH_MSG_WARNING("Found empty blob, no correction needed");
123 m_EneRescaler = CaloCondBlobFlt::getInstance(blob); // offline egamma cell correction (due from 5 to 4 downsampling rate)
124 ATH_MSG_DEBUG("offlineEnergyRescaler is set!");
125 }
126
127 if (!m_run2DSPThresholdsKey.empty()) {
129 m_run2DSPThresh = std::unique_ptr<LArDSPThresholdsFlat>(new LArDSPThresholdsFlat(*dspThrshAttrHdl));
130 ATH_MSG_DEBUG("DSPThreshold has set!");
131 }
132
133 if (!m_lumiDataKey.empty()){
135 m_lumis =*lumiHdl;
136 ATH_MSG_DEBUG("LuminosityCondData is set!");
137 }
138
139 if (!m_offlineHVScaleCorrKey.empty()){
141 m_oflHVCorr =*oflHVCorrHdl;
142 ATH_MSG_DEBUG("OfflineHVCorrection is set!");
143 }
144 }
145 else{
146 if (!m_fSamplKey.empty()){ // MC
148 m_fSampl = *fSamplHdl;
149 ATH_MSG_DEBUG("SamplingFraction is set!");
150 }
151 }
152
160
161 m_larCabling = *larCablingHdl;
162 m_noiseCDO = *noiseHdl;
163 m_peds = *pedHdl;
164 m_adc2MeVs = *adc2mevHdl;
165 m_ofcs = *ofcHdl;
166 m_shapes = *shapeHdl;
167 m_minBiasAvgs = *minBiasAvgHdl;
168
170 if (!ei.isValid()) ATH_MSG_ERROR(" EventInfo container is not valid!");
171
172 if (ei->errorState(xAOD::EventInfo::LAr) == xAOD::EventInfo::Error) {
173 ATH_MSG_WARNING("Event not passing LAr! Skipping event.");
174 return StatusCode::SUCCESS;
175 }
176
178 if (!primVertexCnt.isValid()) ATH_MSG_ERROR(" Primary Vertex container is not valid!");
179
180 // *** Lumiblock data ***
181 // Verify if ei->lumiBlock() was dumped into lb_lumiblock. if not, add it.
182 // Each LB entry should be dumped just once, since their content doesnt change per event.
183 if (std::count(m_lb_lumiblock->begin(), m_lb_lumiblock->end(), ei->lumiBlock()) == 0){
184 if(!dumpLumiblockInfo(ei)) ATH_MSG_INFO("Lumiblock information cannot be collected!");
185 }
186
187 // EventInfo
188 if(!dumpEventInfo(ei)) ATH_MSG_INFO("Event information cannot be collected!");
189
190 // Clusters
191 if (m_doClusterDump){
192
194
195 if(!cls.isValid()){
196 ATH_MSG_ERROR("CaloCluster container is not valid!");
197 return StatusCode::FAILURE;
198 }
199
200 for (const xAOD::CaloCluster *cl : *cls){
201 ATH_MSG_DEBUG ("Cluster "<< m_c_clusterIndexCounter << ", Total size: " << cl->numberCells() << "/ "<< cl->clusterSize() << ", etaBE: " << cl->etaBE(2) << ", numberCellsInSampling: " << cl->numberCellsInSampling(CaloSampling::EMB2) <<", eta size: " << cl->etasize(CaloSampling::EMB2) << ", phi size: " << cl->phisize(CaloSampling::EMB2) );
202
203 if (! dumpClusterCells(cl, m_c_clusterIndexCounter , ctx) ) ATH_MSG_WARNING ("CaloCluster Cells cannot be dumped for Zee.");
204
206 }
207 }
208
209 // Apply the Zee cut
211
212 if(!dumpZeeCut(ei,primVertexCnt, ctx)) ATH_MSG_DEBUG("Zee cut algorithm cannot be executed!");
213
214 std::string eSelectionText = "";
215 SG::ReadHandle<xAOD::ElectronContainer> myElectronsSelection;
216
217 if (m_doElecSelectByTrackOnly) eSelectionText = "Number of myElectronsSelection single electrons: ";
218 else eSelectionText = "Number of myElectronsSelection tagAndProbe Zee candidates: ";
219
220 myElectronsSelection = SG::makeHandle(m_myElecSelectionSgKey,ctx);
221 // Optional: Skip empty events.
222 if (m_skipEmptyEvents && (myElectronsSelection->size() == 0)){
223 ATH_MSG_INFO("This event has no selected electrons! Cleanning event variables and skipping writing to NTuple...");
224 clear(); // clear all variables selected to dump to the output NTuple.
225 return StatusCode::SUCCESS;
226 }
227
228 if(!FillNTupleWithSelectedElectrons(ei, primVertexCnt, myElectronsSelection, eSelectionText, ctx)) ATH_MSG_DEBUG("FillNTupleWithElectrons cannot be executed!");
229
230 if (m_isMC){
231 // Particle Truth
234 if (!truthParticleCnt.isValid()) ATH_MSG_ERROR("TruthParticleContainer is not valid!");
235
236 if(!dumpTruthParticle(myElectronsSelection, truthParticleCnt)) ATH_MSG_DEBUG("Truth Particle information cannot be collected!");
237 }
238 }
239 } // end if-start TagAndProbe chain
240
241 m_Tree->Fill();
242
243 return StatusCode::SUCCESS;
244}
245
247
248 ATH_MSG_INFO(eSelectionText << elContainer->size() );
249
250 int electronIndex = 0;
251 for (const xAOD::Electron *elec : *elContainer){
252
253 const auto& clusLinks = elec->caloClusterLinks(); // get the cluster links for the electron
254
255 // loop over clusters and dump cells
256 for (const auto& clusLink : clusLinks){
257
258 // get associated topoclusters from superclusters
260 auto assocCls = xAOD::EgammaHelpers::getAssociatedTopoClusters( (*clusLink) );
261
262 for ( auto assocCl : assocCls){
263 ATH_MSG_DEBUG ("AssociatedTopoCluster " << m_c_clusterIndexCounter << ": e: "<< assocCl->e() << ", eta: " << assocCl->eta() << ", phi: " << assocCl->phi() <<". Total size: " << assocCl->numberCells() << "/ "<< assocCl->clusterSize() << ", etaBE: " << assocCl->etaBE(2) << ", numberCellsInSampling: " << assocCl->numberCellsInSampling(CaloSampling::EMB2) <<", eta size: " << assocCl->etasize(CaloSampling::EMB2) << ", phi size: " << assocCl->phisize(CaloSampling::EMB2) );
264 if (! dumpClusterCells(assocCl, m_c_clusterIndexCounter, ctx ) ) ATH_MSG_WARNING ("CaloCluster Cells cannot be dumped for Zee.");
265
267 }
268 }
269 else{ // dump only the superclusters
270 if (! dumpClusterCells((*clusLink), m_c_clusterIndexCounter, ctx ) ) ATH_MSG_WARNING ("CaloCluster Cells cannot be dumped for Zee.");
272 }
273 m_c_electronIndex_clusterLvl->push_back(electronIndex); // electron indexes for each cluster
274 } //end-for loop in clusLinks
275
276 // dump tag and probe electrons
277 if (!dumpElectrons(elec)) ATH_MSG_WARNING ("Cannot dump ordinary electrons...");
278 if (!dumpOfflineSS(elec)) ATH_MSG_WARNING ("Cannot dump offline shower shapes for electrons...");
279 if (!dumpPrimVertexAssocToElectron(elec, primVertexCnt, ei)) ATH_MSG_WARNING ("Cannot dump primary vertexes info associated to electrons...");
280 m_el_index->push_back(electronIndex);
281
282 electronIndex++;
283
284 } // end-for loop in m_electronsSelectedByTrack electrons
285
286 return StatusCode::SUCCESS;
287}
288
290 m_el_f1->push_back(electron->showerShapeValue(xAOD::EgammaParameters::f1));
291 m_el_f3->push_back(electron->showerShapeValue(xAOD::EgammaParameters::f3));
292 m_el_eratio->push_back(electron->showerShapeValue(xAOD::EgammaParameters::Eratio));
293 m_el_weta1->push_back(electron->showerShapeValue(xAOD::EgammaParameters::weta1));
294 m_el_weta2->push_back(electron->showerShapeValue(xAOD::EgammaParameters::weta2));
295 m_el_fracs1->push_back(electron->showerShapeValue(xAOD::EgammaParameters::fracs1));
296 m_el_wtots1->push_back(electron->showerShapeValue(xAOD::EgammaParameters::wtots1));
297 m_el_e277->push_back(electron->showerShapeValue(xAOD::EgammaParameters::e277));
298 m_el_reta->push_back(electron->showerShapeValue(xAOD::EgammaParameters::Reta));
299 m_el_rphi->push_back(electron->showerShapeValue(xAOD::EgammaParameters::Rphi));
300 m_el_deltae->push_back(electron->showerShapeValue(xAOD::EgammaParameters::DeltaE));
301 m_el_rhad->push_back(electron->showerShapeValue(xAOD::EgammaParameters::Rhad));
302 m_el_rhad1->push_back(electron->showerShapeValue(xAOD::EgammaParameters::Rhad1));
303
304 return StatusCode::SUCCESS;
305}
306
308 float electronEt = electron->e()/(cosh(electron->trackParticle()->eta()));
309 float track_p = (electron->trackParticle())->pt()*std::cosh((electron->trackParticle())->eta());
310 float eoverp = (electron->caloCluster())->e()/track_p;
311 m_el_eoverp->push_back(eoverp);
312 m_el_Pt->push_back(electron->pt());
313 m_el_et->push_back(electronEt);
314 m_el_Eta->push_back(electron->eta());
315 m_el_Phi->push_back(electron->phi());
316 m_el_m->push_back(electron->m());
317
318 return StatusCode::SUCCESS;
319}
320
322
323 const xAOD::TrackParticle *trackElectron = el->trackParticle();
324
325 // check for primary vertex in the event
326 // *************** Primary vertex check ***************
327 //loop over vertices and look for good primary vertex
328 float bestDeltaZ0Sin = 9999.0, bestZfromVertex = 9999.0, bestXFromVertex = 9999.0, bestYFromVertex = 9999.0, bestDeltaZ0 = 9999.0;
329 double bestD0Sig = 9999.0;
330 int vtxCounter = 0;//, bestVtxCounter = 0;
331 bool isAnyClosestVtx = false;
332 for (const xAOD::Vertex *vxIter : *primVertexCnt) {
333
334 // Select good primary vertex
335 float zFromVertex = vxIter->z();
336 float delta_z0 = fabs(trackElectron->z0() + trackElectron->vz() - zFromVertex); //where trk.vz() represents the point of reference for the z0 calculation (in this case, the beamspot position along the z axis).
337 float delta_z0_sin = delta_z0 * sin(trackElectron->theta()); //where sin(trk.theta()) parameterises the uncertainty of the z0 measurement.
338 double d0sig = xAOD::TrackingHelpers::d0significance( trackElectron, evtInfo->beamPosSigmaX(), evtInfo->beamPosSigmaY(), evtInfo->beamPosSigmaXY() );
339
340
341 if ((vxIter->vertexType() == xAOD::VxType::PriVtx) && ( fabs(delta_z0_sin) < m_z0Tag) && (fabs(d0sig) < m_d0TagSig) ){ //is this vertex passed into d0sig and dz0Sin conditions?
342 isAnyClosestVtx = true;
343
344 ATH_MSG_DEBUG ("(dumpPrimVertexAssocToElectron) Vertex "<< vtxCounter << ": This is a primary vertex. |delta_z0_sin| < 0.5 mm ("<< delta_z0_sin << "). |d0sig| < 5 (" << d0sig << ")");
345 if ( (fabs(delta_z0_sin) < fabs(bestDeltaZ0Sin) ) && (fabs(d0sig) < fabs(bestD0Sig)) ) // is this vertex the closest one to that electron track?
346 {
347 // assign all variables to dump:
348 ATH_MSG_DEBUG ("(dumpPrimVertexAssocToElectron) New best associated Vertex. Vertex "<< vtxCounter << ": |delta_z0_sin| < 0.5 mm ("<< delta_z0_sin << "). |d0sig| < 5 (" << d0sig << ")");
349
350 bestDeltaZ0Sin = delta_z0_sin;
351 bestD0Sig = d0sig;
352
353 bestXFromVertex = vxIter->x();
354 bestYFromVertex = vxIter->y();
355 bestZfromVertex = zFromVertex;
356 bestDeltaZ0 = delta_z0;
357 }
358 }
359 vtxCounter++;
360 }
361 // --------- Dump here: ---------
362 if (isAnyClosestVtx){
363 m_vtx_x->push_back(bestXFromVertex);
364 m_vtx_y->push_back(bestYFromVertex);
365 m_vtx_z->push_back(bestZfromVertex);
366 m_vtx_deltaZ0->push_back(bestDeltaZ0);
367 m_vtx_delta_z0_sin->push_back(bestDeltaZ0Sin);
368 m_vtx_d0sig->push_back(bestD0Sig);
369 }
370 else{
371 ATH_MSG_ERROR("A pre-selected electron track has no closest vertex to dump! (weird?)");
372 }
373 // -------------------------------
374
375
376 return StatusCode::SUCCESS;
377}
378
380
381 if (!m_isMC){
382 m_lb_bcidLuminosity->push_back(m_lumis->lbLuminosityPerBCIDVector());
383 ATH_MSG_INFO ("LB_data: lbLuminosityPerBCIDVector stored into ntuple." );
384 }
385 m_lb_lumiblock->push_back( ei->lumiBlock() );
386 ATH_MSG_INFO ("LB_data: Lumiblock "<< ei->lumiBlock() << " stored into ntuple." );
387
388 return StatusCode::SUCCESS;
389}
390
392 m_e_runNumber = ei->runNumber();
393 m_e_eventNumber = ei->eventNumber();
394 m_e_bcid = ei->bcid();
395 m_e_lumiBlock = ei->lumiBlock();
396 m_e_inTimePileup = ei->actualInteractionsPerCrossing();
397 m_e_outOfTimePileUp = ei->averageInteractionsPerCrossing();
398
399 ATH_MSG_INFO ("in execute, runNumber = " << m_e_runNumber << ", eventNumber = " << m_e_eventNumber << ", bcid: " << m_e_bcid );
400
401 return StatusCode::SUCCESS;
402}
403
405 ATH_MSG_INFO("Dumping Zee cut region...");
406
407 auto electronSelectionCnt = std::make_unique<ConstDataVector<xAOD::ElectronContainer>> (SG::VIEW_ELEMENTS);
408 auto TagAndProbeElectronSelectionCnt = std::make_unique<ConstDataVector<xAOD::ElectronContainer>> (SG::VIEW_ELEMENTS);
409
411
412 if (!electronsCnt.isValid()) {
413 ATH_MSG_ERROR("Electron container is not valid!");
414 return StatusCode::FAILURE;
415 }
416
417 // Pre-selection of electrons
418 for (auto el : *electronsCnt){
419 if (std::abs(el->eta()) > m_elecEtaCut){ // apply electron |eta| cut
420 continue;
421 }
422 if (trackSelectionElectrons(el, primVertexCnt, ei) == true){
423 if (eOverPElectron(el) == true){ // if 0.7 < E/p < 1.4
424 electronSelectionCnt->push_back( el );
425 }
426 }
427 else continue;
428 }
429
430 if (m_doElecSelectByTrackOnly){ // do not proceed to T&P
431 ATH_CHECK (evtStore()->record( electronSelectionCnt.release(), "MySelectedElectrons"));
432 return StatusCode::SUCCESS;
433 }
434
435 if (electronSelectionCnt->size() < 2){
436 ATH_MSG_DEBUG("(TagAndProbe) Not enough Electrons for T&P (nElectrons="<<electronSelectionCnt->size() << "). Storing "<<electronSelectionCnt->size()<<" electron on MyTagAndProbeElectrons container. This will not be dumped!");
437 ATH_CHECK (evtStore()->record( TagAndProbeElectronSelectionCnt.release(), "MyTagAndProbeElectrons"));
438 return StatusCode::SUCCESS;
439 }
440
441 // ## Loop over electron container in search of Zee pairs ##
442 for (const xAOD::Electron *elTag : *electronSelectionCnt){
443
444 if (! isTagElectron(elTag)) continue;
445 ATH_MSG_DEBUG("(TagAndProbe) Electron is a Tag!");
446
447 for (const xAOD::Electron *elProbe : *electronSelectionCnt){
448 if (elTag==elProbe) continue;
449
450 //check for charge (opposite charges for Zee)
451 if ( elTag->charge() == elProbe->charge() ) continue;
452 ATH_MSG_DEBUG ("(TagAndProbe) Electron Pair Charges are opposite! Good.");
453
454 //check for Zee mass
455 TLorentzVector el1;
456 TLorentzVector el2;
457 el1.SetPtEtaPhiE(elTag->pt(), elTag->trackParticle()->eta(), elTag->trackParticle()->phi(), elTag->e());
458 el2.SetPtEtaPhiE(elProbe->pt(), elProbe->trackParticle()->eta(), elProbe->trackParticle()->phi(), elProbe->e());
459
460 float tpPairMass = (el1 + el2).M(); // mass of the electron pair
461 ATH_MSG_DEBUG ("(TagAndProbe) Electron Pair mass: " << tpPairMass << ". Min: "<< m_minZeeMassTP*GeV << ". Max: " << m_maxZeeMassTP*GeV);
462 if (!((tpPairMass > m_minZeeMassTP*GeV) && (tpPairMass < m_maxZeeMassTP*GeV))){
463 ATH_MSG_DEBUG ("(TagAndProbe) Electron pair not in Z mass window.");
464 continue;
465 }
466 else{
467 ATH_MSG_INFO ("(TagAndProbe) Electron-positron pair are in Z mass window.");
468 // test for goodProbeElectron
469 if (!isGoodProbeElectron(elProbe)){
470 ATH_MSG_DEBUG (" Probe electron not passed in Goodnes of Probe test.");
471 continue;
472 }
473 ATH_MSG_INFO("(TagAndProbe) Electron is a good probe.");
474 ATH_MSG_INFO ("Tag and probe pair found.");
475
476 ATH_MSG_INFO ("TAG: pt="<< elTag->pt() << " e="<< elTag->e());
477 ATH_MSG_INFO ("PRO: pt="<< elProbe->pt() << " e="<< elProbe->e());
478 ATH_MSG_INFO ("Zee: M="<< tpPairMass << " E="<< (el1 + el2).E());
479 m_zee_M->push_back((el1 + el2).M());
480 m_zee_E->push_back((el1 + el2).E());
481 m_zee_pt->push_back((el1 + el2).Pt());
482 m_zee_px->push_back((el1 + el2).Px());
483 m_zee_py->push_back((el1 + el2).Py());
484 m_zee_pz->push_back((el1 + el2).Pz());
485 m_zee_T->push_back((el1 + el2).T());
486 m_zee_deltaR->push_back(el1.DeltaR(el2));
487
488 // ****************************************************************
489 // store electrons in a container to dump their clusters and cells.
490 TagAndProbeElectronSelectionCnt->push_back( (elTag) );
491 // ****************************************************************
492 }
493 } //end-loop probe electrons
494 } //end-loop tag electrons
495
496 ATH_CHECK (evtStore()->record( TagAndProbeElectronSelectionCnt.release(), "MyTagAndProbeElectrons"));
497 return StatusCode::SUCCESS;
498}
499
501 ATH_MSG_INFO("Dumping Truth Particle...");
502
503 auto elecCandidates = std::make_unique<ConstDataVector<xAOD::TruthParticleContainer>> (SG::VIEW_ELEMENTS);
504
505 if (truthParticleCnt->size() == 0) ATH_MSG_INFO("truthParticleCnt is empty!");
506 else{
507 for (const xAOD::Electron *recElectron : *electronSelectionCnt){
508
510 elecCandidates->push_back( truth );
511
512 ATH_MSG_INFO("(TruthParticle) Reco pt="<< recElectron->pt()<<" , Truth pt= "<< truth->pt());
513 }
514 }
515
516 if (elecCandidates->size() > 0) ATH_MSG_INFO("(TruthParticle) Size of elecCandidates is "<< elecCandidates->size()<<" !");
517
518 for (const xAOD::TruthParticle *elecSelected : *elecCandidates){
519 const xAOD::TruthVertex* vertex = elecSelected->prodVtx();
520
521 TLorentzVector elecCandidateLorentz;
522 elecCandidateLorentz.SetPtEtaPhiE(elecSelected->pt(),elecSelected->eta(),elecSelected->phi(),elecSelected->e());
523
524 m_mc_vert_x->push_back(vertex->x()); // vertex displacement
525 m_mc_vert_y->push_back(vertex->y()); // vertex displacement
526 m_mc_vert_z->push_back(vertex->z()); // vertex displacement in beam direction
527 m_mc_vert_time->push_back(vertex->t()); // vertex time
528 m_mc_vert_perp->push_back(vertex->perp()); // Vertex transverse distance from the beam line
529 m_mc_vert_eta->push_back(vertex->eta()); // Vertex pseudorapidity
530 m_mc_vert_phi->push_back(vertex->phi()); // Vertex azimuthal angle
531 m_mc_vert_uniqueID->push_back(HepMC::uniqueID(vertex));
532 m_mc_vert_status->push_back(HepMC::status(vertex));
533
534 m_mc_part_energy->push_back(elecSelected->e());
535 m_mc_part_pt->push_back(elecSelected->pt());
536 m_mc_part_pdgId->push_back(elecSelected->pdgId());
537 m_mc_part_m->push_back(elecSelected->m());
538 m_mc_part_phi->push_back(elecSelected->phi());
539 m_mc_part_eta->push_back(elecSelected->eta());
540 }
541 ATH_CHECK (evtStore()->record( elecCandidates.release(), "MyMatchedTruthElectrons"));
542 return StatusCode::SUCCESS;
543
544}
545
546StatusCode EventReaderAlg::dumpClusterCells(const xAOD::CaloCluster *cl, int clusIndex, const EventContext& ctx){
547
549 if(!LarDigCnt.isValid()) ATH_MSG_ERROR("LArDigitContainer is not a valid container!");
551 if(!LArRawCnt.isValid()) ATH_MSG_ERROR("LArRawChannelContainer is not a valid container!");
552
553 // calorimeter level
554 std::bitset<200000> larClusteredDigits;
555 std::vector<size_t> caloHashMap;
556 std::vector<HWIdentifier> channelHwidInClusterMap; //unique for any readout in the ATLAS
557 std::vector<int> cellIndexMap;
558 std::vector<float> channelIndexMap;
559 std::vector<int> cellLayerMap;
560 // cell level
561 std::vector<double> clusCellEtaMap;//unused
562 std::vector<double> clusCellPhiMap; //unused
563 // channel level
564 std::vector<double> channelEnergyInClusterMap;
565 std::vector<double> channelTimeInClusterMap;
566 std::vector<double> channelEtaInClusterMap;
567 std::vector<double> channelPhiInClusterMap;
568 std::vector<float> channelEffectiveSigmaClusterMap;
569 std::vector<float> channelNoiseClusterMap;
570
571 std::vector<int> channelCaloRegionMap;
572 std::vector<bool> badChannelMap;
573
574 // cluster
575 double clusEta = cl->eta();
576 double clusPhi = cl->phi();
577 double clusEt = cl->et();
578 double clusPt = cl->pt();
579 double clusTime = cl->time();
580
581 ATH_MSG_DEBUG (" (Cluster) Cluster: "<< clusIndex <<", numberCells: " << cl->numberCells() << ", e = " << cl->e() << ", time = "<< clusTime << ", pt = " << cl->pt() << " , eta = " << cl->eta() << " , phi = " << cl->phi());
582
583 // loop over cells in cluster
584 auto itrCellsBegin = cl->cell_begin();
585 auto itrCellsEnd = cl->cell_end();
586 int cellNum = 0; //cell number just for printing out
587
588 for (auto itCells=itrCellsBegin; itCells != itrCellsEnd; ++itCells){
589 const CaloCell* cell = (*itCells); //get the caloCells
590 if (cell){ // check for empty clusters
591 Identifier cellId = cell->ID();
592
593 int caloRegionIndex = getCaloRegionIndex(cell); // custom caloRegionIndex based on caloDDE
594
595 double eneCell = cell->energy();
596 double timeCell = cell->time();
597 double etaCell = cell->eta();
598 double phiCell = cell->phi();
599 int gainCell = cell->gain(); // CaloGain type
600 int layerCell = m_calocell_id->calo_sample(cell->ID());
601 bool badCell = cell->badcell(); // applied to LAR channels. For Tile, we use TileCell* tCell->badch1() or 2.
602 bool isTile = cell->caloDDE()->is_tile();
603 bool isLAr = cell->caloDDE()->is_lar_em();
604 bool isLArFwd = cell->caloDDE()->is_lar_fcal();
605 bool isLArHEC = cell->caloDDE()->is_lar_hec();
606 double detaCell = cell->caloDDE()->deta(); //delta eta - granularity
607 double dphiCell = cell->caloDDE()->dphi(); //delta phi - granularity
608 float effSigma = m_noiseCDO->getEffectiveSigma(cell->ID(), cell->gain(), cell->energy()); // effective sigma of cell related to its noise.
609 float cellNoise = m_noiseCDO->getNoise(cell->ID(), cell->gain()); // cell noise value
610
611 IdentifierHash chidHash;
612 HWIdentifier chhwid;
613 size_t index;
614
615 // ========= TileCal ==========
616 if (isTile) continue;
617
618 // ========= LAr ==========
619 else if ((isLAr) || (isLArFwd) || (isLArHEC)) { //LAr
620 chhwid = m_larCabling->createSignalChannelID(cellId);
621 chidHash = m_onlineLArID->channel_Hash(chhwid);
622 index = (size_t) (chidHash);
623
624 if (larClusteredDigits.test(index)) {
625 ATH_MSG_ERROR (" ##### (Cluster) Error LAr: Conflict index position in Channel map. Position was already filled in this event. Skipping the cell of index: " << index << " and hwid: " << chhwid << ". Cell_E/t="<<cell->energy() << "/"<< cell->time() << ". Eta/Phi: "<< cell->eta() << "/" << cell->phi());
626 continue;
627 }
628 if (badCell && m_noBadCells){
629 ATH_MSG_INFO (" (Cluster)(LAr) Cell "<< cellNum <<" in cluster is a bad LAr channel! Skipping the cell.");
630 continue;
631 }
632 larClusteredDigits.set(index);
633 caloHashMap.push_back(index);
634 cellIndexMap.push_back(m_c_cellIndexCounter);
635 clusCellEtaMap.push_back(etaCell);
636 clusCellPhiMap.push_back(phiCell);
637 cellLayerMap.push_back(layerCell);
638 channelIndexMap.push_back( m_c_cellIndexCounter );
639 channelHwidInClusterMap.push_back(chhwid);
640 channelTimeInClusterMap.push_back(timeCell);
641 channelEnergyInClusterMap.push_back(eneCell);
642 channelCaloRegionMap.push_back(caloRegionIndex);
643 channelEffectiveSigmaClusterMap.push_back(effSigma);
644 channelNoiseClusterMap.push_back(cellNoise);
645 if (!m_noBadCells) badChannelMap.push_back(badCell);
646
647 if (m_printCellsClus){ //optional to help debugging
648 ATH_MSG_INFO (" (Cluster) in IsLAr: Cell (layer) "<< cellNum << " (" << layerCell <<") ID: " << cellId << "). HwId (B_EC/P_N/FeedTr/slot/ch) " << chhwid << " (" << m_onlineLArID->barrel_ec(chhwid) << "/" << m_onlineLArID->pos_neg(chhwid) << "/"<< m_onlineLArID->feedthrough(chhwid) << "/" << m_onlineLArID->slot(chhwid) << "/" << m_onlineLArID->channel(chhwid) << ") . Index: " << index << ". ene " << eneCell << ". time " << timeCell << ". D_eta: " << detaCell << ". D_phi: " << dphiCell << " ):" << ". Eta/Phi: "<< cell->eta() << "/" << cell->phi());
649 }
650 } //end else LAr
651
652 else {
653 ATH_MSG_ERROR (" ####### (Cluster) ERROR ! No CaloCell region was found!");
654 continue;
655 }
656
657 // ##############################
658 // CELL INFO DUMP (CLUSTER)
659 // ##############################
660 const double clusterDphiRaw = clusPhi - phiCell;
661 double cluster_dphi = 0.;
662
663 if (clusterDphiRaw < -pi) {
664 cluster_dphi = twopi + clusterDphiRaw;
665 }
666 else if (clusterDphiRaw > pi) {
667 cluster_dphi = clusterDphiRaw - twopi;
668 }
669 else {
670 cluster_dphi = clusterDphiRaw;
671 }
672
673 m_c_clusterIndex_cellLvl->push_back(clusIndex);
675 m_c_cellGain->push_back(gainCell);
676 m_c_cellLayer->push_back(layerCell);
677 m_c_cellEnergy->push_back(eneCell);
678 m_c_cellTime->push_back(timeCell);
679 m_c_cellEta->push_back(etaCell);
680 m_c_cellPhi->push_back(phiCell);
681 m_c_cellDEta->push_back(detaCell);
682 m_c_cellDPhi->push_back(dphiCell);
683 m_c_cellToClusterDEta->push_back(clusEta - etaCell);
684 m_c_cellToClusterDPhi->push_back(cluster_dphi);
685 m_c_cellRegion->push_back(caloRegionIndex);
686
688 cellNum++;
689 } // end if-cell is empty verification
690 } // end loop at cells inside cluster
691
692 // ##############################
693 // CLUSTER INFO DUMP (CLUSTER)
694 // // ##############################
695 m_c_clusterIndex->push_back(clusIndex);
696 m_c_clusterEnergy->push_back(clusEt);
697 m_c_clusterTime->push_back(clusTime);
698 m_c_clusterEta->push_back(clusEta);
699 m_c_clusterPhi->push_back(clusPhi);
700 m_c_clusterPt->push_back(clusPt);
701
702 // ##############################
703 // DIGITS CHANNEL INFO DUMP (CLUSTER)
704 // ##############################
705 // Loop over ALL channels in LAr Digit Container.
706 // Dump only the channels inside the previous clusters
707
708 // ========= LAr ==========
709 if (larClusteredDigits.any()){
710 // -- LAr_Hits --
712 ATH_MSG_DEBUG (" (Cluster-HITS) Dumping LAr EMB Hits...");
713
714 m_ncell = m_calocell_id->calo_cell_hash_max();
715
717 if(!larHitCnt.isValid()) ATH_MSG_ERROR("LAr EMB Hit container is not valid!");
718
719 for (unsigned int k=0 ; k < channelHwidInClusterMap.size() ; k++){
720 double cell_total_ene = 0.0;
721 double cell_total_eneCalib = 0.0;
722 double cell_hit_tof = -999.0;
723 double hit_ene = 0.;
724 double hit_time = 0.;
725 float hit_fSampCalib = 1.;
726 int hit_sampling = 0;
727 size_t hit_index1 = 0;
728 bool thereIsOneHitToDump = false;
729 std::vector<double> hitEnergiesFromMap;
730 std::vector<double> hitTimesFromMap ;
731
732 for (const LArHit* hit : *larHitCnt){
733 Identifier hit_cellID = hit->cellID();
734 HWIdentifier hit_hwid = m_larCabling->createSignalChannelID(hit_cellID);
735 IdentifierHash hit_idHash = m_onlineLArID->channel_Hash(hit_hwid);
736 hit_index1 = (size_t) (hit_idHash);//(m_calocell_id->calo_cell_hash(hit_cellID));
737
738 if (larClusteredDigits.test(hit_index1)){
739 if (channelHwidInClusterMap[k]==hit_hwid){
740
741 hit_ene = hit->energy();
742 hit_time = hit->time();
743 hit_sampling = m_calocell_id->calo_sample(hit_cellID);
744
745 if (hit_index1 < m_ncell && fabs(hit_time) < 25.){ // time < 25 ns (current BC)
746 hitEnergiesFromMap.push_back(hit_ene);
747 hitTimesFromMap.push_back(hit_time);
748 hit_fSampCalib = m_fSampl->FSAMPL(hit_cellID);
749 thereIsOneHitToDump = true;
750
751 ATH_MSG_DEBUG ("(HITS) Match in "<< k <<"/"<< channelHwidInClusterMap.size() <<"! Sampling "<< hit_sampling << ", Cell (clus): "<< channelIndexMap[k] <<" ("<< clusIndex <<"), ID (mapHwid / hwid / hash ): "<< hit_cellID << " ("<< channelHwidInClusterMap[k] << " / "<< hit_hwid << " / "<< hit_index1 <<"), hitEne: "<< hit_ene <<", hitTime: "<< hit_time << ", m_fSampl: "<< hit_fSampCalib <<". eta="<< clusCellEtaMap[k]<< ", phi="<<clusCellPhiMap[k]<<".");
752
753 }// end-if caloHashMap matches
754 }// end-if cluster map has this hit_index
755 }// end-if current bc test
756 }// end-if current bc test
757
758 if (thereIsOneHitToDump){
759 for (auto hitE : hitEnergiesFromMap){
760 cell_total_ene += hitE;
761 cell_total_eneCalib += hitE / hit_fSampCalib; //calib energy from hits
762 }
763 cell_hit_tof = *std::min_element(hitTimesFromMap.begin(), hitTimesFromMap.end());
764
765 m_hits_energy->push_back(cell_total_ene);
766 m_hits_time->push_back(cell_hit_tof);
767 m_hits_sampling->push_back(hit_sampling);
768 m_hits_clusterIndex_chLvl->push_back(clusIndex);
769 m_hits_clusterChannelIndex->push_back(channelIndexMap[k]);
770 m_hits_hash->push_back(hit_index1);
771 m_hits_sampFrac->push_back(hit_fSampCalib);
772 m_hits_energyConv->push_back(cell_total_eneCalib);
773 m_hits_cellEta->push_back(clusCellEtaMap[k]);
774 m_hits_cellPhi->push_back(clusCellPhiMap[k]);
775 }
776 else{
777 ATH_MSG_DEBUG("(HITS) Hit from cell "<< k <<"/"<< channelHwidInClusterMap.size() <<" not found! Sampling "<< hit_sampling << ", Cell (clus): "<< channelIndexMap[k] <<" ("<< clusIndex <<"), mapHwid: "<< channelHwidInClusterMap[k]<<". eta="<< clusCellEtaMap[k]<< ", phi="<<clusCellPhiMap[k]<<".");
778 }
779 hitEnergiesFromMap.clear();
780 hitTimesFromMap.clear();
781
782 }// end for loop over caloHashMaps
783 }// end-if isMC and dumpHits
784
785
786 // -- LAr_Digits --
787 ATH_MSG_DEBUG (" (Cluster) Dumping LAr Digits...");
788
789 for (const LArDigit* dig : *LarDigCnt) {
790 HWIdentifier channelID = dig->channelID();
791 IdentifierHash idHash = m_onlineLArID->channel_Hash(channelID);
792 size_t index = (size_t) (idHash);
793
794 if (larClusteredDigits.test(index)) {
795 for (unsigned int k=0 ; k < channelHwidInClusterMap.size() ; k++){
796 if (channelHwidInClusterMap[k]==channelID){
797
798 // digits
799 std::vector<short> larDigitShort = dig->samples();
800 std::vector<float> larDigit( larDigitShort.begin(), larDigitShort.end() ); // get vector conversion from 'short int' to 'float'
801 m_c_channelDigits->push_back(larDigit);
802
803 const HWIdentifier digId = dig->hardwareID();
804 const int digGain = dig->gain();
805 auto ofc_a = m_ofcs->OFC_a(digId, digGain);
806 auto ofc_b = m_ofcs->OFC_b(digId, digGain);
807
808 std::vector<double> ofca, ofcb, shape, shapeDer;
809 const IdentifierHash& dig_cell_hashId = m_onlineLArID->channel_Hash(channelID);
810 for (size_t k=0; k < ofc_a.size(); k++) ofca.push_back((double) ofc_a[k]);
811 for (size_t k=0; k < ofc_b.size(); k++) ofcb.push_back((double) ofc_b[k]);
812
813 const auto& adc2mev = m_adc2MeVs->ADC2MEV(digId, digGain);
814 const float pedLAr = m_peds->pedestal(digId, digGain);
815 const auto& minBiasLAr = m_minBiasAvgs->minBiasAverage(digId);
816
817 // Remark: Looks like the EC does not have this rescale in DB (?)
818 if (!m_isMC){
819 auto sig_shape = m_shapes->Shape(digId, digGain);
820 auto sig_shapeDer = m_shapes->ShapeDer(digId, digGain);
821 for (size_t k=0; k < sig_shape.size(); k++) shape.push_back((double) sig_shape[k]);
822 for (size_t k=0; k < sig_shapeDer.size(); k++) shapeDer.push_back((double) sig_shapeDer[k]);
823
824 float offl_EneRescaler = 1.0; // if the channel is outside of hash_id limits from DB, set scale to 1.0 (energy remains unchanged).
825 const auto& offl_hv = m_oflHVCorr->HVScaleCorr(digId);
826 if (dig_cell_hashId < m_EneRescaler->getNChans()){ // if the channel is INSIDE the hash_id limit, get the data from DB.
827 offl_EneRescaler = m_EneRescaler->getData(dig_cell_hashId,0,0); // IMPORTANT REMARK: There was an update in Athena v23, compared to v22. There is a new <T> for getData() instance, which no longer needs the 2nd and 3rd accessor (adc, gain).
828 }
829 m_c_channelDSPThreshold->push_back(m_run2DSPThresh->tQThr(digId));
830 m_c_channelOfflEneRescaler->push_back(offl_EneRescaler);
831 m_c_channelOfflHVScale->push_back(offl_hv);
832 m_c_channelShape->push_back(shape);
833 m_c_channelShapeDer->push_back(shapeDer);
834 }
835 // Cell / readout data
836 m_c_channelEnergy->push_back(channelEnergyInClusterMap[k]);
837 m_c_channelTime->push_back(channelTimeInClusterMap[k]);
838 m_c_channelLayer->push_back(cellLayerMap[k]);
839 m_c_channelEffectiveSigma->push_back(channelEffectiveSigmaClusterMap[k]);
840 m_c_channelNoise->push_back(channelNoiseClusterMap[k]);
841 if (!m_noBadCells) m_c_channelBad->push_back(badChannelMap[k]);
842 // Calibration constants
843 m_c_channelOFCa->push_back(ofca);
844 m_c_channelOFCb->push_back(ofcb);
845 m_c_channelOFCTimeOffset->push_back(m_ofcs->timeOffset(digId,digGain));
846 m_c_channelADC2MEV0->push_back(adc2mev[0]);
847 m_c_channelADC2MEV1->push_back(adc2mev[1]);
848 m_c_channelPed->push_back(pedLAr);
849 m_c_channelMinBiasAvg->push_back(minBiasLAr);
850
851 // Channel info
852 int barrelEc = m_onlineLArID->barrel_ec(channelID);
853 int posNeg = m_onlineLArID->pos_neg(channelID);
854 int feedThr = m_onlineLArID->feedthrough(channelID); // feedthrough - cabling interface from cold and hot side. in barrel, there are 2 feedThr for each crate.
855 int slot = m_onlineLArID->slot(channelID);
856 int chn = m_onlineLArID->channel(channelID);
857 std::vector<int> chInfo {barrelEc, posNeg, feedThr, slot, chn } ; //unite info
858 m_c_channelChInfo->push_back(chInfo); //add to the list of cell info (both calo)
859
860 // important indexes
861 m_c_clusterChannelIndex->push_back(channelIndexMap[k]);//each LAr cell is an individual read out.
862 m_c_clusterIndex_chLvl->push_back(clusIndex); // what roi this cell belongs at the actual event: 0, 1, 2 ...
863 m_c_channelHashMap->push_back(index); // online id hash for channel
864 m_c_channelChannelIdMap->push_back(channelID.get_identifier32().get_compact());
865
866
867 if (m_printCellsClus){
868
869 ATH_MSG_INFO ("(Cluster) In DumpLAr Digits: ReadOutIndex "<< channelIndexMap[k] << ". HwId " << channelID);
870 ATH_MSG_INFO ("(Cluster) In DumpLAr Digits: ReadOutIndex "<< channelIndexMap[k] << " HwId.get_compact() " << channelID.get_compact());
871 ATH_MSG_INFO ("(Cluster) In DumpLAr Digits: ReadOutIndex "<< channelIndexMap[k] << " HwId.get_identifier32().get_compact() " << channelID.get_identifier32().get_compact());
872
873 ATH_MSG_INFO("(Cluster) LAr OFC timeOffset: "<< m_ofcs->timeOffset(digId, digGain) <<", dig->hardwareID: " << digId << ", dig->channelID: "<< channelID);
874 ATH_MSG_INFO("\tOFCa ("<< ofca.size()<<"): ["<< ofca[0] <<", " << ofca[1] <<", " << ofca[2]<<", " << ofca[3] <<"]");
875 ATH_MSG_INFO("\tOFCb ("<< ofcb.size()<<"): ["<< ofcb[0] <<", " << ofcb[1] <<", " << ofcb[2]<<", " << ofcb[3] <<"]");
876
877 ATH_MSG_DEBUG ("(Cluster) In DumpLAr Digits: ReadOutIndex "<< channelIndexMap[k] << ". HwId (B_EC/P_N/FeedTr/slot/ch) " << channelID << " (" << barrelEc << "/" << posNeg << "/"<< feedThr << "/" << slot << "/" << chn << ". Dig (float): " << larDigit);
878
879 }
880 } //end-if caloHashMap matches
881 } //end for loop over caloHashMaps
882 } // end-if clustBits Test
883 } //end loop over LAr digits container
884 } //end-if larClustBits is not empty
885
886 // ##############################
887 // RAW CHANNEL INFO DUMP (CLUSTER)
888 // ##############################
889
890 // ========= LAr ==========
891 if (larClusteredDigits.any()) {
892 ATH_MSG_INFO ("(Cluster) Dumping LAr Raw Channel...");
893
894 for (const LArRawChannel& LArChannel : *LArRawCnt){
895
896 HWIdentifier channelID = LArChannel.channelID();
897 IdentifierHash chHwidHash = m_onlineLArID->channel_Hash(channelID);
898
899 size_t index = static_cast<size_t>(chHwidHash);
900
901 if (larClusteredDigits.test(index)){ //if this channel index is inside
902 for (unsigned int k=0 ; k < channelHwidInClusterMap.size() ; k++){ //loop over the vector of hashIndex, and verify if the cell index match.
903 if (channelHwidInClusterMap[k] == channelID){
904
905 //RawCh info
906 int rawEnergy = LArChannel.energy(); // energy in MeV (rounded to integer)
907 int rawTime = LArChannel.time(); // time in ps (rounded to integer)
908 uint16_t rawQuality = LArChannel.quality(); // quality from pulse reconstruction
909 int provenance = static_cast<int>(LArChannel.provenance()); // its uint16_t
910 float rawEnergyConv = static_cast<float>(rawEnergy);
911 float rawTimeConv = static_cast<float>(rawTime);
912 float rawQualityConv = static_cast<float>(rawQuality);
913
914 // Channel info
915 int barrelEc = m_onlineLArID->barrel_ec(channelID);
916 int posNeg = m_onlineLArID->pos_neg(channelID);
917 int feedThr = m_onlineLArID->feedthrough(channelID); // feedthrough - cabling interface from cold and hot side. in barrel, there are 2 feedThr for each crate.
918 int slot = m_onlineLArID->slot(channelID);
919 int chn = m_onlineLArID->channel(channelID);
920 std::vector<int> chInfo {barrelEc, posNeg, feedThr, slot, chn } ; //unite info
921 m_c_rawChannelChInfo->push_back(chInfo); //add to the list of cell info (both calo)
922
923 if ( (rawEnergy != rawEnergyConv) || (rawTime != rawTimeConv) || (rawQuality != rawQualityConv) ){
924 ATH_MSG_ERROR (" ###### (Cluster) LAR RAW CHANNEL: Value conversion from int to float of amplitude, time or quality (uint16_t) had changed its actual value !!!");
925 }
926 m_c_rawChannelAmplitude->push_back(rawEnergyConv);
927 m_c_rawChannelTime->push_back(rawTimeConv);
928 m_c_rawChannelLayer->push_back(cellLayerMap[k]);
929 m_c_rawChannelQuality->push_back(rawQualityConv);
930 m_c_rawChannelProv->push_back(provenance);
931 m_c_rawChannelPed->push_back(-8888); // masked LAr
932 if (!m_isMC){
933 m_c_rawChannelDSPThreshold->push_back(m_run2DSPThresh->tQThr(channelID));
934 }
935
936 // important indexes
937 m_c_clusterRawChannelIndex->push_back(channelIndexMap[k]);
938 m_c_clusterIndex_rawChLvl->push_back(clusIndex); // what roi this ch belongs
939 m_c_rawChannelIdMap->push_back(channelID.get_identifier32().get_compact());
940
941 if (m_printCellsClus){ //optional to help debugging
942
943 HWIdentifier hardwareID = LArChannel.hardwareID();
944
945 if (!m_isMC){
946 ATH_MSG_INFO ("(Cluster) In DumpLAr Raw "<< channelIndexMap[k] <<": hardwareID (B_EC/P_N/feedThr/slot/chn): " << hardwareID << "(" << barrelEc << "/" << posNeg << "/" << feedThr << "/" << slot << "/" << chn << ")" << ". Energy: " << rawEnergyConv << ". Time: " << rawTimeConv << ". Provenance: " << provenance << ". Quality: " << rawQualityConv <<" ecut (DSPThr) = " << m_run2DSPThresh->tQThr(channelID));
947 }
948 else{
949 ATH_MSG_INFO ("(Cluster) In DumpLAr Raw "<< channelIndexMap[k] <<": hardwareID (B_EC/P_N/feedThr/slot/chn): " << hardwareID << "(" << barrelEc << "/" << posNeg << "/" << feedThr << "/" << slot << "/" << chn << ")" << ". Energy: " << rawEnergyConv << ". Time: " << rawTimeConv << ". Provenance: " << provenance << ". Quality: " << rawQualityConv);
950 }
951
952 } // end-if optional cell print
953 } // end-if hwid match rawChID
954 } // end loop over HWIDClusterMap
955 } // end-if clust.test
956 } //end loop LArRawChannelContainer
957 } // end-if clustBits have Cells
958
959 larClusteredDigits.reset();
960
961 caloHashMap.clear();
962
963 channelHwidInClusterMap.clear();
964 cellIndexMap.clear();
965 cellLayerMap.clear();
966 clusCellEtaMap.clear();
967 clusCellPhiMap.clear();
968 channelIndexMap.clear();
969 channelEnergyInClusterMap.clear();
970 channelTimeInClusterMap.clear();
971 channelEtaInClusterMap.clear();
972 channelPhiInClusterMap.clear();
973 channelEffectiveSigmaClusterMap.clear();
974 channelNoiseClusterMap.clear();
975 channelCaloRegionMap.clear();
976 if (!m_noBadCells) badChannelMap.clear();
977
978 ATH_MSG_INFO (" (Cluster) RawChannel: "<< m_c_rawChannelAmplitude->size() <<" channels dumped, from " << m_c_cellEta->size() <<" cluster cells. ");
979 ATH_MSG_INFO (" (Cluster) Digits: "<< m_c_channelDigits->size() <<" channels dumped, out of " << m_c_rawChannelAmplitude->size() <<" raw channel cluster channels. ");
980 if (m_c_channelDigits->size() == m_c_rawChannelAmplitude->size()){
981 ATH_MSG_INFO (" (Cluster) ALL Digits from the cluster were dumped successfully!");}
982 else{
983 ATH_MSG_INFO (" (Cluster) The digits from "<< (m_c_rawChannelAmplitude->size() - m_c_channelDigits->size()) <<" channels are missing!");}
984
985
986 return StatusCode::SUCCESS;
987}
988
989
991 ATH_MSG_DEBUG ("Finalizing " << name() << "...");
992 m_secondTree->Fill();
993
994 return StatusCode::SUCCESS;
995}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
static Double_t sc
#define pi
constexpr double twopi
const ServiceHandle< StoreGateSvc > & detStore() const
Data object for each calorimeter readout cell.
Definition CaloCell.h:57
static CaloCondBlobFlt * getInstance(coral::Blob &blob)
Returns a pointer to a non-const CaloCondBlobFlt.
const ILArMinBiasAverage * m_minBiasAvgs
SG::ReadHandleKey< xAOD::EventInfo > m_eventInfoSgKey
SG::ReadHandleKey< LArDigitContainer > m_larDigitCntSgKey
virtual StatusCode finalize() override
SG::ReadHandleKey< xAOD::VertexContainer > m_primVertSgKey
Gaudi::Property< bool > m_skipEmptyEvents
SG::ReadCondHandleKey< LArOnOffIdMapping > m_larCablingKey
const LArEM_ID * m_larem_id
Gaudi::Property< bool > m_getAssociatedTopoCluster
SG::ReadCondHandleKey< ILArMinBiasAverage > m_minBiasAvgKey
SG::ReadCondHandleKey< LArADC2MeV > m_adc2MeVKey
const LArADC2MeV * m_adc2MeVs
virtual StatusCode dumpOfflineSS(const xAOD::Electron *electron)
virtual StatusCode dumpTruthParticle(SG::ReadHandle< xAOD::ElectronContainer > &electronSelectionCnt, SG::ReadHandle< xAOD::TruthParticleContainer > &truthParticleCnt)
const CaloCondBlobFlt * m_EneRescaler
SG::ReadHandleKey< xAOD::ElectronContainer > m_myElecSelectionSgKey
SG::ReadCondHandleKey< LuminosityCondData > m_lumiDataKey
Gaudi::Property< bool > m_printCellsClus
Gaudi::Property< float > m_minZeeMassTP
virtual StatusCode FillNTupleWithSelectedElectrons(SG::ReadHandle< xAOD::EventInfo > &ei, SG::ReadHandle< xAOD::VertexContainer > &primVertexCnt, SG::ReadHandle< xAOD::ElectronContainer > &electronSelectionCnt, std::string &eSelectionText, const EventContext &ctx)
const ILArShape * m_shapes
const ILArOFC * m_ofcs
virtual StatusCode dumpLumiblockInfo(SG::ReadHandle< xAOD::EventInfo > &ei)
EventReaderAlg(const std::string &name, ISvcLocator *pSvcLocator)
const ILArPedestal * m_peds
virtual StatusCode dumpClusterCells(const xAOD::CaloCluster *cl, int clusIndex, const EventContext &ctx)
SG::ReadHandleKey< xAOD::TruthEventContainer > m_truthEventCntSgKey
const LArFCAL_ID * m_larfcal_id
const LArOnlineID * m_onlineLArID
const LArHEC_ID * m_larhec_id
const CaloIdManager * m_caloIdMgr
SG::ReadHandleKey< CaloCellContainer > m_allCaloCellCntSgKey
const ILArfSampl * m_fSampl
SG::ReadCondHandleKey< AthenaAttributeList > m_run2DSPThresholdsKey
virtual StatusCode initialize() override
SG::ReadHandleKey< LArRawChannelContainer > m_larRawChCntSgKey
const CaloNoise * m_noiseCDO
virtual StatusCode dumpEventInfo(SG::ReadHandle< xAOD::EventInfo > &ei)
virtual StatusCode dumpPrimVertexAssocToElectron(const xAOD::Electron *el, SG::ReadHandle< xAOD::VertexContainer > &primVertexCnt, SG::ReadHandle< xAOD::EventInfo > &evtInfo)
SG::ReadCondHandleKey< ILArfSampl > m_fSamplKey
virtual StatusCode dumpZeeCut(SG::ReadHandle< xAOD::EventInfo > &ei, SG::ReadHandle< xAOD::VertexContainer > &primVertexCnt, const EventContext &ctx)
SG::ReadHandleKey< LArHitContainer > m_larEMBHitCntSgKey
SG::ReadHandleKey< xAOD::TruthParticleContainer > m_truthParticleCntSgKey
SG::ReadCondHandleKey< ILArShape > m_shapeKey
SG::ReadHandleKey< xAOD::ElectronContainer > m_electronCntSgKey
SG::ReadCondHandleKey< ILArOFC > m_ofcKey
SG::ReadCondHandleKey< ILArPedestal > m_pedestalKey
virtual StatusCode execute() override
Gaudi::Property< float > m_maxZeeMassTP
std::unique_ptr< LArDSPThresholdsFlat > m_run2DSPThresh
virtual StatusCode dumpElectrons(const xAOD::Electron *electron)
const LuminosityCondData * m_lumis
SG::ReadHandleKey< xAOD::CaloClusterContainer > m_caloClusSgKey
const LArOnOffIdMapping * m_larCabling
Gaudi::Property< bool > m_doClusterDump
SG::ReadCondHandleKey< CaloNoise > m_noiseCDOKey
const CaloCell_ID * m_calocell_id
const LArHVCorr * m_oflHVCorr
SG::ReadCondHandleKey< LArHVCorr > m_offlineHVScaleCorrKey
SG::ReadCondHandleKey< AthenaAttributeList > m_EneRescalerFldr
ServiceHandle< ITHistSvc > m_ntsvc
std::vector< float > * m_vtx_x
std::vector< std::vector< double > > * m_c_channelShape
std::vector< float > * m_el_deltae
std::vector< float > * m_c_channelPed
std::vector< int > * m_c_clusterIndex_rawChLvl
Gaudi::Property< float > m_d0TagSig
std::vector< double > * m_c_clusterEnergy
unsigned long long m_e_eventNumber
std::vector< float > * m_c_rawChannelQuality
std::vector< float > * m_el_fracs1
std::vector< int > * m_c_cellRegion
std::vector< unsigned int > * m_c_channelChannelIdMap
std::vector< double > * m_zee_py
std::vector< float > * m_el_wtots1
std::vector< double > * m_hits_cellPhi
std::vector< float > * m_el_Phi
std::vector< std::vector< double > > * m_c_channelShapeDer
Gaudi::Property< bool > m_doLArEMBHitsDump
std::vector< int > * m_c_clusterChannelIndex
Gaudi::Property< float > m_z0Tag
void bookDatabaseBranches(TTree *tree)
std::vector< double > * m_zee_px
std::vector< double > * m_zee_deltaR
std::vector< std::vector< float > > * m_lb_bcidLuminosity
std::vector< bool > * m_c_channelBad
std::vector< double > * m_hits_energyConv
std::vector< double > * m_c_cellTime
std::vector< float > * m_c_rawChannelProv
std::vector< float > * m_el_e277
std::vector< float > * m_el_rhad
std::vector< double > * m_vtx_d0sig
std::vector< int > * m_mc_vert_status
std::vector< std::vector< double > > * m_c_channelOFCb
std::vector< float > * m_mc_vert_phi
std::vector< std::vector< double > > * m_c_channelOFCa
std::vector< int > * m_mc_part_pdgId
std::vector< float > * m_c_rawChannelAmplitude
std::vector< float > * m_mc_vert_z
std::vector< double > * m_c_cellPhi
std::vector< float > * m_vtx_delta_z0_sin
std::vector< double > * m_c_cellEnergy
int getCaloRegionIndex(const CaloCell *cell)
std::vector< int > * m_c_clusterIndex_chLvl
std::vector< float > * m_mc_vert_y
std::vector< double > * m_zee_pt
std::vector< float > * m_hits_sampFrac
std::vector< int > * m_c_cellLayer
std::vector< double > * m_c_clusterPt
bool isGoodProbeElectron(const xAOD::Electron *el)
std::vector< float > * m_c_rawChannelPed
std::vector< float > * m_mc_part_pt
std::vector< int > * m_c_clusterIndex
std::vector< double > * m_c_cellToClusterDPhi
std::vector< float > * m_c_channelNoise
std::vector< int > * m_hits_clusterChannelIndex
std::vector< float > * m_el_f1
std::vector< float > * m_c_clusterRawChannelIndex
std::vector< float > * m_el_Pt
std::vector< int > * m_c_clusterCellIndex
bool isTagElectron(const xAOD::Electron *electron)
std::vector< float > * m_c_channelEffectiveSigma
std::vector< unsigned int > * m_c_channelHashMap
bool trackSelectionElectrons(const xAOD::Electron *electron, SG::ReadHandle< xAOD::VertexContainer > &primVertexCnt, SG::ReadHandle< xAOD::EventInfo > &ei)
std::vector< int > * m_c_rawChannelLayer
std::vector< std::vector< float > > * m_c_channelDigits
std::vector< double > * m_c_cellEta
std::vector< double > * m_c_cellDEta
std::vector< double > * m_hits_cellEta
Gaudi::Property< bool > m_doTruthPartDump
std::vector< float > * m_c_channelOfflEneRescaler
std::vector< double > * m_zee_M
std::vector< double > * m_zee_pz
std::vector< double > * m_c_cellDPhi
std::vector< float > * m_el_rhad1
std::vector< float > * m_el_weta1
EventReaderBaseAlg(const std::string &name, ISvcLocator *pSvcLocator)
std::vector< float > * m_el_et
std::vector< float > * m_vtx_z
std::vector< int > * m_lb_lumiblock
std::vector< int > * m_c_channelLayer
std::vector< double > * m_zee_T
std::vector< double > * m_c_clusterPhi
std::vector< int > * m_el_index
std::vector< std::vector< int > > * m_c_rawChannelChInfo
Gaudi::Property< bool > m_doTagAndProbe
Gaudi::Property< bool > m_isMC
std::vector< int > * m_mc_vert_uniqueID
std::vector< double > * m_hits_energy
std::vector< float > * m_c_channelADC2MEV1
std::vector< float > * m_mc_part_eta
std::vector< float > * m_mc_part_energy
std::vector< float > * m_el_Eta
std::vector< float > * m_c_channelOfflHVScale
std::vector< double > * m_c_channelTime
std::vector< int > * m_c_clusterIndex_cellLvl
std::vector< double > * m_c_clusterTime
void bookBranches(TTree *tree)
std::vector< float > * m_c_channelMinBiasAvg
std::vector< float > * m_mc_vert_time
std::vector< float > * m_c_channelDSPThreshold
std::vector< double > * m_c_clusterEta
std::vector< int > * m_c_cellGain
std::vector< float > * m_mc_part_phi
std::vector< float > * m_c_channelADC2MEV0
std::vector< int > * m_c_electronIndex_clusterLvl
std::vector< float > * m_mc_part_m
std::vector< double > * m_zee_E
std::vector< float > * m_mc_vert_x
Gaudi::Property< float > m_elecEtaCut
std::vector< float > * m_vtx_deltaZ0
std::vector< int > * m_hits_sampling
std::vector< std::vector< int > > * m_c_channelChInfo
std::vector< float > * m_c_rawChannelDSPThreshold
std::vector< float > * m_vtx_y
std::vector< double > * m_c_channelEnergy
std::vector< float > * m_el_rphi
Gaudi::Property< bool > m_doElecSelectByTrackOnly
std::vector< double > * m_c_channelOFCTimeOffset
std::vector< float > * m_el_eratio
std::vector< unsigned int > * m_hits_hash
std::vector< float > * m_c_rawChannelTime
Gaudi::Property< bool > m_noBadCells
std::vector< float > * m_mc_vert_eta
std::vector< float > * m_el_f3
std::vector< float > * m_el_reta
std::vector< int > * m_hits_clusterIndex_chLvl
std::vector< float > * m_mc_vert_perp
bool eOverPElectron(const xAOD::Electron *electron)
std::vector< float > * m_el_weta2
std::vector< float > * m_el_eoverp
std::vector< float > * m_el_m
std::vector< double > * m_c_cellToClusterDEta
std::vector< unsigned int > * m_c_rawChannelIdMap
std::vector< double > * m_hits_time
value_type get_compact() const
Get the compact id.
This is a "hash" representation of an Identifier.
value_type get_compact() const
Get the compact id.
Identifier32 get_identifier32() const
Get the 32-bit version Identifier, will be invalid if >32 bits needed.
Liquid Argon digit base class.
Definition LArDigit.h:25
Class to store hit energy and time in LAr cell from G4 simulation.
Definition LArHit.h:25
Liquid Argon ROD output object base class.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
@ LAr
The LAr calorimeter.
@ Error
The sub-detector issued an error.
float z0() const
Returns the parameter.
float theta() const
Returns the parameter, which has range 0 to .
float vz() const
The z origin for the parameters.
virtual double pt() const override final
The transverse momentum ( ) of the particle.
int uniqueID(const T &p)
int status(const T &p)
@ VIEW_ELEMENTS
this data object is a view, it does not own its elmts
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
Definition index.py:1
std::vector< const xAOD::CaloCluster * > getAssociatedTopoClusters(const xAOD::CaloCluster *cluster)
Return a vector of all the topo clusters associated with the egamma cluster.
@ wtots1
shower width is determined in a window detaxdphi = 0,0625 ×~0,2, corresponding typically to 20 strips...
@ e277
uncalibrated energy (sum of cells) of the middle sampling in a rectangle of size 7x7
Definition EgammaEnums.h:81
@ f3
fraction of energy reconstructed in 3rd sampling
Definition EgammaEnums.h:55
@ f1
E1/E = fraction of energy reconstructed in the first sampling, where E1 is energy in all strips belon...
Definition EgammaEnums.h:53
@ Eratio
(emaxs1-e2tsts1)/(emaxs1+e2tsts1)
@ DeltaE
e2tsts1-emins1
@ fracs1
shower shape in the shower core : [E(+/-3)-E(+/-1)]/E(+/-1), where E(+/-n) is the energy in ± n strip...
@ weta2
the lateral width is calculated with a window of 3x5 cells using the energy weighted sum over all cel...
@ weta1
shower width using +/-3 strips around the one with the maximal energy deposit: w3 strips = sqrt{sum(E...
Definition EgammaEnums.h:98
double d0significance(const xAOD::TrackParticle *tp, double d0_uncert_beam_spot_2)
const xAOD::TruthParticle * getTruthParticle(const xAOD::IParticle &p)
Return the truthParticle associated to the given IParticle (if any)
@ PriVtx
Primary vertex.
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.
TruthVertex_v1 TruthVertex
Typedef to implementation.
Definition TruthVertex.h:15
TrackParticle_v1 TrackParticle
Reference the current persistent version:
Vertex_v1 Vertex
Define the latest version of the vertex class.
TruthParticle_v1 TruthParticle
Typedef to implementation.
Electron_v1 Electron
Definition of the current "egamma version".