SND@LHC Software
Loading...
Searching...
No Matches
muon.cxx
Go to the documentation of this file.
1#include "muon.h"
2
3#include "muonPoint.h"
4
5
6#include "FairVolume.h"
7#include "FairGeoVolume.h"
8#include "FairGeoNode.h"
9#include "FairRootManager.h"
10#include "FairGeoLoader.h"
11#include "FairGeoInterface.h"
12#include "FairGeoMedia.h"
13#include "FairGeoBuilder.h"
14#include "FairRun.h"
15#include "FairRuntimeDb.h"
16#include "ShipDetectorList.h"
17#include "ShipStack.h"
18
19#include "TClonesArray.h"
20#include "TVirtualMC.h"
21#include "TGeoManager.h"
22#include "TGeoBBox.h"
23#include "TGeoCompositeShape.h"
24#include "TGeoShapeAssembly.h"
25#include "TGeoTube.h"
26#include "TGeoMaterial.h"
27#include "TGeoMedium.h"
28#include "TParticle.h"
29
30
31
32#include <iostream>
33using std::cout;
34using std::endl;
35
37 : FairDetector("muon", kTRUE, kMuon),
38 fTrackID(-1),
39 fVolumeID(-1),
40 fPos(),
41 fMom(),
42 fTime(-1.),
43 fLength(-1.),
44 fELoss(-1),
45 fmuonPointCollection(new TClonesArray("muonPoint"))
46{
47}
48
49muon::muon(const char* name, Bool_t active)
50 : FairDetector(name, active, kMuon),
51 fTrackID(-1),
52 fVolumeID(-1),
53 fPos(),
54 fMom(),
55 fTime(-1.),
56 fLength(-1.),
57 fELoss(-1),
58 fmuonPointCollection(new TClonesArray("muonPoint"))
59{
60}
61
63{
65 fmuonPointCollection->Delete();
67 }
68}
69
71{
72 FairDetector::Initialize();
73// FairRuntimeDb* rtdb= FairRun::Instance()->GetRuntimeDb();
74// muonGeoPar* par=(muonGeoPar*)(rtdb->getContainer("muonGeoPar"));
75}
76// ----- Private method InitMedium
77Int_t muon::InitMedium(const char* name)
78{
79 static FairGeoLoader *geoLoad=FairGeoLoader::Instance();
80 static FairGeoInterface *geoFace=geoLoad->getGeoInterface();
81 static FairGeoMedia *media=geoFace->getMedia();
82 static FairGeoBuilder *geoBuild=geoLoad->getGeoBuilder();
83
84 FairGeoMedium *ShipMedium=media->getMedium(name);
85
86 if (!ShipMedium)
87 {
88 Fatal("InitMedium","Material %s not defined in media file.", name);
89 return -1111;
90 }
91 TGeoMedium* medium=gGeoManager->GetMedium(name);
92 if (medium!=NULL)
93 return ShipMedium->getMediumIndex();
94
95 return geoBuild->createMedium(ShipMedium);
96}
97Bool_t muon::ProcessHits(FairVolume* vol)
98{
100 //Set parameters at entrance of volume. Reset ELoss.
101 if ( gMC->IsTrackEntering() ) {
102 fELoss = 0.;
103 fTime = gMC->TrackTime() * 1.0e09;
104 fLength = gMC->TrackLength();
105 gMC->TrackPosition(fPos);
106 gMC->TrackMomentum(fMom);
107 }
108
109 // Sum energy loss for all steps in the active volume
110 fELoss += gMC->Edep();
111
112 // Create muonPoint at exit of active volume
113 if ( gMC->IsTrackExiting() ||
114 gMC->IsTrackStop() ||
115 gMC->IsTrackDisappeared() ) {
116 fTrackID = gMC->GetStack()->GetCurrentTrackNumber();
117 //fVolumeID = vol->getMCid();
118 //cout << "muon proc "<< fVolumeID<<" "<<vol->GetName()<<" "<<vol->getVolumeId() <<endl;
119 //cout << " "<< gGeoManager->FindVolumeFast(vol->GetName())->GetNumber()<<endl;
120 fVolumeID = gGeoManager->FindVolumeFast(vol->GetName())->GetNumber();
121 if (fELoss == 0. ) { return kFALSE; }
122 TParticle* p=gMC->GetStack()->GetCurrentTrack();
123 Int_t pdgCode = p->GetPdgCode();
124 AddHit(fTrackID, fVolumeID, TVector3(fPos.X(), fPos.Y(), fPos.Z()),
125 TVector3(fMom.Px(), fMom.Py(), fMom.Pz()), fTime, fLength,
126 fELoss,pdgCode);
127
128 // Increment number of muon det points in TParticle
129 ShipStack* stack = (ShipStack*) gMC->GetStack();
130 stack->AddPoint(kMuon);
131 }
132
133 return kTRUE;
134}
135
137{
138
139 fmuonPointCollection->Clear();
140
141}
142
143
144
146{
147
154 FairRootManager::Instance()->Register("muonPoint", "muon",
155 fmuonPointCollection, kTRUE);
156
157}
158
159
160TClonesArray* muon::GetCollection(Int_t iColl) const
161{
162 if (iColl == 0) { return fmuonPointCollection; }
163 else { return NULL; }
164}
165
167{
168 fmuonPointCollection->Clear();
169}
170
171void muon::SetZStationPositions(Double_t z0, Double_t z1,Double_t z2,Double_t z3)
172{
173 fM0z=z0;
174 fM1z=z1;
175 fM2z=z2;
176 fM3z=z3;
177}
178void muon::SetZFilterPositions(Double_t z0, Double_t z1,Double_t z2)
179{
180 fF0z=z0;
181 fF1z=z1;
182 fF2z=z2;
183}
184void muon::SetActiveThickness(Double_t activeThickness)
185{
186 fActiveThickness=activeThickness;
187}
188void muon::SetFilterThickness(Double_t filterThickness)
189{
190 fFilterThickness=filterThickness;
191}
192void muon::SetXMax(Double_t xMax)
193{
194 fXMax=xMax;
195}
196void muon::SetYMax(Double_t yMax)
197{
198 fYMax=yMax;
199}
201{
206 TGeoVolume *top=gGeoManager->GetTopVolume();
207 TGeoVolume *tMuon = new TGeoVolumeAssembly("MuonDetector");
208
209 InitMedium("iron");
210 InitMedium("Scintillator");
211
212 TGeoMedium *Al =gGeoManager->GetMedium("Scintillator");
213 TGeoMedium *A2 =gGeoManager->GetMedium("iron");
214
215// TGeoBBox *detbox1 = new TGeoBBox("detbox1", 250, 250, 10);
216// TGeoBBox *detbox2 = new TGeoBBox("detbox2", 245, 245, 10);
217
218// TGeoCompositeShape *detcomp1 = new TGeoCompositeShape("detcomp1", "detbox1-detbox2");
219
220// TGeoVolume *detmu1 = new TGeoVolume("MuX", detcomp1, Al);
221 TGeoVolume *muondet0 = gGeoManager->MakeBox("muondet0", Al, fXMax, fYMax, fActiveThickness);
222 TGeoVolume *muondet1 = gGeoManager->MakeBox("muondet1", Al, fXMax, fYMax, fActiveThickness);
223 TGeoVolume *muondet2 = gGeoManager->MakeBox("muondet2", Al, fXMax, fYMax, fActiveThickness);
224 TGeoVolume *muondet3 = gGeoManager->MakeBox("muondet3", Al, fXMax, fYMax, fActiveThickness);
225
226 TGeoVolume *muonfilter = gGeoManager->MakeBox("muonfilter", A2, fXMax, fYMax, fFilterThickness);
227// 10cm iron to shield against backsplash from cavern
228 TGeoVolume *muonshield = gGeoManager->MakeBox("muonshield", A2, fXMax, fYMax, 5.);
229
230 AddSensitiveVolume(muondet0);
231 AddSensitiveVolume(muondet1);
232 AddSensitiveVolume(muondet2);
233 AddSensitiveVolume(muondet3);
234 muondet0->SetLineColor(kGreen);
235 muondet1->SetLineColor(kGreen);
236 muondet2->SetLineColor(kGreen);
237 muondet3->SetLineColor(kGreen);
238 muonfilter->SetLineColor(kBlue);
239 Double_t zStartMuon = fM0z;
240 Double_t totLength = fM3z-fM0z+2*fActiveThickness+15.;
241 Double_t relPos = zStartMuon-fActiveThickness+totLength/2.;
242 tMuon->AddNode(muondet0, 1, new TGeoTranslation(0, 0, fM0z-relPos));
243 tMuon->AddNode(muonfilter, 0, new TGeoTranslation(0, 0, fF0z-relPos));
244 tMuon->AddNode(muondet1, 1, new TGeoTranslation(0, 0, fM1z-relPos));
245 tMuon->AddNode(muonfilter, 1, new TGeoTranslation(0, 0, fF1z-relPos));
246 tMuon->AddNode(muondet2, 1, new TGeoTranslation(0, 0, fM2z-relPos));
247 tMuon->AddNode(muonfilter, 2, new TGeoTranslation(0, 0, fF2z-relPos));
248 tMuon->AddNode(muondet3, 1, new TGeoTranslation(0, 0, fM3z-relPos));
249 tMuon->AddNode(muonshield, 1, new TGeoTranslation(0, 0, fM3z+fActiveThickness+10.-relPos));
250 //finish assembly and position
251 top->AddNode(tMuon, 1, new TGeoTranslation(0, 0,relPos));
252}
253
254muonPoint* muon::AddHit(Int_t trackID, Int_t detID,
255 TVector3 pos, TVector3 mom,
256 Double_t time, Double_t length,
257 Double_t eLoss, Int_t pdgCode)
258{
259 TClonesArray& clref = *fmuonPointCollection;
260 Int_t size = clref.GetEntriesFast();
261 // cout << "muon hit called"<< pos.z()<<endl;
262 return new(clref[size]) muonPoint(trackID, detID, pos, mom,
263 time, length, eLoss, pdgCode);
264}
265
@ kMuon
Definition muon.h:14
virtual void Reset()
Definition muon.cxx:166
void SetFilterThickness(Double_t filterThickness)
Definition muon.cxx:188
TLorentzVector fMom
position at entrance
Definition muon.h:97
Double_t fF1z
z-position of veto station
Definition muon.h:106
void SetYMax(Double_t yMax)
Definition muon.cxx:196
virtual ~muon()
Definition muon.cxx:62
Double_t fActiveThickness
Definition muon.h:110
Double_t fM0z
energy loss
Definition muon.h:101
void SetZFilterPositions(Double_t z0, Double_t z1, Double_t z2)
Definition muon.cxx:178
Int_t InitMedium(const char *name)
Definition muon.cxx:77
Int_t fTrackID
Definition muon.h:94
Double_t fLength
time
Definition muon.h:99
virtual void Register()
Definition muon.cxx:145
void ConstructGeometry()
Definition muon.cxx:200
virtual void EndOfEvent()
Definition muon.cxx:136
Double_t fM3z
z-position of tracking station 2
Definition muon.h:104
TClonesArray * fmuonPointCollection
Definition muon.h:115
Double_t fF0z
z-position of tracking station 3
Definition muon.h:105
void SetXMax(Double_t xMax)
Definition muon.cxx:192
muonPoint * AddHit(Int_t trackID, Int_t detID, TVector3 pos, TVector3 mom, Double_t time, Double_t length, Double_t eLoss, Int_t pdgcode)
Definition muon.cxx:254
void SetZStationPositions(Double_t z0, Double_t z1, Double_t z2, Double_t z3)
Definition muon.cxx:171
virtual TClonesArray * GetCollection(Int_t iColl) const
Definition muon.cxx:160
Double_t fF2z
z-position of tracking station 1
Definition muon.h:107
Double_t fTime
momentum at entrance
Definition muon.h:98
virtual void Initialize()
Definition muon.cxx:70
muon()
Definition muon.cxx:36
Double_t fM1z
z-position of veto station
Definition muon.h:102
virtual Bool_t ProcessHits(FairVolume *v=0)
Definition muon.cxx:97
Double_t fFilterThickness
z-position of tracking station 2
Definition muon.h:109
void SetActiveThickness(Double_t activeThickness)
Definition muon.cxx:184
Double_t fM2z
z-position of tracking station 1
Definition muon.h:103
Double_t fXMax
Definition muon.h:111
Double_t fELoss
length
Definition muon.h:100
Double_t fYMax
Definition muon.h:112
TLorentzVector fPos
volume id
Definition muon.h:96
Int_t fVolumeID
track index
Definition muon.h:95
ClassImp(ecalContFact) ecalContFact