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