ATLAS Offline Software
Loading...
Searching...
No Matches
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
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
#define M_PI
#define endmsg
AtlasHitsVector< TRTUncompressedHit > TRTUncompressedHitCollection
constexpr int pow(int base, int exp) noexcept
const_iterator begin() const
void Emplace(Args &&... args)
const_iterator end() const
virtual void persToTrans(const TRT_HitCollection_p5 *persCont, TRTUncompressedHitCollection *transCont, MsgStream &log)
virtual void transToPers(const TRTUncompressedHitCollection *transCont, TRT_HitCollection_p5 *persCont, MsgStream &log)
virtual TRTUncompressedHitCollection * createTransient(const TRT_HitCollection_p5 *persObj, MsgStream &log)
std::vector< unsigned char > m_startPhi
std::vector< unsigned int > m_truthID
std::vector< unsigned short > m_strawId2b
std::vector< int > m_id
std::vector< unsigned short > m_mcEvtIndex
std::vector< unsigned char > m_strawId1b
std::vector< unsigned char > m_endPhi
std::vector< unsigned char > m_endR
std::vector< float > m_hitEne
std::vector< unsigned short > m_kinEne
std::vector< unsigned short > m_nTruthID
std::vector< unsigned short > m_nHits
std::vector< float > m_meanTimeof
std::vector< unsigned char > m_startR
std::vector< char > m_truthSupp
std::vector< unsigned short > m_meanTime
std::vector< unsigned char > m_startZ
std::vector< unsigned short > m_steplength
std::vector< unsigned short > m_nId
const ExtendedEventContext & getExtendedEventContext(const EventContext &ctx)
Retrieve an extended context from a context object.
Definition index.py:1