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()