SND@LHC Software
Loading...
Searching...
No Matches
UpstreamTagger.cxx
Go to the documentation of this file.
1// RPC Timing Detector
2// 17/12/2019
3// celso.franco@cern.ch
4
5#include "UpstreamTagger.h"
7#include "UpstreamTaggerHit.h"
8
9#include "FairVolume.h"
10#include "FairGeoVolume.h"
11#include "FairGeoNode.h"
12#include "FairRootManager.h"
13#include "FairGeoLoader.h"
14#include "FairGeoInterface.h"
15#include "FairGeoMedia.h"
16#include "FairGeoBuilder.h"
17#include "FairRun.h"
18#include "FairRuntimeDb.h"
19#include "ShipDetectorList.h"
20#include "ShipStack.h"
21
22#include "TClonesArray.h"
23#include "TVirtualMC.h"
24#include "TGeoManager.h"
25#include "TGeoBBox.h"
26#include "TGeoCompositeShape.h"
27#include "TGeoTube.h"
28#include "TGeoMaterial.h"
29#include "TGeoMedium.h"
30#include "TMath.h"
31#include "TParticle.h"
32#include "TVector3.h"
33
34#include <iostream>
35#include <sstream>
36using std::cout;
37using std::endl;
38
39
41 : FairDetector("UpstreamTagger", kTRUE, kUpstreamTagger),
42 fTrackID(-1),
43 fVolumeID(-1),
44 fPos(),
45 fMom(),
46 fTime(-1.),
47 fLength(-1.),
48 fELoss(-1),
49 //
50 det_zPos(0),
51
52 det_xGlassPos(0),
53 det_yGlassPos(0),
54 det_zGlassPos(0),
55
56 det_xGlassBorderPos(0),
57 det_yGlassBorderPos(0),
58 det_zGlassBorderPos(0),
59
60 det_xPMMAPos(0),
61 det_yPMMAPos(0),
62 det_zPMMAPos(0),
63
64 det_dxPMMAPos(0),
65 det_dyPMMAPos(0),
66 det_dzPMMAPos(0),
67
68 det_xFreonSF6Pos(0),
69 det_yFreonSF6Pos(0),
70 det_zFreonSF6Pos(0),
71
72 det_xFR4Pos(0),
73 det_yFR4Pos(0),
74 det_zFR4Pos(0),
75
76 det_xAlPos(0),
77 det_yAlPos(0),
78 det_zAlPos(0),
79
80 det_dxAlPos(0),
81 det_dyAlPos(0),
82 det_dzAlPos(0),
83
84 det_xAirPos(0),
85 det_yAirPos(0),
86 det_zAirPos(0),
87
88 det_xStripPos64(0),
89 det_yStripPos64(0),
90 det_xStripPos(0),
91 det_yStripPos(0),
92 det_zStripPos(0),
93
94 //
95 UpstreamTagger_fulldet(0),
96 //
97 fUpstreamTaggerPointCollection(new TClonesArray("UpstreamTaggerPoint"))
98{
99}
100
101UpstreamTagger::UpstreamTagger(const char* name, Bool_t active)
102 : FairDetector(name, active, kUpstreamTagger),
103 fTrackID(-1),
104 fVolumeID(-1),
105 fPos(),
106 fMom(),
107 fTime(-1.),
108 fLength(-1.),
109 fELoss(-1),
110 //
111 det_zPos(0),
112
113 det_xGlassPos(0),
114 det_yGlassPos(0),
115 det_zGlassPos(0),
116
117 det_xGlassBorderPos(0),
118 det_yGlassBorderPos(0),
119 det_zGlassBorderPos(0),
120
121 det_xPMMAPos(0),
122 det_yPMMAPos(0),
123 det_zPMMAPos(0),
124
125 det_dxPMMAPos(0),
126 det_dyPMMAPos(0),
127 det_dzPMMAPos(0),
128
129 det_xFreonSF6Pos(0),
130 det_yFreonSF6Pos(0),
131 det_zFreonSF6Pos(0),
132
133 det_xFR4Pos(0),
134 det_yFR4Pos(0),
135 det_zFR4Pos(0),
136
137 det_xAlPos(0),
138 det_yAlPos(0),
139 det_zAlPos(0),
140
141 det_dxAlPos(0),
142 det_dyAlPos(0),
143 det_dzAlPos(0),
144
145 det_xAirPos(0),
146 det_yAirPos(0),
147 det_zAirPos(0),
148
149 det_xStripPos64(0),
150 det_yStripPos64(0),
151 det_xStripPos(0),
152 det_yStripPos(0),
153 det_zStripPos(0),
154
155 //
156 UpstreamTagger_fulldet(0),
157 //
158 fUpstreamTaggerPointCollection(new TClonesArray("UpstreamTaggerPoint"))
159{
160}
161
162
164{
165 FairDetector::Initialize();
166}
167
168
176
177
178
179Int_t UpstreamTagger::InitMedium(const char* name)
180{
181
182 static FairGeoLoader *geoLoad=FairGeoLoader::Instance();
183 static FairGeoInterface *geoFace=geoLoad->getGeoInterface();
184 static FairGeoMedia *media=geoFace->getMedia();
185 static FairGeoBuilder *geoBuild=geoLoad->getGeoBuilder();
186
187 FairGeoMedium *ShipMedium=media->getMedium(name);
188
189 if (!ShipMedium)
190 {
191 Fatal("InitMedium","Material %s not defined in media file.", name);
192 return -1111;
193 }
194 TGeoMedium* medium=gGeoManager->GetMedium(name);
195 if (medium!=NULL)
196 return ShipMedium->getMediumIndex();
197
198 return geoBuild->createMedium(ShipMedium);
199
200 return 0;
201}
202
203
204
205Bool_t UpstreamTagger::ProcessHits(FairVolume* vol)
206{
208 //Set parameters at entrance of volume. Reset ELoss.
209 if ( gMC->IsTrackEntering() ) {
210 fELoss = 0.;
211 fTime = gMC->TrackTime() * 1.0e09;
212 fLength = gMC->TrackLength();
213 gMC->TrackPosition(fPos);
214 gMC->TrackMomentum(fMom);
215 }
216
217 // Sum energy loss for all steps in the active volume
218 fELoss += gMC->Edep();
219
220 // Create vetoPoint at exit of active volume
221 if ( gMC->IsTrackExiting() ||
222 gMC->IsTrackStop() ||
223 gMC->IsTrackDisappeared() ) {
224 if (fELoss == 0. ) { return kFALSE; }
225
226 fTrackID = gMC->GetStack()->GetCurrentTrackNumber();
227
228 Int_t uniqueId;
229 gMC->CurrentVolID(uniqueId);
230 if (uniqueId>1000000) //Solid scintillator case
231 {
232 Int_t vcpy;
233 gMC->CurrentVolOffID(1, vcpy);
234 if (vcpy==5) uniqueId+=4; //Copy of half
235 }
236
237 TParticle* p = gMC->GetStack()->GetCurrentTrack();
238 Int_t pdgCode = p->GetPdgCode();
239 TLorentzVector Pos;
240 gMC->TrackPosition(Pos);
241 TLorentzVector Mom;
242 gMC->TrackMomentum(Mom);
243 Double_t xmean = (fPos.X()+Pos.X())/2. ;
244 Double_t ymean = (fPos.Y()+Pos.Y())/2. ;
245 Double_t zmean = (fPos.Z()+Pos.Z())/2. ;
246
247 AddHit(fTrackID, uniqueId, TVector3(xmean, ymean, zmean),
248 TVector3(fMom.Px(), fMom.Py(), fMom.Pz()), fTime, fLength,
249 fELoss,pdgCode,TVector3(Pos.X(), Pos.Y(), Pos.Z()),
250 TVector3(Mom.Px(), Mom.Py(), Mom.Pz()) );
251
252 // Increment number of veto det points in TParticle
253 ShipStack* stack = (ShipStack*) gMC->GetStack();
254 stack->AddPoint(kUpstreamTagger);
255 }
256
257 return kTRUE;
258}
259
260
261
266
267
268
270{
271
278 FairRootManager::Instance()->Register("UpstreamTaggerPoint", "UpstreamTagger",
280}
281
282
283
284TClonesArray* UpstreamTagger::GetCollection(Int_t iColl) const
285{
286 if (iColl == 0) { return fUpstreamTaggerPointCollection; }
287 else { return NULL; }
288}
289
290
291
296
297
298
300{
301 TGeoVolume *top = gGeoManager->GetTopVolume();
302
304
305 InitMedium("aluminium");
306 TGeoMedium *rpc_al =gGeoManager->GetMedium("aluminium");
307
308 InitMedium("TimeRpc_gas");
309 TGeoMedium *rpc_gas =gGeoManager->GetMedium("TimeRpc_gas");
310
311 InitMedium("air");
312 TGeoMedium *rpc_air =gGeoManager->GetMedium("air");
313
314 InitMedium("copper");
315 TGeoMedium *rpc_strip =gGeoManager->GetMedium("copper");
316
317 InitMedium("TimeRpc_glass");
318 TGeoMedium *rpc_glass =gGeoManager->GetMedium("TimeRpc_glass");
319
320 InitMedium("TimeRpc_pmma");
321 TGeoMedium *rpc_pmma =gGeoManager->GetMedium("TimeRpc_pmma");
322
323 InitMedium("TimeRpc_FR4");
324 TGeoMedium *rpc_FR4 =gGeoManager->GetMedium("TimeRpc_FR4");
325
327
328 TGeoVolume *vol_al1 = gGeoManager->MakeBox("Al1", rpc_al, (det_xAlPos + (2*det_dxAlPos))/2.0, (det_yAlPos + (2*det_dyAlPos))/2.0, det_dzAlPos/2.0);
329 vol_al1->SetLineColor(kBlue);//Gray);
330
331 TGeoVolume *vol_al2 = gGeoManager->MakeBox("Al2", rpc_al, (det_xAlPos + (2*det_dxAlPos))/2.0, det_dyAlPos/2.0, det_zAlPos/2.0);
332 vol_al2->SetLineColor(kRed);//Gray);
333
334 TGeoVolume *vol_al3 = gGeoManager->MakeBox("Al3", rpc_al, (det_dxAlPos)/2.0, (det_yAlPos + (2*det_dyAlPos))/2.0, det_zAlPos/2.0);
335 vol_al3->SetLineColor(kRed);//);
336
337 TGeoVolume *vol_strip = gGeoManager->MakeBox("strip", rpc_strip, (det_xStripPos)/2.0, (det_yStripPos)/2.0, det_zStripPos/2.0);
338 vol_strip->SetLineColor(42);
339
340 TGeoVolume *vol_strip64 = gGeoManager->MakeBox("strip64", rpc_strip, (det_xStripPos64)/2.0, (det_yStripPos64)/2.0, det_zStripPos/2.0);
341 vol_strip->SetLineColor(42);
342
343 TGeoVolume *vol_pmma1 = gGeoManager->MakeBox("pmma1", rpc_pmma, (det_xPMMAPos+(2*det_dxPMMAPos))/2.0, (det_yPMMAPos + (2*det_dyPMMAPos))/2.0, det_dzPMMAPos/2.0);
344 vol_pmma1->SetLineColor(kYellow);
345
346 TGeoVolume *vol_pmma2 = gGeoManager->MakeBox("pmma2", rpc_pmma, (det_xPMMAPos+(2*det_dxPMMAPos))/2.0, (det_dyPMMAPos)/2.0, det_zPMMAPos/2.0);
347 vol_pmma2->SetLineColor(kYellow);
348
349 TGeoVolume *vol_pmma3 = gGeoManager->MakeBox("pmma3", rpc_pmma, (det_dxPMMAPos)/2.0, (det_yPMMAPos + (2*det_dyPMMAPos))/2.0, det_zPMMAPos/2.0);
350 vol_pmma3->SetLineColor(kYellow);
351
352 TGeoVolume *vol_glass = gGeoManager->MakeBox("glass_upstreamtagger", rpc_glass, det_xGlassPos/2.0, det_yGlassPos/2.0, det_zGlassPos/2.0);
353 vol_glass->SetLineColor(kBlue);
354 AddSensitiveVolume(vol_glass);
355
356 TGeoVolume *vol_glass_border = gGeoManager->MakeBox("glassB", rpc_glass, (det_xGlassPos + (det_xGlassBorderPos*2.0))/2.0, det_yGlassBorderPos/2.0, det_zGlassBorderPos/2.0);
357 vol_glass_border->SetLineColor(kRed);
358
359 TGeoVolume *vol_glass_border1 = gGeoManager->MakeBox("glassB1", rpc_glass, det_xGlassBorderPos/2.0, det_yGlassPos/2.0, det_zGlassBorderPos/2.0);
360 vol_glass_border1->SetLineColor(kRed);
361
362 TGeoVolume *vol_FR4 = gGeoManager->MakeBox("FR4", rpc_FR4, det_xFR4Pos/2.0, det_yFR4Pos/2.0, det_zFR4Pos/2.0);
363 vol_FR4->SetLineColor(kBlack);
364
365 TGeoVolume *vol_air = gGeoManager->MakeBox("air", rpc_air, (det_xPMMAPos + (2*det_dxPMMAPos))/2.0, det_yAirPos/2.0, det_zAirPos/2.0);
366 vol_air->SetLineColor(kWhite);
367
368 TGeoVolume *vol_FrSF6 = gGeoManager->MakeBox("gas1", rpc_gas, det_xFreonSF6Pos/2.0, det_yFreonSF6Pos/2.0, det_zFreonSF6Pos/2.0);
369 vol_FrSF6->SetLineColor(kGreen);
370
371 TGeoVolume *vol_FrSF6_2 = gGeoManager->MakeBox("gas2", rpc_gas, det_xPMMAPos/2.0, det_yFreonSF6Pos_2/2.0, det_zFreonSF6Pos_2/2.0);
372 vol_FrSF6_2->SetLineColor(kGreen);
373
374 TGeoVolume *vol_FrSF6_3 = gGeoManager->MakeBox("gas3", rpc_gas, det_xFreonSF6Pos_2/2.0, (det_yPMMAPos/2.0 - (2*det_yFreonSF6Pos_2)/2.0), det_zFreonSF6Pos_2/2.0);
375 vol_FrSF6_2->SetLineColor(kGreen);
376
377
379
380 InitMedium("vacuum");
381 TGeoMedium *Vacuum_box =gGeoManager->GetMedium("vacuum");
382 double xbox=233.4; double ybox = 113; double zbox = 1.3503;
383
384 //RPC Module with 32 horizontal strips
385 TGeoVolume *Rpc_module_upstream = gGeoManager->MakeBox("UpstreamTagger",Vacuum_box, xbox/2.0, ybox/2.0, zbox/2.0);
386 Rpc_module_upstream->SetLineColor(kRed);
387
388 Rpc_module_upstream->AddNode(vol_al1, 145, new TGeoTranslation(0, 0, (-(det_zAlPos/2.0) - (det_dzAlPos/2.0)) ));
389 Rpc_module_upstream->AddNode(vol_al2, 146, new TGeoTranslation(0, ((-det_yAlPos/2.0) - (det_dyAlPos/2.0)), 0));
390 Rpc_module_upstream->AddNode(vol_al2, 147, new TGeoTranslation(0, ((det_yAlPos/2.0) + (det_dyAlPos/2.0)), 0));
391 Rpc_module_upstream->AddNode(vol_al3, 148, new TGeoTranslation(((-det_xAlPos/2.0) - (det_dxAlPos/2.0)), 0, 0));
392 Rpc_module_upstream->AddNode(vol_al3, 149, new TGeoTranslation(((det_xAlPos/2.0) + (det_dxAlPos/2.0)), 0, 0));
393 Rpc_module_upstream->AddNode(vol_al1, 150, new TGeoTranslation(0, 0, ((det_zAlPos/2.0) + (det_dzAlPos/2.0)) ));
394
395 Rpc_module_upstream->AddNode(vol_pmma1, 151, new TGeoTranslation(0, 0, -((det_zAlPos/2.0) - (det_dzPMMAPos/2.0))));
396 Rpc_module_upstream->AddNode(vol_pmma2, 152, new TGeoTranslation(0, ((-det_yPMMAPos/2.0) - (det_dyPMMAPos/2.0)), 0 - (det_zFR4Pos + det_zStripPos)/2.0 ));
397 Rpc_module_upstream->AddNode(vol_pmma2, 153, new TGeoTranslation(0, ((det_yPMMAPos/2.0) + (det_dyPMMAPos/2.0)),0 - (det_zFR4Pos + det_zStripPos)/2.0 ));
398 Rpc_module_upstream->AddNode(vol_pmma3, 154, new TGeoTranslation(((-det_xPMMAPos/2.0) - (det_dxPMMAPos/2.0)), 0, 0 - (det_zFR4Pos + det_zStripPos)/2.0 ));
399 Rpc_module_upstream->AddNode(vol_pmma3, 155, new TGeoTranslation(((det_xPMMAPos/2.0) + (det_dxPMMAPos/2.0)), 0, 0 - (det_zFR4Pos + det_zStripPos)/2.0 ));
400 Rpc_module_upstream->AddNode(vol_pmma1, 156, new TGeoTranslation(0, 0, -(det_zAlPos/2.0) + det_dzPMMAPos + det_zPMMAPos + (det_dzPMMAPos/2.0) ));
401
402 Rpc_module_upstream->AddNode(vol_glass_border, 157, new TGeoTranslation(0, ((det_yGlassPos/2.0) + (det_yGlassBorderPos/2.0)), ((det_zAlPos/2.0) - det_zFR4Pos - det_zStripPos - det_dzPMMAPos - (det_zGlassPos/2.0))));
403 Rpc_module_upstream->AddNode(vol_glass_border, 158, new TGeoTranslation(0, (-(det_yGlassPos/2.0) - (det_yGlassBorderPos/2.0)), ((det_zAlPos/2.0) - det_zFR4Pos - det_zStripPos - det_dzPMMAPos - (det_zGlassPos/2.0))));
404 Rpc_module_upstream->AddNode(vol_glass_border1, 159, new TGeoTranslation(((det_xGlassPos/2.0) + (det_xGlassBorderPos/2.0)), 0, ((det_zAlPos/2.0) - det_zFR4Pos - det_zStripPos - det_dzPMMAPos - (det_zGlassPos/2.0))));
405 Rpc_module_upstream->AddNode(vol_glass_border1, 160, new TGeoTranslation((-(det_xGlassPos/2.0) - (det_xGlassBorderPos/2.0)), 0, ((det_zAlPos/2.0) - det_zFR4Pos - det_zStripPos - det_dzPMMAPos - (det_zGlassPos/2.0))));
406
407 Rpc_module_upstream->AddNode(vol_glass_border, 161, new TGeoTranslation(0, ((det_yGlassPos/2.0) + (det_yGlassBorderPos/2.0)), ((det_zAlPos/2.0) - det_zFR4Pos - det_zStripPos - det_dzPMMAPos - det_zGlassPos - det_zFreonSF6Pos - (det_zGlassPos/2.0))));
408 Rpc_module_upstream->AddNode(vol_glass_border, 162, new TGeoTranslation(0, (-(det_yGlassPos/2.0) - (det_yGlassBorderPos/2.0)), ((det_zAlPos/2.0) - det_zFR4Pos - det_zStripPos - det_dzPMMAPos - det_zGlassPos - det_zFreonSF6Pos - (det_zGlassPos/2.0))));
409 Rpc_module_upstream->AddNode(vol_glass_border1, 163, new TGeoTranslation(((det_xGlassPos/2.0) + (det_xGlassBorderPos/2.0)), 0, ((det_zAlPos/2.0) - det_zFR4Pos - det_zStripPos - det_dzPMMAPos - det_zGlassPos - det_zFreonSF6Pos - (det_zGlassPos/2.0))));
410 Rpc_module_upstream->AddNode(vol_glass_border1, 164, new TGeoTranslation((-(det_xGlassPos/2.0) - (det_xGlassBorderPos/2.0)), 0, ((det_zAlPos/2.0) - det_zFR4Pos - det_zStripPos - det_dzPMMAPos - det_zGlassPos - det_zFreonSF6Pos - (det_zGlassPos/2.0))));
411
412 Rpc_module_upstream->AddNode(vol_glass_border, 165, new TGeoTranslation(0, ((det_yGlassPos/2.0) + (det_yGlassBorderPos/2.0)), ((det_zAlPos/2.0) - det_zFR4Pos - det_zStripPos - det_dzPMMAPos - (det_zGlassPos*2.0) - (det_zFreonSF6Pos*2.0) - (det_zGlassPos/2.0))));
413 Rpc_module_upstream->AddNode(vol_glass_border, 166, new TGeoTranslation(0, (-(det_yGlassPos/2.0) - (det_yGlassBorderPos/2.0)), ((det_zAlPos/2.0) - det_zFR4Pos - det_zStripPos - det_dzPMMAPos - (det_zGlassPos*2.0) - (det_zFreonSF6Pos*2.0) - (det_zGlassPos/2.0))));
414 Rpc_module_upstream->AddNode(vol_glass_border1, 167, new TGeoTranslation(((det_xGlassPos/2.0) + (det_xGlassBorderPos/2.0)), 0, ((det_zAlPos/2.0 - det_zFR4Pos - det_zStripPos) - det_dzPMMAPos - (det_zGlassPos*2.0) - (det_zFreonSF6Pos*2.0) - (det_zGlassPos/2.0))));
415 Rpc_module_upstream->AddNode(vol_glass_border1, 168, new TGeoTranslation((-(det_xGlassPos/2.0) - (det_xGlassBorderPos/2.0)), 0, ((det_zAlPos/2.0) - det_zFR4Pos - det_zStripPos - det_dzPMMAPos - (det_zGlassPos*2.0) - (det_zFreonSF6Pos*2.0) - (det_zGlassPos/2.0))));
416
417 Rpc_module_upstream->AddNode(vol_glass, 169, new TGeoTranslation(0, 0, ((det_zAlPos/2.0) - det_zFR4Pos - det_zStripPos - det_dzPMMAPos - (det_zGlassPos/2.0))));
418 Rpc_module_upstream->AddNode(vol_glass, 170, new TGeoTranslation(0, 0, ((det_zAlPos/2.0) - det_zFR4Pos - det_zStripPos - det_dzPMMAPos - det_zGlassPos - det_zFreonSF6Pos - (det_zGlassPos/2.0))));
419 Rpc_module_upstream->AddNode(vol_glass, 171, new TGeoTranslation(0, 0, ((det_zAlPos/2.0) - det_zFR4Pos - det_zStripPos - det_dzPMMAPos - (det_zGlassPos*2.0) - (det_zFreonSF6Pos*2.0) - (det_zGlassPos/2.0))));
420
421 Rpc_module_upstream->AddNode(vol_FrSF6, 172, new TGeoTranslation(0, 0, ((det_zAlPos/2.0) - det_zFR4Pos - det_zStripPos - det_dzPMMAPos - (det_zGlassPos*1.0) - (det_zFreonSF6Pos/2.0))));
422 Rpc_module_upstream->AddNode(vol_FrSF6, 173, new TGeoTranslation(0, 0, ((det_zAlPos/2.0) - det_zFR4Pos - det_zStripPos - det_dzPMMAPos - (det_zGlassPos*2.0) - (det_zFreonSF6Pos*1.0) - (det_zFreonSF6Pos/2.0))));
423
424 Rpc_module_upstream->AddNode(vol_FrSF6_2, 174, new TGeoTranslation(0, ((-det_yGlassPos/2.0) - det_yGlassBorderPos - (det_yFreonSF6Pos_2/2.0)), (-(det_zAlPos/2.0) + (det_dzPMMAPos) + (det_zFreonSF6Pos_2/2.0))));
425 Rpc_module_upstream->AddNode(vol_FrSF6_2, 175, new TGeoTranslation(0, ((det_yGlassPos/2.0) + det_yGlassBorderPos + (det_yFreonSF6Pos_2/2.0)), (-(det_zAlPos/2.0) + (det_dzPMMAPos) + (det_zFreonSF6Pos_2/2.0))));
426 Rpc_module_upstream->AddNode(vol_FrSF6_3, 176, new TGeoTranslation(((det_xGlassPos/2.0) + det_xGlassBorderPos + (det_xFreonSF6Pos_2/2.0)), 0, (-(det_zAlPos/2.0) + (det_dzPMMAPos) + (det_zFreonSF6Pos_2/2.0))));
427 Rpc_module_upstream->AddNode(vol_FrSF6_3, 177, new TGeoTranslation(((-det_xGlassPos/2.0) - det_xGlassBorderPos - (det_xFreonSF6Pos_2/2.0)), 0, (-(det_zAlPos/2.0) + (det_dzPMMAPos) + (det_zFreonSF6Pos_2/2.0))));
428
429 Rpc_module_upstream->AddNode(vol_FR4, 178, new TGeoTranslation(0, 0, -(det_zAlPos/2.0) + det_dzPMMAPos + det_zPMMAPos + det_dzPMMAPos + det_zFR4Pos/2.0));
430
431 Rpc_module_upstream->AddNode(vol_air, 179, new TGeoTranslation(0, ((-det_yAlPos/2.0) + (det_yAirPos/2.0)), 0));
432 Rpc_module_upstream->AddNode(vol_air, 180, new TGeoTranslation(0, ((det_yAlPos/2.0) - (det_yAirPos/2.0)), 0));
433
434 Int_t interval = 0;
435
436 //Add 32 copper strips to the Rpc module
437 for(int i = 181; i < 213; i++){
438
439 Rpc_module_upstream->AddNode(vol_strip, i, new TGeoTranslation(0, (-det_yGlassPos/2.0) - det_yGlassBorderPos + 1.5 + (interval*det_yStripPos) + (interval*0.15) + ((det_yStripPos/2.0)), -(det_zAlPos/2.0) + det_dzPMMAPos + det_zPMMAPos + det_dzPMMAPos + det_zFR4Pos + (det_zStripPos/2.0) ));
440 interval++;
441 }
442
443 //RPC Module with 64 vertical strips
444 TGeoVolume *Rpc_module_upstream1 = gGeoManager->MakeBox("UpstreamTagger1",Vacuum_box, xbox/2.0, ybox/2.0, zbox/2.0);
445 Rpc_module_upstream1->SetLineColor(kRed);
446
447 Rpc_module_upstream1->AddNode(vol_al1, 214, new TGeoTranslation(0, 0, (-(det_zAlPos/2.0) - (det_dzAlPos/2.0)) ));
448 Rpc_module_upstream1->AddNode(vol_al2, 215, new TGeoTranslation(0, ((-det_yAlPos/2.0) - (det_dyAlPos/2.0)), 0));
449 Rpc_module_upstream1->AddNode(vol_al2, 216, new TGeoTranslation(0, ((det_yAlPos/2.0) + (det_dyAlPos/2.0)), 0));
450 Rpc_module_upstream1->AddNode(vol_al3, 217, new TGeoTranslation(((-det_xAlPos/2.0) - (det_dxAlPos/2.0)), 0, 0));
451 Rpc_module_upstream1->AddNode(vol_al3, 218, new TGeoTranslation(((det_xAlPos/2.0) + (det_dxAlPos/2.0)), 0, 0));
452 Rpc_module_upstream1->AddNode(vol_al1, 219, new TGeoTranslation(0, 0, ((det_zAlPos/2.0) + (det_dzAlPos/2.0)) ));
453
454 Rpc_module_upstream1->AddNode(vol_pmma1, 220, new TGeoTranslation(0, 0, -((det_zAlPos/2.0) - (det_dzPMMAPos/2.0))));
455 Rpc_module_upstream1->AddNode(vol_pmma2, 221, new TGeoTranslation(0, ((-det_yPMMAPos/2.0) - (det_dyPMMAPos/2.0)), 0 - (det_zFR4Pos + det_zStripPos)/2.0 ));
456 Rpc_module_upstream1->AddNode(vol_pmma2, 222, new TGeoTranslation(0, ((det_yPMMAPos/2.0) + (det_dyPMMAPos/2.0)),0 - (det_zFR4Pos + det_zStripPos)/2.0 ));
457 Rpc_module_upstream1->AddNode(vol_pmma3, 223, new TGeoTranslation(((-det_xPMMAPos/2.0) - (det_dxPMMAPos/2.0)), 0, 0 - (det_zFR4Pos + det_zStripPos)/2.0 ));
458 Rpc_module_upstream1->AddNode(vol_pmma3, 224, new TGeoTranslation(((det_xPMMAPos/2.0) + (det_dxPMMAPos/2.0)), 0, 0 - (det_zFR4Pos + det_zStripPos)/2.0 ));
459 Rpc_module_upstream1->AddNode(vol_pmma1, 225, new TGeoTranslation(0, 0, -(det_zAlPos/2.0) + det_dzPMMAPos + det_zPMMAPos + (det_dzPMMAPos/2.0) ));
460
461 Rpc_module_upstream1->AddNode(vol_glass_border, 226, new TGeoTranslation(0, ((det_yGlassPos/2.0) + (det_yGlassBorderPos/2.0)), ((det_zAlPos/2.0) - det_zFR4Pos - det_zStripPos - det_dzPMMAPos - (det_zGlassPos/2.0))));
462 Rpc_module_upstream1->AddNode(vol_glass_border, 227, new TGeoTranslation(0, (-(det_yGlassPos/2.0) - (det_yGlassBorderPos/2.0)), ((det_zAlPos/2.0) - det_zFR4Pos - det_zStripPos - det_dzPMMAPos - (det_zGlassPos/2.0))));
463 Rpc_module_upstream1->AddNode(vol_glass_border1, 228, new TGeoTranslation(((det_xGlassPos/2.0) + (det_xGlassBorderPos/2.0)), 0, ((det_zAlPos/2.0) - det_zFR4Pos - det_zStripPos - det_dzPMMAPos - (det_zGlassPos/2.0))));
464 Rpc_module_upstream1->AddNode(vol_glass_border1, 229, new TGeoTranslation((-(det_xGlassPos/2.0) - (det_xGlassBorderPos/2.0)), 0, ((det_zAlPos/2.0) - det_zFR4Pos - det_zStripPos - det_dzPMMAPos - (det_zGlassPos/2.0))));
465
466 Rpc_module_upstream1->AddNode(vol_glass_border, 230, new TGeoTranslation(0, ((det_yGlassPos/2.0) + (det_yGlassBorderPos/2.0)), ((det_zAlPos/2.0) - det_zFR4Pos - det_zStripPos - det_dzPMMAPos - det_zGlassPos - det_zFreonSF6Pos - (det_zGlassPos/2.0))));
467 Rpc_module_upstream1->AddNode(vol_glass_border, 231, new TGeoTranslation(0, (-(det_yGlassPos/2.0) - (det_yGlassBorderPos/2.0)), ((det_zAlPos/2.0) - det_zFR4Pos - det_zStripPos - det_dzPMMAPos - det_zGlassPos - det_zFreonSF6Pos - (det_zGlassPos/2.0))));
468 Rpc_module_upstream1->AddNode(vol_glass_border1, 232, new TGeoTranslation(((det_xGlassPos/2.0) + (det_xGlassBorderPos/2.0)), 0, ((det_zAlPos/2.0) - det_zFR4Pos - det_zStripPos - det_dzPMMAPos - det_zGlassPos - det_zFreonSF6Pos - (det_zGlassPos/2.0))));
469 Rpc_module_upstream1->AddNode(vol_glass_border1, 233, new TGeoTranslation((-(det_xGlassPos/2.0) - (det_xGlassBorderPos/2.0)), 0, ((det_zAlPos/2.0) - det_zFR4Pos - det_zStripPos- det_dzPMMAPos - det_zGlassPos - det_zFreonSF6Pos - (det_zGlassPos/2.0))));
470
471 Rpc_module_upstream1->AddNode(vol_glass_border, 234, new TGeoTranslation(0, ((det_yGlassPos/2.0) + (det_yGlassBorderPos/2.0)), ((det_zAlPos/2.0) - det_zFR4Pos - det_zStripPos - det_dzPMMAPos - (det_zGlassPos*2.0) - (det_zFreonSF6Pos*2.0) - (det_zGlassPos/2.0))));
472 Rpc_module_upstream1->AddNode(vol_glass_border, 235, new TGeoTranslation(0, (-(det_yGlassPos/2.0) - (det_yGlassBorderPos/2.0)), ((det_zAlPos/2.0) - det_zFR4Pos - det_zStripPos - det_dzPMMAPos - (det_zGlassPos*2.0) - (det_zFreonSF6Pos*2.0) - (det_zGlassPos/2.0))));
473 Rpc_module_upstream1->AddNode(vol_glass_border1, 236, new TGeoTranslation(((det_xGlassPos/2.0) + (det_xGlassBorderPos/2.0)), 0, ((det_zAlPos/2.0) - det_zFR4Pos - det_zStripPos - det_dzPMMAPos - (det_zGlassPos*2.0) - (det_zFreonSF6Pos*2.0) - (det_zGlassPos/2.0))));
474 Rpc_module_upstream1->AddNode(vol_glass_border1, 237, new TGeoTranslation((-(det_xGlassPos/2.0) - (det_xGlassBorderPos/2.0)), 0, ((det_zAlPos/2.0) - det_zFR4Pos - det_zStripPos - det_dzPMMAPos - (det_zGlassPos*2.0) - (det_zFreonSF6Pos*2.0) - (det_zGlassPos/2.0))));
475
476 Rpc_module_upstream1->AddNode(vol_glass, 238, new TGeoTranslation(0, 0, ((det_zAlPos/2.0) - det_zFR4Pos - det_zStripPos - det_dzPMMAPos - (det_zGlassPos/2.0))));
477 Rpc_module_upstream1->AddNode(vol_glass, 239, new TGeoTranslation(0, 0, ((det_zAlPos/2.0) - det_zFR4Pos - det_zStripPos - det_dzPMMAPos - det_zGlassPos - det_zFreonSF6Pos - (det_zGlassPos/2.0))));
478 Rpc_module_upstream1->AddNode(vol_glass, 240, new TGeoTranslation(0, 0, ((det_zAlPos/2.0) - det_zFR4Pos - det_zStripPos - det_dzPMMAPos - (det_zGlassPos*2.0) - (det_zFreonSF6Pos*2.0) - (det_zGlassPos/2.0))));
479
480 Rpc_module_upstream1->AddNode(vol_FrSF6, 241, new TGeoTranslation(0, 0, ((det_zAlPos/2.0) - det_zFR4Pos - det_zStripPos - det_dzPMMAPos - (det_zGlassPos*1.0) - (det_zFreonSF6Pos/2.0))));
481 Rpc_module_upstream1->AddNode(vol_FrSF6, 243, new TGeoTranslation(0, 0, ((det_zAlPos/2.0) - det_zFR4Pos - det_zStripPos - det_dzPMMAPos - (det_zGlassPos*2.0) - (det_zFreonSF6Pos*1.0) - (det_zFreonSF6Pos/2.0))));
482
483 Rpc_module_upstream1->AddNode(vol_FrSF6_2, 243, new TGeoTranslation(0, ((-det_yGlassPos/2.0) - det_yGlassBorderPos - (det_yFreonSF6Pos_2/2.0)), (-(det_zAlPos/2.0) + (det_dzPMMAPos) + (det_zFreonSF6Pos_2/2.0))));
484 Rpc_module_upstream1->AddNode(vol_FrSF6_2, 244, new TGeoTranslation(0, ((det_yGlassPos/2.0) + det_yGlassBorderPos + (det_yFreonSF6Pos_2/2.0)), (-(det_zAlPos/2.0) + (det_dzPMMAPos) + (det_zFreonSF6Pos_2/2.0))));
485 Rpc_module_upstream1->AddNode(vol_FrSF6_3, 245, new TGeoTranslation(((det_xGlassPos/2.0) + det_xGlassBorderPos + (det_xFreonSF6Pos_2/2.0)), 0, (-(det_zAlPos/2.0) + (det_dzPMMAPos) + (det_zFreonSF6Pos_2/2.0))));
486 Rpc_module_upstream1->AddNode(vol_FrSF6_3, 246, new TGeoTranslation(((-det_xGlassPos/2.0) - det_xGlassBorderPos - (det_xFreonSF6Pos_2/2.0)), 0, (-(det_zAlPos/2.0) + (det_dzPMMAPos) + (det_zFreonSF6Pos_2/2.0))));
487
488 Rpc_module_upstream1->AddNode(vol_FR4, 247, new TGeoTranslation(0, 0, -(det_zAlPos/2.0) + det_dzPMMAPos + det_zPMMAPos + det_dzPMMAPos + det_zFR4Pos/2.0));
489
490 Rpc_module_upstream1->AddNode(vol_air, 248, new TGeoTranslation(0, ((-det_yAlPos/2.0) + (det_yAirPos/2.0)), 0));
491 Rpc_module_upstream1->AddNode(vol_air, 249, new TGeoTranslation(0, ((det_yAlPos/2.0) - (det_yAirPos/2.0)), 0));
492
493 interval = 0;
494
495 //Add 64 copper strips to the Rpc module
496 for(int i = 250; i < 314; i++){
497
498 Rpc_module_upstream1->AddNode(vol_strip64, i, new TGeoTranslation((-det_xGlassPos/2.0) - det_xGlassBorderPos + 2.175 + (interval*det_xStripPos64) + (interval*0.15) + ((det_xStripPos64/2.0)), 0, -(det_zAlPos/2.0) + det_dzPMMAPos + det_zPMMAPos + det_dzPMMAPos + det_zFR4Pos + (det_zStripPos/2.0) ));
499 interval++;
500 }
501
502
504
505 //UpstreamTagger_fulldet = new TGeoVolumeAssembly("Upstream_Tagger");
506 UpstreamTagger_fulldet = gGeoManager->MakeBox("Upstream_Tagger", Vacuum_box, xbox_fulldet/2.0, ybox_fulldet/2.0, zbox_fulldet/2.0);
507 UpstreamTagger_fulldet->SetLineColor(kWhite);
508
509 ybox_fulldet = 499; //resize box to define the modules position from active area of the detectors (discounting the aluminium box + acrilic)
510
511 //First Layer of full Rpc detector covering 2.23 x 4.99 meters with 32 strips
512 module[1][0] = 0; module[1][1] = ((ybox_fulldet/2.0) - ((det_yGlassPos)/2.0)); module[1][2] = (-(zbox_fulldet/2.0) + (det_zAlPos/2.0) + det_dzAlPos);
513 module[2][0] = 0; module[2][1] = 0; module[2][2] = (-(zbox_fulldet/2.0) + (det_zAlPos/2.0) + det_dzAlPos);
514 module[3][0] = 0; module[3][1] = -((ybox_fulldet/2.0) - ((det_yGlassPos)/2.0)); module[3][2] = (-(zbox_fulldet/2.0) + (det_zAlPos/2.0) + det_dzAlPos);
515
516 //Second Layer of full Rpc detector covering 2.23 x 4.99 meters with 32 strips
517 module[4][0] = 0; module[4][1] = ((ybox_fulldet/2.0) - ((det_yGlassPos)) - ((det_yGlassPos)/2.0) + extra_y); module[4][2] = (-(zbox_fulldet/2.0) + det_zAlPos + det_dzAlPos*3.0 + z_space_layers + (det_zAlPos/2.0));
518 module[5][0] = 0; module[5][1] = -((ybox_fulldet/2.0) - ((det_yGlassPos)) - ((det_yGlassPos)/2.0) + extra_y); module[5][2] = (-(zbox_fulldet/2.0) + det_zAlPos + det_dzAlPos*3.0 + z_space_layers + (det_zAlPos/2.0));
519
520 //Third Layer of full Rpc detector covering 2.23 x 4.99 meters with 64 strips
521 module[6][0] = 0; module[6][1] = ((ybox_fulldet/2.0) - ((det_yGlassPos)/2.0)); module[6][2] = (-(zbox_fulldet/2.0) + (det_zAlPos*2.0) + det_dzAlPos*5.0 + (z_space_layers*2.0) + (det_zAlPos/2.0));
522 module[7][0] = 0; module[7][1] = 0; module[7][2] = (-(zbox_fulldet/2.0) + (det_zAlPos*2.0) + det_dzAlPos*5.0 + (z_space_layers*3.0) + (det_zAlPos/2.0));
523 module[8][0] = 0; module[8][1] = -((ybox_fulldet/2.0) - ((det_yGlassPos)/2.0)); module[8][2] = (-(zbox_fulldet/2.0) + (det_zAlPos*2.0) + det_dzAlPos*5.0 + (z_space_layers*2.0) + (det_zAlPos/2.0));
524
525 //Fourth Layer of full Rpc detector covering 2.23 x 4.99 meters with 64 strips
526 module[9][0] = 0; module[9][1] = ((ybox_fulldet/2.0) - ((det_yGlassPos)) - ((det_yGlassPos)/2.0) + extra_y); module[9][2] = (-(zbox_fulldet/2.0) + (det_zAlPos*3.0) + det_dzAlPos*7.0 + (z_space_layers*3.0) + (det_zAlPos/2.0));
527 module[10][0] = 0; module[10][1] = -((ybox_fulldet/2.0) - ((det_yGlassPos)) - ((det_yGlassPos)/2.0) + extra_y); module[10][2] = (-(zbox_fulldet/2.0) + (det_zAlPos*3.0) + det_dzAlPos*7.0 + (z_space_layers*3.0) + (det_zAlPos/2.0));
528
529 //First Layer of full Rpc detector1 covering 2.23 x 4.99 meters
530 UpstreamTagger_fulldet->AddNode(Rpc_module_upstream, 1, new TGeoTranslation(module[1][0], module[1][1], module[1][2]));
531 UpstreamTagger_fulldet->AddNode(Rpc_module_upstream, 2, new TGeoTranslation(module[2][0], module[2][1], module[2][2]));
532 UpstreamTagger_fulldet->AddNode(Rpc_module_upstream, 3, new TGeoTranslation(module[3][0], module[3][1], module[3][2]));
533 //Second Layer of full Rpc detector1 covering 2.23 x 4.99 meters
534 UpstreamTagger_fulldet->AddNode(Rpc_module_upstream, 4, new TGeoTranslation(module[4][0], module[4][1], module[4][2]));
535 UpstreamTagger_fulldet->AddNode(Rpc_module_upstream, 5, new TGeoTranslation(module[5][0], module[5][1], module[5][2]));
536 //Third Layer of full Rpc detector1 covering 2.23 x 4.99 meters
537 UpstreamTagger_fulldet->AddNode(Rpc_module_upstream1, 6, new TGeoTranslation(module[6][0], module[6][1], module[6][2]));
538 UpstreamTagger_fulldet->AddNode(Rpc_module_upstream1, 7, new TGeoTranslation(module[7][0], module[7][1], module[7][2]));
539 UpstreamTagger_fulldet->AddNode(Rpc_module_upstream1, 8, new TGeoTranslation(module[8][0], module[8][1], module[8][2]));
540 //Fourth Layer of full Rpc detector1 covering 2.23 x 4.99 meters
541 UpstreamTagger_fulldet->AddNode(Rpc_module_upstream1, 9, new TGeoTranslation(module[9][0], module[9][1], module[9][2]));
542 UpstreamTagger_fulldet->AddNode(Rpc_module_upstream1, 10, new TGeoTranslation(module[10][0], module[10][1], module[10][2]));
543
544
545 //First Layer of full Rpc detector2 covering 2.23 x 4.99 meters
546 UpstreamTagger_fulldet->AddNode(Rpc_module_upstream, 11, new TGeoTranslation(module[1][0], module[1][1], -module[9][2]));
547 UpstreamTagger_fulldet->AddNode(Rpc_module_upstream, 12, new TGeoTranslation(module[2][0], module[2][1], -module[9][2]));
548 UpstreamTagger_fulldet->AddNode(Rpc_module_upstream, 13, new TGeoTranslation(module[3][0], module[3][1], -module[9][2]));
549 //Second Layer of full Rpc detector2 covering 2.23 x 4.99 meters
550 UpstreamTagger_fulldet->AddNode(Rpc_module_upstream, 14, new TGeoTranslation(module[4][0], module[4][1], -module[6][2]));
551 UpstreamTagger_fulldet->AddNode(Rpc_module_upstream, 15, new TGeoTranslation(module[5][0], module[5][1], -module[6][2]));
552 //Third Layer of full Rpc detector2 covering 2.23 x 4.99 meters
553 UpstreamTagger_fulldet->AddNode(Rpc_module_upstream1, 16, new TGeoTranslation(module[6][0], module[6][1], -module[4][2]));
554 UpstreamTagger_fulldet->AddNode(Rpc_module_upstream1, 17, new TGeoTranslation(module[7][0], module[7][1], -module[4][2]));
555 UpstreamTagger_fulldet->AddNode(Rpc_module_upstream1, 18, new TGeoTranslation(module[8][0], module[8][1], -module[4][2]));
556 //Fourth Layer of full Rpc detector2 covering 2.23 x 4.99 meters
557 UpstreamTagger_fulldet->AddNode(Rpc_module_upstream1, 19, new TGeoTranslation(module[9][0], module[9][1], -module[1][2]));
558 UpstreamTagger_fulldet->AddNode(Rpc_module_upstream1, 20, new TGeoTranslation(module[10][0], module[10][1], -module[1][2]));
559
560 top->AddNode(UpstreamTagger_fulldet, 1, new TGeoTranslation(0.0, 0.0, det_zPos));
561
562 cout << " Z Position (Upstream Tagger1) " << det_zPos << endl;
564
565 return;
566}
567
568
569
570UpstreamTaggerPoint* UpstreamTagger::AddHit(Int_t trackID, Int_t detID,
571 TVector3 pos, TVector3 mom,
572 Double_t time, Double_t length,
573 Double_t eLoss, Int_t pdgCode,TVector3 Lpos, TVector3 Lmom)
574{
575 TClonesArray& clref = *fUpstreamTaggerPointCollection;
576 Int_t size = clref.GetEntriesFast();
577
578 return new(clref[size]) UpstreamTaggerPoint(trackID, detID, pos, mom,
579 time, length, eLoss, pdgCode,Lpos,Lmom);
580}
581
582
@ kUpstreamTagger
TClonesArray * fUpstreamTaggerPointCollection
Double_t det_dzPMMAPos
y-thickness of PMMA box
Double_t fTime
momentum at entrance
Double_t det_yAlPos
x-size of Aluminium box
Double_t det_dxAlPos
z-size of Aluminium box
Double_t det_yFreonSF6Pos
x-size of gas gap
Double_t det_xGlassBorderPos
z-size of Active Glass plates
TLorentzVector fPos
volume id
Double_t det_zStripPos
y-size of Strip for modules with 32 strips
Double_t det_zFreonSF6Pos
y-size of gas gap
Double_t fLength
time
Double_t det_yAirPos
x-size of Aluminium box
Double_t det_yGlassBorderPos
x-size of Inactive Glass plates
Double_t det_zFreonSF6Pos_2
y-size of gas gap
virtual Bool_t ProcessHits(FairVolume *v=0)
Double_t module[11][3]
Double_t det_zAlPos
y-size of Aluminium box
Double_t det_dzAlPos
y-thickness of Aluminium box
Double_t det_zAirPos
y-size of Aluminium box
Double_t det_xStripPos
y-size of Strip for modules with 64 strips
Double_t det_xAlPos
z-size of FR4 box
Double_t det_dyAlPos
x-thickness of Aluminium box
TLorentzVector fMom
position at entrance
Double_t det_xPMMAPos
z-size of Inactive Glass plates
Double_t ybox_fulldet
virtual void EndOfEvent()
Double_t det_zGlassPos
y-size of Active Glass plates
Int_t InitMedium(const char *name)
virtual void Initialize()
Double_t xbox_fulldet
z-size of Strip
Double_t det_xGlassPos
z-position of veto station
Double_t det_zFR4Pos
y-size of FR4 box
Double_t det_xStripPos64
z-size of Aluminium box
Double_t det_yStripPos
x-size of Strip for modules with 32 strips
Double_t fELoss
length
UpstreamTaggerPoint * AddHit(Int_t trackID, Int_t detID, TVector3 pos, TVector3 mom, Double_t time, Double_t length, Double_t eLoss, Int_t pdgCode, TVector3 Lpos, TVector3 Lmom)
Double_t det_dxPMMAPos
z-size of PMMA box
virtual void Reset()
Double_t det_zPos
energy loss
Double_t det_dyPMMAPos
x-thickness of PMMA box
TGeoVolume * UpstreamTagger_fulldet
virtual ~UpstreamTagger()
Double_t det_yStripPos64
x-size of Strip for modules with 64 strips
Double_t det_yGlassPos
x-size of Active Glass plates
Double_t det_xFR4Pos
z-size of gas gap
Double_t det_yFR4Pos
x-size of FR4 box
Double_t det_yPMMAPos
x-size of PMMA box
Double_t det_zGlassBorderPos
y-size of Inactive Glass plates
virtual void Register()
Double_t det_xFreonSF6Pos
z-thickness of PMMA box
Double_t det_xFreonSF6Pos_2
z-size of gas gap
Double_t zbox_fulldet
Double_t det_zPMMAPos
y-size of PMMA box
Double_t det_yFreonSF6Pos_2
x-size of gas gap
virtual TClonesArray * GetCollection(Int_t iColl) const
ClassImp(ecalContFact) ecalContFact