ATLAS Offline Software
TRT_HitCollectionCnv_p4.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
9 
10 #include <cmath>
11 
12 // CLHEP
13 #include "CLHEP/Geometry/Point3D.h"
14 #include "CLHEP/Units/SystemOfUnits.h"
15 
16 // Gaudi
17 #include "GaudiKernel/MsgStream.h"
18 #include "GaudiKernel/ThreadLocalContext.h"
19 
20 // Athena
23 #include "StoreGate/StoreGateSvc.h"
24 
25 // Transient(Geant) to Persistent(Disk)
27 {
28 
29  /*
30  Spring 2009
31  Andrew Beddall - lossy TRT G4hit compression [p3]
32 
33  In p1, p2 versions, GEANT hits are persistified on disk as floats.
34  In the p3 version, floats are compressed to "integers"/"short-floats" before persistifying.
35  In the p4 version, HepMcParticleLink_p2 can identify the event index and collection.
36  The saving is about 75%; see http://cern.ch/beddall/TRThitCompression/
37 
38  Spring 2008
39  Rob Duxfield - lossless TRT G4hit compression [p2]
40 
41  Finds hits belonging to a "string" (in which the end point of one hit is
42  the same as the start point of the next) and persistifies the end point
43  of each hit plus the start point of the first hit in each string.
44  */
45 
46  // The original units from the hit simulation are indicated in comments;
47  // they are all in CLHEP units except for hitEne which is in keV.
48  // I sometimes make use of CLHEP scales *CLHEP::mm and *CLHEP::ns (both=1) for clarity (I hope!).
49  // See also https://twiki.cern.ch/twiki/bin/view/Atlas/TrtSoftware#Production_of_Hits
50 
51  static const double dRcut = 1.0e-7*CLHEP::mm;
52  static const double dTcut = 1.0*CLHEP::ns; // redundant?
53 
54  // if (log.level() <= MSG::DEBUG) log << MSG::DEBUG << "In TRT_HitCollectionCnv_p4::transToPers()" << endmsg;
55 
56  const EventContext& ctx = Gaudi::Hive::currentContext();
57  const IProxyDict* proxy = Atlas::getExtendedEventContext(ctx).proxy();
58  int lastIndex{-1};
59  int lastBarcode{-1};
60  int lastId = -1;
61  double lastT = 0.0*CLHEP::ns;
62  unsigned int idx = 0;
63  unsigned int endBC = 0;
64  unsigned int endId = 0;
65  unsigned int endHit = 0;
66  HepGeom::Point3D<double> lastEnd(0.0, 0.0, 0.0); // mm
67 
68  for (TRTUncompressedHitCollection::const_iterator it = transCont->begin(); it != transCont->end(); ++it) {
69 
71  const HepMcParticleLink * currentLink = &(trtHit->particleLink());
72  const int barcode = currentLink->barcode();
73  int index{0};
75  proxy).at(0) != 0) {
76  index = currentLink->eventIndex();
77  }
78 
79  if ( lastBarcode != barcode || lastIndex != index || (idx - endBC > 65500) ) { // max unsigned short = 65535;
80  lastBarcode = barcode;
81  lastIndex = index;
82  const unsigned short persIndex = static_cast<unsigned short>(index);
83  if (static_cast<HepMcParticleLink::index_type>(lastIndex) != static_cast<HepMcParticleLink::index_type>(persIndex)) {
84  log << MSG::WARNING << "Attempting to persistify an eventIndex larger than max unsigned short!" << endmsg;
85  }
86  // store barcode, eventIndex and McEventCollection once for set
87  // of consecutive hits with the same barcode and eventIndex
88  persCont->m_barcode.push_back(static_cast<unsigned int>(lastBarcode));
89  persCont->m_mcEvtIndex.push_back(persIndex);
90  persCont->m_evtColl.push_back('a'); // Hard-coding as this only ever had a single value in production
91 
92  if ( idx > 0 ) {
93  persCont->m_nBC.push_back(idx - endBC);
94  endBC = idx;
95  }
96  }
97 
98  if ( (int)trtHit->GetParticleEncoding() != lastId || idx - endId > 65500) { // max unsigned short = 65535;
99  // store id once for set of consecutive hits with same id
100  lastId = trtHit->GetParticleEncoding();
101  persCont->m_id.push_back(lastId);
102  if ( idx > 0 ) {
103  persCont->m_nId.push_back(idx - endId);
104  endId = idx;
105  }
106  }
107 
108  const HepGeom::Point3D<double> hitStart(trtHit->GetPreStepX(), trtHit->GetPreStepY(), trtHit->GetPreStepZ()); // mm
109 
110  const double meanTime = trtHit->GetGlobalTime(); // ns // Time of flight from the I.P. to the center of the hit.
111  const double dTLast = std::abs(meanTime - lastT); // |d(meantime)| between the previous hit and the current one.
112  const double dRLast = lastEnd.distance(hitStart); // Distance between end of previous hit and start of current one;
113  // this is zero if the hit is a continuation of the same particle in the same straw.
114 
115  // Begin a new string if the current and previous hits are disconnected;
116  // it looks like dTcut is redundant (but not sure about this).
117  if ( dRLast >= dRcut || dTLast >= dTcut ) {
118 
119  // if ( dRLast < dRcut) std::cout << "AJBdTLastTriggeredNewString " << dRLast << " " << dTLast << std::endl;
120 
122  // new hit string //
124 
125  //
126  // Persistify string *strawId* using 24 bits.
127  // Assumes 0 <= strawId <= 16,777,215 (strawId appears to be < 4,000,000)
128  //
129  const unsigned int strawId = trtHit->GetHitID();
130  persCont->m_strawId1b.push_back( (unsigned char)(strawId % 256) ); // 8 bits
131  persCont->m_strawId2b.push_back( (unsigned short)(strawId / 256) ); // 16 bits
132  if ( strawId>16777215 )
133  log << MSG::WARNING << "TRT_HitCollectionCnv: strawId > 2^24-1 cannot be persistified correctly! " << endmsg;
134 
135  //
136  // Persistify string start radius using 1 bit (istartRflag) or 8 bits (startR)
137  // Note that the smallest value of R is the wire radius (0.0155 mm)
138  //
139  // R will be flagged as 2 mm if it is within 0.1 um of the straw wall => max error = 0.1 um,
140  // otherwise compress with 8 bits => max error = 3.9 um (0.078 ns), RMS error = 1.1 um (0.022 ns)
141  //
142  const double startR = sqrt( hitStart.x()*hitStart.x() + hitStart.y()*hitStart.y() ); // mm
143  unsigned short istartRflag;
144  if ( startR > 1.9999*CLHEP::mm ) {
145  istartRflag=1; // persistify as a 1-bit flag
146  }
147  else {
148  istartRflag=0; // compress to 8 bits with a span of 2 mm
149  persCont->m_startR.push_back( (unsigned char)(startR/(2.0*CLHEP::mm)*256.0) );
150  }
151 
152  //
153  // Persistify string *startPhi* using 8 bits (min=-pi, max=+pi)
154  // Max. error = 12 mrad (< 24 um, 0.48 ns); RMS error = 7 mrad (< 14 um, 0.28 ns)
155  //
156  const double startPhi = atan2( hitStart.y(), hitStart.x() ); // returns range -pi to +pi rad
157  persCont->m_startPhi.push_back( (unsigned char)( (startPhi+M_PI)/(2.0*M_PI)*256.0 ) );
158 
159  //
160  // Persistify *startZ* using a 4 bits (min = -365 mm, max= +365 mm)
161  // Max. error = 25 mm (25e-3/(0.75c) = 0.111 ns * 2 reflect = 0.222 ns)
162  // RMS error = 14 mm (14e-3/(0.75c) = 0.062 ns * 2 reflect = 0.124 ns)
163  // Also the 1-bit *istartRflag* is packed into this variable.
164  //
165  // Note:
166  // In the digi code we need to allow for something like 22.5 mm outside straw.
167  // Also because we have short straws,
168  // short straws are about < +-180 mm, long straws are about < +-350 mm
169  // The following compressions can give a large "out of straw" value;
170  // *don't* use these: (2.0), 32.0, 128.0, 256.0.
171 
172  unsigned char istartZ = (unsigned char)( (hitStart.z()+365.0*CLHEP::mm)/(730.0*CLHEP::mm)*16.0 );
173  istartZ = (istartZ << 1) | istartRflag;
174  persCont->m_startZ.push_back( istartZ );
175 
176  if ( idx > 0 ) {
177  persCont->m_nHits.push_back( idx - endHit );
178  endHit = idx;
179  }
180  /*
181  // Validation output
182  std::cout.precision(15);
183  std::cout << "AJBTtoPstrawId " << strawId << std::endl;
184  std::cout << "AJBTtoPstartR " << startR << std::endl;
185  std::cout << "AJBTtoPstartPhi " << startPhi << std::endl;
186  std::cout << "AJBTtoPstartX " << hitStart.x() << std::endl;
187  std::cout << "AJBTtoPstartY " << hitStart.y() << std::endl;
188  std::cout << "AJBTtoPstartZ " << hitStart.z() << std::endl;
189  */
190  } // end of "begin new hit string"
191 
193  // Now for the end hits //
195 
196  const HepGeom::Point3D<double> hitEnd(trtHit->GetPostStepX(), trtHit->GetPostStepY(), trtHit->GetPostStepZ()); // mm
197  const HepGeom::Point3D<double> hitLength = (hitEnd - hitStart);
198 
199  //
200  // Here both *kinEne* (kinetic energy of the particle causing the hit) and
201  // *steplength* (g4hit length) are persistified using a 15-bit "short float"
202  // (9 bit unsigned mantissa, 6 bit unsigned exponent).
203  // This stores values in the range 0.51*2^0 = 0.51 to 1.00*2^63 = 9.2e18.
204  // I enforce the limits 1.0 and 9.0e18; see below.
205  // Max relative error = 0.0010, RMS = 0.0004
206  //
207  // Notes:
208  //
209  // - G4 gives kinEne in MeV; I sometimes see values ~ 1e-7 MeV (100 meV) [float round-off?]
210  // So I multiply by 1e9 and store in units of meV => range 1.0 meV to 9.0e18 meV (9000 TeV!)
211  // - About 1 in 10000 hits have steplength ~ 1e-7 mm [float round-off?]
212  // so again I multiply by 1e9 and store in units of pm => range 1.0 pm to 9.0e18 pm (9000 km)
213  // - The mantissa has maximum 9 bits, the exponent has maximum 6 bits,
214  // Note: a rare condition causes an 10-bit mantissa (mantissa=512).
215  //
216  double kinEne = trtHit->GetKineticEnergy() * 1.0e9; // nano Mev = meV.
217  double steplength = hitLength.distance() * 1.0e9; // nano mm = pm.
218  if ( kinEne < 1.0 ) kinEne=1.0; // Keep the value
219  if ( steplength < 1.0 ) steplength=1.0; // well within the
220  if ( kinEne > 9.0e18 ) kinEne=9.0e18; // range of the
221  if ( steplength > 9.0e18 ) steplength=9.0e18; // short float.
222  const unsigned int kexponent = (unsigned int)ceil(log10(kinEne)/0.30102999566398);
223  const unsigned int sexponent = (unsigned int)ceil(log10(steplength)/0.30102999566398);
224  const unsigned int kmantissa = (unsigned int)(kinEne/pow(2.0,kexponent)*1024) - 512;
225  const unsigned int smantissa = (unsigned int)(steplength/pow(2.0,sexponent)*1024) - 512;
226  persCont->m_kinEne.push_back( (kmantissa << 6) | kexponent );
227  persCont->m_steplength.push_back( (smantissa << 6) | sexponent );
228 
229  //
230  // Persistify hit end radius using 1 bit (iendRflag) or 8 bits (endR).
231  // Note that the smallest value of R is the wire radius (0.0155 mm)
232  //
233  // R will be flagged as 2 mm if it is within 0.1 um of the straw wall => max error = 0.1 um,
234  // otherwise compress with 8 bits. The errors are as for startR, but can increased greatly
235  // after steplength preservation in PtoT.
236  //
237  const double endR = sqrt( hitEnd.x()*hitEnd.x() + hitEnd.y()*hitEnd.y() ); // mm
238  unsigned short iendRflag;
239  if ( endR > 1.9999*CLHEP::mm ) {
240  iendRflag=1; // persistify as a 1-bit flag
241  }
242  else {
243  iendRflag=0; // compress to 8 bits with a span of 2 mm
244  persCont->m_endR.push_back( (unsigned char)(endR/(2.0*CLHEP::mm)*256.0) );
245  }
246 
247  //
248  // Persistify string *endPhi* using 8 bits (min=-pi, max=+pi)
249  // The errors are as for startPhi, but are very different after steplength
250  // preservation in PtoT.
251  //
252  const double endPhi = atan2( hitEnd.y(), hitEnd.x() ); // returns range -pi to +pi rad
253  persCont->m_endPhi.push_back( (unsigned char)( (endPhi+M_PI)/(2.0*M_PI)*256.0 ) );
254 
255  //
256  // Persistify hit *meanTime* using 10 bits (min=0.,span=75 ns)
257  // with float overflow for meanTime >= 75ns (the tail of the distribution).
258  // Max. error = 0.037 ns; RMS error = 0.021 ns.
259  // Also the 1-bit *iendRflag* and 1-bit *idZsign* are packed into this variable.
260  //
261  unsigned short idZsign = (hitLength.z()>0.0) ? 1 : 0; // flag the sign of dZ
262  unsigned short imeanTime = ( meanTime < 75.0*CLHEP::ns ) ? (unsigned short)(meanTime/(75.0*CLHEP::ns)*1024.0) : 1023;
263  if ( imeanTime == 1023 ) persCont->m_meanTimeof.push_back( (float)meanTime ); // "overflow flag"
264  imeanTime = (imeanTime << 2) | (idZsign << 1) | iendRflag;
265  persCont->m_meanTime.push_back( imeanTime );
266 
267  //
268  // Persistify hit *hitEne* (the energy deposited by the hit in keV) using a float but only for photons
269  // (relatively very few of these). Digitisation does not use hitEne for charged particles.
270  //
271  if ( lastId == 22 ||
272  (int)(abs(lastId)/100000) == 41 ||
273  (int)(abs(lastId)/10000000) == 1
274  ) persCont->m_hitEne.push_back( (float)(trtHit->GetEnergyDeposit()) ); // keV
275 
276  lastEnd = hitEnd;
277  lastT = meanTime;
278  ++idx;
279  /*
280  // Validation output
281  std::cout.precision(15);
282  std::cout << "AJBTtoPendR " << endR << std::endl;
283  std::cout << "AJBTtoPendPhi " << endPhi << std::endl;
284  std::cout << "AJBTtoPendX " << hitEnd.x() << std::endl;
285  std::cout << "AJBTtoPendY " << hitEnd.y() << std::endl;
286  std::cout << "AJBTtoPendZ " << hitEnd.z() << std::endl;
287  std::cout << "AJBTtoPmeanTime " << meanTime << std::endl;
288  std::cout << "AJBTtoPkinEne " << trtHit->GetKineticEnergy() << std::endl;
289  std::cout << "AJBTtoPhitEne " << trtHit->GetEnergyDeposit() << std::endl;
290  std::cout << "AJBTtoPsteplength " << hitLength.distance() << std::endl;
291  */
292  }
293 
294  persCont->m_nBC.push_back(idx - endBC);
295  persCont->m_nId.push_back(idx - endId);
296  persCont->m_nHits.push_back( idx - endHit );
297 
298 } // transToPers
299 
300 
301 // Create Transient
303  std::unique_ptr<TRTUncompressedHitCollection> trans(std::make_unique<TRTUncompressedHitCollection>("DefaultCollectionName",persObj->m_nHits.size()));
304  persToTrans(persObj, trans.get(), log);
305  return(trans.release());
306 } //createTransient
307 
308 
309 // Persistent(Disk) to Transient
311 {
312  const EventContext& ctx = Gaudi::Hive::currentContext();
313 
314  // if (log.level() <= MSG::DEBUG) log << MSG::DEBUG << "In TRT_HitCollectionCnv_p4::persToTrans()" << endmsg;
315 
316  // some values are read less than once per hit, these need counters.
317  unsigned int meanTimeofCount=0, startRCount=0, endRCount=0, hitEneCount=0;
318  unsigned int idxBC=0, idxId=0, endHit=0, endBC=0, endId=0;
319 
320  //
321  // loop over strings - index [i]
322  //
323 
324  for ( unsigned int i = 0; i < persCont->m_nHits.size(); i++ ) {
325 
326  if ( persCont->m_nHits[i] ) { // at least one hit in the string
327 
328  const unsigned int startHit = endHit;
329  endHit += persCont->m_nHits[i];
330 
331  //
332  // string strawId
333  //
334  const unsigned int i1 = persCont->m_strawId1b[i]; // 8 bits
335  const unsigned int i2 = persCont->m_strawId2b[i]; // 16 bits
336  const unsigned int strawId = i2*256+i1; // => 24 bits (0 to 16,777,215)
337 
338  //
339  // string startPhi
340  //
341  const unsigned int istartPhi = persCont->m_startPhi[i]; // 8 bits
342  const double startPhi = -M_PI + (istartPhi+0.5)*2.0*M_PI/256.0; // rad (min = -pi, max = +pi)
343 
344  //
345  // string startZ
346  //
347  const unsigned int istartZ = persCont->m_startZ[i] >> 1; // 4 bits
348  double startZ = -365.0*CLHEP::mm + (istartZ+0.5)*730.0*CLHEP::mm/16.0; // (min = -365 mm, max = +365 mm)
349 
350  //
351  // start Rflag
352  //
353  const unsigned int istartRflag = persCont->m_startZ[i] & 1; // 1 bit
354 
355  //
356  // string startR
357  //
358  double startR;
359  if ( istartRflag == 1 ) {
360  startR = 2.0*CLHEP::mm; // 1 bit
361  }
362  else {
363  const unsigned int istartR = persCont->m_startR[startRCount++]; // 8 bits
364  startR = (istartR+0.5)*2.0*CLHEP::mm/256.0; // (range 0 - 2 mm)
365  if ( startR < 0.0155*CLHEP::mm ) startR = 0.0155*CLHEP::mm; // The wire radius
366  }
367 
368  //
369  // string startX, startY (derived from R,Phi)
370  //
371  double startX = startR*cos(startPhi);
372  double startY = startR*sin(startPhi);
373  /*
374  // Validation output
375  std::cout.precision(15);
376  std::cout << "AJBPtoTstrawId " << strawId << std::endl;
377  std::cout << "AJBPtoTstartR " << startR << std::endl;
378  std::cout << "AJBPtoTstartPhi " << startPhi << std::endl;
379  std::cout << "AJBPtoTstartX " << startX << std::endl;
380  std::cout << "AJBPtoTstartY " << startY << std::endl;
381  std::cout << "AJBPtoTstartZ " << startZ << std::endl;
382  std::cout << "AJBPtoTnHits " << persCont->m_nHits[i] << std::endl;
383  */
384  //
385  // loop over end hits in the string - index [j]
386  //
387 
388  for ( unsigned int j = startHit; j < endHit; j++ ) {
389 
390  if ( j >= endBC + persCont->m_nBC[idxBC] ) endBC += persCont->m_nBC[idxBC++];
391  if ( j >= endId + persCont->m_nId[idxId] ) endId += persCont->m_nId[idxId++];
392 
393  //
394  // hit meanTime
395  //
396  const unsigned int imeanTime = persCont->m_meanTime[j] >> 2; // 10 bits
397  double meanTime = (imeanTime+0.5)*75.0*CLHEP::ns/1024.0; // (min = 0.0 ns, max = 75.0 ns)
398  if ( imeanTime == 1023 ) meanTime = (double)persCont->m_meanTimeof[meanTimeofCount++]; // ns, 32-bit float overflow
399 
400  //
401  // dZ sign
402  //
403  const unsigned int idZsign = (persCont->m_meanTime[j] >> 1 ) & 1; // 1 bit
404 
405  //
406  // endR flag
407  //
408  const unsigned int iendRflag = persCont->m_meanTime[j] & 1; // 1 bit
409 
410  //
411  // hit energy deposited in keV (only relevant for photons) 32-bit float
412  //
413  const double hitEne = ( persCont->m_id[idxId] == 22 ||
414  (int)(abs(persCont->m_id[idxId])/100000) == 41 ||
415  (int)(abs(persCont->m_id[idxId])/10000000) == 1
416  ) ? (double)persCont->m_hitEne[hitEneCount++] : 0.0;
417 
418  //
419  // hit endPhi (can be modified later during "steplength preservation")
420  //
421  const unsigned int iendPhi = persCont->m_endPhi[j]; // 8 bits
422  double endPhi = -M_PI + (iendPhi+0.5)*2.0*M_PI/256.0; // rad (min = -pi, max = +pi)
423 
424  //
425  // string endR (can be modified later during "steplength preservation")
426  //
427  double endR;
428  if ( iendRflag==1 ) {
429  endR = 2.0*CLHEP::mm; // 1 bit
430  }
431  else {
432  const unsigned int iendR = persCont->m_endR[endRCount++];
433  endR = (iendR+0.5)*2.0*CLHEP::mm/256.0; // 8 bits
434  if ( endR < 0.0155*CLHEP::mm ) endR = 0.0155*CLHEP::mm; // the wire radius
435  }
436 
437  //
438  // hit endX, endY (derived from R,Phi)
439  //
440  double endX = endR*cos(endPhi); // can be modified later during "steplength preservation"
441  double endY = endR*sin(endPhi); // can be modified later during "steplength preservation"
442 
443  // Save the (o)riginal endX, endY values for the next hit start because
444  // they might get shrunk to fit the g4 steplength of the current hit.
445  double endXo = endX;
446  double endYo = endY;
447 
448  //
449  // g4 step length of the hit, m_steplength, and
450  // kinetic energy of the hit, m_kinEne, are both 15-bit short floats.
451  // Note: a rare condition causes a 16-bit short float (mantissa=512).
452  //
453  const int kmantissa = persCont->m_kinEne[j] >> 6; // 9 bits (expected)
454  const int smantissa = persCont->m_steplength[j] >> 6;
455  const int kexponent = persCont->m_kinEne[j] & 0x3F; // 6 bits
456  const int sexponent = persCont->m_steplength[j] & 0x3F;
457  const double kinEne = (kmantissa+512.5)/1024 * pow(2.0,kexponent) / 1.0e9; // MeV
458  double g4steplength = (smantissa+512.5)/1024 * pow(2.0,sexponent) / 1.0e9; // mm
459  if ( idZsign==0 ) g4steplength = -g4steplength;
460 
461  //
462  // Preserving the steplength of the hit by setting endZ or shrinking dX,dY.
463  //
464  double dX = endX-startX;
465  double dY = endY-startY;
466  double dZ;
467  double dXY2 = dX*dX+dY*dY;
468  double dL2 = g4steplength*g4steplength;
469  if ( dL2 > dXY2 ) { // define dZ such that steplength = g4steplength
470  dZ = sqrt(dL2-dXY2);
471  if (g4steplength<0.0) dZ=-dZ;
472  }
473  else { // dL2 < dXY2 // shrink dX,dY such that dXY = g4steplength
474  dX = dX * sqrt(dL2/dXY2); // this includes the cases where dL2=0!
475  dY = dY * sqrt(dL2/dXY2);
476  dZ = 0.0*CLHEP::mm;
477  endX = startX + dX;
478  endY = startY + dY;
479  //endR = sqrt( endX*endX + endY*endY ); // for validation information
480  //endPhi = atan2(endY,endX); // for validation information
481  }
482  double endZ = startZ + dZ;
483  //dX = endX-startX; // for validation information
484  //dY = endY-startY; // for validation information
485  /*
486  // Validation output
487  std::cout.precision(15);
488  std::cout << "AJBPtoTendR " << endR << std::endl;
489  std::cout << "AJBPtoTendPhi " << endPhi << std::endl;
490  std::cout << "AJBPtoTendX " << endX << std::endl;
491  std::cout << "AJBPtoTendY " << endY << std::endl;
492  std::cout << "AJBPtoTendZ " << endZ << std::endl;
493  std::cout << "AJBPtoTmeanTime " << meanTime << std::endl;
494  std::cout << "AJBPtoTkinEne " << kinEne << std::endl;
495  std::cout << "AJBPtoThitEne " << hitEne << std::endl;
496  std::cout << "AJBPtoTsteplength " << sqrt(dX*dX+dY*dY+dZ*dZ) << std::endl;
497  */
498  //
499  // Notes:
500  // - All units are CLHEP, except hitEne which is in keV.
501  // - For charged particles kinEne is *zero*!
502  //
503 
505  if (persCont->m_mcEvtIndex[idxBC] == 0) {
507  }
508  HepMcParticleLink partLink( persCont->m_barcode[idxBC], persCont->m_mcEvtIndex[idxBC], flag, HepMcParticleLink::IS_BARCODE, ctx );
509  if ( HepMC::BarcodeBased::is_truth_suppressed_pileup(static_cast<int>(persCont->m_barcode[idxBC])) ) {
511  }
512  transCont->Emplace( strawId, partLink, persCont->m_id[idxId],
513  kinEne, hitEne, startX, startY, startZ,
514  endX, endY, endZ, meanTime );
515  //
516  // End of this hit becomes the start of the next;
517  // use the original (uncorrected) values for X,Y
518  // but the derived value for Z.
519  //
520  startX = endXo; startY = endYo; startZ = endZ;
521 
522  }
523  } // nhits>0
524  } // straw loop
525 } // persToTrans
TRT_HitCollection_p4::m_startZ
std::vector< unsigned char > m_startZ
Definition: TRT_HitCollection_p4.h:35
TRT_HitCollection_p4::m_endPhi
std::vector< unsigned char > m_endPhi
Definition: TRT_HitCollection_p4.h:44
TRT_HitCollection_p4::m_kinEne
std::vector< unsigned short > m_kinEne
Definition: TRT_HitCollection_p4.h:41
StateLessPT_NewConfig.proxy
proxy
Definition: StateLessPT_NewConfig.py:392
TRT_HitCollection_p4::m_nId
std::vector< unsigned short > m_nId
Definition: TRT_HitCollection_p4.h:53
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
TRT_HitCollection_p4::m_nBC
std::vector< unsigned short > m_nBC
Definition: TRT_HitCollection_p4.h:57
index
Definition: index.py:1
ExtendedEventContext.h
xAOD::char
char
Definition: TrigDecision_v1.cxx:38
AtlasHitsVector
Definition: AtlasHitsVector.h:33
TRT_HitCollection_p4
Definition: TRT_HitCollection_p4.h:19
skel.it
it
Definition: skel.GENtoEVGEN.py:396
TRT_HitCollectionCnv_p4::persToTrans
virtual void persToTrans(const TRT_HitCollection_p4 *persCont, TRTUncompressedHitCollection *transCont, MsgStream &log)
Definition: TRT_HitCollectionCnv_p4.cxx:310
M_PI
#define M_PI
Definition: ActiveFraction.h:11
TRT_HitCollection_p4::m_startR
std::vector< unsigned char > m_startR
Definition: TRT_HitCollection_p4.h:33
drawFromPickle.cos
cos
Definition: drawFromPickle.py:36
AtlasHitsVector::begin
const_iterator begin() const
Definition: AtlasHitsVector.h:131
IProxyDict
A proxy dictionary.
Definition: AthenaKernel/AthenaKernel/IProxyDict.h:47
AtlasHitsVector::const_iterator
CONT::const_iterator const_iterator
Definition: AtlasHitsVector.h:43
TRT_HitCollection_p4::m_strawId2b
std::vector< unsigned short > m_strawId2b
Definition: TRT_HitCollection_p4.h:31
TRT_HitCollection_p4::m_mcEvtIndex
std::vector< unsigned short > m_mcEvtIndex
Definition: TRT_HitCollection_p4.h:55
Atlas::getExtendedEventContext
const ExtendedEventContext & getExtendedEventContext(const EventContext &ctx)
Retrieve an extended context from a context object.
Definition: ExtendedEventContext.cxx:32
AtlasHitsVector::Emplace
void Emplace(Args &&... args)
Definition: AtlasHitsVector.h:81
TRT_HitCollection_p4::m_strawId1b
std::vector< unsigned char > m_strawId1b
Definition: TRT_HitCollection_p4.h:32
TRT_HitCollection_p4::m_meanTime
std::vector< unsigned short > m_meanTime
Definition: TRT_HitCollection_p4.h:45
TRT_HitCollection_p4::m_nHits
std::vector< unsigned short > m_nHits
Definition: TRT_HitCollection_p4.h:30
TRT_HitCollection_p4::m_hitEne
std::vector< float > m_hitEne
Definition: TRT_HitCollection_p4.h:52
lumiFormat.i
int i
Definition: lumiFormat.py:85
TRT_HitCollectionCnv_p4.h
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
HepMC::barcode
int barcode(const T *p)
Definition: Barcode.h:16
master.flag
bool flag
Definition: master.py:29
TRT_HitCollection_p4::m_evtColl
std::vector< char > m_evtColl
Definition: TRT_HitCollection_p4.h:56
TRT_HitCollection_p4::m_steplength
std::vector< unsigned short > m_steplength
Definition: TRT_HitCollection_p4.h:42
xAOD::double
double
Definition: CompositeParticle_v1.cxx:159
TRT_HitCollection_p4::m_endR
std::vector< unsigned char > m_endR
Definition: TRT_HitCollection_p4.h:43
MagicNumbers.h
HepMC::BarcodeBased::is_truth_suppressed_pileup
bool is_truth_suppressed_pileup(const T &p)
Method to establish if a particle (or barcode) corresponds to truth-suppressed pile-up.
Definition: MagicNumbers.h:197
python.SystemOfUnits.mm
int mm
Definition: SystemOfUnits.py:83
DeMoScan.index
string index
Definition: DeMoScan.py:364
TRT_HitCollection_p4::m_barcode
std::vector< unsigned int > m_barcode
Definition: TRT_HitCollection_p4.h:54
TRTUncompressedHitCollection.h
TRTUncompressedHit.h
AtlasHitsVector::end
const_iterator end() const
Definition: AtlasHitsVector.h:134
python.CaloCondTools.log
log
Definition: CaloCondTools.py:20
LArNewCalib_DelayDump_OFC_Cali.idx
idx
Definition: LArNewCalib_DelayDump_OFC_Cali.py:69
TRT_HitCollectionCnv_p4::transToPers
virtual void transToPers(const TRTUncompressedHitCollection *transCont, TRT_HitCollection_p4 *persCont, MsgStream &log)
Definition: TRT_HitCollectionCnv_p4.cxx:26
TRT_HitCollection_p4::m_id
std::vector< int > m_id
Definition: TRT_HitCollection_p4.h:58
EBC_PU_SUPPRESSED
@ EBC_PU_SUPPRESSED
Definition: MagicNumbers.h:30
python.SystemOfUnits.ns
int ns
Definition: SystemOfUnits.py:130
drawFromPickle.sin
sin
Definition: drawFromPickle.py:36
pow
constexpr int pow(int base, int exp) noexcept
Definition: ap_fixedTest.cxx:15
StoreGateSvc.h
TRT_HitCollection_p4::m_meanTimeof
std::vector< float > m_meanTimeof
Definition: TRT_HitCollection_p4.h:46
TRT_HitCollection_p4.h
TRT_HitCollectionCnv_p4::createTransient
virtual TRTUncompressedHitCollection * createTransient(const TRT_HitCollection_p4 *persObj, MsgStream &log)
Definition: TRT_HitCollectionCnv_p4.cxx:302
TRT_HitCollection_p4::m_startPhi
std::vector< unsigned char > m_startPhi
Definition: TRT_HitCollection_p4.h:34