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