1 #include "TGeoManager.h"
4 void ClusterPlacer(
double x,
double y,
double z,
double GlobalZOffset ,
int ObjectNo, TGeoVolume *
top,TGeoVolume *Clusterr,
double phi,
double theta,
double psi)
6 TGeoRotation *Clusterrot =
new TGeoRotation(
"Clusterrot",phi, theta,psi-phi);
7 Clusterrot->RegisterYourself();
8 top->AddNode(Clusterr,ObjectNo,
new TGeoCombiTrans(x,y,GlobalZOffset+z,Clusterrot));
14 gROOT->Macro(
"$VMCWORKDIR/gconfig/rootlogon.C");
17 gSystem->Load(
"libGeoBase");
18 gSystem->Load(
"libParBase");
19 gSystem->Load(
"libBase");
20 gSystem->Load(
"libPndData");
21 gSystem->Load(
"libPassive");
24 TFile*
fi =
new TFile(outfile,
"RECREATE");
28 FairGeoLoader*
geoLoad =
new FairGeoLoader(
"TGeo",
"FairGeoLoader");
29 FairGeoInterface *
geoFace = geoLoad->getGeoInterface();
30 geoFace->setMediaFile(
"../../../../geometry/media_pnd.geo");
34 FairGeoMedia *
Media = geoFace->getMedia();
35 FairGeoBuilder *
geobuild=geoLoad->getGeoBuilder();
37 FairGeoMedium *medGe = Media->getMedium(
"germanium");
38 Int_t nmedGe=geobuild->createMedium(medGe);
41 FairGeoMedium *medcap = Media->getMedium(
"HYPaluminium");
42 Int_t nmedcap=geobuild->createMedium(medcap);
44 TGeoMedium *Ge =
gGeoManager->GetMedium(
"germanium");
47 TGeoMedium *Al_sol =
gGeoManager->GetMedium(
"HYPaluminium");
66 TGeoManager *
geom = (TGeoManager*)gROOT->FindObject(
"FAIRGeom");
67 TGeoVolume *
top =
new TGeoVolumeAssembly(
"hpGe");
68 TGeoVolume *strange =
new TGeoVolumeAssembly(
"strange");
70 cout<<
" geom "<<geom<<endl;
71 geom->SetTopVolume(top);
76 TGeoVolume *Strahlrohr =geom->MakeTube(
"Strahlrohr",Al_sol,0,7.5,150);
77 Strahlrohr->SetLineColor(kBlue);
81 TGeoVolume *Außenhülle =geom->MakeTube(
"Außenhülle",Al_sol,45,45.5,100);
82 Außenhülle->SetLineColor(kBlue);
87 TGeoVolume *HoldingStruc =geom->MakeBox(
"HoldingStruc",Al_sol,1,45,50);
88 HoldingStruc->SetLineColor(kGreen);
92 TGeoSphere *Kugel =
new TGeoSphere(
"Kugel",1,30,0,180,0,360);
93 TGeoVolume *Kugell =
new TGeoVolume(
"Kugell",Kugel,Al_sol);
94 Kugell->SetLineColor(kBlue);
95 Kugell->SetTransparency(50);
100 TGeoSphere *Origin =
new TGeoSphere(
"Origin",0,1,0,180,0,360);
101 TGeoVolume *Originn =
new TGeoVolume(
"Originn",Origin,Al_sol);
102 Originn->SetLineColor(kGreen);
107 double orangexy[16]={5.1211,-3.9906 , 2.5436,-7.0666 , -1.40290,-6.3389 , -2.5693,-3.0401 , 6.5119,-5.1633 , 3.2569,-9.0480 , -1.7273,-8.1289 , -3.2443,-3.8387};
108 double gelbxy[16]={-2.5693,-3.0401 , -6.0164,-2.4697 , -7.3916,1.3304 , -4.7881,4.3843 , -3.2443,-3.8387 , -7.7274,-3.0578 , -9.4641,1.7035 , -6.1761,5.5903};
109 double braunxy[16]={5.1211,-3.9906 , -2.5693,-3.0401 , -4.7881,4.3843 , -1.3481,3.7451 , 6.5119,-5.1633 , -3.2443,-3.8387 , -6.1761,5.5603 , -1.7021,4.7290};
110 double grauxy[16]={5.1211,-3.9906 , -1.3481,3.7451 , 0.8954,6.4301 , 3.9175,-0.7051 , 6.5119,-5.1633 , -1.7021,4.7290 , 1.2156,8.2210 , 4.9466,-0.8905};
111 double gruenxy[16]={0.8954,6.4301 , 4.8480,5.7361 , 6.1610,1.9544 , 3.9175,-0.7051 , 1.2156,8.2210 , 6.2074,7.3444 , 7.9036,2.5685 , 4.9466,-0.8905};
113 TGeoArb8 *orange =
new TGeoArb8 (
"orange",12.95/2, orangexy );
114 TGeoArb8 *gelb =
new TGeoArb8 (
"gelb",12.95/2, gelbxy );
115 TGeoArb8 *braun =
new TGeoArb8 (
"braun",12.95/2, braunxy );
116 TGeoArb8 *grau =
new TGeoArb8 (
"grau",12.95/2, grauxy );
117 TGeoArb8 *gruen =
new TGeoArb8 (
"gruen",12.95/2, gruenxy );
120 double orangeInxy[16]={-2.4572,-2.9075 , -1.2905,-6.2072 , 2.4849,-6.9033 , 4.9505,-3.9607 , -3.1322,-3.7060 , -1.6148,-7.9972 , 3.1981,-8.8846 , 6.3412,-5.1334};
121 double gelbInxy[16]={-2.4572,-2.9075 , -4.7303,4.2211 , -7.2208,1.2997 , -5.9053,-2.3069 , -3.1322,-3.7060 , -6.1183,5.3971 , -9.2933,1.6727 , -7.6162,-2.9250};
122 double braunInxy[16]={-2.4572,-2.9075 , 4.9505,-3.9607 , -1.2893,3.5817 , -4.7303,4.2211 , -3.1322,-3.7060 , 6.3412,-5.1334 , -1.6433,4.5655 , -6.1183,5.3971};
123 double grauInxy[16]={4.9505,-3.9607 , 3.7466,-0.4744 , 0.9549,6.2675 , -1.2893,3.5817 , 6.3412,-5.1334 , 4.7756,-0.8597 , 1.2751,8.0583 , -1.6433,4.5655};
124 double gruenInxy[16]={3.7466,-0.4744 , 6.0208,1.9859 , 4.7360,5.6035 , 0.9549,6.2675 , 4.7756,-0.8597 , 7.7332,2.6000 , 6.0953,7.2118 , 1.2751,8.0583};
126 TGeoTranslation *In_Z =
new TGeoTranslation(
"In_Z",0,0,0.15);
127 In_Z->RegisterYourself();
128 TGeoArb8 *orangeIn =
new TGeoArb8 (
"orangeIn",(12.95-0.15)/2, orangeInxy );
129 TGeoArb8 *gelbIn =
new TGeoArb8 (
"gelbIn",(12.95-0.15)/2, gelbInxy );
130 TGeoArb8 *braunIn =
new TGeoArb8 (
"braunIn",(12.95-0.15)/2, braunInxy );
131 TGeoArb8 *grauIn =
new TGeoArb8 (
"grauIn",(12.95-0.15)/2, grauInxy );
132 TGeoArb8 *gruenIn =
new TGeoArb8 (
"gruenIn",(12.95-0.15)/2, gruenInxy );
136 double up1_2xy[16]={6.5119,-5.1633 , 3.2569,-9.0480 , 3.1981,-8.8846 , 6.3412,-5.1334 ,
137 6.9097,-5.2329 , 3.3939,-9.4288 , 3.1981,-8.8846 , 6.3412,-5.1334};
138 double up2_3xy[16]={3.2569,-9.0480 , -1.7273,-8.1289 , -1.6148,-7.9972 , 3.1981,-8.8846 ,
139 3.3939,-9.4288 , -1.9896,-8.4361 , -1.6148,-7.9972 , 3.1981,-8.8846};
140 double up3_4xy[16]={-1.7273,-8.1289 , -3.2443,-3.8387 , -3.1322,-3.7060 , -1.6148,-7.9972 ,
141 -1.9896,-8.4361 , -3.5050,-4.1481 , -3.1322,-3.7060 , -1.6148,-7.9972};
142 double up4_5xy[16]={-3.2443,-3.8387 , -7.7274,-3.0578 , -7.6162,-2.9250 ,
144 -3.5050,-4.1481 , -7.9866,-3.3866 , -7.6162,-2.9250 , -3.1322,-3.7060};
145 double up5_6xy[16]={-7.7274,-3.0578 , -9.4641,1.7035 , -9.2933,1.6727 , -7.6162,-2.9250 , -7.9866,-3.3866 , -9.8624,1.7752 , -9.2933,1.6727 ,-7.6162,-2.9250 };
146 double up6_7xy[16]={-9.4641,1.7035 , -6.1761,5.5603 , -6.1183,5.3971 , -9.2933,1.6727 , -9.8624,1.7752 , -6.3111,5.9410 , -6.1183,5.3971 , -9.2933,1.6727};
147 double up7_8xy[16]={-6.1761,5.5603 , -1.7021,4.7290 , -1.6433,4.5655 , -6.1183,5.3971 , -6.3111,5.9410 , -1.8393,5.1101 , -1.6433,4.5655 , -6.1183,5.3971};
148 double up8_9xy[16]={-1.7021,4.7290 , 1.2156,8.2210 , 1.2751,8.0583 , -1.6433,4.5655 , -1.8393,5.1101 , 1.0770,8.6003 , 1.2751,8.0583 , -1.6433,4.5655};
149 double up9_10xy[16]={1.2156,8.2210 , 6.2074,7.3444 , 6.0953,7.2118 , 1.2751,8.0583 , 1.0770,8.6003 , 6.4686,7.6535 , 6.0953,7.2118 , 1.2751,8.0583};
150 double up10_11xy[16]={6.2074,7.3444 , 7.9036,2.5685 , 7.7332,2.6000 , 6.0953,7.2118 , 6.4686,7.6535 , 8.3007,2.4950 , 7.7332,2.6000 , 6.0953,7.2118};
151 double up11_12xy[16]={7.9036,2.5685 , 4.9466,-0.8905 , 4.7756,-0.8597 , 7.7332,2.6000 , 8.3007,2.4950 , 5.3453,-0.9622 , 4.7756,-0.8597 , 7.7332,2.6000};
153 double up12_1xy[16]={4.9466,-0.8905 , 6.5119,-5.1633 , 6.3412,-5.1334 , 4.7756,-0.8597 , 5.3453,-0.9622 , 6.9097,-5.2329 ,6.3412,-5.1334 , 4.7756,-0.8597};
154 TGeoArb8 *up1_2 =
new TGeoArb8 (
"up1_2",2.5, up1_2xy );
155 TGeoArb8 *up2_3 =
new TGeoArb8 (
"up2_3",2.5, up2_3xy );
156 TGeoArb8 *up3_4 =
new TGeoArb8 (
"up3_4",2.5, up3_4xy );
157 TGeoArb8 *up4_5 =
new TGeoArb8 (
"up4_5",2.5, up4_5xy );
158 TGeoArb8 *up5_6 =
new TGeoArb8 (
"up5_6",2.5, up5_6xy );
159 TGeoArb8 *up6_7 =
new TGeoArb8 (
"up6_7",2.5, up6_7xy );
160 TGeoArb8 *up7_8 =
new TGeoArb8 (
"up7_8",2.5, up7_8xy );
161 TGeoArb8 *up8_9 =
new TGeoArb8 (
"up8_9",2.5, up8_9xy );
162 TGeoArb8 *up9_10 =
new TGeoArb8 (
"up9_10",2.5, up9_10xy );
163 TGeoArb8 *up10_11 =
new TGeoArb8 (
"up10_11",2.5, up10_11xy );
164 TGeoArb8 *up11_12 =
new TGeoArb8 (
"up11_12",2.5, up11_12xy );
165 TGeoArb8 *up12_1 =
new TGeoArb8 (
"up12_1",2.5, up12_1xy );
166 TGeoTranslation *up_Z =
new TGeoTranslation(
"up_Z",0,0,12.95/2+5./2);
167 up_Z->RegisterYourself();
172 double xDeckel[12] = {6.9097,3.3939,-1.9896,-3.5058,-7.9866,-9.8624,-6.3111,-1.8393,1.0770,6.4686,8.3007,5.3453};
174 double yDeckel[12] ={-5.2329,-9.4288,-8.4361,-4.1481,-3.3866,1.7752,5.9410,5.1101,8.6003,7.6535,2.4950,-0.9622};
176 TGeoXtru *Deckel =
new TGeoXtru (2);
177 Deckel->DefinePolygon(12,xDeckel,yDeckel);
178 Deckel->DefineSection(0,12.95/2+5,0,0,1);
179 Deckel->DefineSection(1,12.95/2+5+0.5,0,0,1);
180 TGeoVolume *DeckelVol =
new TGeoVolume(
"Deckel",Deckel,Al_sol);
181 TGeoCompositeShape *KappenForm =
new TGeoCompositeShape(
"KappenForm",
"(orange+gelb+braun+grau+gruen)-orangeIn:In_Z-gelbIn:In_Z-braunIn:In_Z-grauIn:In_Z-gruenIn:In_Z+(up1_2:up_Z+up2_3:up_Z+up3_4:up_Z+up4_5:up_Z+up5_6:up_Z+up6_7:up_Z+up7_8:up_Z+up8_9:up_Z+up9_10:up_Z+up10_11:up_Z+up11_12:up_Z+up12_1:up_Z)");
182 TGeoVolume *Kappe =
new TGeoVolume(
"Kappe",KappenForm,Al_sol);
185 TGeoRotation *rightPosRot =
new TGeoRotation(
"rightPosRot", 0,0,180+130.2);
186 rightPosRot->RegisterYourself();
187 TGeoCombiTrans *rightPos =
new TGeoCombiTrans(0,0,6.475,rightPosRot);
188 rightPos->RegisterYourself();
193 Kappe->SetLineColor(kBlue);
194 DeckelVol->SetLineColor(kBlue);
198 TGeoTube *CapTube =
new TGeoTube(
"CapTube",0,3.75,5);
199 TGeoPgon *CapPgon =
new TGeoPgon(
"CapPgon",0.,360.,6,2);
200 CapPgon->DefineSection(0,-5,3.0571,3.8);
201 CapPgon->DefineSection(1,4.9094,3.75,3.8);
202 double CapThickness = 0.08;
203 double Scale = (3.0571-CapThickness)/3.0571;
204 TGeoTube *CapInTube =
new TGeoTube(
"CapInTube",0,3.75*Scale,5);
205 TGeoPgon *CapInPgon =
new TGeoPgon(
"CapInPgon",0.,360.,6,2);
206 CapInPgon->DefineSection(0,-5,3.0571-CapThickness,3.8);
207 CapInPgon->DefineSection(1,4.9094,3.75-CapThickness,3.8);
208 TGeoTube *CapTop =
new TGeoTube(
"CapTop",0,3.75,CapThickness/2);
209 TGeoTranslation *CapTop_Z =
new TGeoTranslation(
"CapTop_Z",0,0,5-CapThickness/2);
210 CapTop_Z->RegisterYourself();
211 TGeoCompositeShape *CapOutForm=
new TGeoCompositeShape(
"CapOutForm",
"(CapTube-CapPgon)");
212 TGeoCompositeShape *CapInForm=
new TGeoCompositeShape(
"CapInForm",
"(CapInTube-CapInPgon)");
213 TGeoTranslation *Cap_Z =
new TGeoTranslation(
"Cap_Z",0,0,CapThickness);
214 Cap_Z->RegisterYourself();
215 TGeoCompositeShape *CapForm =
new TGeoCompositeShape(
"CapForm",
"CapOutForm-CapInForm:Cap_Z+CapTop:CapTop_Z");
217 TGeoVolume *Capsule =
new TGeoVolume(
"Capsule",CapForm,Al_sol);
218 Capsule->SetTransparency(10);
219 Capsule->SetLineColor(10);
223 double VacThickness = 0.08;
224 double Scale2 =(3.0571-CapThickness-VacThickness)/3.0571;
225 cout << Scale2 << endl;
226 TGeoTube *CryTube =
new TGeoTube(
"CryTube",0,3.75,3.5);
227 TGeoPgon *CryPgon =
new TGeoPgon(
"CryPgon",0.,360.,6,2);
228 CryPgon->DefineSection(0,-3.5,3.0571-CapThickness-VacThickness,3.8);
229 CryPgon->DefineSection(1,1.5+4.9094,3.75-CapThickness-VacThickness,3.8);
230 TGeoTube *CryHole =
new TGeoTube(
"CryHole",0,0.5,3);
231 TGeoTranslation *CryHoleTrans =
new TGeoTranslation(
"CryHoleTrans",0,0,0.5);
232 CryHoleTrans->RegisterYourself();
233 TGeoCompositeShape *CryForm=
new TGeoCompositeShape(
"CryForm",
"((CryTube-CryPgon)-CryHole:CryHoleTrans)");
235 TGeoVolume *Crystal =
new TGeoVolume(
"Crystal",CryForm,Ge);
236 Crystal->SetLineColor(kGreen);
237 Crystal->SetFillColor(kGreen);
238 TGeoTranslation *CryTrans =
new TGeoTranslation(0,0,5-1.5+CapThickness+VacThickness);
239 CryTrans->RegisterYourself();
245 TGeoVolume *CryCap[48];
246 for(
int i = 0;
i < 48;
i++)
248 CryCap[
i]=
new TGeoVolumeAssembly(
"CryCap");
249 CryCap[
i]->AddNode(Crystal,
i+1,CryTrans);
250 CryCap[
i]->AddNode(Capsule,100+
i+1,
new TGeoTranslation(0,0,5));
252 double TripleXOffset = -3.53/2-0.2;
253 double TripleYOffset = -6.1386/2;
254 TGeoRotation *CryCap1rot =
new TGeoRotation(
"CryCap1rot", -0,+4,0);
255 CryCap1rot->RegisterYourself();
256 TGeoCombiTrans *CryCap1Combitrans =
new TGeoCombiTrans(0+TripleXOffset,0+TripleYOffset,+0.45+0.2843,CryCap1rot);
257 CryCap1Combitrans->RegisterYourself();
259 TGeoRotation *CryCap2rot =
new TGeoRotation(
"CryCap2rot", -90,-6.93,90);
260 CryCap2rot->RegisterYourself();
261 TGeoCombiTrans *CryCap2Combitrans =
new TGeoCombiTrans(5.3162+TripleXOffset,6.1386/2+TripleYOffset,0.45+0.2843,CryCap2rot);
262 CryCap2Combitrans->RegisterYourself();
264 TGeoRotation *CryCap3rot =
new TGeoRotation(
"CryCap3rot", 0,-4,0);
265 CryCap3rot->RegisterYourself();
266 TGeoCombiTrans *CryCap3Combitrans =
new TGeoCombiTrans(0+TripleXOffset,6.1386+TripleYOffset,0.45+0.2843,CryCap3rot);
267 CryCap3Combitrans->RegisterYourself();
269 cout <<
"test0" << endl;
272 TGeoVolume *Pointingtube = geom->MakeTube(
"Pointer",Al_sol,0,0.2,150);
274 TGeoVolume *Cluster[16];
275 TGeoVolume *ClusterTemp[16];
276 for(
int i = 0;
i < 16;
i ++)
279 sprintf(buffer,
"Cluster_%d",
i);
280 Cluster[
i]=
new TGeoVolumeAssembly(buffer);
281 ClusterTemp[
i]=
new TGeoVolumeAssembly(
"ClusterTemp");
283 ClusterTemp[
i]->AddNode(Kappe,200+
i+1,rightPos);
284 ClusterTemp[
i]->AddNode(DeckelVol,300+
i+1,rightPos);
285 ClusterTemp[
i]->AddNode(CryCap[3*
i],1000+i+1,CryCap1Combitrans);
287 ClusterTemp[
i]->AddNode(CryCap[3*i+1],2000+i+1,CryCap2Combitrans);
288 ClusterTemp[
i]->AddNode(CryCap[3*i+2],3000+i+1,CryCap3Combitrans);
289 cout <<
"winkel "<< 180/
Pi*TMath::ATan(12.5751/-26.3009) << endl;
290 cout <<
"winkel2 "<< 180/
Pi*TMath::ATan(7.0801/-26.3009) << endl;
291 TGeoRotation *ClusterTemprot =
new TGeoRotation;
293 ClusterTemprot->RotateY(180);
294 ClusterTemprot->RotateX(0);
295 ClusterTemprot->RegisterYourself();
297 Cluster[
i]->AddNode(ClusterTemp[i],400+i,
new TGeoCombiTrans(0,0,0,ClusterTemprot));
301 cout <<
"test1" << endl;
311 ClusterPlacer(7.0801,12.5751, -26.3009, GlobalZOffset , 1000, strange,Cluster[0],180+150.62, 28.73,180-4.95);
312 cout <<
"test2" << endl;
313 ClusterPlacer(12.8422,-0, -27.1123, GlobalZOffset , 2000, strange,Cluster[1],180+90,25.34,180);
314 ClusterPlacer(7.0801,-12.5751, -26.3009, GlobalZOffset , 3000, strange,Cluster[2],180+29.38,28.73,180+4.95);
316 ClusterPlacer(-7.0801,-12.5751, -26.3009, GlobalZOffset , 4000, strange,Cluster[3],150.62,28.73,4.95);
317 ClusterPlacer(-12.8422,0, -27.1123, GlobalZOffset , 5000, strange,Cluster[4],90,25.34,0);
318 ClusterPlacer(-7.0801,12.5751, -26.3009, GlobalZOffset , 6000, strange,Cluster[5],29.38,28.73,4.95);
321 ClusterPlacer(8.421,20.8241, -19.8857, GlobalZOffset , 7000, strange,Cluster[6],180+157.98,48.5,0);
322 ClusterPlacer(17.9414,10.7963, -21.4836, GlobalZOffset , 8000, strange,Cluster[7],180+121.04,44.29,180-4.95);
323 ClusterPlacer(24.3173,0, -17.5689, GlobalZOffset , 9000, strange,Cluster[8],180+90,54.51,0);
324 ClusterPlacer(17.9414,-10.7963, -21.4836, GlobalZOffset , 10000, strange,Cluster[9],180+180-121.04,44.29,180+4.95);
325 ClusterPlacer(8.421,-20.8241, -19.8857, GlobalZOffset , 11000, strange,Cluster[10],180+180-157.98,48.5,0);
327 ClusterPlacer(-8.421,-20.8241, -19.8857, GlobalZOffset , 12000, strange,Cluster[11],+157.98,48.5,180);
328 ClusterPlacer(-17.9414,-10.7963, -21.4836, GlobalZOffset , 13000, strange,Cluster[12],+121.04,44.29,-4.95);
329 ClusterPlacer(-24.3173,0, -17.5689, GlobalZOffset , 14000, strange,Cluster[13],+90,54.51,180);
330 ClusterPlacer(-17.9414,10.7963, -21.4836, GlobalZOffset , 15000, strange,Cluster[14],+180-121.04,44.29,4.95);
331 ClusterPlacer(-8.421,20.8241, -19.8857, GlobalZOffset , 16000, strange,Cluster[15],+180-157.98,48.5,180);
333 top->AddNode(strange,0);
334 geom->CloseGeometry();
338 strange->Draw(
"ogl");
339 geom->CheckOverlaps(0.0000000001,option=
"d");
340 geom->PrintOverlaps();
341 cout <<
"Anzahl der Objekte: "<< ObjektNr << endl;
TGeoManager * gGeoManager
FairGeoBuilder * geobuild
void ClusterPlacer(double x, double y, double z, double GlobalZOffset, int ObjectNo, TGeoVolume *top, TGeoVolume *Clusterr, double phi, double theta, double psi)
FairGeoInterface * geoFace