CbmRoot
Loading...
Searching...
No Matches
CbmTrdDigitizer.cxx
Go to the documentation of this file.
1/* Copyright (C) 2009-2024 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Florian Uhlig [committer], Alexandru Bercuci, Etienne Bechtel */
4
5#include "CbmTrdDigitizer.h"
6
7#include "CbmMCTrack.h"
8#include "CbmMatch.h"
9#include "CbmTrdAddress.h"
10#include "CbmTrdCheckUtil.h"
11#include "CbmTrdDigi.h"
12#include "CbmTrdGeoHandler.h"
13#include "CbmTrdModuleSim.h"
14#include "CbmTrdModuleSim2D.h"
15#include "CbmTrdModuleSimR.h"
16#include "CbmTrdPads.h"
17#include "CbmTrdParAsic.h"
18#include "CbmTrdParModAsic.h"
19#include "CbmTrdParModDigi.h"
20#include "CbmTrdParModGain.h"
21#include "CbmTrdParModGas.h"
22#include "CbmTrdParModGeo.h"
23#include "CbmTrdParSetAsic.h"
24#include "CbmTrdParSetDigi.h"
25#include "CbmTrdParSetGain.h"
26#include "CbmTrdParSetGas.h"
27#include "CbmTrdParSetGeo.h"
28#include "CbmTrdPoint.h"
29#include "CbmTrdRadiator.h"
30#include "CbmTrdRawToDigiR.h"
31
32#include <FairBaseParSet.h>
33#include <FairEventHeader.h>
34#include <FairRootManager.h>
35#include <FairRunAna.h>
36#include <FairRunSim.h>
37#include <FairRuntimeDb.h>
38#include <Logger.h>
39
40#include <TClonesArray.h>
41#include <TRandom.h>
42#include <TStopwatch.h>
43#include <TVector3.h>
44
45#include <cmath>
46#include <iomanip>
47#include <iostream>
48#include <memory>
49
50using std::map;
51using std::pair;
52using std::shared_ptr;
53using namespace std;
55
56//________________________________________________________________________________________
57CbmTrdDigitizer::CbmTrdDigitizer(shared_ptr<CbmTrdRadiator> radiator)
58 : CbmDigitize<CbmTrdDigi>("TrdDigitize")
59 , fLastEventTime(0)
60 , fpoints(0)
61 , nofBackwardTracks(0)
62 , fEfficiency(1.)
63 , fPoints(NULL)
64 , fTracks(NULL)
65 , fDigis(nullptr)
66 , fDigiMatches(nullptr)
67 , fAsicPar(NULL)
68 , fGasPar(NULL)
69 , fDigiPar(NULL)
70 , fGainPar(NULL)
71 , fGeoPar(NULL)
72 , fRadiator(radiator)
73 , fConverter(NULL)
74 , fQA(NULL)
75 // ,fConverter()
76 // ,fGeoHandler(new CbmTrdGeoHandler())
77 , fModuleMap()
78 , fDigiMap()
79{
80}
81
82//________________________________________________________________________________________
85
86
87//________________________________________________________________________________________
89{
91 delete fDigis;
92 delete fDigiMatches;
93 for (map<Int_t, CbmTrdModuleSim*>::iterator imod = fModuleMap.begin(); imod != fModuleMap.end(); imod++)
94 delete imod->second;
95 fModuleMap.clear();
96
97 delete fConverter;
98 delete fQA;
99}
100
101
102//________________________________________________________________________________________
104{
105 fAsicPar = static_cast<CbmTrdParSetAsic*>(FairRunAna::Instance()->GetRuntimeDb()->getContainer("CbmTrdParSetAsic"));
106 fGasPar = static_cast<CbmTrdParSetGas*>(FairRunAna::Instance()->GetRuntimeDb()->getContainer("CbmTrdParSetGas"));
107 fDigiPar = static_cast<CbmTrdParSetDigi*>(FairRunAna::Instance()->GetRuntimeDb()->getContainer("CbmTrdParSetDigi"));
108 fGainPar = static_cast<CbmTrdParSetGain*>(FairRunAna::Instance()->GetRuntimeDb()->getContainer("CbmTrdParSetGain"));
109 fGeoPar = new CbmTrdParSetGeo(); //fGeoPar->Print();
110}
111
112//________________________________________________________________________________________
114{
115 FairRootManager* ioman = FairRootManager::Instance();
116 if (!ioman) LOG(fatal) << "CbmTrdDigitizer::Init: No FairRootManager";
117
118 fPoints = (TClonesArray*) ioman->GetObject("TrdPoint");
119 if (!fPoints) LOG(fatal) << "CbmTrdDigitizer::Init(): No TrdPoint array!";
120
121 fTracks = (TClonesArray*) ioman->GetObject("MCTrack");
122 if (!fTracks) LOG(fatal) << "CbmTrdDigitizer::Init(): No MCTrack array!";
123
124 if (!fRadiator) {
125 if (GetGeoTag().BeginsWith("v25a_1") || GetGeoTag().BeginsWith("v25b_1"))
126 fRadiator = make_shared<CbmTrdRadiator>(kTRUE, "tdr18_25cm");
127 else
128 fRadiator = make_shared<CbmTrdRadiator>(kTRUE, "tdr18");
129 }
130
131 if (fRadiator) fRadiator->Init();
132
134 fQA = new CbmTrdCheckUtil();
135
136 // Set time-based mode if appropriate
137 SetTimeBased(fEventMode ? kFALSE : kTRUE);
138
139 // --- Read list of inactive channels
140 if (!fInactiveChannelFileName.IsNull()) {
141 LOG(info) << GetName() << ": Reading inactive channels from " << fInactiveChannelFileName;
142 auto result = ReadInactiveChannels();
143 if (!result.second) {
144 LOG(error) << GetName() << ": Error in reading from file! Task will be inactive.";
145 return kFATAL;
146 }
147 LOG(info) << GetName() << ": " << std::get<0>(result) << " lines read from file, " << fInactiveChannels.size()
148 << " channels set inactive";
149 }
150
152
153
154 LOG(info) << "================ TRD Digitizer ===============";
155 LOG(info) << " Free streaming : " << (IsTimeBased() ? "yes" : "no");
156 LOG(info) << " Add Noise : " << (AddNoise() ? "yes" : "no");
157 LOG(info) << " Weighted distance : " << (UseWeightedDist() ? "yes" : "no");
158
159 return kSUCCESS;
160}
161
162//________________________________________________________________________________________
164{
165 // start timer
166 TStopwatch timer;
167 timer.Start();
168
169 // get event info (once per event, used for matching)
170 GetEventInfo();
171
172 // reset private monitoring counters
174
175 // loop tracks in current event
176 CbmTrdModuleSim* mod(NULL);
177 Int_t nofPoints = fPoints->GetEntriesFast();
178 gGeoManager->CdTop();
179 for (Int_t iPoint = 0; iPoint < nofPoints; iPoint++) {
180 fpoints++;
181 //fMCPointId = iPoint;
182
183 CbmTrdPoint* point = static_cast<CbmTrdPoint*>(fPoints->At(iPoint));
184 if (!point) continue;
185 const CbmMCTrack* track = static_cast<const CbmMCTrack*>(fTracks->At(point->GetTrackID()));
186 if (!track) continue;
187
188 Double_t dz = point->GetZOut() - point->GetZIn();
189 if (dz < 0) {
190 LOG(debug2) << GetName() << "::Exec: MC-track points towards target!";
192 }
193
194 // get link to the module working class
195 map<Int_t, CbmTrdModuleSim*>::iterator imod = fModuleMap.find(point->GetDetectorID());
196 if (imod == fModuleMap.end()) {
197 // Looking for gas node corresponding to current point in geo manager
198 Double_t meanX = (point->GetXOut() + point->GetXIn()) / 2.;
199 Double_t meanY = (point->GetYOut() + point->GetYIn()) / 2.;
200 Double_t meanZ = (point->GetZOut() + point->GetZIn()) / 2.;
201 gGeoManager->FindNode(meanX, meanY, meanZ);
202 if (!TString(gGeoManager->GetPath()).Contains("gas")) {
203 LOG(error) << GetName() << "::Exec: MC-track not in TRD! Node:" << TString(gGeoManager->GetPath()).Data()
204 << " gGeoManager->MasterToLocal() failed!";
205 continue;
206 }
207 mod = AddModule(point->GetDetectorID());
208 }
209 else
210 mod = imod->second;
212 Double_t gamma = TMath::Sqrt(1 + TMath::Power(track->GetP() / (track->GetMass()), 2));
213 mod->SetGamma(gamma);
214 mod->MakeDigi(point, fCurrentEventTime, TMath::Abs(track->GetPdgCode()) == 11);
215 }
216
217 // Fill data from internally used stl map into CbmDaqBuffer.
218 // Calculate final event statistics
219 Int_t nDigis(0), nofElectrons(0), nofLatticeHits(0), nofPointsAboveThreshold(0), n0, n1, n2;
220 for (map<Int_t, CbmTrdModuleSim*>::iterator imod = fModuleMap.begin(); imod != fModuleMap.end(); imod++) {
221 // in streaming mode flush buffers only up to a certain point in time wrt to current event time (allow for event pile-ups)
222 //printf("Processing data for module %d\n", imod->first);
223 if (IsTimeBased()) nDigis += imod->second->FlushBuffer(fCurrentEventTime);
224 // in event-by-event mode flush all buffers
225 if (!IsTimeBased()) imod->second->FlushBuffer();
226 imod->second->GetCounters(n0, n1, n2);
227 nofElectrons += n0;
228 nofLatticeHits += n1;
229 nofPointsAboveThreshold += n2;
230 std::map<Int_t, std::pair<CbmTrdDigi*, CbmMatch*>>* digis = imod->second->GetDigiMap();
231 for (std::map<Int_t, pair<CbmTrdDigi*, CbmMatch*>>::iterator it = digis->begin(); it != digis->end(); it++) {
232 assert(it->second.second);
233 CbmTrdDigi* digi = it->second.first;
234 if (fCreateMatches) {
235 SendData(digi->GetTime(), digi, it->second.second);
236 }
237 else {
238 SendData(digi->GetTime(), digi);
239 }
240 nDigis++;
241 } //# modules
242 digis->clear();
243 } //# digis
245
246
247 Double_t digisOverPoints = (nofPoints > 0) ? Double_t(nDigis) / Double_t(nofPoints) : 0;
248 Double_t latticeHitsOverElectrons = (nofElectrons > 0) ? (Double_t) nofLatticeHits / (Double_t) nofElectrons : 0;
249 LOG(debug) << "CbmTrdDigitizer::Exec Points: " << nofPoints;
250 LOG(debug) << "CbmTrdDigitizer::Exec PointsAboveThreshold: " << nofPointsAboveThreshold;
251 LOG(debug) << "CbmTrdDigitizer::Exec Digis: " << nDigis;
252 LOG(debug) << "CbmTrdDigitizer::Exec digis/points: " << digisOverPoints;
253 LOG(debug) << "CbmTrdDigitizer::Exec BackwardTracks: " << nofBackwardTracks;
254 LOG(debug) << "CbmTrdDigitizer::Exec LatticeHits: " << nofLatticeHits;
255 LOG(debug) << "CbmTrdDigitizer::Exec Electrons: " << nofElectrons;
256 LOG(debug) << "CbmTrdDigitizer::Exec latticeHits/electrons:" << latticeHitsOverElectrons;
257 timer.Stop();
258 LOG(debug) << "CbmTrdDigitizer::Exec real time=" << timer.RealTime() << " CPU time=" << timer.CpuTime();
259
260 // --- Event log
261 LOG(info) << "+ " << setw(15) << GetName() << ": Event " << setw(6) << right << fCurrentEvent << " at " << fixed
262 << setprecision(3) << fCurrentEventTime << " ns, points: " << nofPoints << ", digis: " << nDigis
263 << ". Exec time " << setprecision(6) << timer.RealTime() << " s.";
264}
265
266//________________________________________________________________________________________
268{
269 LOG(info) << GetName() << ": Processing analogue buffers";
270 Int_t nDigis(0);
271 for (map<Int_t, CbmTrdModuleSim*>::iterator imod = fModuleMap.begin(); imod != fModuleMap.end(); imod++) {
272 nDigis += imod->second->FlushBuffer();
273 std::map<Int_t, std::pair<CbmTrdDigi*, CbmMatch*>>* digis = imod->second->GetDigiMap();
274 for (std::map<Int_t, pair<CbmTrdDigi*, CbmMatch*>>::iterator it = digis->begin(); it != digis->end(); it++) {
275 assert(it->second.second);
276 CbmTrdDigi* digi = it->second.first;
277 if (fCreateMatches) {
278 SendData(digi->GetTime(), digi, it->second.second);
279 }
280 else {
281 SendData(digi->GetTime(), digi);
282 }
283 nDigis++;
284 } //# modules
285 digis->clear();
286 } //# digis
287 LOG(info) << GetName() << ": " << nDigis << (nDigis == 1 ? " digi " : " digis ") << "created and sent to DAQ ";
288}
289
290//________________________________________________________________________________________
292{
293 // flush buffers in streaming mode
294 LOG(info) << "=====================================";
295 LOG(info) << GetName() << ": Finish run";
296 if (IsTimeBased()) FlushBuffers();
297 LOG(info) << GetName() << ": Run summary ";
298 LOG(info) << "=====================================";
299
300 fQA->DumpPlots();
301}
302
303//________________________________________________________________________________________
305{
320
321 const TString& path = gGeoManager->GetPath(); // decouple the local path variable from gGeoManager current path [AB]
322 LOG(debug) << GetName() << "::AddModule(" << path << ")"
323 << " det[" << detId << "]";
324
325 CbmTrdGeoHandler geoHandler;
326 Int_t moduleAddress = geoHandler.GetModuleAddress(path), moduleType = geoHandler.GetModuleType(path),
327 orientation = geoHandler.GetModuleOrientation(path), lyId = CbmTrdAddress::GetLayerId(detId);
328 if (moduleAddress != detId) {
329 LOG(error) << "CbmTrdDigitizer::AddModule: MC module ID " << detId << " does not match geometry definition "
330 << moduleAddress << ". Module init failed!";
331 return nullptr;
332 }
333 // try to load read-out parameters for module
334 const CbmTrdParModDigi* pDigi(NULL);
335 if (!fDigiPar || !(pDigi = (const CbmTrdParModDigi*) fDigiPar->GetModulePar(detId))) {
336 LOG(error) << GetName() << "::AddModule : No Read-Out params for module " << detId << " @ " << path
337 << ". Module init failed!";
338 return nullptr;
339 }
340
341 // find the type of TRD detector was hit. Temporary until a new scheme of setup parameters will be but in place. TODO
342 bool trd2d(false);
343 if (pDigi->GetPadPlaneType() >= 0)
344 trd2d = pDigi->IsPadPlane2D();
345 else
346 trd2d = (moduleType >= 9); // legacy support for old pad-plane addresing
347 LOG(debug) << GetName() << "::AddModule(" << path << " " << (trd2d ? '2' : '1') << "D] mod[" << moduleAddress;
348 CbmTrdModuleSim* module(NULL);
349 if (trd2d) {
350 // temporary fix for TRD-2Dh @ mCBM 2021 (legacy)
351 if (moduleType == 10)
352 SetUseFASP(kFALSE);
353 else
354 SetUseFASP();
355 module = fModuleMap[moduleAddress] = new CbmTrdModuleSim2D(moduleAddress, lyId, orientation, UseFASP());
356 // AB :: calibration wrt the Tof detector as the Bmon simulation is still in development (14.07.2022)
357 module->SetTimeSysOffset(-400);
358 Int_t rType(-1);
359 if ((rType = geoHandler.GetRadiatorType(path)) >= 0) {
360 if (!fRadiator2D) { // strong TRD-2D entrance window
361 // const Char_t *ewin = "Al;C;Air;C;Al";
362 const Char_t* ewin = "Al;C;HC;C;Al";
363 Float_t widths[] = {
364 1.2e-3, // 12 mu aluminized polyester foil
365 0.02, // carbon laminate sheets of 0.2 mm thickness
366 0.9, // 9mm Nomex honeycom
367 0.02, // carbon laminate sheets of 0.2 mm thickness
368 1.2e-3, // 12 mu aluminized polyester foil
369 };
370
371 // // light TRD-2D entrance window
372 // const Char_t *ewin = "Al;C;HC;Po;Al";
373 // Float_t widths[] = {
374 // 1.2e-3, // 12 mu aluminized polyester foil
375 // 0.02, // carbon laminate sheets of 0.2 mm thickness
376 // 0.9, // 9mm Nomex honeycom
377 // 0.0025, // polyethylen sheets of 50 mu thickness
378 // 1.2e-3, // 12 mu aluminized polyester foil
379 // }; pwidth = widths;
380 fRadiator2D = make_shared<CbmTrdRadiator>(kTRUE, "tdr18", ewin);
381 fRadiator2D->SetEWwidths(5, widths);
382 fRadiator2D->Init();
383 }
384 module->SetRadiator(fRadiator2D);
385 }
386 //((CbmTrdModuleSim2D*)module)->SetLabMeasurement();
387 }
388 else {
389 module = fModuleMap[moduleAddress] = new CbmTrdModuleSimR(moduleAddress, lyId, orientation);
390 module->SetMessageConverter(fConverter);
391 module->SetQA(fQA);
392 }
393 module->SetDigiPar(pDigi);
394
395 // try to load Geometry parameters for module
396 const CbmTrdParModGeo* pGeo(NULL);
397 if (!fGeoPar || !(pGeo = (const CbmTrdParModGeo*) fGeoPar->GetModulePar(detId))) {
398 LOG(info) << GetName() << "::AddModule : No Geo params for module " << detId << " @ " << path << ". Using default.";
399 module->SetGeoPar(new CbmTrdParModGeo(Form("TRD_%d", detId), path));
400 }
401 else
402 module->SetGeoPar(pGeo);
403
404 // TODO check if this works also for TRD1D modules
405 if (trd2d) {
406 // try to load ASIC parameters for module
407 CbmTrdParModAsic* pAsic(NULL);
408 if (!fAsicPar || !(pAsic = (CbmTrdParModAsic*) fAsicPar->GetModulePar(detId))) {
409 LOG(fatal) << GetName() << "::AddModule : No ASIC params for module " << detId << " @ " << path << ". Abort.";
410 }
411 else
412 module->SetAsicPar(pAsic);
413
414 // try to load Chamber parameters for module
415 const CbmTrdParModGas* pChmb(NULL);
416 if (!fGasPar || !(pChmb = (const CbmTrdParModGas*) fGasPar->GetModulePar(detId))) {
417 LOG(info) << GetName() << "::AddModule : No Gas params for module " << detId << " @ " << path
418 << ". Using default.";
419 }
420 else
421 module->SetChmbPar(pChmb);
422
423 // try to load Gain parameters for module
424 const CbmTrdParModGain* pGain(NULL);
425 if (!fGainPar || !(pGain = (const CbmTrdParModGain*) fGainPar->GetModulePar(detId))) {
426 LOG(debug) << GetName() << "::AddModule : No Gain params for module " << detId << " @ " << path
427 << ". Using default.";
428 }
429 else
430 module->SetGainPar(pGain);
431 }
432
433 if (fRadiator) module->SetRadiator(fRadiator);
434
435 // Register this class to the module. For data transport through SendData().
436 module->SetDigitizer(this);
437
438
439 return module;
440}
441
442//________________________________________________________________________________________
444{
447 fpoints = 0;
449 for (std::map<Int_t, CbmTrdModuleSim*>::iterator imod = fModuleMap.begin(); imod != fModuleMap.end(); imod++)
450 imod->second->ResetCounters();
451}
452
453
455{
456
457 if (fDigis) fDigis->clear();
458 if (fDigiMatches) fDigiMatches->clear();
459}
460
462{
463 assert(gGeoManager);
464 TString geoTag;
465 TString sysName = "trd";
466 Int_t sysLength = sysName.Length() + 1;
467 gGeoManager->CdTop();
468 TGeoNode* cave = gGeoManager->GetCurrentNode(); // cave
469 for (Int_t iNode = 0; iNode < cave->GetNdaughters(); iNode++) {
470 TString volName = cave->GetDaughter(iNode)->GetVolume()->GetName();
471 if (volName.Contains(sysName.Data(), TString::kIgnoreCase)) {
472 geoTag = TString(volName(sysLength, volName.Length() - sysLength));
473 break;
474 }
475 }
476
477 return geoTag;
478}
479
480
ClassImp(CbmConverterManager)
Helper class to convert unique channel ID back and forth.
TRD digitizer. Updated 24/04/2013 by Andrey Lebedev andrey.lebedev@gsi.de Updated 4/06/2018 by Alex B...
Helper class to extract information from the GeoManager.
float Float_t
int Int_t
virtual std::pair< size_t, bool > ReadInactiveChannels()
std::set< uint32_t > fInactiveChannels
Base class template for CBM digitisation tasks.
Definition CbmDigitize.h:44
void SendData(Double_t time, CbmTrdDigi *digi, CbmMatch *match=nullptr)
double GetP() const
Definition CbmMCTrack.h:97
double GetMass() const
Mass of the associated particle.
int32_t GetPdgCode() const
Definition CbmMCTrack.h:67
static uint32_t GetLayerId(uint32_t address)
Return layer ID from address.
double GetTime() const
Getter for physical time [ns]. Accounts for clock representation of each ASIC. In SPADIC case physica...
Definition CbmTrdDigi.h:155
virtual void Exec(Option_t *option)
Inherited from FairTask.
static Bool_t AddNoise()
CbmTrdParSetAsic * fAsicPar
parameter list for ASIC characterization
std::shared_ptr< CbmTrdRadiator > fRadiator2D
parametrization of 2D radiator TR yield
static void SetTimeBased(Bool_t set=kTRUE)
virtual void SetParContainers()
Inherited from FairTask.
CbmTrdRawToDigiR * fConverter
virtual InitStatus Init()
Inherited from FairTask.
CbmTrdParSetGas * fGasPar
parameter list for HV status
void ResetCounters()
Recursive reset all private monitoring counters.
CbmTrdParSetGain * fGainPar
parameter list for keV->ADC gain conversion
virtual void Finish()
Inherited from FairTask.
std::shared_ptr< CbmTrdRadiator > fRadiator
parametrization of radiator TR yield
TString GetGeoTag()
Get the TRD geo tag curently used.
static Bool_t UseWeightedDist()
Double_t fLastEventTime
time of last event [ns]
CbmTrdModuleSim * AddModule(Int_t detId)
Create module for current MC point.
static void SetUseFASP(Bool_t set=kTRUE)
CbmTrdDigitizer(std::shared_ptr< CbmTrdRadiator > radiator=nullptr)
Constructor.
std::map< Int_t, CbmTrdModuleSim * > fModuleMap
list of modules being processed
TClonesArray * fTracks
MC Track information.
virtual void ResetArrays()
Clear data arrays.
CbmTrdParSetDigi * fDigiPar
parameter list for read-out geometry
std::vector< CbmTrdDigi > * fDigis
Output CbmTrdDigi array.
std::vector< CbmMatch > * fDigiMatches
Output CbmMatch array.
TClonesArray * fPoints
Trd MC points.
CbmTrdCheckUtil * fQA
static Bool_t IsTimeBased()
void FlushBuffers()
Flush local digi buffers to CbmDaqBuffer.
CbmTrdParSetGeo * fGeoPar
parameter list for geometry definitions
virtual ~CbmTrdDigitizer()
Destructor.
static Int_t fConfig
Configuration map for the digitizer. See CbmTrdSimDef for details.
Int_t GetModuleType(const TString &path)
Int_t GetRadiatorType(const TString &path)
Navigate to node and return the radiator type build in the geometry based on the naming convention.
Int_t GetModuleOrientation(const TString &path)
Return pad orientation of the current node in the TGeoManager.
Int_t GetModuleAddress()
Return module address calculated based on the current node in the TGeoManager.
virtual const Char_t * GetPath() const
Abstract class for module wise digitization and raw format producing.
virtual Bool_t MakeDigi(CbmTrdPoint *p, Double_t time, Bool_t TR=kFALSE)=0
Steering routine for converting MC point to digits.
virtual void SetLinkId(Int_t input, Int_t event=-1, Int_t point=-1)
virtual void SetGamma(Double_t gamma=0.)=0
Describe TRD module ASIC settings (electronic gain, delays, etc)
Definition of chamber gain conversion for one TRD module.
int GetPadPlaneType() const
Access the basic type of pad plane topology. For convenience also specific accessors are added for ea...
bool IsPadPlane2D() const
Definition of gain parameters for one TRD module.
Definition of gas parameters for one TRD module.
Definition of geometry for one TRD module.
Describe TRD module ASIC settings (electronic gain, delays, etc)
Describe TRD module working settings (HV, etc)
double GetYOut() const
Definition CbmTrdPoint.h:69
double GetXIn() const
Definition CbmTrdPoint.h:65
double GetZIn() const
Definition CbmTrdPoint.h:67
double GetXOut() const
Definition CbmTrdPoint.h:68
double GetYIn() const
Definition CbmTrdPoint.h:66
double GetZOut() const
Definition CbmTrdPoint.h:70
Hash for CbmL1LinkKey.