BmnRoot
Loading...
Searching...
No Matches
BmnDch.cxx
Go to the documentation of this file.
1// -------------------------------------------------------------------------
2// ----- BmnDch source file -----
3// -------------------------------------------------------------------------
4
5#include "BmnDch.h"
6
7#include "BmnDchGeo.h"
8#include "BmnDchGeoPar.h"
9#include "CbmStack.h"
10#include "FairGeoBuilder.h"
11#include "FairGeoInterface.h"
12#include "FairGeoLoader.h"
13#include "FairGeoMedia.h"
14#include "FairGeoNode.h"
15#include "FairRootManager.h"
16#include "FairRun.h"
17#include "FairRuntimeDb.h"
18#include "FairVolume.h"
19#include "TFile.h"
20#include "TGDMLParse.h"
21#include "TGeoManager.h"
22#include "TMath.h"
23#include "TObjArray.h"
24#include "TParticle.h"
25#include "TParticlePDG.h"
26#include "TVirtualMC.h"
27
28#include <iostream>
29
30//------------------------------------------------------------------------------------------------------------------------
32 : FairDetector("DCH", kTRUE)
33{
34 fPointCollection = new TClonesArray("BmnDchPoint");
35 fPosIndex = 0;
36 fVerboseLevel = 1;
37 ResetParameters();
38}
39
40//------------------------------------------------------------------------------------------------------------------------
41BmnDch::BmnDch(const char* name, Bool_t active)
42 : FairDetector(name, active)
43{
44 fPointCollection = new TClonesArray("BmnDchPoint");
45 fPosIndex = 0;
46 fVerboseLevel = 1;
47 ResetParameters();
48}
49
50//------------------------------------------------------------------------------------------------------------------------
52{
53 if (fPointCollection) {
54 fPointCollection->Delete();
55 delete fPointCollection;
56 }
57}
58
59//------------------------------------------------------------------------------------------------------------------------
60int BmnDch::DistAndPoints(TVector3 p3, TVector3 p4, TVector3& pa, TVector3& pb)
61{
62 pa = (p3 + p4) * 0.5;
63 pb = pa;
64 // pa=p3; //del
65 // pb=pa; //del
66 return 0;
67}
68
69//------------------------------------------------------------------------------------------------------------------------
70TVector3 BmnDch::GlobalToLocal(TVector3& global)
71{
72 Double_t globPos[3];
73 Double_t localPos[3];
74 global.GetXYZ(globPos);
75 gMC->Gmtod(globPos, localPos, 1);
76
77 return TVector3(localPos);
78}
79
80//------------------------------------------------------------------------------------------------------------------------
81TVector3 BmnDch::LocalToGlobal(TVector3& local)
82{
83 Double_t globPos[3];
84 Double_t localPos[3];
85 local.GetXYZ(localPos);
86 gMC->Gdtom(localPos, globPos, 1);
87
88 return TVector3(globPos);
89}
90
91//----------------------------------------------------------------------------------------------------------------------
92Bool_t BmnDch::ProcessHits(FairVolume* vol)
93{
94 // TGeoVolume *currentVolume = gGeoManager->GetCurrentVolume();
95 // TString currentVolumeName = currentVolume->GetName();
96
97 // Set parameters at entrance of volume. Reset ELoss.
98 if (gMC->IsTrackEntering()) {
99 ResetParameters();
100
101 fELoss = 0.;
102 fTime = gMC->TrackTime() * 1.0e09;
103 fLength = gMC->TrackLength();
104 fIsPrimary = 0;
105 fCharge = -1;
106 fPdgId = 0;
107
108 TLorentzVector PosIn;
109 gMC->TrackPosition(PosIn);
110 fPosIn.SetXYZ(PosIn.X(), PosIn.Y(), PosIn.Z());
111 gMC->TrackMomentum(fMom);
112
113 TParticle* part = gMC->GetStack()->GetCurrentTrack();
114 if (part) {
115 fIsPrimary = (Int_t)part->IsPrimary();
116 fCharge = (Int_t)part->GetPDG()->Charge();
117 fPdgId = (Int_t)part->GetPdgCode();
118 }
119
120 fVolumeID = vol->getMCid();
121 fPlaneNumber = gGeoManager->GetCurrentNode()->GetNumber();
122 fTrackID = gMC->GetStack()->GetCurrentTrackNumber();
123 }
124
125 // Sum energy loss for all steps in the active volume
126 fELoss += gMC->Edep();
127
128 // Create BmnDchPoint at EXIT of active volume;
129 if ((gMC->IsTrackExiting() || gMC->IsTrackStop() || gMC->IsTrackDisappeared()) && fELoss >= 0) {
130 TLorentzVector PosOut;
131 gMC->TrackPosition(PosOut);
132 fPosOut.SetXYZ(PosOut.X(), PosOut.Y(), PosOut.Z());
133
134 // Line defined in local coordinates
135 TVector3 p1(0, 0, 0); // 10 - arbitrary number...
136 TVector3 p2(10, 0, 0);
137
138 // Conversion to global coordinates
139 p1 = LocalToGlobal(p1);
140 p2 = LocalToGlobal(p2);
141 Double_t phi = TMath::ATan2(p2.Y() - p1.Y(), p2.X() - p1.X());
142
143 // "will-be-filled-out-soon" Points of closest approach
144 TVector3 trackPosition(0, 0, 0); // trackPosition => point on track, fPos => point on straw
145
146 // calculate points of closest approach between track and straw
147 // int result =
148 DistAndPoints(fPosIn, fPosOut, fPos, trackPosition);
149
150 BmnDchPoint* p =
151 AddHit(fTrackID, fVolumeID, fPos, fPos.Perp(), TVector3(fMom.Px(), fMom.Py(), fMom.Pz()), fTime,
152 (fLength + gMC->TrackLength()) / 2, fELoss, fIsPrimary, fCharge, fPdgId, trackPosition);
153 p->SetPhi(phi); // AZ
154 p->SetPlaneNumber(fPlaneNumber);
155
156 ((CbmStack*)gMC->GetStack())->AddPoint(kDCH);
157 }
158
159 return kTRUE;
160}
161
162//------------------------------------------------------------------------------------------------------------------------
164{
165 if (fVerboseLevel)
166 Print("");
167 fPointCollection->Delete();
168 fPosIndex = 0;
169}
170
171//------------------------------------------------------------------------------------------------------------------------
173{
174 FairRootManager::Instance()->Register("DCHPoint", "DCH", fPointCollection, kTRUE);
175}
176
177//------------------------------------------------------------------------------------------------------------------------
178TClonesArray* BmnDch::GetCollection(Int_t iColl) const
179{
180 if (iColl == 0)
181 return fPointCollection;
182 return NULL;
183}
184
185//------------------------------------------------------------------------------------------------------------------------
186void BmnDch::Print(Option_t*) const
187{
188 Int_t nHits = fPointCollection->GetEntriesFast();
189 cout << "-I- BmnDch: " << nHits << " points registered in this event." << endl;
190
191 if (fVerboseLevel > 1)
192 for (Int_t i = 0; i < nHits; i++)
193 (*fPointCollection)[i]->Print();
194}
195
196//------------------------------------------------------------------------------------------------------------------------
198{
199 fPointCollection->Delete();
200 ResetParameters();
201}
202
203//------------------------------------------------------------------------------------------------------------------------
204void BmnDch::CopyClones(TClonesArray* cl1, TClonesArray* cl2, Int_t offset)
205{
206 Int_t nEntries = cl1->GetEntriesFast();
207 cout << "-I- BmnDch: " << nEntries << " entries to add." << endl;
208 TClonesArray& clref = *cl2;
209 BmnDchPoint* oldpoint = NULL;
210
211 for (Int_t i = 0; i < nEntries; i++) {
212 oldpoint = (BmnDchPoint*)cl1->At(i);
213 Int_t index = oldpoint->GetTrackID() + offset;
214 oldpoint->SetTrackID(index);
215 new (clref[fPosIndex]) BmnDchPoint(*oldpoint);
216 fPosIndex++;
217 }
218
219 cout << "-I- BmnDch: " << cl2->GetEntriesFast() << " merged entries." << endl;
220}
221
222//------------------------------------------------------------------------------------------------------------------------
224{
225 TString fileName = GetGeometryFileName();
226
227 if (fileName.EndsWith(".root")) {
228 LOG(info) << "Constructing DCH geometry from ROOT file " << fileName.Data();
229 ConstructRootGeometry();
230 } else if (fileName.EndsWith(".geo")) {
231 LOG(info) << "Constructing DCH geometry from ASCII file " << fileName.Data();
233 } else if (fileName.EndsWith(".gdml")) {
234 LOG(info) << "Constructing DCH geometry from GDML file " << fileName.Data();
235 ConstructGDMLGeometry(nullptr);
236 } else {
237 LOG(fatal) << "Geometry format of DCH file " << fileName.Data() << " not supported.";
238 }
239}
240
241// ----- ConstructAsciiGeometry -------------------------------------------
243{
244 FairGeoLoader* geoLoad = FairGeoLoader::Instance();
245 FairGeoInterface* geoFace = geoLoad->getGeoInterface();
246 BmnDchGeo* DCHGeo = new BmnDchGeo();
247 DCHGeo->setGeomFile(GetGeometryFileName());
248 geoFace->addGeoModule(DCHGeo);
249
250 Bool_t rc = geoFace->readSet(DCHGeo);
251 if (rc)
252 DCHGeo->create(geoLoad->getGeoBuilder());
253 TList* volList = DCHGeo->getListOfVolumes();
254 // store geo parameter
255 FairRun* fRun = FairRun::Instance();
256 FairRuntimeDb* rtdb = FairRun::Instance()->GetRuntimeDb();
257 BmnDchGeoPar* par = (BmnDchGeoPar*)(rtdb->getContainer("BmnDchGeoPar"));
258 TObjArray* fSensNodes = par->GetGeoSensitiveNodes();
259 TObjArray* fPassNodes = par->GetGeoPassiveNodes();
260
261 TListIter iter(volList);
262 FairGeoNode* node = NULL;
263 FairGeoVolume* aVol = NULL;
264
265 while ((node = (FairGeoNode*)iter.Next())) {
266 aVol = dynamic_cast<FairGeoVolume*>(node);
267 if (node->isSensitive()) {
268 fSensNodes->AddLast(aVol);
269 } else {
270 fPassNodes->AddLast(aVol);
271 }
272 }
273 par->setChanged();
274 par->setInputVersion(fRun->GetRunId(), 1);
275 ProcessNodes(volList);
276}
277
278/*
279// ----- ConstructGDMLGeometry -------------------------------------------
280void BmnDch::ConstructGDMLGeometry()
281{
282 TGDMLParse parser;
283 TGeoVolume* v1 = parser.GDMLReadFile(GetGeometryFileName());
284
285 v1->Dump();
286
287 if (v1 == 0)
288 fLogger->Fatal(MESSAGE_ORIGIN, "\033[5m\033[31mFairModule::ConstructGDMLGeometry(): could construct geometry
289from GDML File!! \033[0m", GetGeometryFileName().Data());
290
291 TGeoNode* n = v1->GetNode(0);
292
293 n->Dump();
294
295 gGeoManager->cd();
296
297 // add gdml volume to the simulation TGeoManager
298 gGeoManager->AddVolume(v1);
299
300 // force rebuilding of voxels
301 TGeoVoxelFinder* voxels = v1->GetVoxels();
302 if (voxels)
303 voxels->SetNeedRebuild();
304
305 //To avoid having different names of the default matrices because we could have get the volume from another
306 //TGeoManager, we reset the default matrix name
307 //TGeoMatrix* M = n->GetMatrix();
308 //M->SetDefaultName();
309
310 //Now we can remove the matrix so that the new geomanager will rebuild it properly
311 //gGeoManager->GetListOfMatrices()->Remove(M);
312 //TGeoHMatrix* global = gGeoManager->GetHMatrix();
313 //gGeoManager->GetListOfMatrices()->Remove(global); //Remove the Identity matrix
314
315 //Now we can add the node to the existing cave
316 TGeoVolume* Cave = gGeoManager->GetTopVolume();
317 Cave->AddNode(v1, 0, 0);
318
319 // correction from O. Merle: in case of a TGeoVolume (v1) set the material properly
320 // Assign medium to the the volume v, this has to be done in all cases:
321 // case 1: For CAD converted volumes they have no mediums (only names)
322 // case 2: TGeoVolumes, we need to be sure that the material is defined in this session
323 FairGeoMedia* Media = FairGeoLoader::Instance()->getGeoInterface()->getMedia();
324 FairGeoBuilder* geobuild = FairGeoLoader::Instance()->getGeoBuilder();
325 TGeoMedium* med1 = v1->GetMedium();
326 med1->Dump();
327 if (med1)
328 {
329 TGeoMaterial* mat1 = v1->GetMaterial();
330 TGeoMaterial* newMat = gGeoManager->GetMaterial(mat1->GetName());
331 if (newMat == 0)
332 {
333 cout<<"The Material is not defined in the TGeoManager"<<endl;
334 // The Material is not defined in the TGeoManager, we try to create one if we have enough information about it
335 FairGeoMedium* FairMedium = Media->getMedium(mat1->GetName());
336 if (!FairMedium)
337 {
338 fLogger->Fatal(MESSAGE_ORIGIN,"Material %s is not defined in ASCII file nor in Root file we Stop creating
339geometry", mat1->GetName());
340 // FairMedium=new FairGeoMedium(mat1->GetName());
341 // Media->addMedium(FairMedium);
342 }
343
344 Int_t nmed = geobuild->createMedium(FairMedium);
345 v1->SetMedium(gGeoManager->GetMedium(nmed));
346 gGeoManager->SetAllIndex();
347 }
348 else
349 {
350 cout<<"Material is already available in the TGeoManager"<<endl;
351 // Material is already available in the TGeoManager and we can set it
352 TGeoMedium* med2 = gGeoManager->GetMedium(mat1->GetName());
353 v1->SetMedium(med2);
354 }
355 }
356 else
357 {
358 if (strcmp(v1->ClassName(),"TGeoVolumeAssembly") != 0)
359 {
360 //[R.K.-3.3.08] // When there is NO material defined, set it to avoid conflicts in Geant
361 fLogger->Fatal(MESSAGE_ORIGIN,"The volume %s Has no medium information and not an Assembly so we have to
362quit", v1->GetName());
363 }
364 }
365
366 // now go through the herachy and set the materials properly, this is important becase the CAD converter
367 // produce TGeoVolumes with materials that have only names and no properties
368 ExpandNode(gGeoManager->GetTopVolume()->GetNode(gGeoManager->GetTopVolume()->GetNdaughters()-1));
369
370
371 // Define output ROOT file with dch geometry
372 TFile* outfile = new TFile("dch.root", "RECREATE");
373 v1->Write();
374 outfile->Close();
375}
376// ----------------------------------------------------------------------------
377*/
378
379// ----- ConstructGDMLGeometry -------------------------------------------
381{
382 TFile* old = gFile;
383 TGDMLParse parser;
384 TGeoVolume* gdmlTop;
385
386 // Before importing GDML
387 Int_t maxInd = gGeoManager->GetListOfMedia()->GetEntries() - 1;
388
389 gdmlTop = parser.GDMLReadFile(GetGeometryFileName());
390
391 // Cheating - reassigning media indices after GDML import (need to fix this in TGDMLParse class!!!)
392 // for (Int_t i=0; i<gGeoManager->GetListOfMedia()->GetEntries(); i++)
393 // gGeoManager->GetListOfMedia()->At(i)->Dump();
394 // After importing GDML
395 Int_t j = gGeoManager->GetListOfMedia()->GetEntries() - 1;
396 Int_t curId;
397 TGeoMedium* m;
398 do {
399 m = (TGeoMedium*)gGeoManager->GetListOfMedia()->At(j);
400 curId = m->GetId();
401 m->SetId(curId + maxInd);
402 j--;
403 } while (curId > 1);
404
405 Int_t newMaxInd = gGeoManager->GetListOfMedia()->GetEntries() - 1;
406
407 gGeoManager->GetTopVolume()->AddNode(gdmlTop, 1, 0);
408 ExpandNodeForGdml(gGeoManager->GetTopVolume()->GetNode(gGeoManager->GetTopVolume()->GetNdaughters() - 1));
409
410 for (Int_t k = maxInd + 1; k < newMaxInd + 1; k++) {
411 TGeoMedium* medToDel = (TGeoMedium*)(gGeoManager->GetListOfMedia()->At(maxInd + 1));
412 LOG(debug) << " removing media " << medToDel->GetName() << " with id " << medToDel->GetId() << " (k=" << k
413 << ")";
414 gGeoManager->GetListOfMedia()->Remove(medToDel);
415 }
416 gGeoManager->SetAllIndex();
417
418 gFile = old;
419}
420
421void BmnDch::ExpandNodeForGdml(TGeoNode* node)
422{
423 LOG(debug) << "----------------------------------------- ExpandNodeForGdml for node " << node->GetName();
424
425 TGeoVolume* curVol = node->GetVolume();
426 LOG(debug) << " volume: " << curVol->GetName();
427
428 if (curVol->IsAssembly())
429 LOG(debug) << " skipping volume-assembly";
430 else {
431 TGeoMedium* curMed = curVol->GetMedium();
432 TGeoMaterial* curMat = curVol->GetMaterial();
433 TGeoMedium* curMedInGeoManager = gGeoManager->GetMedium(curMed->GetName());
434 TGeoMaterial* curMatOfMedInGeoManager = curMedInGeoManager->GetMaterial();
435 TGeoMaterial* curMatInGeoManager = gGeoManager->GetMaterial(curMat->GetName());
436
437 // Current medium and material assigned to the volume from GDML
438 LOG(debug2) << " curMed\t\t\t\t" << curMed << "\t" << curMed->GetName() << "\t" << curMed->GetId();
439 LOG(debug2) << " curMat\t\t\t\t" << curMat << "\t" << curMat->GetName() << "\t" << curMat->GetIndex();
440
441 // Medium and material found in the gGeoManager - either the pre-loaded one or one from GDML
442 LOG(debug2) << " curMedInGeoManager\t\t" << curMedInGeoManager << "\t" << curMedInGeoManager->GetName()
443 << "\t" << curMedInGeoManager->GetId();
444 LOG(debug2) << " curMatOfMedInGeoManager\t\t" << curMatOfMedInGeoManager << "\t"
445 << curMatOfMedInGeoManager->GetName() << "\t" << curMatOfMedInGeoManager->GetIndex();
446 LOG(debug2) << " curMatInGeoManager\t\t" << curMatInGeoManager << "\t" << curMatInGeoManager->GetName()
447 << "\t" << curMatInGeoManager->GetIndex();
448
449 TString matName = curMat->GetName();
450 TString medName = curMed->GetName();
451
452 if (curMed->GetId() != curMedInGeoManager->GetId()) {
453 if (fFixedMedia.find(medName) == fFixedMedia.end()) {
454 LOG(debug) << " Medium needs to be fixed";
455 fFixedMedia[medName] = curMedInGeoManager;
456 Int_t ind = curMat->GetIndex();
457 gGeoManager->RemoveMaterial(ind);
458 LOG(debug) << " removing material " << curMat->GetName() << " with index " << ind;
459 for (Int_t i = ind; i < gGeoManager->GetListOfMaterials()->GetEntries(); i++) {
460 TGeoMaterial* m = (TGeoMaterial*)gGeoManager->GetListOfMaterials()->At(i);
461 m->SetIndex(m->GetIndex() - 1);
462 }
463
464 LOG(debug) << " Medium fixed";
465 } else {
466 LOG(debug) << " Already fixed medium found in the list ";
467 }
468 } else {
469 if (fFixedMedia.find(medName) == fFixedMedia.end()) {
470 LOG(debug) << " There is no correct medium in the memory yet";
471
472 FairGeoLoader* geoLoad = FairGeoLoader::Instance();
473 FairGeoInterface* geoFace = geoLoad->getGeoInterface();
474 FairGeoMedia* geoMediaBase = geoFace->getMedia();
475 FairGeoBuilder* geobuild = geoLoad->getGeoBuilder();
476
477 FairGeoMedium* curMedInGeo = geoMediaBase->getMedium(medName);
478 if (curMedInGeo == 0) {
479 LOG(fatal) << " Media not found in Geo file: " << medName;
483 } else {
484 LOG(debug) << " Found media in Geo file" << medName;
485 /*Int_t nmed = */ geobuild->createMedium(curMedInGeo);
486 fFixedMedia[medName] = (TGeoMedium*)gGeoManager->GetListOfMedia()->Last();
487 gGeoManager->RemoveMaterial(curMatOfMedInGeoManager->GetIndex());
488 LOG(debug) << " removing material " << curMatOfMedInGeoManager->GetName() << " with index "
489 << curMatOfMedInGeoManager->GetIndex();
490 for (Int_t i = curMatOfMedInGeoManager->GetIndex();
491 i < gGeoManager->GetListOfMaterials()->GetEntries(); i++)
492 {
493 TGeoMaterial* m = (TGeoMaterial*)gGeoManager->GetListOfMaterials()->At(i);
494 m->SetIndex(m->GetIndex() - 1);
495 }
496 }
497
498 if (curMedInGeo->getSensitivityFlag()) {
499 LOG(debug) << " Adding sensitive " << curVol->GetName();
500 AddSensitiveVolume(curVol);
501 }
502 } else {
503 LOG(debug) << " Already fixed medium found in the list";
504 LOG(debug) << "!!! Sensitivity: " << fFixedMedia[medName]->GetParam(0);
505 if (fFixedMedia[medName]->GetParam(0) == 1) {
506 LOG(debug) << " Adding sensitive " << curVol->GetName();
507 AddSensitiveVolume(curVol);
508 }
509 }
510 }
511
512 curVol->SetMedium(fFixedMedia[medName]);
513 gGeoManager->SetAllIndex();
514
515 // gGeoManager->GetListOfMaterials()->Print();
516 // gGeoManager->GetListOfMedia()->Print();
517 }
518
520 if (curVol->GetNdaughters() != 0) {
521 TObjArray* NodeChildList = curVol->GetNodes();
522 TGeoNode* curNodeChild;
523 for (Int_t j = 0; j < NodeChildList->GetEntriesFast(); j++) {
524 curNodeChild = (TGeoNode*)NodeChildList->At(j);
525 ExpandNodeForGdml(curNodeChild);
526 }
527 }
528}
529
530// Check if Sensitive-----------------------------------------------------------
531Bool_t BmnDch::CheckIfSensitive(std::string name)
532{
533 TString tsname = name;
534 if (tsname.Contains("Active"))
535 return kTRUE;
536
537 return kFALSE;
538
539 // if(0 == TString(name).CompareTo("DCHDetV")) {
540 // return kTRUE;
541 // }
542 // return kFALSE;
543}
544
545//------------------------------------------------------------------------------------------------------------------------
546BmnDchPoint* BmnDch::AddHit(Int_t trackID,
547 Int_t detID,
548 TVector3 pos,
549 Double_t radius,
550 TVector3 mom,
551 Double_t time,
552 Double_t length,
553 Double_t eLoss,
554 Int_t isPrimary,
555 Double_t charge,
556 Int_t pdgId,
557 TVector3 trackPos)
558{
559 TClonesArray& clref = *fPointCollection;
560 Int_t size = clref.GetEntriesFast();
561 // std::cout << "ELoss: " << eLoss << "\n";
562 return new (clref[size])
563 BmnDchPoint(trackID, detID, pos, radius, mom, time, length, eLoss, isPrimary, charge, pdgId, trackPos);
564}
int i
Definition P4_F32vec4.h:22
__m128 m
Definition P4_F32vec4.h:27
@ kDCH
TObjArray * GetGeoSensitiveNodes()
TObjArray * GetGeoPassiveNodes()
void SetPhi(Double_t phi)
Definition BmnDchPoint.h:48
void SetPlaneNumber(Int_t plane_num)
Definition BmnDchPoint.h:49
virtual void Print(Option_t *) const
Definition BmnDch.cxx:186
virtual TClonesArray * GetCollection(Int_t iColl) const
Definition BmnDch.cxx:178
virtual void Reset()
Definition BmnDch.cxx:197
virtual void ConstructGeometry()
Definition BmnDch.cxx:223
BmnDch()
Definition BmnDch.cxx:31
virtual void CopyClones(TClonesArray *cl1, TClonesArray *cl2, Int_t offset)
Definition BmnDch.cxx:204
virtual Bool_t CheckIfSensitive(std::string name)
Definition BmnDch.cxx:531
virtual ~BmnDch()
Definition BmnDch.cxx:51
virtual Bool_t ProcessHits(FairVolume *vol=0)
Definition BmnDch.cxx:92
void ExpandNodeForGdml(TGeoNode *node)
Definition BmnDch.cxx:421
virtual void ConstructGDMLGeometry(TGeoMatrix *)
Definition BmnDch.cxx:380
virtual void ConstructAsciiGeometry()
Definition BmnDch.cxx:242
virtual void Register()
Definition BmnDch.cxx:172
map< TString, TGeoMedium * > fFixedMedia
Definition BmnDch.h:67
virtual void EndOfEvent()
Definition BmnDch.cxx:163