15 const Int_t kNofDisks = 1;
17 const Double_t kDiskVolInnerRadius[kNofDisks] = { 4.50 };
18 const Double_t kDiskVolOuterRadius[kNofDisks] = { 74.0 };
19 const Double_t kDiskZPosition [kNofDisks] = { 188.50 };
22 const Int_t kDiskNFoils [kNofDisks] = { 4 };
23 const Double_t kMiddleROBarHfTh[kNofDisks] = { 2.35 };
24 const Double_t kHalfStationThickness = 6.00;
26 const Double_t carbonRingInnerRadius[kNofDisks] = { 69.0 };
27 const Double_t carbonRingOuterRadius[kNofDisks] = { 69.2 };
28 const Double_t carbonRingHalfThickness = 1.5;
30 const Double_t copperRingInnerRadius[kNofDisks] = { 68.9 };
31 const Double_t copperRingOuterRadius[kNofDisks] = { 69.1 };
32 const Double_t copperRingHalfThickness = 3.75;
34 const Double_t AlRingInnerRadius[kNofDisks] = { 69.1 };
35 const Double_t AlRingOuterRadius[kNofDisks] = { 73.7 };
36 const Double_t AlRingHalfThickness = 3.75;
38 const Double_t SegmentHalfThickness = 0.25;
39 const Int_t NofSegments = 24;
41 const Double_t FirstSegmentAngle = 7.5;
42 const TString newsegment [NofSegments] = {
"seg1" ,
"seg2" ,
"seg3" ,
"seg4" ,
"seg5" ,
"seg6" ,
"seg7" ,
"seg8" ,
43 "seg9" ,
"seg10",
"seg11",
"seg12",
"seg13",
"seg14",
"seg15",
"seg16",
44 "seg17",
"seg18",
"seg19",
"seg20",
"seg21",
"seg22",
"seg23",
"seg24" };
46 const Double_t moduleRingInnerRadius[kNofDisks] = { 69.15 };
47 const Double_t moduleRingOuterRadius[kNofDisks] = { 73.65 };
48 const Double_t moduleRingHalfThickness = 3.75;
50 const Double_t moduleSegmentHalfThickness = 1.30;
51 const Int_t NofmoduleSegments = 24;
53 const Double_t FirstmoduleSegmentAngle = 0.0 ;
54 const TString newmodulesegment [NofmoduleSegments] = {
"moduleseg1" ,
"moduleseg2" ,
"moduleseg3" ,
"moduleseg4" ,
"moduleseg5" ,
"moduleseg6" ,
"moduleseg7" ,
"moduleseg8" ,
55 "moduleseg9" ,
"moduleseg10",
"moduleseg11",
"moduleseg12",
"moduleseg13",
"moduleseg14",
"moduleseg15",
"moduleseg16",
56 "moduleseg17",
"moduleseg18",
"moduleseg19",
"moduleseg20",
"moduleseg21",
"moduleseg22",
"moduleseg23",
"moduleseg24" };
58 const Double_t AlumiRingInnerRadius[kNofDisks] = { 73.7 };
59 const Double_t AlumiRingOuterRadius[kNofDisks] = { 74.0 };
60 const Double_t AlumiRingHalfThickness = 3.75;
62 const Double_t coverRingInnerRadius[kNofDisks] = { 68.9 };
63 const Double_t coverRingOuterRadius[kNofDisks] = { 74.0 };
64 const Double_t coverRingHalfThickness = 0.2;
67 const Int_t kNofLayers = 47;
68 const TString kLayerName [kNofLayers] = {
"window_foil_out_aluminium",
"WindowF_kapton",
70 "WindowF_aluminium",
"CathodeF_kapton",
"CathodeF_aluminium",
72 "Gem1_Sensor_GEMmixture",
74 "Gem1F_copper",
"Gem1_kapton",
"Gem1B_copper",
76 "Gem2F_copper",
"Gem2_kapton",
"Gem2B_copper",
78 "Gem3F_copper",
"Gem3_kapton",
"Gem3B_copper",
81 "PadF_copper",
"Pad_kapton",
"PadB_copper",
84 "Gem4F_copper",
"Gem4_kapton",
"Gem4B_copper",
86 "Gem5F_copper",
"Gem5_kapton",
"Gem5B_copper",
88 "Gem6F_copper",
"Gem6_kapton",
"Gem6B_copper",
90 "Gem6_Sensor_GEMmixture",
92 "CathodeB_aluminium",
"CathodeB_kapton",
"WindowB_aluminium",
94 "WindowB_kapton",
"window_foil_in_aluminium" };
95 const Double_t kLayerThick[kNofLayers] = { 0.0001, 0.0007,
97 0.0001, 0.0007, 0.0001,
101 0.0005, 0.0050, 0.0005,
103 0.0005, 0.0050, 0.0005,
105 0.0005, 0.0050, 0.0005,
111 0.0005, 0.0050, 0.0005,
113 0.0005, 0.0050, 0.0005,
115 0.0005, 0.0050, 0.0005,
119 0.0001, 0.0007, 0.0001,
122 const Double_t kDiskOuterRadius[kNofLayers][kNofDisks] = { 67.95, 68.40,
149 const Double_t kDiskInnerRadius[kNofLayers][kNofDisks] = { 4.50, 4.50,
182 const Int_t NofHLayers = 14;
183 const TString HLayersName [NofHLayers] = {
"windowF_ring_carbon",
184 "cathodeF_ring_GlassFiber",
185 "gem_ring1_GlassFiber",
186 "gem_ring2_GlassFiber",
187 "gem_ring3_GlassFiber",
188 "gem_ring4_GlassFiber",
189 "padplaneF_support_GlassFiber",
190 "padplaneB_support_GlassFiber",
191 "gem_ring5_GlassFiber",
192 "gem_ring6_GlassFiber",
193 "gem_ring7_GlassFiber",
194 "gem_ring8_GlassFiber",
195 "cathodeB_ring_GlassFiber",
196 "windowB_ring_carbon" };
197 const Double_t HLayersThick[NofHLayers] = { 1.00,
211 const Double_t HZPosition[NofHLayers][kNofDisks] = { -1.9426,
225 const Double_t HOuterRadius[NofHLayers][kNofDisks] = { 68.90,
239 const Double_t HInnerRadius[NofHLayers][kNofDisks] = { 68.65,
260 const Double_t HTY[NofHLayers][kNofDisks] = { 45.0,
275 const Int_t kSensorStripType [2] = { 3 , 2 };
277 const Double_t kSensorStripAngle[2][2] = { 0. , 0. , 0. , 0. };
278 const Double_t kSensorStripPitch[2][2] = { 0.04, 0.04, 0.04, 0.04};
282 for ( Int_t ilayer = 0 ; ilayer < kNofLayers ; ilayer++ ) {
283 cout << kLayerName[ilayer].Data() <<
" -> " << kLayerThick[ilayer] << endl;
284 firstLayerOffset += kLayerThick[ilayer];
287 cout <<
"total thickness is " << firstLayerOffset << endl;
288 firstLayerOffset = firstLayerOffset/2.;
289 firstLayerOffset = -0.001*(TMath::Floor(1000.*firstLayerOffset));
290 cout <<
"first layer offset is " << firstLayerOffset << endl;
293 TString vmcWorkdir = getenv(
"VMCWORKDIR");
295 TString outfile=
"../../geometry/gem_1Station_last_realistic_v1.root";
297 TFile*
fi =
new TFile(outfile,
"RECREATE");
299 cout <<
"created output file" << endl;
300 FairGeoLoader*
geoLoad =
new FairGeoLoader(
"TGeo",
"FairGeoLoader");
301 FairGeoInterface *
geoFace = geoLoad->getGeoInterface();
302 cout <<
"geoface setmediafile" << endl;
303 geoFace->setMediaFile(
"../../geometry/media_pnd.geo");
304 cout <<
"geoface readmedia" << endl;
305 geoFace->readMedia();
306 cout <<
"geoface print" << endl;
308 cout <<
"geoface done" << endl;
310 FairGeoMedia *
Media = geoFace->getMedia();
311 FairGeoBuilder *
geobuild=geoLoad->getGeoBuilder();
317 FairGeoMedium *CbmMediumCopper = Media->getMedium(
"copper");
318 FairGeoMedium *CbmMediumKapton = Media->getMedium(
"kapton");
319 FairGeoMedium *CbmMediumArCO2 = Media->getMedium(
"GEMmixture");
320 FairGeoMedium *CbmMediumUranium = Media->getMedium(
"uranium");
321 FairGeoMedium *CbmMediumGlassFiber= Media->getMedium(
"GlassFiber");
323 Int_t
nmed=geobuild->createMedium(CbmMediumAir);
324 nmed=geobuild->createMedium(CbmMediumPWO);
325 nmed=geobuild->createMedium(CbmMediumCarbon);
326 nmed=geobuild->createMedium(CbmMediumAluminium);
327 nmed=geobuild->createMedium(CbmMediumCopper);
328 nmed=geobuild->createMedium(CbmMediumKapton);
329 nmed=geobuild->createMedium(CbmMediumArCO2);
330 nmed=geobuild->createMedium(CbmMediumUranium);
331 nmed=geobuild->createMedium(CbmMediumGlassFiber);
334 TGeoManager*
gGeoMan = (TGeoManager*)gROOT->FindObject(
"FAIRGeom");
336 TGeoVolume *
top =
new TGeoVolumeAssembly(
"Gem");
338 gGeoMan->SetTopVolume(top);
340 cout <<
"-------------------------------------------------------------------" << endl;
341 TList* mediaList = (TList*)gGeoMan->GetListOfMedia();
342 cout <<
"media known: " << mediaList->GetEntries() <<
"." << endl;
343 for ( Int_t itemp = 0 ; itemp < mediaList->GetEntries() ; itemp++ ) {
344 TGeoMedium*
medium = (TGeoMedium*)mediaList->At(itemp);
345 cout <<
"medium " << itemp <<
" name is " << medium->GetName() << endl;
347 cout <<
"-------------------------------------------------------------------" << endl;
349 TGeoRotation*
dummyrot =
new TGeoRotation();
351 TGeoVolumeAssembly*
SubunitVol =
new TGeoVolumeAssembly(
"Gem_Disks");
354 TGeoShape *DiskShape[kNofDisks];
355 TGeoVolume *DiskVol [kNofDisks];
356 TGeoTranslation *DiskTrans[kNofDisks];
357 TGeoCombiTrans *DiskCombi[kNofDisks];
359 TGeoShape *carbonRingShape[kNofDisks];
360 TGeoVolume *carbonRingVol [kNofDisks];
361 TGeoTranslation *carbonRingTrans[kNofDisks];
362 TGeoCombiTrans *carbonRingCombi[kNofDisks];
364 TGeoShape *copperRingShape[kNofDisks];
365 TGeoVolume *copperRingVol [kNofDisks];
366 TGeoTranslation *copperRingTrans[kNofDisks];
367 TGeoCombiTrans *copperRingCombi[kNofDisks];
369 TGeoShape *coverRingShape[kNofDisks];
370 TGeoVolume *coverRingVol [kNofDisks];
371 TGeoTranslation *coverRingTrans[kNofDisks];
372 TGeoCombiTrans *coverRingCombi[kNofDisks];
374 TGeoShape *AlRingShape[kNofDisks][NofSegments];
375 TGeoVolume *AlRingVol [kNofDisks][NofSegments];
376 TGeoTranslation *AlRingTrans[kNofDisks][NofSegments];
377 TGeoCombiTrans *AlRingCombi[kNofDisks][NofSegments];
379 TGeoShape *moduleRingShape[kNofDisks][NofmoduleSegments];
380 TGeoVolume *moduleRingVol [kNofDisks][NofmoduleSegments];
381 TGeoTranslation *moduleRingTrans[kNofDisks][NofmoduleSegments];
382 TGeoCombiTrans *moduleRingCombi[kNofDisks][NofmoduleSegments];
384 TGeoShape *AlumiRingShape[kNofDisks];
385 TGeoVolume *AlumiRingVol [kNofDisks];
386 TGeoTranslation *AlumiRingTrans[kNofDisks];
387 TGeoCombiTrans *AlumiRingCombi[kNofDisks];
389 TGeoShape *DiskLayersShapeA [kNofLayers][kNofDisks][4];
390 TGeoShape *DiskLayersShapeB [kNofLayers][kNofDisks][4];
391 TGeoSubtraction *DiskLayersSubtr [kNofLayers][kNofDisks][4];
392 TGeoShape *DiskLayersShapeC [kNofLayers][kNofDisks][4];
393 TGeoShape *DiskLayersShapeHole [kNofLayers][kNofDisks][4];
394 TGeoCompositeShape *DiskLayersShapecompos[kNofLayers][kNofDisks][4];
395 TGeoVolume *DiskLayersVol [kNofLayers][kNofDisks][4];
396 TGeoTranslation *DiskLayersTranshA [kNofLayers][kNofDisks][4];
397 TGeoTranslation *DiskLayersTranshB [kNofLayers][kNofDisks][4];
398 TGeoTranslation *DiskLayersTrans [kNofLayers][kNofDisks][4];
399 TGeoCombiTrans *DiskLayersCombi [kNofLayers][kNofDisks][4];
401 TGeoShape *HLayersShapeTube [NofHLayers][kNofDisks];
402 TGeoShape *HLayersShapeBox [NofHLayers][kNofDisks];
403 TGeoShape *HLayersShapePlate [NofHLayers][kNofDisks];
404 TGeoShape *HLayersShapeHT [NofHLayers][kNofDisks];
405 TGeoShape *HLayersShapeHTM [NofHLayers][kNofDisks];
406 TGeoShape *HLayersShapeHTD [NofHLayers][kNofDisks];
407 TGeoCompositeShape *HLayersShapecompos[NofHLayers][kNofDisks];
408 TGeoVolume *HLayersVolcomp [NofHLayers][kNofDisks];
409 TGeoTranslation *HLayersTranstA [NofHLayers][kNofDisks];
410 TGeoTranslation *HLayersTranstB [NofHLayers][kNofDisks];
411 TGeoTranslation *HLayersTranstC [NofHLayers][kNofDisks];
412 TGeoTranslation *HLayersTranstD [NofHLayers][kNofDisks];
413 TGeoTranslation *HLayersTranstE [NofHLayers][kNofDisks];
414 TGeoTranslation *HLayersTranstF [NofHLayers][kNofDisks];
415 TGeoRotation *HLayersRotrA [NofHLayers][kNofDisks];
416 TGeoShape *HLayersShape [NofHLayers][kNofDisks];
417 TGeoVolume *HLayersVol [NofHLayers][kNofDisks];
418 TGeoTranslation *HLayersTrans [NofHLayers][kNofDisks];
419 TGeoCombiTrans *HLayersCombi [NofHLayers][kNofDisks];
421 TString outParFileName = Form(
"%s/macro/params/gem_1Station_last_realistic_v1.digi.par",vmcWorkdir.Data());
423 cout <<
"parameter file = \"" << outParFileName.Data() <<
"\"" << endl;
425 ofstream pout(outParFileName.Data());
426 pout.setf(ios::fixed);
428 pout <<
"#################################################################" << endl;
429 pout <<
"# Digitization parameters for GEM " << endl;
430 pout <<
"# with 1 Station " << endl;
431 pout <<
"# Format: " << endl;
432 pout <<
"# Description of parameters: " << endl;
433 pout <<
"# [PndGemDetectors] " << endl;
434 pout <<
"# parameters:d station_number, ZPos, rotation_angle, number_of_sensors, \\" << endl;
435 pout <<
"# sensor_number, sensor_type, pos_x, pos_y, pos_z, rotAngle, inn_rad, out_rad, thick, str_ang_0, str_ang_1, barWidth, pitch_0, pitch_1, \\" << endl;
436 pout <<
"# sensor_number, ...." << endl;
437 pout <<
"# station_number, ..." << endl;
438 pout <<
"#################################################################" << endl;
439 pout <<
"[PndGemDetectors]" << setprecision(4) << endl;
441 pout <<
"parameters:Double_t \\" << endl;
443 for ( Int_t istat = 0 ; istat < kNofDisks ; istat++ ) {
445 pout <<
" " << istat+1 <<
", "
446 << setw(9) << kDiskZPosition[istat]
447 <<
", 0.0, " << 2 <<
", \\" << endl;
449 DiskShape[istat] =
new TGeoTube (Form(
"disk%dshape",istat+1),kDiskVolInnerRadius[istat],kDiskVolOuterRadius[istat],kHalfStationThickness);
450 DiskVol [istat] =
new TGeoVolume(Form(
"Gem_Disk%d_Volume",istat+1),DiskShape[istat],gGeoMan->GetMedium(
"GEMmixture"));
451 DiskTrans[istat] =
new TGeoTranslation(0.,0.,kDiskZPosition[istat]);
452 cout <<
"station " << kDiskVolInnerRadius[istat] <<
" " << kDiskVolOuterRadius[istat] <<
" at " << kDiskZPosition[istat] << endl;
453 DiskCombi[istat] =
new TGeoCombiTrans(*DiskTrans[istat],*dummyrot);
454 DiskCombi[istat]->SetName(Form(
"Gem_Disk%d_Volume",istat+1));
455 DiskCombi[istat]->RegisterYourself();
456 DiskVol[istat]->SetLineColor(kYellow);
459 carbonRingShape[istat] =
new TGeoTube (Form(
"carbonRing%dshape",istat+1),carbonRingInnerRadius[istat],carbonRingOuterRadius[istat],carbonRingHalfThickness);
460 carbonRingVol [istat] =
new TGeoVolume(Form(
"Gem_carbonRing%d_Volume",istat+1),carbonRingShape[istat],gGeoMan->GetMedium(
"carbon"));
461 carbonRingTrans[istat] =
new TGeoTranslation(0.,0.,-1.5);
462 cout <<
"carbonRing " << carbonRingInnerRadius[istat] <<
" " << carbonRingOuterRadius[istat] << endl;
463 carbonRingCombi[istat] =
new TGeoCombiTrans(*carbonRingTrans[istat],*dummyrot);
464 carbonRingCombi[istat]->SetName(Form(
"Gem_carbonRing%d_Volume",istat+1));
465 carbonRingCombi[istat]->RegisterYourself();
466 carbonRingVol[istat]->SetLineColor(kMagenta);
468 DiskVol[istat]->AddNode(carbonRingVol [istat],0,carbonRingCombi[istat]);
471 copperRingShape[istat] =
new TGeoTube (Form(
"copperRing%dshape",istat+1),copperRingInnerRadius[istat],copperRingOuterRadius[istat],copperRingHalfThickness);
472 copperRingVol [istat] =
new TGeoVolume(Form(
"Gem_copperRing%d_Volume",istat+1),copperRingShape[istat],gGeoMan->GetMedium(
"copper"));
473 copperRingTrans[istat] =
new TGeoTranslation(0.,0.,3.75);
474 cout <<
"copperRing " << copperRingInnerRadius[istat] <<
" " << copperRingOuterRadius[istat] << endl;
475 copperRingCombi[istat] =
new TGeoCombiTrans(*copperRingTrans[istat],*dummyrot);
476 copperRingCombi[istat]->SetName(Form(
"Gem_copperRing%d_Volume",istat+1));
477 copperRingCombi[istat]->RegisterYourself();
478 copperRingVol[istat]->SetLineColor(kYellow-5);
480 DiskVol[istat]->AddNode(copperRingVol [istat],0,copperRingCombi[istat]);
483 Double_t segmentAngularSize = SegmentHalfThickness/AlRingInnerRadius[istat]*360.;
484 for ( Int_t isegm = 0 ; isegm < NofSegments ; isegm++ ) {
485 cout <<
" Segment " << isegm <<
" with name " << newsegment[isegm] <<
" will be put at " << FirstSegmentAngle+isegm*SegmentDeltaAngle <<
" (in fact from " << FirstSegmentAngle+isegm*SegmentDeltaAngle-segmentAngularSize/2. <<
" to " << FirstSegmentAngle+isegm*SegmentDeltaAngle+segmentAngularSize/2. <<
")" << endl;
486 AlRingShape[istat][isegm] =
new TGeoTubeSeg (Form(
"AlRing%dshape",istat+1,isegm+1),AlRingInnerRadius[istat],AlRingOuterRadius[istat],AlRingHalfThickness,FirstSegmentAngle+isegm*SegmentDeltaAngle-segmentAngularSize/2.,FirstSegmentAngle+isegm*SegmentDeltaAngle+segmentAngularSize/2. );
487 AlRingVol[istat][isegm] =
new TGeoVolume (Form(
"Gem_AlRing%d_Volume",istat+1,isegm+1),AlRingShape[istat][isegm],gGeoMan->GetMedium(
"aluminium"));
488 AlRingTrans[istat][isegm] =
new TGeoTranslation (0.,0.,3.75);
489 cout <<
"AlRing " << AlRingInnerRadius[istat] <<
" " << AlRingOuterRadius[istat] << endl;
490 AlRingCombi[istat][isegm] =
new TGeoCombiTrans (*AlRingTrans[istat][isegm],*dummyrot);
491 AlRingCombi[istat][isegm]->SetName(Form(
"Gem_AlRing%d_Volume",istat+1,isegm+1));
492 AlRingCombi[istat][isegm]->RegisterYourself();
493 AlRingVol[istat][isegm]->SetLineColor(kCyan-9);
495 DiskVol[istat]->AddNode(AlRingVol[istat][isegm],0,AlRingCombi[istat][isegm]);
500 Double_t modulesegmentAngularSize = moduleSegmentHalfThickness/moduleRingInnerRadius[istat]*360.;
501 for ( Int_t imodulesegm = 0 ; imodulesegm < NofmoduleSegments ; imodulesegm++ ) {
502 cout <<
" moduleSegment " << imodulesegm <<
" with name " << newmodulesegment[imodulesegm] <<
" will be put at " << FirstmoduleSegmentAngle+imodulesegm*moduleSegmentDeltaAngle <<
" (in fact from " << FirstmoduleSegmentAngle+imodulesegm*moduleSegmentDeltaAngle-modulesegmentAngularSize/2. <<
" to " << FirstmoduleSegmentAngle+imodulesegm*moduleSegmentDeltaAngle+modulesegmentAngularSize/2. <<
")" << endl;
503 moduleRingShape[istat][imodulesegm] =
new TGeoTubeSeg (Form(
"moduleRing%dshape",istat+1,imodulesegm+1),moduleRingInnerRadius[istat],moduleRingOuterRadius[istat],moduleRingHalfThickness,FirstmoduleSegmentAngle+imodulesegm*moduleSegmentDeltaAngle-modulesegmentAngularSize/2.,FirstmoduleSegmentAngle+imodulesegm*moduleSegmentDeltaAngle+modulesegmentAngularSize/2. );
504 moduleRingVol[istat][imodulesegm] =
new TGeoVolume (Form(
"Gem_moduleRing%d_Volume",istat+1,imodulesegm+1),moduleRingShape[istat][imodulesegm],gGeoMan->GetMedium(
"copper"));
505 moduleRingTrans[istat][imodulesegm] =
new TGeoTranslation (0.,0.,3.65);
506 cout <<
"moduleRing " << moduleRingInnerRadius[istat] <<
" " << moduleRingOuterRadius[istat] << endl;
507 moduleRingCombi[istat][imodulesegm] =
new TGeoCombiTrans (*moduleRingTrans[istat][imodulesegm],*dummyrot);
508 moduleRingCombi[istat][imodulesegm]->SetName(Form(
"Gem_moduleRing%d_Volume",istat+1,imodulesegm+1));
509 moduleRingCombi[istat][imodulesegm]->RegisterYourself();
510 moduleRingVol[istat][imodulesegm]->SetLineColor(kGreen);
512 DiskVol[istat]->AddNode(moduleRingVol[istat][imodulesegm],0,moduleRingCombi[istat][imodulesegm]);
516 AlumiRingShape[istat] =
new TGeoTube (Form(
"AlumiRing%dshape",istat+1),AlumiRingInnerRadius[istat],AlumiRingOuterRadius[istat],AlumiRingHalfThickness);
517 AlumiRingVol [istat] =
new TGeoVolume(Form(
"Gem_AlumiRing%d_Volume",istat+1),AlumiRingShape[istat],gGeoMan->GetMedium(
"aluminium"));
518 AlumiRingTrans[istat] =
new TGeoTranslation(0.,0.,3.75);
519 cout <<
"AlumiRing " << AlumiRingInnerRadius[istat] <<
" " << AlumiRingOuterRadius[istat] << endl;
520 AlumiRingCombi[istat] =
new TGeoCombiTrans(*AlumiRingTrans[istat],*dummyrot);
521 AlumiRingCombi[istat]->SetName(Form(
"Gem_AlumiRing%d_Volume",istat+1));
522 AlumiRingCombi[istat]->RegisterYourself();
523 AlumiRingVol[istat]->SetLineColor(kCyan-9);
525 DiskVol[istat]->AddNode(AlumiRingVol[istat],0,AlumiRingCombi[istat]);
528 coverRingShape[istat] =
new TGeoTube (Form(
"coverRing%dshape",istat+1),coverRingInnerRadius[istat],coverRingOuterRadius[istat],coverRingHalfThickness);
529 coverRingVol [istat] =
new TGeoVolume(Form(
"Gem_coverRing%d_Volume",istat+1),coverRingShape[istat],gGeoMan->GetMedium(
"GlassFiber"));
530 coverRingTrans[istat] =
new TGeoTranslation(0.,0.,7.75);
531 cout <<
"coverRing " << coverRingInnerRadius[istat] <<
" " << coverRingOuterRadius[istat] << endl;
532 coverRingCombi[istat] =
new TGeoCombiTrans(*coverRingTrans[istat],*dummyrot);
533 coverRingCombi[istat]->SetName(Form(
"Gem_coverRing%d_Volume",istat+1));
534 coverRingCombi[istat]->RegisterYourself();
535 coverRingVol[istat]->SetLineColor(kGreen+3);
537 DiskVol[istat]->AddNode(coverRingVol [istat],0,coverRingCombi[istat]);
540 for ( Int_t jlay = 0 ; jlay < NofHLayers ; jlay++ ) {
541 cout <<
"doing Hlayers " << jlay << endl;
543 HLayersShapeTube[jlay][istat] =
new TGeoTube (Form(
"T%dT%s",istat+1,HLayersName[jlay].Data()),HInnerRadius[jlay][istat],HOuterRadius[jlay][istat],HLayersThick[jlay]);
544 HLayersShapeHT[jlay][istat] =
new TGeoTube (Form(
"H%dH%s",istat+1,HLayersName[jlay].Data()),0.0,4.60,HLayersThick[jlay]);
545 HLayersShapeHTM[jlay][istat] =
new TGeoTube (Form(
"HTM%dHTM%s",istat+1,HLayersName[jlay].Data()),0.0,4.40,HLayersThick[jlay]+0.0002);
546 HLayersShapeHTD[jlay][istat] =
new TGeoTube (Form(
"HTD%dHTD%s",istat+1,HLayersName[jlay].Data()),0.0,1.90,HLayersThick[jlay]+0.0001);
547 cout <<
"Tube name is " << HLayersShapeTube[jlay][istat]->GetName() << endl;
549 HLayersShapeBox[jlay][istat] =
new TGeoBBox(Form(
"B%dB%s",istat+1,HLayersName[jlay].Data()),HXBoxWidth[jlay][istat],HOuterRadius[jlay][istat],HLayersThick[jlay]);
550 HLayersShapePlate[jlay][istat] =
new TGeoBBox(Form(
"P%dP%s",istat+1,HLayersName[jlay].Data()),HXPlateWidth[jlay][istat],HYPlateWidth[jlay][istat],HLayersThick[jlay]+0.0001);
552 HLayersTranstA[jlay][istat] =
new TGeoTranslation(
"tA",HTX,HTY[jlay][istat],HTZ);
553 HLayersTranstA[jlay][istat] ->RegisterYourself();
554 HLayersTranstB[jlay][istat] =
new TGeoTranslation(
"tB",HTX,-HTY[jlay][istat],HTZ);
555 HLayersTranstB[jlay][istat] ->RegisterYourself();
556 HLayersTranstC[jlay][istat] =
new TGeoTranslation(
"tC",HTX,HTY[jlay][istat]+9.0,HTZ);
557 HLayersTranstC[jlay][istat] ->RegisterYourself();
558 HLayersTranstD[jlay][istat] =
new TGeoTranslation(
"tD",HTX,HTY[jlay][istat]-9.0,HTZ);
559 HLayersTranstD[jlay][istat] ->RegisterYourself();
560 HLayersTranstE[jlay][istat] =
new TGeoTranslation(
"tE",HTX,-HTY[jlay][istat]+9.0,HTZ);
561 HLayersTranstE[jlay][istat] ->RegisterYourself();
562 HLayersTranstF[jlay][istat] =
new TGeoTranslation(
"tF",HTX,-HTY[jlay][istat]-9.0,HTZ);
563 HLayersTranstF[jlay][istat] ->RegisterYourself();
565 HLayersShapecompos[jlay][istat] =
new TGeoCompositeShape(Form(
"compos%dcompos%s",istat+1,HLayersName[jlay].Data()),
566 Form(
"T%dT%s+B%dB%s+H%dH%s-HTM%dHTM%s-(P%dP%s:tA)-(HTD%dHTD%s:tC)-(HTD%dHTD%s:tD)-(P%dP%s:tB)-(HTD%dHTD%s:tE)-(HTD%dHTD%s:tF)",
567 istat+1,HLayersName[jlay].Data(),istat+1,HLayersName[jlay].Data(),istat+1,HLayersName[jlay].Data(),istat+1,HLayersName[jlay].Data(),
568 istat+1,HLayersName[jlay].Data(),istat+1,HLayersName[jlay].Data(),istat+1,HLayersName[jlay].Data(),istat+1,HLayersName[jlay].Data(),
569 istat+1,HLayersName[jlay].Data(),istat+1,HLayersName[jlay].Data()));
571 cout <<
"composite name is " << HLayersShapecompos[jlay][istat] -> GetName() << endl;
573 TString HlayersMaterial = HLayersName[jlay].Data();
574 HlayersMaterial.Remove(0,HlayersMaterial.Last(
'_')+1);
575 cout <<
"THE HMATERIAL IS \"" << HlayersMaterial.Data() <<
"\"" << endl;
576 HLayersVolcomp[jlay][istat] =
new TGeoVolume(Form(
"GEMHLayersCOMP%dGEMHLayersCOMP%s",istat+1,HLayersName[jlay].Data()),HLayersShapecompos[jlay][istat],gGeoMan->GetMedium(HlayersMaterial.Data()));
577 cout <<
"COMP name is " << HLayersVolcomp[jlay][istat] -> GetName() << endl;
578 cout <<
"Hlayersmaterial = " << HlayersMaterial.Data() << endl;
580 if ( HlayersMaterial.Contains(
"carbon" ) )
582 if ( HlayersMaterial.Contains(
"GlassFiber" ) )
585 cout <<
"STATION " << istat <<
" LAYER " << jlay <<
" POSITION " << HZPosition[jlay][istat] << endl;
587 HLayersTrans[jlay][istat] =
new TGeoTranslation(0.0,0.0,HZPosition[jlay][istat]);
588 HLayersCombi[jlay][istat] =
new TGeoCombiTrans(*HLayersTrans[jlay][istat],*dummyrot);
589 HLayersCombi[jlay][istat]->SetName(Form(
"GEMHLayersCOMP%dGEMHLayersCOMP%s",istat+1,HLayersName[jlay].Data()));
590 HLayersCombi[jlay][istat]->RegisterYourself();
591 DiskVol[istat]->AddNode( HLayersVolcomp[jlay][istat],0,HLayersCombi[jlay][istat] );
595 Double_t layerPosition = firstLayerOffset;
597 Int_t sensorNumber = 0;
599 for ( Int_t ilay = 0 ; ilay < kNofLayers ; ilay++ ) {
600 cout <<
"doing layer " << ilay << endl;
601 layerPosition += kLayerThick[ilay]/2.;
602 if ( kLayerName[ilay].Contains(
"space") && kLayerThick[ilay] > 0.7 ) {
603 cout <<
"***** THE THICK SPACE LAYER IS AT " << layerPosition << endl;
605 if ( kLayerName[ilay].Contains(
"space") && kLayerName[ilay].Length() == 5 ) {
606 layerPosition += kLayerThick[ilay]/2.;
610 cout <<
" HAHA, got layer " << kLayerName[ilay].Data() << endl;
614 cout <<
"will do loop over segments" << endl;
615 for ( Int_t iseg = 0 ; iseg < 1 ; iseg++ ) {
616 cout <<
"segment " << iseg << endl;
617 DiskLayersShapeA[ilay][istat][iseg] =
new TGeoTube(Form(
"disk%dseg%d%sshape",istat+1,iseg+1,kLayerName[ilay].Data()),
618 kDiskInnerRadius[ilay][istat],kDiskOuterRadius[ilay][istat],
619 kLayerThick[ilay]/2.);
620 DiskLayersShapeB[ilay][istat][iseg] =
new TGeoBBox (Form(
"robo%dseg%d%sshape",istat+1,iseg+1,kLayerName[ilay].Data()),
621 kMiddleROBarHfTh[istat]/2.,
622 kDiskOuterRadius[ilay][istat],
624 DiskLayersSubtr[ilay][istat][iseg] =
new TGeoSubtraction(DiskLayersShapeA[ilay][istat][iseg],
625 DiskLayersShapeB[ilay][istat][iseg]);
628 DiskLayersShapeC[ilay][istat][iseg] =
new TGeoCompositeShape(Form(
"comp%dseg%d%sshape",istat+1,iseg+1,kLayerName[ilay].Data()),
629 DiskLayersSubtr[ilay][istat][iseg]);
630 segBegin += segPhiSpan;
631 cout <<
" segBegin " << segBegin << endl;
633 DiskLayersShapeHole[ilay][istat][iseg] =
new TGeoTube(Form(
"Hole%dseg%d%sshape",istat+1,iseg+1,kLayerName[ilay].Data()),0.0,3.80,kLayerThick[ilay]+0.001);
635 DiskLayersTranshA[ilay][istat][iseg] =
new TGeoTranslation(
"hA",HoleTX,HoleTY,HoleTZ);
636 DiskLayersTranshA[ilay][istat][iseg] ->RegisterYourself();
637 DiskLayersTranshB[ilay][istat][iseg] =
new TGeoTranslation(
"hB",HoleTX,-HoleTY,HoleTZ);
638 DiskLayersTranshB[ilay][istat][iseg] ->RegisterYourself();
640 DiskLayersShapecompos[ilay][istat][iseg] =
new TGeoCompositeShape(Form(
"compos%dseg%d%sshape",istat+1,iseg+1,kLayerName[ilay].Data()),
641 Form(
"comp%dseg%d%sshape-(Hole%dseg%d%sshape:hA)-(Hole%dseg%d%sshape:hB)",
642 istat+1,iseg+1,kLayerName[ilay].Data(),istat+1,iseg+1,kLayerName[ilay].Data(),istat+1,iseg+1,kLayerName[ilay].Data()));
645 TString layerMaterial = kLayerName[ilay].Data();
646 layerMaterial.Remove(0,layerMaterial.Last(
'_')+1);
647 cout <<
"THE MATERIAL IS \"" << layerMaterial.Data() <<
"\"" << endl;
648 DiskLayersVol[ilay][istat][iseg] =
new TGeoVolume(Form(
"Gem_Disk%d_Seg%d_%s",istat+1,iseg+1,kLayerName[ilay].Data()),
649 DiskLayersShapecompos[ilay][istat][iseg],
650 gGeoMan->GetMedium(layerMaterial.Data()));
653 cout <<
"layer material = " << layerMaterial.Data() << endl;
654 if ( layerMaterial.Contains(
"air" ) )
655 DiskLayersVol[ilay][istat][iseg]->
SetLineColor(kGray+1);
656 if ( layerMaterial.Contains(
"copper" ) )
657 DiskLayersVol[ilay][istat][iseg]->
SetLineColor(kOrange+1);
658 if ( layerMaterial.Contains(
"kapton" ) )
659 DiskLayersVol[ilay][istat][iseg]->
SetLineColor(kOrange+2);
660 if ( layerMaterial.Contains(
"aluminium" ) )
661 DiskLayersVol[ilay][istat][iseg]->
SetLineColor(kCyan-9);
662 if ( layerMaterial.Contains(
"GEMmixture" ) )
663 DiskLayersVol[ilay][istat][iseg]->
SetLineColor(kYellow);
664 if ( layerMaterial.Contains(
"carbon" ) )
666 if ( layerMaterial.Contains(
"GlassFiber" ) )
667 DiskLayersVol[jlay][istat][iseg]->
SetLineColor(kGreen+3);
669 DiskLayersTrans[ilay][istat][iseg] =
new TGeoTranslation(0.,0.,layerPosition);
670 DiskLayersCombi[ilay][istat][iseg] =
new TGeoCombiTrans(*DiskLayersTrans[ilay][istat][iseg],*dummyrot);
671 DiskLayersCombi[ilay][istat][iseg]->SetName(Form(
"Gem_Disk%d_Seg%d_%s",istat+1,iseg+1,kLayerName[ilay].Data()));
672 DiskLayersCombi[ilay][istat][iseg]->RegisterYourself();
673 DiskVol[istat]->AddNode(DiskLayersVol[ilay][istat][iseg],0,DiskLayersCombi[ilay][istat][iseg]);
677 cout <<
"volume " << kLayerName[ilay] <<
" from "
678 << setprecision(10) << kDiskZPosition[istat]+layerPosition-kLayerThick[ilay]/2. <<
" to "
679 << setprecision(10) << kDiskZPosition[istat]+layerPosition+kLayerThick[ilay]/2. << endl;
681 if ( kLayerName[ilay].Contains(
"Gem") && kLayerName[ilay].Contains(
"Sensor") ) {
682 Double_t newRadius = kDiskInnerRadius[ilay][istat];
685 cout <<
"rad = " << kDiskInnerRadius[ilay][istat] <<
" pitch = " << kSensorStripPitch[sensorNumber][0] <<
" for sensor " << sensorNumber << endl;
686 if ( kSensorStripType[sensorNumber] != 2 ) {
687 nofStrips = TMath::Ceil(2.*
TMath::Pi()*kDiskInnerRadius[ilay][istat]/kSensorStripPitch[sensorNumber][0]);
688 newRadius = nofStrips*kSensorStripPitch[sensorNumber][0]/2./
TMath::Pi();
690 cout <<
"!!!! " << istat <<
" " << ilay <<
" > there shall be " << nofStrips <<
" strips here so the radius should be " << newRadius << endl;
691 pout <<
" " << sensorNumber+1 <<
", " << kSensorStripType[sensorNumber] <<
", "
692 << setw(9) << 0. <<
", "
693 << setw(9) << 0. <<
", "
694 << setw(9) << kDiskZPosition[istat]+layerPosition <<
", "
695 << setw(9) << 0. <<
", "
696 << setw(9) << newRadius <<
", "
697 << setw(9) << kDiskOuterRadius[ilay][istat] <<
", "
698 << setw(9) << kLayerThick[ilay] <<
", "
699 << setw(9) << kSensorStripAngle[sensorNumber][0] <<
", "
701 << setw(9) << kMiddleROBarHfTh[istat] <<
", "
702 << setw(9) << kSensorStripPitch[sensorNumber][0] <<
", "
703 << setw(9) << kSensorStripPitch[sensorNumber][1] << ((istat==kNofDisks-1&&sensorNumber==1)?
"":
", \\")
708 layerPosition += kLayerThick[ilay]/2.;
711 SubunitVol->AddNode(DiskVol[istat],0,DiskCombi[istat]);
715 pout <<
"TrackFinderOnHits_ParThetaA: Double_t 59.4" << endl
716 <<
"TrackFinderOnHits_ParThetaB: Double_t -0.02" << endl
717 <<
"TrackFinderOnHits_ParTheta0: Double_t 56.1372" << endl
718 <<
"TrackFinderOnHits_ParTheta1: Double_t -0.000564362" << endl
719 <<
"TrackFinderOnHits_ParTheta2: Double_t -0.181828" << endl
720 <<
"TrackFinderOnHits_ParTheta3: Double_t 0.284289" << endl
721 <<
"TrackFinderOnHits_ParRadPhi0:Double_t 0.9944432" << endl
722 <<
"TrackFinderOnHits_ParRadPhi2:Double_t -0.000590706" << endl
723 <<
"TrackFinderOnHits_ParMat0: Double_t \\" << endl
724 <<
" -2.31333e-6, 0.00067035, 0.10173" << endl
725 <<
"TrackFinderOnHits_ParMat1: Double_t \\" << endl
726 <<
" -7.46844e-10, -6.6696e-7, 0.000736672" << endl
727 <<
"##########################################################################################" << flush;
729 top->AddNode(SubunitVol,0,
new TGeoCombiTrans());
731 gGeoMan->CloseGeometry();
FairGeoMedium * CbmMediumCarbon
FairGeoMedium * CbmMediumAluminium
FairGeoBuilder * geobuild
FairGeoMedium * CbmMediumAir
FairGeoMedium * CbmMediumPWO
FairGeoInterface * geoFace
vDisk SetLineColor(colYellow)
int create1StationsGem_lastStation()