ATLAS Offline Software
ITkTrackClusterAssValidation.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include "GaudiKernel/IPartPropSvc.h"
6 #include "GaudiKernel/ServiceHandle.h"
12 #include "StoreGate/ReadHandle.h"
13 #include "HepPDT/ParticleDataTable.hh"
14 #include "AtlasHepMC/GenVertex.h"
15 #include "AtlasHepMC/GenParticle.h"
16 #include "AtlasHepMC/GenVertex.h"
17 
18 #include <cmath>
19 
21 // Constructor
23 
25 (const std::string& name,ISvcLocator* pSvcLocator)
26  : AthReentrantAlgorithm(name,pSvcLocator)
27 {
28  m_particleDataTable = nullptr;
29 }
30 
32 
33 
35 // Initialisation
37 
39 {
40 
41  StatusCode sc;
42 
43  if (m_rapcut == 0) {
44  m_tcut = 0;
45  }
46  else {
47  double den = tan(2.*atan(exp(-m_rapcut)));
48  if (den > 0) {
49  m_tcut = 1./den;
50  }
51  else {
53  }
54  }
55 
56  // get the Particle Properties Service
57  //
58  IPartPropSvc* partPropSvc = nullptr;
59  sc = service("PartPropSvc", partPropSvc, true);
60  if (sc.isFailure()) {
61  msg(MSG::FATAL) << " Could not initialize Particle Properties Service" << endmsg;
62  return StatusCode::FAILURE;
63  }
64 
65  // Particle Data Table
66  //
67  m_particleDataTable = partPropSvc->PDT();
68  if(!m_particleDataTable) {
69  msg(MSG::FATAL) << " Could not initialize Particle Properties Service" << endmsg;
70  return StatusCode::FAILURE;
71  }
72 
73  // Erase statistic information
74  //
75  m_pdg = std::abs(m_pdg) ;
76 
77  m_trackCollectionStat.resize(m_tracklocation.size());
78  m_eventStat = InDet::EventStat_t();
79 
80  // Read Handle Key
81  ATH_CHECK(m_truth_locationStrip.initialize(m_useStrip));
82  ATH_CHECK(m_clustersStripname.initialize(m_useStrip));
83  ATH_CHECK(m_spacepointsStripname.initialize(m_useStrip));
84 
85  ATH_CHECK( m_clustersPixelname.initialize(m_usePix));
86  ATH_CHECK( m_spacepointsPixelname.initialize(m_usePix));
87  ATH_CHECK( m_truth_locationPixel.initialize(m_usePix));
88 
89  ATH_CHECK( m_spacepointsOverlapname.initialize(m_useStrip));
90 
91  ATH_CHECK( m_tracklocation.initialize());
92 
93  // Read Cond Handle Key
94  ATH_CHECK(m_pixelDetEleCollKey.initialize());
95  ATH_CHECK(m_StripDetEleCollKey.initialize());
96 
97  if (msgLvl(MSG::DEBUG)) {
98  dumptools(msg(),MSG::DEBUG);
99  msg() << endmsg;
100  }
101 
102  return sc;
103 }
104 
106 // Execute
108 
110 {
111 
112  if(!m_usePix && !m_useStrip) return StatusCode::SUCCESS;
113  EventData_t event_data(m_tracklocation.size() );
114 
115  std::vector<SG::ReadHandle<PRD_MultiTruthCollection> > read_handle;
116  read_handle.reserve(3);
117  if(m_usePix) {
118  read_handle.emplace_back(m_truth_locationPixel,ctx);
119  if (not read_handle.back().isValid()) {
120  ATH_MSG_FATAL( "Could not find TruthPix" );
121  return StatusCode::FAILURE;
122  }
123  event_data.m_truthPix = &(*read_handle.back());
124  }
125 
126  if(m_useStrip) {
127  read_handle.emplace_back(m_truth_locationStrip,ctx);
128  if (not read_handle.back().isValid()) {
129  ATH_MSG_FATAL( "Could not find TruthStrip" );
130  return StatusCode::FAILURE;
131  }
132  event_data.m_truthStrip = &(*read_handle.back());
133  }
134 
135  newClustersEvent (ctx,event_data);
136  newSpacePointsEvent (ctx,event_data);
137  event_data.m_nqtracks = qualityTracksSelection(event_data);
138  tracksComparison (ctx,event_data);
139  if(!event_data.m_particles[0].empty()) {
140 
141  efficiencyReconstruction(event_data);
142  if(msgLvl(MSG::DEBUG)) noReconstructedParticles(event_data);
143 
144  }
145 
146  {
147  std::lock_guard<std::mutex> lock(m_statMutex);
148  assert( event_data.m_trackCollectionStat.size() == m_trackCollectionStat.size());
149  for (unsigned int i=0; i< m_trackCollectionStat.size(); ++i ) {
150  m_trackCollectionStat[i] += event_data.m_trackCollectionStat[i];
151  }
152  m_eventStat += event_data.m_eventStat;
153  }
154 
155  if (msgLvl(MSG::DEBUG)) {
156  dumpevent(msg(),event_data);
157  msg() << endmsg;
158  }
159  return StatusCode::SUCCESS;
160 }
161 
163 // Finalize
165 
167  if(m_eventStat.m_events<=0) return StatusCode::SUCCESS;
168  const auto & w13 = std::setw(13);
169  const auto & p5 = std::setprecision(5);
170  const auto topNtail=[](const std::string & str){return "|" + str + "|";};
171  const std::string lineSeparator(83,'-');
172  const std::string spaceSeparator(83,' ');
173  std::stringstream out;
174  out<<std::fixed;
175  out<<topNtail(lineSeparator)<<"\n";
176  out<<"| TrackClusterAssValidation statistic for charge truth particles with |\n";
177  out<<topNtail(spaceSeparator)<<"\n";
178 
179  out<<"| eta bins for eta dependent variables = [0.0, ";
180  for (unsigned int etabin = 1; etabin<(m_etabins.size()-1); etabin++)
181  out << std::setw(2) << std::setprecision(1) << m_etabins.value().at(etabin) << ", ";
182  out << std::setw(2) << m_etabins.value().back() << "] |\n";
183  out<<"| eta dependent pT [MeV] >= [";
184  for (unsigned int ptbin = 0; ptbin<(m_ptcuts.size()-1); ptbin++)
185  out<<std::setw(6)<<std::setprecision(2)<<m_ptcuts.value().at(ptbin)<<", ";
186  out<<std::setw(6)<<std::setprecision(2)<<m_ptcuts.value().back()<<"] |\n";
187  if(m_ptcutmax < 1000000.) {
188  out<<"| pT <="<<w13<<p5<<m_ptcutmax<<" MeV"<<" |\n";
189  }
190  out<<"| |rapidity| <="<<w13<<p5<<m_rapcut<<" |\n";
191  out<<"| max vertex radius <="<<w13<<p5<<m_rmax<<" mm"<<" |\n";
192  out<<"| min vertex radius >="<<w13<<p5<<m_rmin<<" mm"<<" |\n";
193  out<<"| particles pdg ="<<std::setw(8)<<m_pdg<<" |\n";
194 
195  auto yesNo=[](const bool predicate){return predicate ? "yes" : "no ";};
196  out<<"| use Pixels information "<<yesNo(m_usePix)<<" |\n";
197  out<<"| use Strip information "<<yesNo(m_useStrip)<<" |\n";
198  out<<"| take into account outliers "<<yesNo(m_useOutliers)<<" |\n";
199  out<<topNtail(spaceSeparator)<<"\n";
200  if(!m_usePix && !m_useStrip) return StatusCode::SUCCESS;
201  enum Regions{Barrel, Transition, Endcap, Forward, NRegions};
202  auto incrementArray=[](auto & array, const int idx){for (int j{};j!=NRegions;++j) array[idx][j] += array[idx+1][j];};
203  for(int i=48; i>=0; --i) {
204  m_eventStat.m_particleClusters [i] +=m_eventStat.m_particleClusters [i+1];
205  incrementArray(m_eventStat.m_particleClustersBTE, i);
206  m_eventStat.m_particleSpacePoints [i] +=m_eventStat.m_particleSpacePoints [i+1];
207  incrementArray(m_eventStat.m_particleSpacePointsBTE, i);
208  }
209  auto coerceToOne=[](const double & initialVal)->double {return (initialVal<1.) ? 1. : initialVal; };
210  /* Note that in all cases below, the dimension of the target (i.e. result) array is 10
211  * whereas the dimension of the source, or input, array is 50. The first index of the source
212  * is used for totals, to act as a denominator(coerced to 1 if necessary). Bin 49 is used for overflows.
213  * Stats for single clusters (index 1) appear to be unused in printout.
214  */
215  //all
216  double pa = coerceToOne(m_eventStat.m_particleClusters[0]);
217  std::array<double, 10> pc2ff{};
218  size_t clusterIdx = 2;
219  for (auto & thisCluster: pc2ff){
220  thisCluster = double(m_eventStat.m_particleClusters[ clusterIdx++ ])/ pa;
221  }
222  //barrel
223  pa = coerceToOne(m_eventStat.m_particleClustersBTE[0][Barrel]);
224  std::array<double, 10> pcBarrel2ff{};
225  size_t clusterBarrelIdx = 2;
226  for (auto & thisClusterB: pcBarrel2ff){
227  thisClusterB = double(m_eventStat.m_particleClustersBTE[ clusterBarrelIdx++ ][Barrel])/ pa;
228  }
229  //transition
230  pa = coerceToOne(m_eventStat.m_particleClustersBTE[0][Transition]);
231  std::array<double, 10> pcTransition2ff{};
232  size_t clusterTransitionIdx = 2;
233  for (auto & thisClusterT: pcTransition2ff){
234  thisClusterT = double(m_eventStat.m_particleClustersBTE[ clusterTransitionIdx++ ][Transition])/ pa;
235  }
236  //endcap
237  pa = coerceToOne(m_eventStat.m_particleClustersBTE[0][Endcap]);
238  std::array<double, 10> pcEndcap2ff{};
239  size_t clusterEndcapIdx = 2;
240  for (auto & thisClusterE: pcEndcap2ff){
241  thisClusterE = double(m_eventStat.m_particleClustersBTE[ clusterEndcapIdx++ ][Endcap])/ pa;
242  }
243  //fwd
244  pa = coerceToOne(m_eventStat.m_particleClustersBTE[0][3]);
245  std::array<double, 10> pcFwd2ff{};
246  size_t clusterFwdIdx = 2;
247  for (auto & thisClusterD: pcFwd2ff){
248  thisClusterD = double(m_eventStat.m_particleClustersBTE[ clusterFwdIdx++ ][Forward])/ pa;
249  }
250  //
251  //*** SPACE POINTS ***
252  //
253  //all
254  pa = coerceToOne(m_eventStat.m_particleSpacePoints[0]);
255  std::array<double, 10> sp2ff{};
256  size_t spacepointIdx = 2;
257  for (auto & thisSpacepoint: sp2ff){
258  thisSpacepoint = double(m_eventStat.m_particleSpacePoints[ spacepointIdx++ ])/ pa;
259  }
260  //barrel
261  pa = coerceToOne(m_eventStat.m_particleSpacePointsBTE[0][Barrel]);
262  std::array<double, 10> spBarrel2ff{};
263  size_t spacepointBarrelIdx = 2;
264  for (auto & thisSpacepoint: spBarrel2ff){
265  thisSpacepoint = double(m_eventStat.m_particleSpacePointsBTE[ spacepointBarrelIdx++ ][Barrel])/ pa;
266  }
267  //transition
268  pa = coerceToOne(m_eventStat.m_particleSpacePointsBTE[0][Transition]);
269  std::array<double, 10> spTransition2ff{};
270  size_t spacepointTransitionIdx = 2;
271  for (auto & thisSpacepoint: spTransition2ff){
272  thisSpacepoint = double(m_eventStat.m_particleSpacePointsBTE[ spacepointTransitionIdx++ ][Transition])/ pa;
273  }
274  //endcap
275  pa = coerceToOne(m_eventStat.m_particleSpacePointsBTE[0][Endcap]);
276  std::array<double, 10> spEndcap2ff{};
277  size_t spacepointEndcapIdx = 2;
278  for (auto & thisSpacepoint: spEndcap2ff){
279  thisSpacepoint = double(m_eventStat.m_particleSpacePointsBTE[ spacepointEndcapIdx++ ][Endcap])/ pa;
280  }
281  //Fwd
282  pa = coerceToOne(m_eventStat.m_particleSpacePointsBTE[0][Forward]);
283  std::array<double, 10> spFwd2ff{};
284  size_t spacepointFwdIdx = 2;
285  for (auto & thisSpacepoint: spFwd2ff){
286  thisSpacepoint = double(m_eventStat.m_particleSpacePointsBTE[ spacepointFwdIdx++ ][Forward])/ pa;
287  }
288  auto w8=std::setw(8);
289  out<<"| Probability for such charge particles to have some number silicon |\n";
290  out<<"| clusters | space points |\n";
291  out<<"| Total Barrel Transi Endcap Forward | Total Barrel Transi Endcap Forward |\n";
292 
293  for (size_t idx{0};idx != 10;++idx){
294  out<<"| >= "<<idx+2<< std::string((idx<8)?" ":" ")
295  <<w8<<p5<<pc2ff[idx]
296  <<w8<<p5<<pcBarrel2ff[idx]
297  <<w8<<p5<<pcTransition2ff[idx]
298  <<w8<<p5<<pcEndcap2ff[idx]
299  <<w8<<p5<<pcFwd2ff[idx]<<" | "
300 
301  <<w8<<p5<<sp2ff[idx]
302  <<w8<<p5<<spBarrel2ff[idx]
303  <<w8<<p5<<spTransition2ff[idx]
304  <<w8<<p5<<spEndcap2ff[idx]
305  <<w8<<p5<<spFwd2ff[idx]
306  <<" |\n";
307  }
308 
309  out<<topNtail(spaceSeparator)<<"\n";
310  out<<"| Additional cuts for truth particles are |\n";
311  out<<"| eta dependent number of silicon clusters >= [";
312  for (unsigned int clbin = 0; clbin<(m_clcuts.size()-1); clbin++)
313  out<<std::setw(2)<<m_clcuts.value().at(clbin)<<", ";
314  out<<std::setw(2)<<m_clcuts.value().back()<<"] |\n";
315  out<<"| number space points >="<<w13<<m_spcut.value()<<" |\n";
316 
317  pa = coerceToOne(m_eventStat.m_particleClusters[0]);
318  out<<"| Probability find truth particles with this cuts is "<<w8<<p5<<double(m_eventStat.m_events)/pa<<" |\n";
319  pa = coerceToOne(m_eventStat.m_particleClustersBTE[0][Barrel]);
320  out<<"| For barrel region "<<w8<<p5<<double(m_eventStat.m_eventsBTE[Barrel])/pa<<" |\n";
321  pa = coerceToOne(m_eventStat.m_particleClustersBTE[0][Transition]);
322  out<<"| For transition region "<<w8<<p5<<double(m_eventStat.m_eventsBTE[Transition])/pa<<" |\n";
323  pa = coerceToOne(m_eventStat.m_particleClustersBTE[0][Endcap]);
324  out<<"| For endcap region "<<w8<<p5<<double(m_eventStat.m_eventsBTE[Endcap])/pa<<" |\n";
325  pa = coerceToOne(m_eventStat.m_particleClustersBTE[0][Forward]);
326  out<<"| For forward region "<<w8<<p5<<double(m_eventStat.m_eventsBTE[Forward])/pa<<" |\n";
327  out<<"| |\n";
328  pa = coerceToOne(m_eventStat.m_nclustersNegBP);
329  double ratio = double(m_eventStat.m_nclustersPosBP)/pa;
330  double eratio = std::sqrt(ratio*(1.+ratio)/pa);
331  out<<"| Ratio barrel pixels clusters for +/- particles ="<<w8<<p5<<ratio<<" +-"<<w8<<p5<<eratio<<" |\n";
332  pa = coerceToOne(m_eventStat.m_nclustersNegEP);
333  ratio = double(m_eventStat.m_nclustersPosEP)/pa;
334  eratio = std::sqrt(ratio*(1.+ratio)/pa);
335  out<<"| Ratio endcap pixels clusters for +/- particles ="<<w8<<p5<<ratio<<" +-"<<w8<<p5<<eratio<<" |\n";
336  pa = coerceToOne(m_eventStat.m_nclustersNegBS);
337  ratio = double(m_eventStat.m_nclustersPosBS)/pa;
338  eratio = std::sqrt(ratio*(1.+ratio)/pa);
339  out<<"| Ratio barrel Strip clusters for +/- particles ="<<w8<<p5<<ratio<<" +-"<<w8<<p5<<eratio<<" |\n";
340  pa = coerceToOne(m_eventStat.m_nclustersNegES);
341  ratio = double(m_eventStat.m_nclustersPosES)/pa;
342  eratio = std::sqrt(ratio*(1.+ratio)/pa);
343  out<<"| Ratio endcap Strip clusters for +/- particles ="<<w8<<p5<<ratio<<" +-"<<w8<<p5<<eratio<<" |\n";
344  pa = double(m_eventStat.m_eventsNEG); if(pa < 1.) pa = 1.;
345  ratio = double(m_eventStat.m_eventsPOS)/pa;
346  eratio = std::sqrt(ratio*(1.+ratio)/pa);
347  out<<"| Number truth particles and +/- ratio ="<<std::setw(10)<<m_eventStat.m_events<<w8<<p5<<ratio<<" +-"<<w8<<p5<<eratio<<" |\n";
348  ratio = 0.;
349  if(m_eventStat.m_nclustersPTOT!=0) ratio = double(m_eventStat.m_nclustersPTOTt)/double(m_eventStat.m_nclustersPTOT);
350 
351  out<<"| Number pix clusters, truth clusters and ratio = "
352  <<std::setw(10)<<m_eventStat.m_nclustersPTOT
353  <<std::setw(10)<<m_eventStat.m_nclustersPTOTt
354  <<std::setw(12)<<std::setprecision(5)<<ratio<<" |\n";
355  ratio = 0.;
356  if(m_eventStat.m_nclustersSTOT!=0) ratio = double(m_eventStat.m_nclustersSTOTt)/double(m_eventStat.m_nclustersSTOT);
357  out<<"| Number strip clusters, truth clusters and ratio = "
358  <<std::setw(10)<<m_eventStat.m_nclustersSTOT
359  <<std::setw(10)<<m_eventStat.m_nclustersSTOTt
360  <<std::setw(12)<<std::setprecision(5)<<ratio<<" |\n";
361 
362  out<<"|-----------------------------------------------------------------------------------|\n\n";
363 
364  SG::ReadHandleKeyArray<TrackCollection>::const_iterator t=m_tracklocation.begin(),te=m_tracklocation.end();
365  int nc = 0;
366  for(; t!=te; ++t) {
367  int n = 47-(t->key().size());
368  std::string s1; for(int i=0; i<n; ++i) s1.append(" "); s1.append("|");
369 
370 
371  out<<"|-----------------------------------------------------------------------------------|\n";
372  out<<"| Statistic for "<<(t->key())<<s1<<"\n";
373 
374  double ne = double(m_eventStat.m_events); if(ne < 1.) ne = 1.;
375  double ef [6]; for(int i=0; i!=6; ++i) ef [i] = double(m_trackCollectionStat[nc].m_efficiency [i]) /ne;
376  double ef0[6]; for(int i=0; i!=6; ++i) ef0[i] = double(m_trackCollectionStat[nc].m_efficiencyN [i][0])/ne;
377  double ef1[6]; for(int i=0; i!=6; ++i) ef1[i] = double(m_trackCollectionStat[nc].m_efficiencyN [i][1])/ne;
378  double ef2[6]; for(int i=0; i!=6; ++i) ef2[i] = double(m_trackCollectionStat[nc].m_efficiencyN [i][2])/ne;
379 
380 
381  using EffArray_t = std::array<double, 6>;
382  //
383  auto makeEffArray = [](const auto & threeDimArray, const size_t secondIdx, const size_t thirdIdx, const double denom){
384  EffArray_t result{};
385  size_t idx{0};
386  auto invDenom = 1./denom;
387  for (auto & entry: result){
388  entry = threeDimArray[idx++][secondIdx][thirdIdx]*invDenom;
389  }
390  return result;
391  };
392  //
393  const auto & efficiencyArrayInput = m_trackCollectionStat[nc].m_efficiencyBTE;
394  //
395  double neBTE = coerceToOne(m_eventStat.m_eventsBTE[Barrel]);
396  const EffArray_t efB0 = makeEffArray(efficiencyArrayInput,0,Barrel,neBTE);
397  const EffArray_t efB1 = makeEffArray(efficiencyArrayInput,1,Barrel,neBTE);
398  const EffArray_t efB2 = makeEffArray(efficiencyArrayInput,2,Barrel,neBTE);
399  const EffArray_t efB3 = makeEffArray(efficiencyArrayInput,3,Barrel,neBTE);
400  const EffArray_t efB4 = makeEffArray(efficiencyArrayInput,4,Barrel,neBTE);
401  //
402  neBTE = coerceToOne(m_eventStat.m_eventsBTE[Transition]);
403  const EffArray_t efT0 = makeEffArray(efficiencyArrayInput,0,Transition,neBTE);
404  const EffArray_t efT1 = makeEffArray(efficiencyArrayInput,1,Transition,neBTE);
405  const EffArray_t efT2 = makeEffArray(efficiencyArrayInput,2,Transition,neBTE);
406  const EffArray_t efT3 = makeEffArray(efficiencyArrayInput,3,Transition,neBTE);
407  const EffArray_t efT4 = makeEffArray(efficiencyArrayInput,4,Transition,neBTE);
408  //
409  neBTE = coerceToOne(m_eventStat.m_eventsBTE[Endcap]);
410  const EffArray_t efE0 = makeEffArray(efficiencyArrayInput,0,Endcap,neBTE);
411  const EffArray_t efE1 = makeEffArray(efficiencyArrayInput,1,Endcap,neBTE);
412  const EffArray_t efE2 = makeEffArray(efficiencyArrayInput,2,Endcap,neBTE);
413  const EffArray_t efE3 = makeEffArray(efficiencyArrayInput,3,Endcap,neBTE);
414  const EffArray_t efE4 = makeEffArray(efficiencyArrayInput,4,Endcap,neBTE);
415  //
416  neBTE = coerceToOne(m_eventStat.m_eventsBTE[Forward]);
417  const EffArray_t efD0 = makeEffArray(efficiencyArrayInput,0,Forward,neBTE);
418  const EffArray_t efD1 = makeEffArray(efficiencyArrayInput,1,Forward,neBTE);
419  const EffArray_t efD2 = makeEffArray(efficiencyArrayInput,2,Forward,neBTE);
420  const EffArray_t efD3 = makeEffArray(efficiencyArrayInput,3,Forward,neBTE);
421  const EffArray_t efD4 = makeEffArray(efficiencyArrayInput,4,Forward,neBTE);
422 
423 
424  double efrec = ef0[0]+ef0[1]+ef0[2]+ef1[0]+ef1[1]+ef2[0];
425  double efrecB = efB0[0]+efB0[1]+efB0[2]+efB1[0]+efB1[1]+efB2[0];
426  double efrecT = efT0[0]+efT0[1]+efT0[2]+efT1[0]+efT1[1]+efT2[0];
427  double efrecE = efE0[0]+efE0[1]+efE0[2]+efE1[0]+efE1[1]+efE2[0];
428  double efrecD = efD0[0]+efD0[1]+efD0[2]+efD1[0]+efD1[1]+efD2[0];
429 
430  ne = coerceToOne(m_eventStat.m_eventsPOS);
431  double efP[6]; for(int i=0; i!=6; ++i) efP[i] = double(m_trackCollectionStat[nc].m_efficiencyPOS[i])/ne;
432  ne = coerceToOne(m_eventStat.m_eventsNEG);
433  double efN[6]; for(int i=0; i!=6; ++i) efN[i] = double(m_trackCollectionStat[nc].m_efficiencyNEG[i])/ne;
434 
435  out<<"|-----------------------------------------------------------------------------------|\n";
436  out<<"| Probability to lose 0 1 2 3 4 >=5 clusters |\n";
437  out<<"|-----------------------------------------------------------------------------------|\n";
438 
439  auto formattedOutput=[&out](auto & effArray){
440  for (size_t i{};i!=6;++i){
441  out<<std::setw(9)<<std::setprecision(4)<<effArray[i];
442  }
443  out<<" |\n";
444  };
445 
446  out<<"| For all particles ";
447  formattedOutput(ef);
448  out<<"| For + particles ";
449  formattedOutput(efP);
450  out<<"| For - particles ";
451  formattedOutput(efN);
452  out<<"|-----------------------------------------------------------------------------------|\n";
453  out<<"| Barrel region |\n";
454  out<<"| 0 wrong clusters ";
455  formattedOutput(efB0);
456  out<<"| 1 wrong clusters ";
457  formattedOutput(efB1);
458  out<<"| 2 wrong clusters ";
459  formattedOutput(efB2);
460  out<<"| 3 wrong clusters ";
461  formattedOutput(efB3);
462  out<<"| >=4 wrong clusters ";
463  formattedOutput(efB4);
464  out<<"|-----------------------------------------------------------------------------------|\n";
465  out<<"| Transition region |\n";
466  out<<"| 0 wrong clusters ";
467  formattedOutput(efT0);
468  out<<"| 1 wrong clusters ";
469  formattedOutput(efT1);
470  out<<"| 2 wrong clusters ";
471  formattedOutput(efT2);
472  out<<"| 3 wrong clusters ";
473  formattedOutput(efT3);
474  out<<"| >=4 wrong clusters ";
475  formattedOutput(efT4);
476  out<<"|-----------------------------------------------------------------------------------|\n";
477  out<<"| Endcap region |\n";
478  out<<"| 0 wrong clusters ";
479  formattedOutput(efE0);
480  out<<"| 1 wrong clusters ";
481  formattedOutput(efE1);
482  out<<"| 2 wrong clusters ";
483  formattedOutput(efE2);
484  out<<"| 3 wrong clusters ";
485  formattedOutput(efE3);
486  out<<"| >=4 wrong clusters ";
487  formattedOutput(efE4);
488  out<<"|-----------------------------------------------------------------------------------|\n";
489  out<<"| Forward region |\n";
490  out<<"| 0 wrong clusters ";
491  formattedOutput(efD0);
492  out<<"| 1 wrong clusters ";
493  formattedOutput(efD1);
494  out<<"| 2 wrong clusters ";
495  formattedOutput(efD2);
496  out<<"| 3 wrong clusters ";
497  formattedOutput(efD3);
498  out<<"| >=4 wrong clusters ";
499  formattedOutput(efD4);
500 
501  out<<"|-----------------------------------------------------------------------------------|\n";
502  pa = coerceToOne(m_eventStat.m_particleClusters[0]);
503  out<<"| Efficiency reconstruction (number lose+wrong < 3) = "
504  <<std::setw(9)<<std::setprecision(5)<<efrec
505  <<" ("
506  <<std::setw(9)<<std::setprecision(5)<<efrec*double(m_eventStat.m_events)/pa
507  <<" ) "
508  <<" |\n";
509  pa = coerceToOne(m_eventStat.m_particleClustersBTE[0][Barrel]);
510  out<<"| For barrel region = "
511  <<std::setw(9)<<std::setprecision(5)<<efrecB
512  <<" ("
513  <<std::setw(9)<<std::setprecision(5)<<efrecB*double(m_eventStat.m_eventsBTE[Barrel])/pa
514  <<" ) "
515  <<" |\n";
516  pa = coerceToOne(m_eventStat.m_particleClustersBTE[0][Transition]);
517  out<<"| For transition region = "
518  <<std::setw(9)<<std::setprecision(5)<<efrecT
519  <<" ("
520  <<std::setw(9)<<std::setprecision(5)<<efrecT*double(m_eventStat.m_eventsBTE[Transition])/pa
521  <<" ) "
522  <<" |\n";
523  pa = coerceToOne(m_eventStat.m_particleClustersBTE[0][Endcap]);
524  out<<"| For endcap region = "
525  <<std::setw(9)<<std::setprecision(5)<<efrecE
526  <<" ("
527  <<std::setw(9)<<std::setprecision(5)<<efrecE*double(m_eventStat.m_eventsBTE[Endcap])/pa
528  <<" ) "
529  <<" |\n";
530  pa = coerceToOne(m_eventStat.m_particleClustersBTE[0][Forward]);
531  out<<"| For forward region = "
532  <<std::setw(9)<<std::setprecision(5)<<efrecD
533  <<" ("
534  <<std::setw(9)<<std::setprecision(5)<<efrecD*double(m_eventStat.m_eventsBTE[Forward])/pa
535  <<" ) "
536  <<" |\n";
537 
538  out<<"|-----------------------------------------------------------------------------------|\n";
539  out<<"| Reconstructed tracks + - +/-ratio error |\n";
540  out<<"|-----------------------------------------------------------------------------------|\n";
541 
542  pa = coerceToOne(m_trackCollectionStat[nc].m_ntracksNEGB);
543  ratio = double(m_trackCollectionStat[nc].m_ntracksPOSB)/pa;
544  eratio = std::sqrt(ratio*(1.+ratio)/pa);
545 
546  out<<"| Barrel "
547  <<std::setw(10)<<m_trackCollectionStat[nc].m_ntracksPOSB
548  <<std::setw(11)<<m_trackCollectionStat[nc].m_ntracksNEGB
549  <<std::setw(11)<<std::setprecision(5)<<ratio
550  <<std::setw(11)<<std::setprecision(5)<<eratio<<" |\n";
551  pa = coerceToOne(m_trackCollectionStat[nc].m_ntracksNEGE);
552  ratio = double(m_trackCollectionStat[nc].m_ntracksPOSE)/pa;
553  eratio = std::sqrt(ratio*(1.+ratio)/pa);
554 
555  out<<"| Endcap "
556  <<std::setw(10)<<m_trackCollectionStat[nc].m_ntracksPOSE
557  <<std::setw(11)<<m_trackCollectionStat[nc].m_ntracksNEGE
558  <<std::setw(11)<<std::setprecision(5)<<ratio
559  <<std::setw(11)<<std::setprecision(5)<<eratio<<" |\n";
560  pa = coerceToOne(m_trackCollectionStat[nc].m_ntracksNEGFWD);
561  ratio = double(m_trackCollectionStat[nc].m_ntracksPOSFWD)/pa;
562  eratio = std::sqrt(ratio*(1.+ratio)/pa);
563 
564  out<<"| Forward "
565  <<std::setw(10)<<m_trackCollectionStat[nc].m_ntracksPOSFWD
566  <<std::setw(11)<<m_trackCollectionStat[nc].m_ntracksNEGFWD
567  <<std::setw(11)<<std::setprecision(5)<<ratio
568  <<std::setw(11)<<std::setprecision(5)<<eratio<<" |\n";
569 
570 
571 
572  int nt=0;
573  int ft=0;
574  int kf=0;
575  for(int k = 0; k!=50; ++k) {
576  nt+=m_trackCollectionStat[nc].m_total[k];
577  ft+=m_trackCollectionStat[nc].m_fake [k];
578  if(!kf && nt) kf = k;
579  }
580 
581  if(kf) {
582 
583  out<<"|-----------------------------------------------------------------------------------|\n";
584  out<<"| Fake tracks rate for different number of clusters on track |\n";
585  out<<"|-----------------------------------------------------------------------------------|\n";
586 
587  for(int k = kf; k!=kf+6; ++k) {
588  out<<"| >= "<<std::setw(2)<<k<<" ";
589  }
590  out<<"|\n";
591 
592  for(int k = kf; k!=kf+6; ++k) {
593  double eff = 0.; if(nt>0) eff = double(ft)/double(nt);
594  out<<"|"<<std::setw(12)<<std::setprecision(5)<<eff<<" ";
595  nt-=m_trackCollectionStat[nc].m_total[k];
596  ft-=m_trackCollectionStat[nc].m_fake [k];
597  }
598  out<<"|\n";
599  out<<"|-----------------------------------------------------------------------------------|\n";
600  }
601  ++nc;
602  }
603  ATH_MSG_INFO("\n"<<out.str());
604  return StatusCode::SUCCESS;
605 }
606 
608 // Dumps conditions information into the MsgStream
610 
612 {
613  SG::ReadHandleKeyArray<TrackCollection>::const_iterator t=m_tracklocation.begin(),te=m_tracklocation.end();
614 
615  int n;
616  out << level <<"\n";
617  out<<"|--------------------------------------------------------------------------------------------------------------------|\n";
618  for(; t!=te; ++t) {
619  n = 65-t->key().size();
620  std::string s1; for(int i=0; i<n; ++i) s1.append(" "); s1.append("|");
621  out<<"| Location of input tracks | "<<t->key()<<s1<<"\n";
622  }
623  auto padString = [](const std::string & s){
624  const int n = 65 - s.size();
625  return s + std::string(n, ' ');
626  };
627  std::string s2 = padString(m_spacepointsPixelname.key());
628  std::string s3 = padString(m_spacepointsStripname.key());
629  std::string s4 = padString(m_spacepointsOverlapname.key());
630  std::string s5 = padString(m_clustersPixelname.key());
631  std::string s6 = padString(m_clustersStripname.key());
632  //
633  std::string s7 = padString(m_truth_locationPixel.key());
634  std::string s8 = padString(m_truth_locationStrip.key());
635 
636  out<<"| Pixel space points | "<<s2<<"|\n";
637  out<<"| Strip space points | "<<s3<<"|\n";
638  out<<"| Overlap space points | "<<s4<<"|\n";
639  out<<"| Pixel clusters | "<<s5<<"|\n";
640  out<<"| Strip clusters | "<<s6<<"|\n";
641  out<<"| Truth location for pixels | "<<s7<<"|\n";
642  out<<"| Truth location for strips | "<<s8<<"|\n";
643  out<<"| max pT cut | "
644  <<std::setw(14)<<std::setprecision(5)<<m_ptcutmax
645  <<" |\n";
646  out<<"| rapidity cut | "
647  <<std::setw(14)<<std::setprecision(5)<<m_rapcut
648  <<" |\n";
649  out<<"| min Radius | "
650  <<std::setw(14)<<std::setprecision(5)<<m_rmin
651  <<" |\n";
652  out<<"| max Radius | "
653  <<std::setw(14)<<std::setprecision(5)<<m_rmax
654  <<" |\n";
655  out<<"| Min. number sp.points for generated track | "
656  <<std::setw(14)<<std::setprecision(5)<<m_spcut
657  <<" |\n";
658  out<<"|--------------------------------------------------------------------------------------------------------------------|\n";
659  return out;
660 }
661 
663 // Dumps event information into the ostream
665 
667 {
668  out << MSG::DEBUG << "\n";
669  auto formatOutput = [&out](const auto val){
670  out<<std::setw(12)<<val
671  <<" |\n";
672  };
673  out<<"|---------------------------------------------------------------------|\n";
674  out<<"| m_nspacepoints | ";
675  formatOutput(event_data.m_nspacepoints);
676  out<<"| m_nclusters | ";
677  formatOutput(event_data.m_nclusters);
678  out<<"| Kine-Clusters size | ";
679  formatOutput(event_data.m_kinecluster.size());
680  out<<"| Kine-SpacePoints size | ";
681  formatOutput(event_data.m_kinespacepoint.size());
682  out<<"| Number good kine tracks | ";
683  formatOutput(event_data.m_nqtracks);
684  out<<"|---------------------------------------------------------------------|\n";
685  return out;
686 }
687 
688 
690 // New event for clusters information
692 
694 {
695  std::lock_guard<std::mutex> lock(m_statMutex);
696 
697  // Get pixel clusters container
698  //
699  std::unique_ptr<SG::ReadHandle<InDet::SiClusterContainer> > pixelcontainer;
700  std::unique_ptr<SG::ReadHandle<InDet::SiClusterContainer> > stripcontainer;
701 
702  if(m_usePix) {
703  pixelcontainer = std::make_unique<SG::ReadHandle<InDet::SiClusterContainer> >(m_clustersPixelname,ctx);
704  if (!pixelcontainer->isValid()) ATH_MSG_DEBUG("Failed to create Pixel clusters container read handle with key " << m_clustersPixelname.key());
705  }
706 
707  // Get strip clusters container
708  //
709  if(m_useStrip) {
710  stripcontainer = std::make_unique<SG::ReadHandle<InDet::SiClusterContainer> >(m_clustersStripname,ctx);
711  if (!stripcontainer->isValid()) ATH_MSG_DEBUG("Failed to create Strip clusters container read handle with key " << m_clustersStripname.key());
712  }
713 
714  int Kine[1000];
715 
716  event_data.m_clusterHandles.reserve(3);
717  // Loop through all pixel clusters
718  //
719  if(pixelcontainer && pixelcontainer->isValid()) {
720  InDet::SiClusterContainer::const_iterator w = (*pixelcontainer)->begin();
721  InDet::SiClusterContainer::const_iterator we = (*pixelcontainer)->end ();
722 
723  for(; w!=we; ++w) {
724 
725  InDet::SiClusterCollection::const_iterator c = (*w)->begin();
726  InDet::SiClusterCollection::const_iterator ce = (*w)->end ();
727 
728  for(; c!=ce; ++c) {
729 
730  ++event_data.m_nclusters;
731  ++m_eventStat.m_nclustersPTOT;
732  if(isTruth(event_data,(*c))) ++m_eventStat.m_nclustersPTOTt;
733 
734 
735  int nk = kine(event_data,(*c),Kine,999);
736  for(int i=0; i!=nk; ++i) {
737  if(!isTheSameDetElement(event_data,Kine[i],(*c))) {
738  event_data.m_kinecluster.insert(std::make_pair(Kine[i],(*c)));
739  }
740  }
741  }
742  }
743  event_data.m_clusterHandles.push_back(std::move(pixelcontainer));
744 
745  }
746 
747  // Loop through all strip clusters
748  //
749  if(stripcontainer && stripcontainer->isValid()) {
750  InDet::SiClusterContainer::const_iterator w = (*stripcontainer)->begin();
751  InDet::SiClusterContainer::const_iterator we = (*stripcontainer)->end ();
752 
753  for(; w!=we; ++w) {
754 
755  InDet::SiClusterCollection::const_iterator c = (*w)->begin();
756  InDet::SiClusterCollection::const_iterator ce = (*w)->end ();
757 
758  for(; c!=ce; ++c) {
759 
760  ++event_data.m_nclusters;
761  ++m_eventStat.m_nclustersSTOT;
762  if(isTruth(event_data,(*c))) ++m_eventStat.m_nclustersSTOTt;
763 
764  int nk = kine(event_data,(*c),Kine,999);
765  for(int i=0; i!=nk; ++i) {
766  if(!isTheSameDetElement(event_data,Kine[i],(*c))) event_data.m_kinecluster.insert(std::make_pair(Kine[i],(*c)));
767  }
768  }
769  }
770  event_data.m_clusterHandles.push_back(std::move(stripcontainer));
771  }
772 
773 }
774 
776 // New event for space points information
778 
780 {
781 
782  int Kine[1000];
783 
784  if(m_usePix && !m_spacepointsPixelname.key().empty()) {
785  event_data.m_spacePointContainer.emplace_back(m_spacepointsPixelname,ctx);
786  if (!event_data.m_spacePointContainer.back().isValid()) {
787  ATH_MSG_DEBUG( "Invalid Pixels space points container read handle for key " << m_spacepointsPixelname.key() );
788  }
789  else {
790  SpacePointContainer::const_iterator spc = event_data.m_spacePointContainer.back()->begin();
791  SpacePointContainer::const_iterator spce = event_data.m_spacePointContainer.back()->end ();
792  for(; spc != spce; ++spc) {
793  SpacePointCollection::const_iterator sp = (*spc)->begin();
794  SpacePointCollection::const_iterator spe = (*spc)->end ();
795 
796  for(; sp != spe; ++sp) {
797 
798  ++event_data.m_nspacepoints;
799  int nk = kine(event_data,(*sp)->clusterList().first,Kine,999);
800  for(int i=0; i!=nk; ++i) {
801 
802  if(!isTheSameDetElement(event_data,Kine[i],(*sp))) {
803  event_data.m_kinespacepoint.insert(std::make_pair(Kine[i],(*sp)));
804  }
805  }
806  }
807  }
808  }
809  }
810 
811  // Get strip space points containers from store gate
812  //
813  if(m_useStrip && !m_spacepointsStripname.key().empty()) {
814  event_data.m_spacePointContainer.emplace_back(m_spacepointsStripname,ctx);
815  if (!event_data.m_spacePointContainer.back().isValid()) {
816  ATH_MSG_DEBUG( "Invalid Strip space points container read handle for key " << m_spacepointsStripname.key() );
817  }
818  else {
819  SpacePointContainer::const_iterator spc = event_data.m_spacePointContainer.back()->begin();
820  SpacePointContainer::const_iterator spce = event_data.m_spacePointContainer.back()->end ();
821 
822  for(; spc != spce; ++spc) {
823 
824  SpacePointCollection::const_iterator sp = (*spc)->begin();
825  SpacePointCollection::const_iterator spe = (*spc)->end ();
826 
827  for(; sp != spe; ++sp) {
828 
829 
830  ++event_data.m_nspacepoints;
831  int nk = kine(event_data,(*sp)->clusterList().first,(*sp)->clusterList().second,Kine,999);
832  for(int i=0; i!=nk; ++i) {
833  if(!isTheSameDetElement(event_data,Kine[i],(*sp))) {
834  event_data.m_kinespacepoint.insert(std::make_pair(Kine[i],(*sp)));
835  }
836  }
837  }
838  }
839  }
840  }
841 
842  // Get strip overlap space points containers from store gate
843  //
844  if(m_useStrip && !m_spacepointsOverlapname.key().empty()) {
845  event_data.m_spacepointsOverlap=std::make_unique< SG::ReadHandle<SpacePointOverlapCollection> >(m_spacepointsOverlapname,ctx);
846  if (!event_data.m_spacepointsOverlap->isValid()) {
847  ATH_MSG_DEBUG( "Invalid overlap space points container read handle for key " << m_spacepointsOverlapname.key() );
848  }
849  else {
852 
853  for (; sp!=spe; ++sp) {
854 
855  ++event_data.m_nspacepoints;
856  int nk = kine(event_data,(*sp)->clusterList().first,(*sp)->clusterList().second,Kine,999);
857  for(int i=0; i!=nk; ++i) {
858  if(!isTheSameDetElement(event_data,Kine[i],(*sp))) {
859  event_data.m_kinespacepoint.insert(std::make_pair(Kine[i],(*sp)));
860  }
861  }
862  }
863  }
864  }
865 }
867 // Good kine tracks selection
869 
871 {
874 
875  if( c == event_data.m_kinecluster.end()) {
876  return 0;
877  }
878 
879  if( s == event_data.m_kinespacepoint.end()) {
880  return 0;
881  }
882 
883  std::list<int> worskine;
884 
885  int rp = 0;
886  double eta = 0.;
887  int t = 0;
888  int k0 = (*c).first;
889  int q0 = k0*charge(event_data,(*c),rp);
890  unsigned int nc = 1 ;
891 
892  auto coerceTo49 = [] (const size_t idx){
893  return (idx<50) ? idx : 49;
894  };
895 
896  for(++c; c!=event_data.m_kinecluster.end(); ++c) {
897 
898  if((*c).first==k0) {++nc; continue;}
899  q0 = charge(event_data,(*c),rp,eta)*k0;
900  //
901  const size_t clusterIdx =coerceTo49(nc);
902  ++event_data.m_eventStat.m_particleClusters [clusterIdx];
903  ++event_data.m_eventStat.m_particleClustersBTE[clusterIdx][rp];
904  //
905  int ns = event_data.m_kinespacepoint.count(k0);
906  const size_t spacepointIdx =coerceTo49(ns);
907  ++event_data.m_eventStat.m_particleSpacePoints [spacepointIdx];
908  ++event_data.m_eventStat.m_particleSpacePointsBTE[spacepointIdx][rp];
909 
910  if (nc < minclusters(eta) ) worskine.push_back(k0);
911  else if(event_data.m_kinespacepoint.count(k0)< m_spcut ) worskine.push_back(k0);
912  else {
913  event_data.m_particles[0].push_back(InDet::PartPropCache(q0,rp)); ++t;
914  }
915 
916  k0 = (*c).first;
917  q0 =charge(event_data,(*c),rp,eta)*k0;
918  nc = 1 ;
919  }
920 
921  ++event_data.m_eventStat.m_particleClusters [coerceTo49(nc)];
922  ++event_data.m_eventStat.m_particleClustersBTE[coerceTo49(nc)][rp];
923  int ns = event_data.m_kinespacepoint.count(k0);
924  ++event_data.m_eventStat.m_particleSpacePoints [coerceTo49(ns)];
925  ++event_data.m_eventStat.m_particleSpacePointsBTE[coerceTo49(ns)][rp];
926 
927  if (nc < minclusters(eta) ) worskine.push_back(k0);
928  else if(event_data.m_kinespacepoint.count(k0)< m_spcut ) worskine.push_back(k0);
929  else {
930  event_data.m_particles[0].push_back(InDet::PartPropCache(q0,rp)); ++t;
931  }
932  for(auto & pThisCluster: worskine) {
933  event_data.m_kinecluster .erase(pThisCluster);
934  event_data.m_kinespacepoint.erase(pThisCluster);
935  }
936 
937  for(c = event_data.m_kinecluster.begin(); c!= event_data.m_kinecluster.end(); ++c) {
938  const Trk::PrepRawData*
939  d = (*c).second;
941  de= dynamic_cast<const InDetDD::SiDetectorElement*>(d->detectorElement());
942  if (not de) continue;
943  int q = charge(event_data,*c,rp);
944 
945  if (q<0) {
946  if(de->isBarrel()) {
947  de->isPixel() ? ++event_data.m_eventStat.m_nclustersNegBP : ++event_data.m_eventStat.m_nclustersNegBS;
948  }
949  else {
950  de->isPixel() ? ++event_data.m_eventStat.m_nclustersNegEP : ++event_data.m_eventStat.m_nclustersNegES;
951  }
952 
953  }
954  else if(q>0) {
955  if(de->isBarrel()) {
956  de->isPixel() ? ++event_data.m_eventStat.m_nclustersPosBP : ++event_data.m_eventStat.m_nclustersPosBS;
957  }
958  else {
959  de->isPixel() ? ++event_data.m_eventStat.m_nclustersPosEP : ++event_data.m_eventStat.m_nclustersPosES;
960  }
961  }
962  }
963 
964 
965 
966  for(const auto& p: event_data.m_particles[0]) {
967  for(SG::ReadHandleKeyArray<TrackCollection>::size_type nc=1; nc<m_tracklocation.size(); ++nc) event_data.m_particles[nc].push_back(p);
968  }
969  return t;
970 }
971 
973 // Recontructed track comparison with kine information
975 
977 {
978  if(!event_data.m_nqtracks) return;
979 
980 
981  int nc = -1;
982  event_data.m_trackcontainer.reserve(m_tracklocation.size());
983  for(const SG::ReadHandleKey<TrackCollection> &track_key : m_tracklocation ) {
984  if(++nc >= 100) return;
985  event_data.m_tracks[nc].clear();
986 
987  event_data.m_trackcontainer.emplace_back(track_key,ctx );
988  if (!event_data.m_trackcontainer.back().isValid()) {
989  continue;
990  }
991 
992  // Loop through all found tracks
993  //
994  TrackCollection::const_iterator t,te = event_data.m_trackcontainer.back()->end();
995 
996  int KINE[200],NKINE[200];
997 
998  for (t=event_data.m_trackcontainer.back()->begin(); t!=te; ++t) {
999 
1000  Trk::TrackStates::const_iterator s = (*t)->trackStateOnSurfaces()->begin(),
1001  se = (*t)->trackStateOnSurfaces()->end();
1002 
1003  int NK = 0;
1004  int NC = 0;
1005  int N0 = 0;
1006  int nkm = 0;
1007  bool qp = false;
1008 
1009  const Trk::TrackParameters* tpf = (*s)->trackParameters(); if(!tpf) continue;
1010  const AmgVector(5)& Vpf = tpf ->parameters ();
1011  double pTf = std::abs(std::sin(Vpf[3])/Vpf[4]);
1012  double etaf = std::abs(log(tan(.5*Vpf[3])));
1013  bool qTf = pTf > minpT(etaf);
1014  for(; s!=se; ++s) {
1015 
1016  if(!qp) {
1017 
1018  const Trk::TrackParameters* tp = (*s)->trackParameters();
1019 
1020  if(tp) {
1021  qp = true;
1022  const AmgVector(5)& Vp = tp->parameters();
1023  double pT = std::sin(Vp[3])/Vp[4] ;
1024  double rap = std::abs(std::log(std::tan(.5*Vp[3])));
1025  double minpt = minpT(rap);
1026  if (pT > minpt && pT < m_ptcutmax) {
1027  if (rap < 1. ) ++event_data.m_trackCollectionStat[nc].m_ntracksPOSB;
1028  else if(rap < 3.0) ++event_data.m_trackCollectionStat[nc].m_ntracksPOSE;
1029  else if(rap < m_rapcut) ++event_data.m_trackCollectionStat[nc].m_ntracksPOSFWD;
1030  }
1031  else if(pT < -minpt && pT > -m_ptcutmax) {
1032  if (rap < 1. ) ++event_data.m_trackCollectionStat[nc].m_ntracksNEGB;
1033  else if(rap < 3.0) ++event_data.m_trackCollectionStat[nc].m_ntracksNEGE;
1034  else if(rap < m_rapcut) ++event_data.m_trackCollectionStat[nc].m_ntracksNEGFWD;
1035  }
1036  }
1037  }
1038 
1039  if(!m_useOutliers && !(*s)->type(Trk::TrackStateOnSurface::Measurement)) continue;
1040 
1041  const Trk::MeasurementBase* mb = (*s)->measurementOnTrack();
1042  if(!mb) continue;
1043 
1044  const Trk::RIO_OnTrack* ri = dynamic_cast<const Trk::RIO_OnTrack*>(mb);
1045  if(!ri) continue;
1046 
1047  const Trk::PrepRawData* rd = ri->prepRawData();
1048  if(!rd) continue;
1049 
1050  const InDet::SiCluster* si = dynamic_cast<const InDet::SiCluster*>(rd);
1051  if(!si) continue;
1052 
1053  if(!m_usePix && dynamic_cast<const InDet::PixelCluster*>(si)) continue;
1054  if(!m_useStrip && dynamic_cast<const InDet::SCT_Cluster*> (si)) continue;
1055 
1056 
1057  int Kine[1000], nk=kine0(event_data,rd,Kine,999); ++NC; if(!nk) ++N0;
1058 
1059  for(int k = 0; k!=nk; ++k) {
1060 
1061  int n = 0;
1062  for(; n!=NK; ++n) {if(Kine[k]==KINE[n]) {++NKINE[n]; break;}}
1063  if(n==NK) {KINE[NK] = Kine[k]; NKINE[NK] = 1; if (NK < 200) ++NK;}
1064  }
1065  for(int n=0; n!=NK; ++n) {if(NKINE[n]>nkm) nkm = NKINE[n];}
1066  }
1067 
1068  for(int n=0; n!=NK; ++n) {
1069  if(NKINE[n]==nkm) {
1070  int NQ = 1000*NKINE[n]+(NC-NKINE[n]);
1071 
1072  event_data.m_tracks[nc].insert(std::make_pair(KINE[n],NQ));
1073  if(qTf) {
1074  if(NC-N0 > 2) {
1075  ++event_data.m_trackCollectionStat[nc].m_total[NC]; if(NC-NKINE[n] > 2) {++event_data.m_trackCollectionStat[nc].m_fake[NC];}
1076  }
1077  }
1078  }
1079  }
1080  }
1081 
1082  }
1083 }
1084 
1086 // Particles and reconstructed tracks comparision
1088 
1090 {
1091  for(SG::ReadHandleKeyArray<TrackCollection>::size_type nc = 0; nc!=m_tracklocation.size(); ++nc) {
1092 
1093  event_data.m_difference[nc].clear();
1094  auto p = event_data.m_particles[nc].begin(), pe =event_data.m_particles[nc].end();
1095  if(p==pe) return;
1096  std::multimap<int,int>::const_iterator t, te = event_data.m_tracks[nc].end();
1097 
1098  while (p!=pe) {
1099 
1100  int k = (*p).barcode();
1101  int n = event_data.m_kinecluster.count(k);
1102  int m = 0;
1103  int w = 0;
1104  t = event_data.m_tracks[nc].find(k);
1105  for(; t!=te; ++t) {
1106  if((*t).first!=k) break;
1107  int ts = (*t).second/1000;
1108  int ws = (*t).second%1000;
1109  if (ts > m ) {m = ts; w = ws;}
1110  else if(ts==m && w > ws) { w = ws;}
1111  }
1112  int d = n-m; if(d<0) d = 0; else if(d > 5) d=5; if(w>4) w = 4;
1113  if(m) {
1114  ++event_data.m_trackCollectionStat[nc].m_efficiency [d];
1115  ++event_data.m_trackCollectionStat[nc].m_efficiencyN[d][w];
1116  }
1117  int ch = (*p).charge();
1118  if(m) {
1119  ++event_data.m_trackCollectionStat[nc].m_efficiencyBTE[d][w][(*p).rapidity()];
1120  ch > 0 ? ++event_data.m_trackCollectionStat[nc].m_efficiencyPOS[d] : ++event_data.m_trackCollectionStat[nc].m_efficiencyNEG[d];
1121  }
1122  if(nc==0) {
1123  ++event_data.m_eventStat.m_events; ch > 0 ? ++event_data.m_eventStat.m_eventsPOS : ++event_data.m_eventStat.m_eventsNEG;
1124  ++event_data.m_eventStat.m_eventsBTE[(*p).rapidity()];
1125  }
1126  if(d==0) event_data.m_particles[nc].erase(p++);
1127  else {event_data.m_difference[nc].push_back(n-m); ++p;}
1128  }
1129  }
1130 }
1131 
1133 // Pointer to particle production for space point
1135 
1137 (const ITk::TrackClusterAssValidation::EventData_t &event_data,const Trk::PrepRawData* d1,const Trk::PrepRawData* d2,int* Kine,int nmax) const
1138 {
1139  int nkine = 0;
1140  int Kine1[1000],Kine2[1000];
1141  int n1 = kine(event_data,d1,Kine1,nmax); if(!n1) return nkine;
1142  int n2 = kine(event_data,d2,Kine2,nmax); if(!n2) return nkine;
1143 
1144  for(int i = 0; i!=n1; ++i) {
1145  for(int j = 0; j!=n2; ++j) {
1146  if(Kine1[i]==Kine2[j]) {Kine[nkine++] = Kine1[i]; break;}
1147  }
1148  }
1149  return nkine;
1150 }
1151 
1153 // Pointer to particle production for cluster
1155 
1157 (const ITk::TrackClusterAssValidation::EventData_t &event_data,const Trk::PrepRawData* d,int* Kine,int nmax) const
1158 {
1159 
1160  PRD_MultiTruthCollection::const_iterator mce;
1161  PRD_MultiTruthCollection::const_iterator mc = findTruth(event_data,d,mce);
1162 
1163  Identifier ID = d->identify();
1164  int nkine = 0;
1165 
1166  for(; mc!=mce; ++mc) {
1167 
1168  if( (*mc).first != ID ) return nkine;
1169 
1170  int k = (*mc).second.barcode(); if(k<=0) continue;
1171 
1172  const HepMC::ConstGenParticlePtr pa = (*mc).second.cptr();
1173  if(!pa or !pa->production_vertex()) continue;
1174 
1175  int pdg = std::abs(pa->pdg_id()); if(m_pdg && m_pdg != pdg ) continue;
1176 
1177  const HepPDT::ParticleData* pd = m_particleDataTable->particle(pdg);
1178  if(!pd or std::abs(pd->charge()) < .5) continue;
1179 
1180  // pT cut
1181  //
1182  double px = pa->momentum().px();
1183  double py = pa->momentum().py();
1184  double pz = pa->momentum().pz();
1185  double pt = std::sqrt(px*px+py*py);
1186  if( pt < m_ptcut || pt > m_ptcutmax) continue;
1187 
1188  // Rapidity cut
1189  //
1190  double t = std::abs(pz)/pt;
1191  if( t > m_tcut ) continue;
1192 
1193  // Radius cut
1194  //
1195  double vx = pa->production_vertex()->position().x();
1196  double vy = pa->production_vertex()->position().y();
1197  double r = std::sqrt(vx*vx+vy*vy);
1198  if( r < m_rmin || r > m_rmax) continue;
1199 
1200  Kine[nkine] = k; if(++nkine >= nmax) break;
1201  }
1202  return nkine;
1203 }
1204 
1206 // Pointer to particle production for cluster
1208 
1210 (const ITk::TrackClusterAssValidation::EventData_t &event_data,const Trk::PrepRawData* d,int* Kine,int nmax)
1211 {
1212 
1213  PRD_MultiTruthCollection::const_iterator mce;
1214  PRD_MultiTruthCollection::const_iterator mc = findTruth(event_data, d,mce);
1215 
1216  Identifier ID = d->identify();
1217  int nkine = 0;
1218 
1219  for(; mc!=mce; ++mc) {
1220 
1221  if( (*mc).first != ID ) return nkine;
1222 
1223  int k = (*mc).second.barcode(); if(k<=0) continue;
1224  Kine[nkine] = k; if(++nkine >= nmax) break;
1225  }
1226  return nkine;
1227 }
1228 
1230 // Test for cluster association with truth particles
1232 
1235 {
1236  PRD_MultiTruthCollection::const_iterator mce;
1237  PRD_MultiTruthCollection::const_iterator mc = findTruth(event_data,d,mce);
1238  return mc!=mce;
1239 }
1240 
1242 // Test detector element
1244 
1246 (const ITk::TrackClusterAssValidation::EventData_t &event_data, int K,const Trk::PrepRawData* d)
1247 {
1248  std::multimap<int,const Trk::PrepRawData*>::const_iterator k = event_data.m_kinecluster.find(K);
1249  for(; k!=event_data.m_kinecluster.end(); ++k) {
1250 
1251  if((*k).first!= K) return false;
1252  if(d->detectorElement()==(*k).second->detectorElement()) return true;
1253  }
1254  return false;
1255 }
1256 
1258 // Test detector element
1260 
1262 (const ITk::TrackClusterAssValidation::EventData_t &event_data, int K,const Trk::SpacePoint* sp)
1263 {
1264  const Trk::PrepRawData* p1 = sp->clusterList().first;
1265  const Trk::PrepRawData* p2 = sp->clusterList().second;
1266 
1267  std::multimap<int,const Trk::SpacePoint*>::const_iterator k = event_data.m_kinespacepoint.find(K);
1268 
1269  if(!p2) {
1270 
1271  for(; k!=event_data.m_kinespacepoint.end(); ++k) {
1272  if((*k).first!= K) return false;
1273 
1274  const Trk::PrepRawData* n1 = (*k).second->clusterList().first ;
1275  const Trk::PrepRawData* n2 = (*k).second->clusterList().second;
1276 
1277  if(p1->detectorElement() == n1->detectorElement()) return true;
1278  if(!n2) continue;
1279  if(p1->detectorElement() == n2->detectorElement()) return true;
1280  }
1281  return false;
1282  }
1283 
1284  for(; k!=event_data.m_kinespacepoint.end(); ++k) {
1285  if((*k).first!= K) return false;
1286 
1287  const Trk::PrepRawData* n1 = (*k).second->clusterList().first ;
1288  const Trk::PrepRawData* n2 = (*k).second->clusterList().second;
1289 
1290  if(p1->detectorElement() == n1->detectorElement()) return true;
1291  if(p2->detectorElement() == n1->detectorElement()) return true;
1292  if(!n2) continue;
1293  if(p1->detectorElement() == n2->detectorElement()) return true;
1294  if(p2->detectorElement() == n2->detectorElement()) return true;
1295  }
1296  return false;
1297 }
1298 
1300 // Dump information about no recontructed particles
1302 
1304 {
1305 
1306  for(SG::ReadHandleKeyArray<TrackCollection>::size_type nc=0; nc!=m_tracklocation.size(); ++nc) {
1307 
1308  auto p = event_data.m_particles[nc].begin(), pe =event_data.m_particles[nc].end();
1309  if(p==pe) continue;
1310 
1311  std::list<int>::const_iterator dif = event_data.m_difference[nc].begin();
1312 
1313  std::multimap<int,const Trk::PrepRawData*>::const_iterator c,ce = event_data.m_kinecluster.end();
1314 
1315  int n = 69-m_tracklocation[nc].key().size();
1316  std::string s1; for(int i=0; i<n; ++i) s1.append(" "); s1.append("|");
1317  std::stringstream out;
1318  out<<"|----------------------------------------------------------------------------------------|\n";
1319  out<<"| "<<m_tracklocation[nc]<<s1<<"\n";
1320  out<<"|----------------------------------------------------------------------------------------|\n";
1321  out<<"| # pdg kine Ncl Ntr Nsp Lose pT(MeV) rapidity radius z |\n";
1322  out<<"|----------------------------------------------------------------------------------------|\n";
1323 
1324  n = 0;
1325  for(; p!=pe; ++p) {
1326 
1327  int k = (*p).barcode();
1328 
1329  c = event_data.m_kinecluster.find(k); if(c==ce) continue;
1330  const Trk::PrepRawData* d = (*c).second;
1331 
1332  PRD_MultiTruthCollection::const_iterator mce;
1333  PRD_MultiTruthCollection::const_iterator mc = findTruth(event_data,d,mce);
1334 
1335  Identifier ID = d->identify();
1336  bool Q = false;
1337  for(; mc!=mce; ++mc) {
1338  if((*mc).first != ID) break;
1339  if((*mc).second.barcode()==k) {Q=true; break;}
1340  }
1341 
1342  if(!Q) continue;
1343 
1344  const HepMC::ConstGenParticlePtr pa = (*mc).second.cptr();
1345 
1346  double px = pa->momentum().px();
1347  double py = pa->momentum().py();
1348  double pz = pa->momentum().pz();
1349  double vx = pa->production_vertex()->position().x();
1350  double vy = pa->production_vertex()->position().y();
1351  double vz = pa->production_vertex()->position().z();
1352  double pt = std::sqrt(px*px+py*py);
1353  double t = std::atan2(pt,pz);
1354  double ra =-std::log(std::tan(.5*t));
1355  double r = std::sqrt(vx*vx+vy*vy);
1356  ++n;
1357  out<<"| "
1358  <<std::setw(4)<<n
1359  <<std::setw(6)<<pa->pdg_id()
1360  <<std::setw(10)<<HepMC::barcode(pa)
1361  <<std::setw(4)<<event_data.m_kinecluster .count(k)
1362  <<std::setw(4)<<event_data.m_kinespacepoint.count(k)
1363  <<std::setw(4)<<(*dif)
1364  <<std::setw(12)<<std::setprecision(5)<<pt
1365  <<std::setw(12)<<std::setprecision(5)<<ra
1366  <<std::setw(12)<<std::setprecision(5)<<r
1367  <<std::setw(12)<<std::setprecision(5)<<vz
1368  <<" |\n";
1369  ++dif;
1370 
1371  }
1372  out<<"|----------------------------------------------------------------------------------------|\n";
1373  ATH_MSG_INFO("\n"<<out.str());
1374  }
1375  return true;
1376 }
1377 
1379 // Cluster truth information
1381 
1382 PRD_MultiTruthCollection::const_iterator
1385  const Trk::PrepRawData* d,
1386  PRD_MultiTruthCollection::const_iterator& mce)
1387 {
1388  const InDet::SCT_Cluster * si = dynamic_cast<const InDet::SCT_Cluster*> (d);
1389  const InDet::PixelCluster * px = dynamic_cast<const InDet::PixelCluster*> (d);
1390 
1391  PRD_MultiTruthCollection::const_iterator mc;
1392 
1393  if (px && event_data.m_truthPix) {mc=event_data.m_truthPix->find(d->identify()); mce=event_data.m_truthPix->end();}
1394  else if(si && event_data.m_truthStrip) {mc=event_data.m_truthStrip->find(d->identify()); mce=event_data.m_truthStrip->end();}
1395  else {
1396  const PRD_MultiTruthCollection *truth[] {event_data. m_truthPix,event_data.m_truthStrip};
1397  for (int i=0; i<3; i++) {
1398  if (truth[i]) {
1399  mce=truth[i]->end();
1400  return truth[i]->end();
1401  }
1402  }
1403  throw std::runtime_error("Neither Pixel nor Strip truth.");
1404  }
1405  return mc;
1406 }
1407 
1409 // Cluster truth information
1411 
1412 int ITk::TrackClusterAssValidation::charge(const ITk::TrackClusterAssValidation::EventData_t &event_data,std::pair<int,const Trk::PrepRawData*> pa,int& rap, double& eta) const
1413 {
1414  int k = pa.first;
1415  const Trk::PrepRawData* d = pa.second;
1416  PRD_MultiTruthCollection::const_iterator mce;
1417  PRD_MultiTruthCollection::const_iterator mc = findTruth(event_data,d,mce);
1418 
1419  for(; mc!=mce; ++mc) {
1420  if((*mc).second.barcode()==k) {
1421 
1422  const HepMC::ConstGenParticlePtr pat = (*mc).second.cptr();
1423 
1424  rap = 0;
1425  double px = pat->momentum().px();
1426  double py = pat->momentum().py();
1427  double pz = pat->momentum().pz();
1428  double pt = std::sqrt(px*px+py*py) ;
1429  double t = std::atan2(pt,pz) ;
1430  eta = std::abs(std::log(std::tan(.5*t)));
1431  // Forward
1432  if (eta > 3.0)
1433  rap = 3;
1434  else
1435  // other regions
1436  eta > 1.6 ? rap = 2 : eta > .8 ? rap = 1 : rap = 0;
1437 
1438  int pdg = pat->pdg_id();
1439  const HepPDT::ParticleData* pd = m_particleDataTable->particle(abs(pdg));
1440  if(!pd) return 0;
1441  double ch = pd->charge(); if(pdg < 0) ch = -ch;
1442  if(ch > .5) return 1;
1443  if(ch < -.5) return -1;
1444  return 0;
1445  }
1446  }
1447  return 0;
1448 }
Trk::SpacePoint::clusterList
const std::pair< const PrepRawData *, const PrepRawData * > & clusterList() const
return the pair of cluster pointers by reference
Definition: Tracking/TrkEvent/TrkSpacePoint/TrkSpacePoint/SpacePoint.h:127
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
ITk::TrackClusterAssValidation::finalize
StatusCode finalize()
Definition: ITkTrackClusterAssValidation.cxx:166
Trk::SpacePoint
Definition: Tracking/TrkEvent/TrkSpacePoint/TrkSpacePoint/SpacePoint.h:35
beamspotman.r
def r
Definition: beamspotman.py:676
ITk::TrackClusterAssValidation::EventData_t::m_eventStat
InDet::EventStat_t m_eventStat
Definition: ITkTrackClusterAssValidation.h:132
CalculateHighPtTerm.pT
pT
Definition: ICHEP2016/CalculateHighPtTerm.py:57
ITk::TrackClusterAssValidation::EventData_t::m_nqtracks
int m_nqtracks
Definition: ITkTrackClusterAssValidation.h:118
xAOD::eratio
setCharge setNTRTHiThresholdHits eratio
Definition: TrigElectron_v1.cxx:96
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
InDet::EventStat_t::m_nclustersNegEP
int m_nclustersNegEP
Definition: TrackClusterAssValidationUtils.h:111
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
sendEI_SPB.ch
ch
Definition: sendEI_SPB.py:35
PlotCalibFromCool.ft
ft
Definition: PlotCalibFromCool.py:329
python.SystemOfUnits.s
int s
Definition: SystemOfUnits.py:131
get_generator_info.result
result
Definition: get_generator_info.py:21
test_pyathena.px
px
Definition: test_pyathena.py:18
python.SystemOfUnits.m
int m
Definition: SystemOfUnits.py:91
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
max
#define max(a, b)
Definition: cfImp.cxx:41
python.Constants.FATAL
int FATAL
Definition: Control/AthenaCommon/python/Constants.py:19
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
ID
std::vector< Identifier > ID
Definition: CalibHitIDCheck.h:24
ITk::TrackClusterAssValidation::EventData_t::m_truthPix
const PRD_MultiTruthCollection * m_truthPix
Definition: ITkTrackClusterAssValidation.h:124
InDet::EventStat_t::m_nclustersNegBP
int m_nclustersNegBP
Definition: TrackClusterAssValidationUtils.h:109
eta
Scalar eta() const
pseudorapidity method
Definition: AmgMatrixBasePlugin.h:79
hist_file_dump.d
d
Definition: hist_file_dump.py:137
PRD_MultiTruthCollection
A PRD is mapped onto all contributing particles.
Definition: PRD_MultiTruthCollection.h:24
ITk::TrackClusterAssValidation::EventData_t::m_truthStrip
const PRD_MultiTruthCollection * m_truthStrip
Definition: ITkTrackClusterAssValidation.h:125
GenVertex.h
ITk::TrackClusterAssValidation::EventData_t::m_kinespacepoint
std::multimap< int, const Trk::SpacePoint * > m_kinespacepoint
Definition: ITkTrackClusterAssValidation.h:127
test_pyathena.pt
pt
Definition: test_pyathena.py:11
python.AthDsoLogger.out
out
Definition: AthDsoLogger.py:71
ITk::TrackClusterAssValidation::EventData_t::m_spacePointContainer
std::vector< SG::ReadHandle< SpacePointContainer > > m_spacePointContainer
Definition: ITkTrackClusterAssValidation.h:122
ITk::TrackClusterAssValidation::EventData_t::m_clusterHandles
std::vector< std::unique_ptr< SG::VarHandleBase > > m_clusterHandles
Definition: ITkTrackClusterAssValidation.h:120
ParticleTest.tp
tp
Definition: ParticleTest.py:25
TRT_PAI_gasdata::NC
const int NC
Number of levels for Carbon.
Definition: TRT_PAI_gasdata.h:237
InDet::EventStat_t::m_nclustersNegBS
int m_nclustersNegBS
Definition: TrackClusterAssValidationUtils.h:110
dq_defect_virtual_defect_validation.d1
d1
Definition: dq_defect_virtual_defect_validation.py:79
SG::HandleKeyArray
Definition: StoreGate/StoreGate/HandleKeyArray.h:38
Trk::RIO_OnTrack
Definition: RIO_OnTrack.h:70
ReadCellNoiseFromCoolCompare.s4
s4
Definition: ReadCellNoiseFromCoolCompare.py:381
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
SG::ReadHandleKey
Property holding a SG store/key/clid from which a ReadHandle is made.
Definition: StoreGate/StoreGate/ReadHandleKey.h:39
drawFromPickle.exp
exp
Definition: drawFromPickle.py:36
keylayer_zslicemap.se
se
Definition: keylayer_zslicemap.py:194
LArG4AODNtuplePlotter.pe
pe
Definition: LArG4AODNtuplePlotter.py:116
GenParticle.h
ITk::TrackClusterAssValidation::newClustersEvent
void newClustersEvent(const EventContext &ctx, ITk::TrackClusterAssValidation::EventData_t &event_data) const
Definition: ITkTrackClusterAssValidation.cxx:693
InDet::EventStat_t::m_nclustersNegES
int m_nclustersNegES
Definition: TrackClusterAssValidationUtils.h:112
drawFromPickle.atan
atan
Definition: drawFromPickle.py:36
InDet::EventStat_t::m_particleClusters
int m_particleClusters[50]
Definition: TrackClusterAssValidationUtils.h:100
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
python.iconfTool.models.loaders.level
level
Definition: loaders.py:20
AthReentrantAlgorithm
An algorithm that can be simultaneously executed in multiple threads.
Definition: AthReentrantAlgorithm.h:83
ITk::TrackClusterAssValidation::isTheSameDetElement
static bool isTheSameDetElement(const ITk::TrackClusterAssValidation::EventData_t &event_data, int, const Trk::PrepRawData *)
Definition: ITkTrackClusterAssValidation.cxx:1246
InDet::EventStat_t::m_particleSpacePointsBTE
int m_particleSpacePointsBTE[50][4]
Definition: TrackClusterAssValidationUtils.h:103
ITk::TrackClusterAssValidation::qualityTracksSelection
int qualityTracksSelection(ITk::TrackClusterAssValidation::EventData_t &event_data) const
Definition: ITkTrackClusterAssValidation.cxx:870
ITkTrackClusterAssValidation.h
ITk::TrackClusterAssValidation::TrackClusterAssValidation
TrackClusterAssValidation(const std::string &name, ISvcLocator *pSvcLocator)
Definition: ITkTrackClusterAssValidation.cxx:25
mc
Definition: mc.PG_single_nu_valid.py:1
TrigConf::MSGTC::Level
Level
Definition: Trigger/TrigConfiguration/TrigConfBase/TrigConfBase/MsgStream.h:21
ITk::TrackClusterAssValidation::initialize
StatusCode initialize()
Definition: ITkTrackClusterAssValidation.cxx:38
ITk::TrackClusterAssValidation::EventData_t::m_nspacepoints
int m_nspacepoints
Definition: ITkTrackClusterAssValidation.h:116
lumiFormat.i
int i
Definition: lumiFormat.py:92
ITk::TrackClusterAssValidation::noReconstructedParticles
bool noReconstructedParticles(const ITk::TrackClusterAssValidation::EventData_t &event_data) const
Definition: ITkTrackClusterAssValidation.cxx:1303
ITk::TrackClusterAssValidation::efficiencyReconstruction
void efficiencyReconstruction(ITk::TrackClusterAssValidation::EventData_t &event_data) const
Definition: ITkTrackClusterAssValidation.cxx:1089
Identifier
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:32
beamspotman.n
n
Definition: beamspotman.py:731
InDet::PartPropCache
Definition: TrackClusterAssValidationUtils.h:15
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
ITk::TrackClusterAssValidation::findTruth
static PRD_MultiTruthCollection::const_iterator findTruth(const ITk::TrackClusterAssValidation::EventData_t &event_data, const Trk::PrepRawData *, PRD_MultiTruthCollection::const_iterator &)
Definition: ITkTrackClusterAssValidation.cxx:1384
ITk::TrackClusterAssValidation::EventData_t::m_nclusters
int m_nclusters
Definition: ITkTrackClusterAssValidation.h:117
HepMC::barcode
int barcode(const T *p)
Definition: Barcode.h:16
AmgVector
AmgVector(4) T2BSTrackFilterTool
Definition: T2BSTrackFilterTool.cxx:114
ITk::TrackClusterAssValidation::EventData_t
Definition: ITkTrackClusterAssValidation.h:100
ITk::TrackClusterAssValidation::EventData_t::m_trackcontainer
std::vector< SG::ReadHandle< TrackCollection > > m_trackcontainer
Definition: ITkTrackClusterAssValidation.h:121
ITk::TrackClusterAssValidation::newSpacePointsEvent
void newSpacePointsEvent(const EventContext &ctx, ITk::TrackClusterAssValidation::EventData_t &event_data) const
Definition: ITkTrackClusterAssValidation.cxx:779
ITk::TrackClusterAssValidation::dumptools
MsgStream & dumptools(MsgStream &out, MSG::Level level) const
Definition: ITkTrackClusterAssValidation.cxx:611
TrackCollection.h
Amg::pz
@ pz
Definition: GeoPrimitives.h:40
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
IdentifiableContainerMT::const_iterator
Definition: IdentifiableContainerMT.h:82
drawFromPickle.tan
tan
Definition: drawFromPickle.py:36
Trk::ParametersBase
Definition: ParametersBase.h:55
xAOD::double
double
Definition: CompositeParticle_v1.cxx:159
InDet::SCT_Cluster
Definition: InnerDetector/InDetRecEvent/InDetPrepRawData/InDetPrepRawData/SCT_Cluster.h:34
compute_lumi.denom
denom
Definition: compute_lumi.py:76
lumiFormat.array
array
Definition: lumiFormat.py:98
Trk::PrepRawData
Definition: PrepRawData.h:62
Trk::MeasurementBase
Definition: MeasurementBase.h:58
dso-stats.pat
pat
Definition: dso-stats.py:39
InDet::EventStat_t::m_nclustersPosES
int m_nclustersPosES
Definition: TrackClusterAssValidationUtils.h:108
GetAllXsec.entry
list entry
Definition: GetAllXsec.py:132
HepMC::ConstGenParticlePtr
const GenParticle * ConstGenParticlePtr
Definition: GenParticle.h:38
ITk::TrackClusterAssValidation::EventData_t::m_spacepointsOverlap
std::unique_ptr< SG::ReadHandle< SpacePointOverlapCollection > > m_spacepointsOverlap
Definition: ITkTrackClusterAssValidation.h:123
Amg::py
@ py
Definition: GeoPrimitives.h:39
ReadCellNoiseFromCoolCompare.s3
s3
Definition: ReadCellNoiseFromCoolCompare.py:380
ITk::TrackClusterAssValidation::kine
int kine(const ITk::TrackClusterAssValidation::EventData_t &event_data, const Trk::PrepRawData *, const Trk::PrepRawData *, int *, int) const
Definition: ITkTrackClusterAssValidation.cxx:1137
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
RIO_OnTrack.h
PixelClusterContainer.h
charge
double charge(const T &p)
Definition: AtlasPID.h:494
ITk::TrackClusterAssValidation::EventData_t::m_particles
std::vector< std::list< InDet::PartPropCache > > m_particles
Definition: ITkTrackClusterAssValidation.h:128
InDetDD::SiDetectorElement
Definition: SiDetectorElement.h:109
ITk::TrackClusterAssValidation::kine0
static int kine0(const ITk::TrackClusterAssValidation::EventData_t &event_data, const Trk::PrepRawData *, int *, int)
Definition: ITkTrackClusterAssValidation.cxx:1210
ITk::TrackClusterAssValidation::~TrackClusterAssValidation
virtual ~TrackClusterAssValidation()
Trk::RIO_OnTrack::prepRawData
virtual const Trk::PrepRawData * prepRawData() const =0
returns the PrepRawData (also known as RIO) object to which this RIO_OnTrack is associated.
ITk::TrackClusterAssValidation::isTruth
static bool isTruth(const ITk::TrackClusterAssValidation::EventData_t &, const Trk::PrepRawData *)
Definition: ITkTrackClusterAssValidation.cxx:1234
xAOD::k0
@ k0
for Fatras usage
Definition: TrackingPrimitives.h:202
ITk::TrackClusterAssValidation::EventData_t::m_trackCollectionStat
std::vector< InDet::TrackCollectionStat_t > m_trackCollectionStat
Definition: ITkTrackClusterAssValidation.h:131
Rtt_histogram.n1
n1
Definition: Rtt_histogram.py:21
InDet::PixelCluster
Definition: InnerDetector/InDetRecEvent/InDetPrepRawData/InDetPrepRawData/PixelCluster.h:49
InDet::EventStat_t::m_eventsBTE
int m_eventsBTE[4]
Definition: TrackClusterAssValidationUtils.h:98
ITk::TrackClusterAssValidation::dumpevent
static MsgStream & dumpevent(MsgStream &out, const ITk::TrackClusterAssValidation::EventData_t &event_data)
Definition: ITkTrackClusterAssValidation.cxx:666
python.compareTCTs.ratio
ratio
Definition: compareTCTs.py:295
ITk::TrackClusterAssValidation::execute
StatusCode execute(const EventContext &ctx) const
Definition: ITkTrackClusterAssValidation.cxx:109
python.CaloScaleNoiseConfig.str
str
Definition: CaloScaleNoiseConfig.py:78
InDet::EventStat_t::m_nclustersPosBP
int m_nclustersPosBP
Definition: TrackClusterAssValidationUtils.h:105
TRT_PAI_physicsConstants::mb
const double mb
1mb to cm2
Definition: TRT_PAI_physicsConstants.h:15
InDet::EventStat_t::m_events
int m_events
Definition: TrackClusterAssValidationUtils.h:95
Pythia8_RapidityOrderMPI.val
val
Definition: Pythia8_RapidityOrderMPI.py:14
InDet::EventStat_t
Definition: TrackClusterAssValidationUtils.h:93
dq_defect_virtual_defect_validation.d2
d2
Definition: dq_defect_virtual_defect_validation.py:81
DEBUG
#define DEBUG
Definition: page_access.h:11
ReadCellNoiseFromCoolCompare.s2
s2
Definition: ReadCellNoiseFromCoolCompare.py:379
InDet::EventStat_t::m_eventsPOS
int m_eventsPOS
Definition: TrackClusterAssValidationUtils.h:96
python.CaloCondTools.log
log
Definition: CaloCondTools.py:20
InDet::EventStat_t::m_eventsNEG
int m_eventsNEG
Definition: TrackClusterAssValidationUtils.h:97
SCT_ClusterContainer.h
LArNewCalib_DelayDump_OFC_Cali.idx
idx
Definition: LArNewCalib_DelayDump_OFC_Cali.py:69
extractSporadic.q
list q
Definition: extractSporadic.py:98
python.SystemOfUnits.ns
int ns
Definition: SystemOfUnits.py:130
dqt_zlumi_alleff_HIST.eff
int eff
Definition: dqt_zlumi_alleff_HIST.py:113
ITk::TrackClusterAssValidation::EventData_t::m_kinecluster
std::multimap< int, const Trk::PrepRawData * > m_kinecluster
Definition: ITkTrackClusterAssValidation.h:126
str
Definition: BTagTrackIpAccessor.cxx:11
ITk::TrackClusterAssValidation::tracksComparison
void tracksComparison(const EventContext &ctx, ITk::TrackClusterAssValidation::EventData_t &event_data) const
Definition: ITkTrackClusterAssValidation.cxx:976
InDet::EventStat_t::m_nclustersPosEP
int m_nclustersPosEP
Definition: TrackClusterAssValidationUtils.h:107
ITk::TrackClusterAssValidation::charge
int charge(const ITk::TrackClusterAssValidation::EventData_t &event_data, std::pair< int, const Trk::PrepRawData * >, int &, double &) const
Definition: ITkTrackClusterAssValidation.cxx:1412
drawFromPickle.sin
sin
Definition: drawFromPickle.py:36
beamspotnt.nt
def nt
Definition: bin/beamspotnt.py:1063
ReadHandle.h
Handle class for reading from StoreGate.
rp
ReadCards * rp
Definition: IReadCards.cxx:26
python.IoTestsLib.w
def w
Definition: IoTestsLib.py:200
covarianceTool.mc
mc
Definition: covarianceTool.py:554
python.CaloScaleNoiseConfig.ts
ts
Definition: CaloScaleNoiseConfig.py:86
InDet::EventStat_t::m_nclustersPosBS
int m_nclustersPosBS
Definition: TrackClusterAssValidationUtils.h:106
python.compressB64.c
def c
Definition: compressB64.py:93
ITk::TrackClusterAssValidation::m_particleDataTable
const HepPDT::ParticleDataTable * m_particleDataTable
Definition: ITkTrackClusterAssValidation.h:135
python.AutoConfigFlags.msg
msg
Definition: AutoConfigFlags.py:7
nmax
const int nmax(200)
InDet::SiCluster
Definition: InnerDetector/InDetRecEvent/InDetPrepRawData/InDetPrepRawData/SiCluster.h:40
LheEventFiller_Common.ef
ef
Definition: SFGen_i/share/common/LheEventFiller_Common.py:7
plotBeamSpotMon.nc
int nc
Definition: plotBeamSpotMon.py:83
ITk::TrackClusterAssValidation::EventData_t::m_difference
std::vector< std::list< int > > m_difference
Definition: ITkTrackClusterAssValidation.h:129
Trk::TrackStateOnSurface::Measurement
@ Measurement
This is a measurement, and will at least contain a Trk::MeasurementBase.
Definition: TrackStateOnSurface.h:101
InDet::EventStat_t::m_particleClustersBTE
int m_particleClustersBTE[50][4]
Definition: TrackClusterAssValidationUtils.h:102
fitman.k
k
Definition: fitman.py:528
ITk::TrackClusterAssValidation::EventData_t::m_tracks
std::vector< std::multimap< int, int > > m_tracks
Definition: ITkTrackClusterAssValidation.h:130
Trk::PrepRawData::detectorElement
virtual const TrkDetElementBase * detectorElement() const =0
return the detector element corresponding to this PRD The pointer will be zero if the det el is not d...
InDet::EventStat_t::m_particleSpacePoints
int m_particleSpacePoints[50]
Definition: TrackClusterAssValidationUtils.h:101