1 |
#include <fstream> |
2 |
#include "TMath.h" |
3 |
#include "TGeoBBox.h" |
4 |
#include "PamVMCDetTrk.h" |
5 |
|
6 |
using TMath::RadToDeg; |
7 |
|
8 |
ClassImp(PamVMCDetTrk) |
9 |
|
10 |
void PamVMCDetTrk::DefineGeometry(){ |
11 |
|
12 |
TGeoMaterial *m=0; |
13 |
TGeoMixture *mx =0; |
14 |
TString s = "ALUMINIUM"; |
15 |
m = GetMat(s); |
16 |
if(!m){ |
17 |
m = new TGeoMaterial(s,26.98,13,2.7); |
18 |
m->SetUniqueID( 9); |
19 |
} |
20 |
|
21 |
s = "IRON"; |
22 |
m = GetMat(s); |
23 |
if(!m){ |
24 |
m = new TGeoMaterial(s,55.85,26,7.87); |
25 |
m->SetUniqueID( 10); |
26 |
} |
27 |
|
28 |
|
29 |
s = "N2GAS"; |
30 |
m = GetMat(s); |
31 |
if (!m){ |
32 |
m = new TGeoMaterial(s,14.01,7,0.1250000E-02); |
33 |
m->SetUniqueID( 19); |
34 |
} |
35 |
|
36 |
s = "SILICON TR"; |
37 |
m= GetMat(s); |
38 |
if(!m){ |
39 |
m = new TGeoMaterial(s,28.09,14,2.33); |
40 |
m->SetUniqueID( 20); |
41 |
} |
42 |
|
43 |
s = "G10C"; |
44 |
mx = (TGeoMixture*)GetMat(s); |
45 |
if(!mx){ |
46 |
mx = new TGeoMixture(s,4, 1.70000 ); |
47 |
mx->SetUniqueID( 27); |
48 |
mx->DefineElement(0,28.09,14,0.53); |
49 |
mx->DefineElement(1,16,8,0.3); |
50 |
mx->DefineElement(2,12.01,6,0.15); |
51 |
mx->DefineElement(3,1.01,1,0.2000000E-01); |
52 |
} |
53 |
|
54 |
s = "SBAR"; |
55 |
mx = (TGeoMixture*)GetMat(s); |
56 |
if(!mx){ |
57 |
mx = new TGeoMixture(s,3, 1.49000 ); |
58 |
mx->SetUniqueID( 40); |
59 |
//Carbon fiber 90%, Resin 10% |
60 |
mx->DefineElement(0,12.01,6,0.845*0.9+0.545*0.1); //C |
61 |
mx->DefineElement(1,1.01,1,0.043*0.9+0.092*0.1); //H |
62 |
mx->DefineElement(2,16.0,8,0.112*0.9+0.363*0.1); //O |
63 |
} |
64 |
|
65 |
|
66 |
TGeoMedium * n = 0; |
67 |
|
68 |
s="ALUMINIUM"; |
69 |
n = (GetMed(s))?GetMed(s): new TGeoMedium(s,1,9,-1,1,40,1,100,0.5000000E-01,0.136283,0.5000000E-03); |
70 |
|
71 |
s = "N2 GAS"; |
72 |
n = (GetMed(s))?GetMed(s): new TGeoMedium(s,3,19,-1,1,40,1,0.5000000E-01,0.5000000E-01,0.1000000E-02,0.5000000E-03); |
73 |
|
74 |
s = "IRONTR"; |
75 |
n = (GetMed(s))?GetMed(s): new TGeoMedium(s,5,10,-1,1,40,1,0.5000000E-01,0.5000000E-01,0.8000000E-01,0.5000000E-03); |
76 |
|
77 |
s = "FIBER+RESIN"; |
78 |
n = (GetMed(s))?GetMed(s): new TGeoMedium(s,29,40,-1,1,40,1,100,0.5000000E-01,0.5000000E-02,0.5000000E-03); |
79 |
|
80 |
s = "SITRACKER"; |
81 |
n = (GetMed(s))?GetMed(s): new TGeoMedium(s,12,20,1,1,40,1,0.1000000E-02,0.5000000E-01,0.5000000E-04,0.1569056E-01); |
82 |
|
83 |
s = "G10C"; |
84 |
n = (GetMed(s))?GetMed(s):new TGeoMedium(s,17,27,-1,1,40,1,100,0.5000000E-01,0.1200000E-02,0.5000000E-03); |
85 |
|
86 |
TGeoVolume *v = 0; |
87 |
|
88 |
|
89 |
s = "SPEB"; |
90 |
v = (GetVol(s))?GetVol(s):gGeoManager->MakeBox(s,GetMed("N2 GAS"),15.,14.4,22.615); |
91 |
for(Int_t i = 1; i<=5; i++){ |
92 |
s = "MGF"; |
93 |
s += i; |
94 |
v = (GetVol(s))?GetVol(s):gGeoManager->MakeBox(s,GetMed("ALUMINIUM"),15.,14.4,4.45); |
95 |
} |
96 |
s = "MGPL"; |
97 |
v = (GetVol(s))?GetVol(s): gGeoManager->MakeBox(s,GetMed("IRONTR"),12.,11.4,4.); |
98 |
s = "MGPI"; |
99 |
v = (GetVol(s))?GetVol(s): gGeoManager->MakeBox(s,GetMed("N2 GAS"),8.07,6.57,4.); |
100 |
for(Int_t i = 1; i<=6; i++){ |
101 |
s = "TRP"; |
102 |
s += i; |
103 |
v = (GetVol(s))?GetVol(s):gGeoManager->MakeBox(s,GetMed("ALUMINIUM"),10.49,12.15,0.365); |
104 |
} |
105 |
for(Int_t i = 1; i<=6; i++){ |
106 |
s = "TPA"; |
107 |
s += i; |
108 |
v = (GetVol(s))?GetVol(s):gGeoManager->MakeBox(s,GetMed("N2 GAS"),8.2,9.9,0.365); |
109 |
} |
110 |
s = "TPAI"; |
111 |
v = (GetVol(s))?GetVol(s): gGeoManager->MakeBox(s,GetMed("ALUMINIUM"),8.144,1.25,0.5E-01); |
112 |
s = "TRSL"; |
113 |
v = (GetVol(s))?GetVol(s): gGeoManager->MakeBox(s,GetMed("SITRACKER"),2.6665,3.5,0.15E-01); |
114 |
s = "THBP"; |
115 |
v = (GetVol(s))?GetVol(s): gGeoManager->MakeBox(s,GetMed("G10C"),2.6665,2.75,0.15E-01); |
116 |
s = "TSPA"; |
117 |
v = (GetVol(s))?GetVol(s): gGeoManager->MakeBox(s,GetMed("SITRACKER"),2.596,3.413,0.15E-01); |
118 |
s = "TRCP"; |
119 |
v = (GetVol(s))?GetVol(s): gGeoManager->MakeBox(s,GetMed("FIBER+RESIN"),0.35E-01,9.9,0.25); |
120 |
s = "TBAL"; |
121 |
v = (GetVol(s))?GetVol(s): gGeoManager->MakeBox(s,GetMed("ALUMINIUM"),1.49,2.25,0.365); |
122 |
s = "MGPA"; |
123 |
v = (GetVol(s))?GetVol(s): gGeoManager->MakeBox(s,GetMed("ALUMINIUM"),8.1,6.6,4.); |
124 |
s = "TPGA"; |
125 |
v = (GetVol(s))?GetVol(s): gGeoManager->MakeBox(s,GetMed("N2 GAS"),10.29,10.65,0.4E-01); |
126 |
s = "TPGI"; |
127 |
v = (GetVol(s))?GetVol(s): gGeoManager->MakeBox(s,GetMed("N2 GAS"),8.07,6.57,0.15E-01); |
128 |
s = "TPGU"; |
129 |
v = (GetVol(s))?GetVol(s): gGeoManager->MakeBox(s,GetMed("N2 GAS"),10.49,12.15,0.1E-01); |
130 |
s = "TPGD"; |
131 |
v = (GetVol(s))?GetVol(s): gGeoManager->MakeBox(s,GetMed("N2 GAS"),12.,11.4,0.5E-02); |
132 |
|
133 |
|
134 |
ReadPaddlesPos(); |
135 |
|
136 |
//Original, not shifted positions of the paddles TRSL respect to TPAs volumes. |
137 |
Double_t x14,x36,x25, y123, y456, za; |
138 |
x36 = 5.405; |
139 |
x14 = -x36; |
140 |
x25 = 0.; |
141 |
y123 = 6.252; |
142 |
y456 = -0.75; |
143 |
za = 0.15E-01; |
144 |
Double_t xp[6] = {x14, x25, x36, x14, x25, x36}; |
145 |
Double_t yp[6] = {y123, y123, y123, y456, y456, y456}; |
146 |
Double_t x,y,z; |
147 |
|
148 |
|
149 |
GetVol("TRSL")->AddNode(GetVol("TSPA"),1,gGeoIdentity); //adding sensetive detector first |
150 |
GetVol("MGPL")->AddNode(GetVol("MGPA"),1,gGeoIdentity); |
151 |
GetVol("MGPA")->AddNode(GetVol("MGPI"),1,gGeoIdentity); |
152 |
|
153 |
Double_t zMGF = ((TGeoBBox*)GetVol("SPEB")->GetShape())->GetDZ(); |
154 |
for(Int_t i = 1; i<=6; i++){ |
155 |
Int_t rot_id, j; |
156 |
TString ss="TRP"; |
157 |
if( i<6 ){ |
158 |
s = "MGF"; |
159 |
s += i; |
160 |
zMGF -= ((TGeoBBox*)GetVol(s)->GetShape())->GetDZ(); |
161 |
GetVol("SPEB")->AddNode(GetVol( s ),1,new TGeoTranslation(0.,0., zMGF )); |
162 |
zMGF -= ((TGeoBBox*)GetVol(s)->GetShape())->GetDZ(); |
163 |
GetVol( s )->AddNode(GetVol("TPGD"),1,new TGeoTranslation(0.,0.,-4.445)); |
164 |
GetVol( s )->AddNode(GetVol("TPGI"),1,new TGeoTranslation(0.,0.,-4.425)); |
165 |
GetVol( s )->AddNode(GetVol("MGPL"),1,new TGeoTranslation(0.,0.,-0.41)); |
166 |
GetVol( s )->AddNode(GetVol("TPGI"),2,new TGeoTranslation(0.,0.,3.605)); |
167 |
GetVol( s )->AddNode(GetVol("TPGA"),1,new TGeoTranslation(0.,-0.75,3.66)); |
168 |
ss += i; |
169 |
GetVol( s )->AddNode(GetVol( ss ),1,new TGeoTranslation(dxflo[i-1], -2.25 + dyflo[i-1], 4.065)); |
170 |
} else { |
171 |
s = "SPEB"; |
172 |
ss += i; |
173 |
GetVol( s )->AddNode(GetVol( ss ),1,new TGeoCombiTrans(dxflo[i-1], 2.25 + dyflo[i-1], -22.25, GetRot("rot10"))); |
174 |
} |
175 |
s = "TPA"; |
176 |
s += i; |
177 |
GetVol( ss )->AddNode(GetVol( s ),i,new TGeoTranslation(0.,-0.75,0.)); |
178 |
GetVol( s )->AddNodeOverlap(GetVol("TRCP"),1,new TGeoTranslation(-8.1075,0.,0.15E-01)); |
179 |
GetVol( s )->AddNodeOverlap(GetVol("TRCP"),2,new TGeoTranslation(-2.7025,0.,0.15E-01)); |
180 |
GetVol( s )->AddNodeOverlap(GetVol("TRCP"),3,new TGeoTranslation(2.7025,0.,0.15E-01)); |
181 |
GetVol( s )->AddNodeOverlap(GetVol("TRCP"),4,new TGeoTranslation(8.1075,0.,0.15E-01)); |
182 |
//paddles// |
183 |
j = (i-1)*NP_TRK + 1; |
184 |
Int_t kk; |
185 |
|
186 |
for(Int_t pad = 0; pad<6; pad++){ |
187 |
ss = "rot_"; |
188 |
rot_id = 50 + j; |
189 |
ss += rot_id; |
190 |
if(i<6) kk = pad; |
191 |
else{ |
192 |
j = (i-1)*NP_TRK + pad + 1; |
193 |
if(pad<=2) |
194 |
kk= 3+pad; |
195 |
else |
196 |
kk = pad-3; |
197 |
|
198 |
ss = "rot_"; |
199 |
rot_id = 50 + kk + (i-1)*NP_TRK + 1; |
200 |
ss += rot_id; |
201 |
(fctmap.find(rot_id - 50)->second)->fdy *=-1.; |
202 |
(fctmap.find(rot_id - 50)->second)->fdz *=-1.; |
203 |
//cout<<"kk+1="<<kk+1<<"j="<<j<<endl; |
204 |
} |
205 |
x = xp[pad] + (fctmap.find(rot_id - 50)->second)->fdx; |
206 |
y = yp[pad] + (fctmap.find(rot_id - 50)->second)->fdy; |
207 |
z = za + (fctmap.find(rot_id - 50)->second)->fdz; |
208 |
|
209 |
//cout<<"plane ="<<i<<" TRSL="<<j<<"x,y,z"<<x<<","<<y<<","<<z<<"RotName"<<ss<<endl; |
210 |
GetVol( s )->AddNode(GetVol("TRSL"),j ,new TGeoCombiTrans( x,y,z, GetRot( ss ))); |
211 |
j++; |
212 |
} |
213 |
|
214 |
GetVol( s )->AddNodeOverlap(GetVol("THBP"),1,new TGeoTranslation(-5.405,-7.0015,0.15E-01)); |
215 |
GetVol( s )->AddNodeOverlap(GetVol("THBP"),2,new TGeoTranslation(0.,-7.0015,0.15E-01)); |
216 |
GetVol( s )->AddNodeOverlap(GetVol("THBP"),3,new TGeoTranslation(5.405,-7.0015,0.15E-01)); |
217 |
GetVol( s )->AddNodeOverlap(GetVol("TPAI"),1,new TGeoTranslation(0.,-8.65,0.315)); |
218 |
|
219 |
if(i<6){ |
220 |
s = "MGF"; |
221 |
s += i; |
222 |
GetVol( s )->AddNode(GetVol("TPGU"),1,new TGeoTranslation(0.,-2.25,4.44)); |
223 |
} |
224 |
} |
225 |
|
226 |
GetVol("SPEB")->AddNode(GetVol("TBAL"),1,new TGeoTranslation(5.4,-12.15,-22.25)); |
227 |
GetVol("SPEB")->AddNode(GetVol("TBAL"),2,new TGeoTranslation(-5.4,-12.15,-22.25)); |
228 |
|
229 |
|
230 |
SetMotherProp(GetVol("SPEB"),1,new TGeoTranslation(0.,0.,49.274)); |
231 |
}; |
232 |
|
233 |
void PamVMCDetTrk::DefineCuts(){ |
234 |
|
235 |
TString s ="ALUMINIUM"; // default GPAMELA parameters |
236 |
if (GetMed(s) && !GetCC(s)) |
237 |
SetCC(s, new pCutControl(GetMedID(s), 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, |
238 |
0.001, 0.01, 1., 1., 1., 0., 1., 1., 1., 4., 1., 1., 1., 1.)); |
239 |
s ="N2 GAS"; |
240 |
if (GetMed(s) && !GetCC(s)) |
241 |
SetCC(s, new pCutControl(GetMedID(s), 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, |
242 |
0.001, 0.01, 1., 1., 1., 0., 0., 1., 1., 4., 1., 1., 2., 1.)); |
243 |
s = "IRONTR"; // default GPAMELA parameters |
244 |
if (GetMed(s) && !GetCC(s)) |
245 |
SetCC(s, new pCutControl(GetMedID(s), 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, |
246 |
0.001, 0.01, 1., 1., 1., 0., 1., 1., 1., 4., 1., 1., 1., 1.)); |
247 |
s = "SITRACKER"; |
248 |
if (GetMed(s) && !GetCC(s)) |
249 |
SetCC(s, new pCutControl(GetMedID(s), 0.0001, 0.001, 0.00001, 0.00001, 0.0001, 0.0001, 0.00001, 0.00001, |
250 |
0.001, 0.01, 1., 1., 1., 0., 1., 1., 1., 1., 1., 1., 1., 2.)); |
251 |
s = "FIBER+RESIN"; |
252 |
if (GetMed(s) && !GetCC(s)) // default GPAMELA parameters |
253 |
SetCC(s, new pCutControl(GetMedID(s), 0.0001, 0.001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, |
254 |
0.001, 0.01, 1., 1., 1., 0., 1., 1., 1., 1., 1., 1., 1., 1.)); |
255 |
|
256 |
s = "G10C"; |
257 |
if (GetMed(s) && !GetCC(s)) |
258 |
SetCC(s, new pCutControl(GetMedID(s), 0.00001, 0.00001, 0.00001, 0.00001, 0.001, 0.001, 0.01, 0.00001, |
259 |
0.00001, 0.01, 1., 1., 1., 0., 1., 1., 1., 1., 1., 1., 1., 2.)); |
260 |
} |
261 |
|
262 |
void PamVMCDetTrk::ReadPaddlesPos(){ |
263 |
//This method reads from file rotations and shifts of the paddles |
264 |
//The format is: Omega, Beta, Gamma, dx, dy, dz |
265 |
|
266 |
cout<<"Loading POS files for TRK sensors..."<<endl; |
267 |
ifstream fcfile; |
268 |
TString PAM_VMC=gSystem->Getenv("PAM_VMC"); |
269 |
TString PLATFORM=gSystem->Getenv("PLATFORM"); |
270 |
TString PATH=PAM_VMC+"/lib/tgt_"+PLATFORM+"/parameters_l"; |
271 |
Int_t ls, ss; |
272 |
|
273 |
TMap rotshiftmap; |
274 |
|
275 |
for(Int_t ik = 1; ik<=NP_TRK; ik++){ |
276 |
TString filename = PATH; |
277 |
if( ik < 4 ){ |
278 |
ls = ik; |
279 |
ss = 2; |
280 |
} else{ |
281 |
ls = ik-3; |
282 |
ss = 1; |
283 |
} |
284 |
filename += ls; |
285 |
filename += "s"; |
286 |
filename += ss; |
287 |
filename += ".dat"; |
288 |
cout<<" loading: "<<filename<<endl; |
289 |
fcfile.open(filename); |
290 |
if(!fcfile){ |
291 |
cout<<" !!! ERROR, file "<<filename<<" is missed...exiting"<<endl; |
292 |
exit(-1); |
293 |
} |
294 |
//reading from file, create structures and put them in array |
295 |
|
296 |
Double_t om, be, ga, dx, dy, dz; |
297 |
for (Int_t ih = 1; ih <= NP_TRK; ih++){ |
298 |
fcfile >> om; |
299 |
fcfile >> be; |
300 |
fcfile >> ga; |
301 |
fcfile >> dx; |
302 |
fcfile >> dy; |
303 |
fcfile >> dz; |
304 |
|
305 |
Int_t ii = (6-ih)*6 +ik; |
306 |
fctmap[ii] = new pCombTrans( om, be, ga, dx, dy, dz ); |
307 |
} |
308 |
fcfile.close(); |
309 |
} |
310 |
|
311 |
for (Int_t ij = 1; ij<=6; ij++){ |
312 |
dxflo[ij-1] = dyflo[ij-1] = 0.; |
313 |
for (Int_t il = 1; il<=6; il++){ |
314 |
Int_t ii = (ij-1)*6+il; |
315 |
dxflo[ij-1] += (fctmap.find(ii)->second)->fdx; |
316 |
dyflo[ij-1] += (fctmap.find(ii)->second)->fdy; |
317 |
} |
318 |
dxflo[ij-1] /=6.; |
319 |
dyflo[ij-1] /=6.; |
320 |
} |
321 |
|
322 |
for (Int_t ij = 1; ij<=6; ij++){ |
323 |
for (Int_t il = 1; il<=6; il++){ |
324 |
Int_t ii = (ij-1)*6+il; |
325 |
(fctmap.find(ii)->second)->fdx = ( (fctmap.find(ii)->second)->fdx - dxflo[ij-1] )*1.E-4; |
326 |
(fctmap.find(ii)->second)->fdy = ( (fctmap.find(ii)->second)->fdy - dyflo[ij-1] )*1.E-4; |
327 |
(fctmap.find(ii)->second)->fdz = ( (fctmap.find(ii)->second)->fdz - 100. )*1.E-4; |
328 |
} |
329 |
dxflo[ij-1] *= 1.E-4; |
330 |
dyflo[ij-1] *= 1.E-4; |
331 |
} |
332 |
|
333 |
for (Int_t ij = 1; ij<=6; ij++){ |
334 |
for (Int_t il = 1; il<=6; il++){ |
335 |
Int_t ii = (ij-1)*6+il; |
336 |
|
337 |
Double_t om_1 = (fctmap.find(ii)->second)->fomega * 1.E-6; |
338 |
Double_t be_1 = (fctmap.find(ii)->second)->fbeta * 1.E-6; |
339 |
Double_t ga_1 = (fctmap.find(ii)->second)->fgamma * 1.E-6; |
340 |
|
341 |
if(ij==6){ |
342 |
om_1 = -om_1; |
343 |
ga_1 = -ga_1; |
344 |
} |
345 |
|
346 |
TVector3 rot1(1.,om_1, -ga_1), rot2(-om_1,1.,be_1), rot3(ga_1,-be_1,1.); |
347 |
Int_t rot_no = 50 + ii; |
348 |
TString nmrot = "rot_"; |
349 |
nmrot += rot_no; |
350 |
|
351 |
AddRot(nmrot.Data(), new TGeoRotation( nmrot.Data(), |
352 |
rot1.Theta()*RadToDeg(),rot1.Phi()*RadToDeg(), |
353 |
rot2.Theta()*RadToDeg(),rot2.Phi()*RadToDeg(), |
354 |
rot3.Theta()*RadToDeg(),rot3.Phi()*RadToDeg() )); |
355 |
//cout<<"plno:"<<ij<<" padno:"<<il |
356 |
// <<" t1:"<<rot1.Theta()*RadToDeg()<<" p1:"<<rot1.Phi()*RadToDeg() |
357 |
// <<" t2:"<<rot2.Theta()*RadToDeg()<<" p2:"<<rot2.Phi()*RadToDeg() |
358 |
// <<" t3:"<<rot3.Theta()*RadToDeg()<<" p3:"<<rot3.Phi()*RadToDeg() <<endl; |
359 |
} |
360 |
} |
361 |
} |
362 |
|
363 |
|