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