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