{ Int_t kNofLayersFc; Double_t kFcrad; Double_t kFclen; TString * kLayerNameFc; Double_t * kLayerThickFc; Double_t * kZOffsetFc; // }}} // {{{ Outer Fieldcage Config const Int_t kNofLayersOfc = 3; const Double_t kOfcrad = 30; const Double_t kOfclen = 72.5; const TString kLayerNameOfc[kNofLayersOfc] = {"FcFirst_kapton", "FcFirst_aluminium", "FcSecond_kapton"}; const Double_t kLayerThickOfc[kNofLayersOfc] = { 0.1, // 1 Kapton 0.1, // +1=2 Aluminium 0.1}; // +1=3 Kapton const Double_t kZOffsetOfc[kNofLayersOfc] = { 0., 0., 0.}; // for a more detailed model, for now put 0. // }}} // {{{ Inner Fieldcage Config const Int_t kNofLayersIfc = 3; const Double_t kIfcrad = 10; const Double_t kIfclen = 100.5; const TString kLayerNameIfc[kNofLayersIfc] = {"FcFirst_kapton", "FcFirst_aluminium", "FcSecond_kapton"}; const Double_t kLayerThickIfc[kNofLayersIfc] = { 0.1, // 1 Kapton 0.1, // +1=2 Aluminium 0.11}; // +1=3 Kapton const Double_t kZOffsetIfc[kNofLayersIfc] = { 0., 0., 0.}; // for a more detailed model, for now put 0. // }}} // {{{ Main Stripfoil Config Int_t kNofLayersS; TString * kLayerNameS; Double_t * kLayerThickS; Double_t * kLayerZ; const Double_t kStripPitch = 0.15; // }}} // {{{ Outer Stripfoil Config const Int_t kNofLayersOs = 3; const TString kLayerNameOs[kNofLayersOs] = {"StInner_copper", "StMiddle_kapton", "StOuter_copper"}; const Double_t kLayerThickOs[kNofLayersOs]= {5e-4, // 1 copper 25e-4, // +1=2 kapton 5e-4,}; // +1=3 copper const Double_t kLayerZOs[kNofLayersOs] = {0.05,kOfclen/2,0.05}; // }}} // {{{ Inner Stripfoil Config const Int_t kNofLayersIs = 3; const TString kLayerNameIs[kNofLayersIs] = {"StInner_copper", "StMiddle_kapton", "StOuter_copper"}; const Double_t kLayerThickIs[kNofLayersIs]= {5e-4, // 1 copper 25e-4, // +1=2 kapton 5e-4,}; // +1=3 copper const Double_t kLayerZIs[kNofLayersIs] = {0.05,kIfclen/2,0.05}; // }}} // {{{ DriftCathode Config const Int_t kNofLayersDc = 2; const TString kLayerNameDc[kNofLayersDc] = {"DcFirst_aluminium","DcFirst_kapton"}; const Double_t kLayerThickDc[kNofLayersDc] = { 1 ,2 }; // }}} // {{{ ReadoutFlange Config const Int_t kNofLayersMgf = 4; const Double_t kZoffPadplaneGem = 0.4; const Double_t kRinMgf[kNofLayersMgf] = {25,// media flange 25,// gem flange 11, //padplane copper 11};// padplane const Double_t KRoutMgf[kNofLayersMgf] = {35, // media flange 30,// gem flange 30, //padplane copper 30};//padplane const TString kLayerNameMgf[kNofLayersMgf] = {"MgfMedia_G10","MgfGem_G10","MgfPads_copper","MgfPadplane_G10"}; const Double_t kLayerThickMgf[kNofLayersMgf] = { 5, // media flange 20, // gem flange 1, //padplane copper 2 };//padplane // }}} // {{{ GemFoil Config const Int_t kNofLayersGf = 7; const Double_t kRinGf[kNofLayersGf] = {24, //upper outer g10ring 10, //upper inner g10 ring 11, //upper copper 10, //kapton 11, //lower copper 10, //lower inner g10 ring 24};//lower outer g10 ring const Double_t KRoutGf[kNofLayersGf] = {25, //upper outer g10 ring 11, //upper inner g10 ring 24, //upper copper 25, //kapton 24, //lower copper 11, //lower inner g10 ring 25};//lower outer g10 ring const TString kLayerNameGf[kNofLayersGf] = {"GfUpperOuter_G10", "GfUpperInner_G10", "GfUpper_copper", "GfMiddle_kapton", "GfLower_copper", "GfLowerInner_G10", "GfLowerOuter_G10"}; const Double_t kLayerThickGf[kNofLayersGf] = {1, //upper outer g10 ring 1, //upper inner g10 ring 5e-4, //upper copper 50e-4, //kapton 5e-4, //lower copper 1, //lower inner g10 ring 1};//lower outer g10 ring TGeoVolume *tpc = new TGeoVolumeAssembly("TPC_Prot"); TGeoTranslation * trans1 =new TGeoTranslation(0.,0.,0.); // outer fieldcage kNofLayersFc = kNofLayersOfc; kFcrad = kOfcrad; kFclen = kOfclen; kLayerNameFc = kLayerNameOfc; kLayerThickFc = kLayerThickOfc; kZOffsetFc = kZOffsetOfc; { for ( Int_t ilayer = 0 ; ilayer < kNofLayersFc ; ilayer++ ) { cout << kLayerNameFc[ilayer].Data() << " -> " << kLayerThickFc[ilayer] << endl; } TGeoVolumeAssembly * FieldCage = new TGeoVolumeAssembly("Outer_Field_Cage"); // vector <*TGeoShape> Shapes; if( &kLayerNameFc[0] == &kLayerNameOfc[0]) { TGeoShape * Shapes[kNofLayersOfc]; TGeoVolume * Volumes[kNofLayersOfc]; } else if ( &kLayerNameFc[0] == & kLayerNameIfc[0]) { TGeoShape * Shapes[kNofLayersIfc]; TGeoVolume * Volumes[kNofLayersIfc]; } Double_t rin = kFcrad; Double_t rout; Double_t zl = kFclen; Double_t totZ=0; TString shapename, layerMaterial; for ( Int_t ilay =0 ; ilay < kNofLayersFc ; ilay++) { totZ=totZ + kZOffsetFc[ilay]; rin-=kLayerThickFc[ilay]; } TGeoTranslation * trans1 =new TGeoTranslation(0.,0.,-totZ/2); zl = (zl - totZ)/2; for ( Int_t icage = 0 ; icage < kNofLayersFc ; icage++ ) { //cout<<"Z:"<Print(); rout = rin + kLayerThickFc[icage]; shapename=Form("%s_shape",kLayerNameFc[icage]); Shapes[icage] = new TGeoTube(shapename,rin,rout,zl); //Shapes.push_back(new TGeoTube(shapename,rin,rout,zl)); layerMaterial = kLayerNameFc[icage].Data(); layerMaterial.Remove(0,layerMaterial.Last('_')+1); Volumes[icage] = new TGeoVolume(kLayerNameFc[icage],Shapes[icage],medium[10-1]); gGeoManager->SetVolumeAttribute(kLayerNameFc[icage],"seen",1); gGeoManager->SetVolumeAttribute(kLayerNameFc[icage],"colo",52); FieldCage->AddNode(Volumes[icage],icage,(TGeoTranslation*)trans1->Clone()); trans1->SetDz(trans1->GetTranslation()[2]+kZOffsetFc[icage]/2); zl=zl+(kZOffsetFc[icage]/2); rin = rout; } TPTUB->AddNode(FieldCage,0); } //outer stripfoil kNofLayersS = kNofLayersOs; kLayerNameS = kLayerNameOs; kLayerThickS = kLayerThickOs; kLayerZ = kLayerZOs; { Int_t kNofStrips = (Int_t)kOfclen/kStripPitch; cout<<"Layers for the Strip Foil"< " << kLayerThickS[ilayer] << endl; } if( &kLayerNameS[0] == &kLayerNameOs[0]) { TGeoShape * ShapesS[kNofLayersOs]; TGeoVolume * VolumesS[kNofLayersOs]; } else if ( &kLayerNameS[0] == & kLayerNameIs[0]) { TGeoShape * ShapesS[kNofLayersIs]; TGeoVolume * VolumesS[kNofLayersIs]; } // TGeoShape *ShapesS [kNofLayersS]; //TGeoVolume *VolumesS[kNofLayersS]; TString shapename, layerMaterial; Double_t rin,rout,dtot=0,dofctot=0; TGeoTranslation * t1 =new TGeoTranslation(0.,0.,kFclen/2); Int_t kStrFoCount = 0; TGeoVolumeAssembly * StripFoil = new TGeoVolumeAssembly("Srip_Foil"); for ( Int_t ilay = 0 ; ilay < kNofLayersS ; ilay++ ) { dtot = dtot + kLayerThickS[ilay]; } for ( Int_t ilay = 0 ; ilay < kNofLayersOfc ; ilay++ ) dofctot += kLayerThickOfc[ilay]; if( &kLayerNameS[0] == &kLayerNameOs[0]) rin=kFcrad-dtot-dofctot; else rin=kFcrad-dtot; //generate all necessary volumes for ( Int_t ilay = 0; ilay < kNofLayersS ; ilay ++ ) { rout=rin+kLayerThickS[ilay]; shapename = Form("%s_shape",kLayerNameS[ilay]); ShapesS[ilay] = new TGeoTube(shapename,rin,rout,kLayerZ[ilay]); layerMaterial = kLayerNameS[ilay].Data(); layerMaterial.Remove(0,layerMaterial.Last('_')+1); VolumesS[ilay] = new TGeoVolume(kLayerNameS[ilay],ShapesS[ilay],medium[10-1]); gGeoManager->SetVolumeAttribute(kLayerNameS[ilay],"seen",1); gGeoManager->SetVolumeAttribute(kLayerNameS[ilay],"colo",52); rin=rout; } //if ( &kLayerNameS[0] == &kLayerNameIs[0]) t1->SetDz(kIfclen-kOfclen); //generate stripfoil strips for(Int_t istrip = 0 ; istrip < kNofStrips ; istrip++) { for ( Int_t istrlay = 0 ; istrlay < kNofLayersS ; istrlay+=kNofLayersS-1) { StripFoil->AddNode(VolumesS[istrlay],kStrFoCount,(TGeoTranslation*)t1->Clone()); kStrFoCount++; t1->SetDz(t1->GetTranslation()[2]-kStripPitch/2); } } //Add kapton part of stripfoil StripFoil->AddNode(VolumesS[1],kStrFoCount); kStrFoCount++; // SetColors(VolumesS,kNofLayersS); // cout<Dump(); TPTUB->AddNode(StripFoil,1); } //inner fieldcage trans1->SetDz((kOfclen-kIfclen)/2); kNofLayersFc = kNofLayersIfc; kFcrad = kIfcrad; kFclen = kIfclen; kLayerNameFc = kLayerNameIfc; kLayerThickFc = kLayerThickIfc; kZOffsetFc = kZOffsetIfc; { for ( Int_t ilayer = 0 ; ilayer < kNofLayersFc ; ilayer++ ) { cout << kLayerNameFc[ilayer].Data() <<" - "< " << kLayerThickFc[ilayer] << endl; } TGeoVolumeAssembly * FieldCage = new TGeoVolumeAssembly("Outer_Field_Cage"); // vector <*TGeoShape> Shapes; if( &kLayerNameFc[0] == &kLayerNameOfc[0]) { TGeoShape * Shapes[kNofLayersOfc]; TGeoVolume * Volumes[kNofLayersOfc]; } else if ( &kLayerNameFc[0] == & kLayerNameIfc[0]) { TGeoShape * Shapes[kNofLayersIfc]; TGeoVolume * Volumes[kNofLayersIfc]; } Double_t rin = kFcrad; Double_t rout; Double_t zl = kFclen; Double_t totZ=0; TString shapename, layerMaterial; for ( Int_t ilay =0 ; ilay < kNofLayersFc ; ilay++) { totZ=totZ + kZOffsetFc[ilay]; rin-=kLayerThickFc[ilay]; } TGeoTranslation * trans1 =new TGeoTranslation(0.,0.,-totZ/2); zl = (zl - totZ)/2; for ( Int_t icage = 0 ; icage < kNofLayersFc ; icage++ ) { //cout<<"Z:"<Print(); rout = rin + kLayerThickFc[icage]; shapename=Form("%s_shape",kLayerNameFc[icage]); std::cout<<"Para: "<SetVolumeAttribute(kLayerNameFc[icage],"seen",1); gGeoManager->SetVolumeAttribute(kLayerNameFc[icage],"colo",52); FieldCage->AddNode(Volumes[icage],icage,(TGeoTranslation*)trans1->Clone()); trans1->SetDz(trans1->GetTranslation()[2]+kZOffsetFc[icage]/2); zl=zl+(kZOffsetFc[icage]/2); rin = rout; } TPTUB->AddNode(FieldCage,2,(TGeoTranslation*)trans1->Clone()); } kFclen=kOfclen; //inner stripfoil //trans1->SetDz(trans1->GetTranslation()[2]+kIfclen/2); kNofLayersS = kNofLayersIs; kLayerNameS = kLayerNameIs; kLayerThickS = kLayerThickIs; kLayerZ = kLayerZIs; { Int_t kNofStrips = (Int_t)kOfclen/kStripPitch; cout<<"Layers for the Strip Foil"< " << kLayerThickS[ilayer] << endl; } if( &kLayerNameS[0] == &kLayerNameOs[0]) { TGeoShape * ShapesS[kNofLayersOs]; TGeoVolume * VolumesS[kNofLayersOs]; } else if ( &kLayerNameS[0] == & kLayerNameIs[0]) { TGeoShape * ShapesS[kNofLayersIs]; TGeoVolume * VolumesS[kNofLayersIs]; } // TGeoShape *ShapesS [kNofLayersS]; //TGeoVolume *VolumesS[kNofLayersS]; TString shapename, layerMaterial; Double_t rin,rout,dtot=0,dofctot=0; TGeoTranslation * t1 =new TGeoTranslation(0.,0.,kFclen/2); Int_t kStrFoCount = 0; TGeoVolumeAssembly * StripFoil = new TGeoVolumeAssembly("Srip_Foil"); for ( Int_t ilay = 0 ; ilay < kNofLayersS ; ilay++ ) { dtot = dtot + kLayerThickS[ilay]; } for ( Int_t ilay = 0 ; ilay < kNofLayersOfc ; ilay++ ) dofctot += kLayerThickOfc[ilay]; if( &kLayerNameS[0] == &kLayerNameOs[0]) rin=kFcrad-dtot-dofctot; else rin=kFcrad-dtot; //generate all necessary volumes for ( Int_t ilay = 0; ilay < kNofLayersS ; ilay ++ ) { rout=rin+kLayerThickS[ilay]; shapename = Form("%s_shape",kLayerNameS[ilay]); ShapesS[ilay] = new TGeoTube(shapename,rin,rout,kLayerZ[ilay]); layerMaterial = kLayerNameS[ilay].Data(); layerMaterial.Remove(0,layerMaterial.Last('_')+1); VolumesS[ilay] = new TGeoVolume(kLayerNameS[ilay],ShapesS[ilay],medium[10-1]); gGeoManager->SetVolumeAttribute(kLayerNameS[ilay],"seen",1); gGeoManager->SetVolumeAttribute(kLayerNameS[ilay],"colo",52); rin=rout; } //if ( &kLayerNameS[0] == &kLayerNameIs[0]) t1->SetDz(kIfclen-kOfclen); //generate stripfoil strips for(Int_t istrip = 0 ; istrip < kNofStrips ; istrip++) { for ( Int_t istrlay = 0 ; istrlay < kNofLayersS ; istrlay+=kNofLayersS-1) { StripFoil->AddNode(VolumesS[istrlay],kStrFoCount,(TGeoTranslation*)t1->Clone()); kStrFoCount++; t1->SetDz(t1->GetTranslation()[2]-kStripPitch/2); } } //Add kapton part of stripfoil StripFoil->AddNode(VolumesS[1],kStrFoCount); kStrFoCount++; // SetColors(VolumesS,kNofLayersS); // cout<Dump(); TPTUB->AddNode(StripFoil,3,(TGeoTranslation*)trans1->Clone()); } { cout<<"Layers for the Drift Cathode"< " << kLayerThickDc[ilayer] << endl; } TGeoShape *Shapes [kNofLayersDc]; TGeoVolume *Volumes[kNofLayersDc]; TString shapename, layerMaterial; Double_t rin,rout; TGeoTranslation * trans1 =new TGeoTranslation(0.,0.,kFclen/2); TGeoVolumeAssembly * DriftCathode = new TGeoVolumeAssembly("Drift_Cathode"); rin = 0; rout = kOfcrad; //calc outer fc radius for drift cathode radius // for ( Int_t ilay = 0 ; ilay < kNofLayersOfc ; ilay++ ) //rout += kLayerThickFc[ilay]; for ( Int_t ilay = 0; ilay < kNofLayersDc ; ilay ++ ) { trans1->SetDz(trans1->GetTranslation()[2]+kLayerThickDc[ilay]/2); shapename = Form("%s_shape",kLayerNameDc[ilay]); Shapes[ilay] = new TGeoTube(shapename,rin,rout,kLayerThickDc[ilay]/2); layerMaterial = kLayerNameDc[ilay].Data(); layerMaterial.Remove(0,layerMaterial.Last('_')+1); Volumes[ilay] = new TGeoVolume(kLayerNameDc[ilay],Shapes[ilay],medium[10-1]); // rout = rout + kLayerThickDc[ilay]; //only for higher detailed model, not implemented now gGeoManager->SetVolumeAttribute(kLayerNameDc[ilay],"seen",1); gGeoManager->SetVolumeAttribute(kLayerNameDc[ilay],"colo",52); DriftCathode->AddNode(Volumes[ilay],ilay,(TGeoTranslation*)trans1->Clone()); trans1->SetDz(trans1->GetTranslation()[2]+kLayerThickDc[ilay]/2); } } TPTUB->AddNode(DriftCathode,4); /* { cout<<"Layers for the Media and Gem Flange"< " << kLayerThickMgf[ilayer] << endl; } TGeoVolumeAssembly * MediaGemFlange = new TGeoVolumeAssembly("Media_Gem_Flange"); TGeoShape *Shapes [kNofLayersMgf]; TGeoVolume *Volumes[kNofLayersMgf]; TString shapename, layerMaterial; TGeoTranslation * trans1 =new TGeoTranslation(0.,0.,-kFclen/2); for ( Int_t ilay = 0; ilay < kNofLayersMgf ; ilay ++ ) { trans1->SetDz(trans1->GetTranslation()[2]-kLayerThickMgf[ilay]/2); shapename = Form("%s_shape",kLayerNameMgf[ilay]); Shapes[ilay] = new TGeoTube(shapename,kRinMgf[ilay],KRoutMgf[ilay],kLayerThickMgf[ilay]/2); layerMaterial = kLayerNameMgf[ilay].Data(); layerMaterial.Remove(0,layerMaterial.Last('_')+1); Volumes[ilay] = new TGeoVolume(kLayerNameMgf[ilay],Shapes[ilay],medium[10-1]); // if ( ilay < 2 ) //{ MediaGemFlange->AddNode(Volumes[ilay],ilay,(TGeoTranslation*)trans1->Clone()); //} trans1->SetDz((trans1->GetTranslation()[2])-kLayerThickMgf[ilay]/2); } //get gem hight double kgemheight = 0; for (Int_t iglay = 0 ; iglay < kNofLayersGf ; iglay ++ ) { kgemheight += kLayerThickGf[iglay]; } //get media gemflange height double kMgfheight = 0; for (Int_t iglay = 0 ; iglay < 2 ; iglay ++ ) { kMgfheight += kLayerThickMgf[iglay]; } // cout<Print(); trans1->SetDz(-kFclen/2-kMgfheight+kLayerThickGf[0]/2+kZoffPadplaneGem); // TGeoVolumeAssembly * GemFoil = CreateGemFoil(_gGeoMan); // for ( Int_t igem = 0 ; igem < 3 ; igem++ ) // { // // MediaGemFlange->AddNode(CreateGemFoil(_gGeoMan),ilay++,trans1); // MediaGemFlange->AddNode(GemFoil,ilay++,(TGeoTranslation*)trans1->Clone()); // trans1->SetDz((trans1->GetTranslation()[2])+kgemheight/2); // } TPTUB->AddNode(MediaGemFlange,5); } */ /* { cout<<"Layers for the Gem Foil"< " << kLayerThickGf[ilayer] << endl; } TGeoVolumeAssembly * GemFoil = new TGeoVolumeAssembly("Gem_Foil"); TGeoShape *Shapes [kNofLayersGf]; TGeoVolume *Volumes[kNofLayersGf]; TString shapename, layerMaterial; TGeoTranslation * trans1 =new TGeoTranslation(0.,0.,0.); for ( Int_t ilay = 0; ilay < kNofLayersGf ; ilay ++ ) { shapename = Form("%s_shape",kLayerNameGf[ilay]); Shapes[ilay] = new TGeoTube(shapename,kRinGf[ilay],KRoutGf[ilay],kLayerThickGf[ilay]/2); layerMaterial = kLayerNameGf[ilay].Data(); layerMaterial.Remove(0,layerMaterial.Last('_')+1); Volumes[ilay] = new TGeoVolume(kLayerNameGf[ilay],Shapes[ilay],medium[10-1]); } GemFoil->AddNode(Volumes[0],1,(TGeoTranslation*)trans1->Clone()); //outer g10 ring GemFoil->AddNode(Volumes[1],2,(TGeoTranslation*)trans1->Clone()); // inner g10 ring trans1->SetDz(kLayerThickGf[0]/2-kLayerThickGf[2]/2); // outer ring/2 - active area/2 GemFoil->AddNode(Volumes[2],3,(TGeoTranslation*)trans1->Clone()); // upper active area trans1->SetDz((trans1->GetTranslation()[2])+kLayerThickGf[2]/2+kLayerThickGf[3]/2); // outer ring/2 + kapton/2 GemFoil->AddNode(Volumes[3],3,(TGeoTranslation*)trans1->Clone()); // kapton trans1->SetDz((trans1->GetTranslation()[2])+kLayerThickGf[3]/2+kLayerThickGf[4]/2); //outer ring/2 + kapton + active area/2 GemFoil->AddNode(Volumes[4],6,(TGeoTranslation*)trans1->Clone()); // lower active area trans1->SetDz((trans1->GetTranslation()[2])-kLayerThickGf[4]/2+kLayerThickGf[5]/2); //outer ring/2 - active area/2 + kapton + outer/inner ring GemFoil->AddNode(Volumes[5],6,(TGeoTranslation*)trans1->Clone()); // inner g10 ring GemFoil->AddNode(Volumes[6],1,(TGeoTranslation*)trans1->Clone()); //outer g10 ring SetColors(Volumes,kNofLayersGf); TPTUB->AddNode(GemFoil,6.); } */ }