ATLAS Offline Software
Loading...
Searching...
No Matches
TRT_HitCollectionCnv_p5.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 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
56 int lastIndex{-1};
57 int lastTruthId{-1};
58 int lastId = -1;
59 double lastT = 0.0*CLHEP::ns;
60 unsigned int idx = 0;
61 unsigned int endTruthID = 0;
62 unsigned int endId = 0;
63 unsigned int endHit = 0;
64 HepGeom::Point3D<double> lastEnd(0.0, 0.0, 0.0); // mm
65
66 for (TRTUncompressedHitCollection::const_iterator it = transCont->begin(); it != transCont->end(); ++it) {
67
69 const HepMcParticleLink * currentLink = &(trtHit->particleLink());
70 const int truthId = currentLink->id();
71 const char truthSupp= currentLink->getTruthSuppressionTypeAsChar();
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 persCont->m_truthSupp.push_back(truthSupp); // TODO include this in the equality check above?
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 );
508 transCont->Emplace( strawId, partLink, persCont->m_id[idxId],
509 kinEne, hitEne, startX, startY, startZ,
510 endX, endY, endZ, meanTime );
511 //
512 // End of this hit becomes the start of the next;
513 // use the original (uncorrected) values for X,Y
514 // but the derived value for Z.
515 //
516 startX = endXo; startY = endYo; startZ = endZ;
517
518 }
519 } // nhits>0
520 } // straw loop
521} // persToTrans
#define M_PI
#define endmsg
AtlasHitsVector< TRTUncompressedHit > TRTUncompressedHitCollection
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
TH1F * trans(TH1F *h, bool t=false)
IProxyDict * proxyDictFromEventContext()
Return the IProxyDict for this thread's current context.
Definition index.py:1
Some out-of-line helpers for ExtendedEventContext.