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