create_ND_geo.C

Elvira Gazeeva, 12/20/2017 12:09 PM

Download (6.55 KB)

 
1
void create_ND_geo()
2
{
3
  TString erPath = gSystem->Getenv("VMCWORKDIR");
4

    
5
  // Output paths
6
  TString outGeoFilenameRoot = erPath + "/geometry/ND1ch.geo.root";
7
  TString outGeoFilenameGdml = erPath + "/geometry/ND1ch.gdml";
8

    
9
  // Input paths
10
  TString medFile = erPath + "/geometry/media.geo";
11

    
12
  // Materials and media
13
  FairGeoLoader* geoLoad = new FairGeoLoader("TGeo", "FairGeoLoader");
14
  FairGeoInterface* geoFace = geoLoad->getGeoInterface();
15
  geoFace->setMediaFile(medFile);
16
  geoFace->readMedia();
17
  FairGeoMedia* geoMedia = geoFace->getMedia();
18
  FairGeoBuilder* geoBuild = geoLoad->getGeoBuilder();
19

    
20
  // Geometry manager
21
  TGeoManager* geoM = (TGeoManager*)gROOT->FindObject("FAIRGeom");
22

    
23
  TString mediumName;
24

    
25
  mediumName = "Stilbene";
26
  FairGeoMedium* mStilbene = geoMedia->getMedium(mediumName);
27
  if (!mStilbene) Fatal("create_ND_geo", "FairMedium %s not found", mediumName.Data());
28
  geoBuild->createMedium(mStilbene);
29
  TGeoMedium* pStilbene = geoM->GetMedium(mediumName);
30
  if (!pStilbene) Fatal("create_ND_geo", "Medium %s not found", mediumName.Data());
31

    
32
  mediumName = "Steel";
33
  FairGeoMedium* mSteel = geoMedia->getMedium(mediumName);
34
  if (!mSteel) Fatal("create_ND_geo", "FairMedium %s not found", mediumName.Data());
35
  geoBuild->createMedium(mSteel);
36
  TGeoMedium* pSteel = geoM->GetMedium(mediumName);
37
  if (!pSteel) Fatal("create_ND_geo", "Medium %s not found", mediumName.Data());
38

    
39
  mediumName = "aluminium";
40
  FairGeoMedium* maluminium = geoMedia->getMedium(mediumName);
41
  if (!maluminium) Fatal("create_ND_geo", "FairMedium %s not found", mediumName.Data());
42
  geoBuild->createMedium(maluminium);
43
  TGeoMedium* paluminium = geoM->GetMedium(mediumName);
44
  if (!paluminium) Fatal("create_ND_geo", "Medium %s not found", mediumName.Data());
45

    
46
  mediumName = "vacuum";
47
  FairGeoMedium* mvacuum      = geoMedia->getMedium(mediumName);
48
  if (!mvacuum) Fatal("create_ND_geo", "FairMedium %s not found", mediumName.Data());
49
  geoBuild->createMedium(mvacuum);
50
  TGeoMedium* pvacuum = geoM->GetMedium(mediumName);
51
  if (!pvacuum) Fatal("create_ND_geo", "Medium %s not found", mediumName.Data());
52

    
53
  // General dimensions
54
  Double_t R_min_Crystal = 0.0; // cm
55
  Double_t R_max_Crystal = 4.0; // cm
56
  Double_t HeightZ_Crystal = 5.0; // cm
57
  Double_t R_min_Shell = 0.0; // cm
58
  Double_t R_max_Shell = 4.2; // cm
59
  Double_t HeightZ_Shell = 5.2; // cm
60
  Double_t R_min_Housing = 0.0; // cm
61
  Double_t R_max_Housing = 4.8; // cm
62
  Double_t HeightZ_Housing = 5.4; // cm
63

    
64
  // Shapes
65
  TGeoTube* crystalSh = new TGeoTube("crystalSh", R_min_Crystal, R_max_Crystal, HeightZ_Crystal/2.);
66
  TGeoTube* shellSh = new TGeoTube("shellSh", R_min_Shell, R_max_Shell, HeightZ_Shell/2.);
67
  TGeoTube* housingSh = new TGeoTube("housingSh", R_min_Housing, R_max_Housing, HeightZ_Housing/2.);
68

    
69
  // Volumes
70
  TGeoVolume* crystalVol = new TGeoVolume("crystalVol", crystalSh, pStilbene);
71
  TGeoVolume* shellVol = new TGeoVolume("shellVol", shellSh, pvacuum);
72
//  TGeoVolume* housingVol = new TGeoVolume("housingVol", housingSh, pSteel);
73
  TGeoVolume* housingVol = new TGeoVolume("housingVol", housingSh, pvacuum);
74
  TGeoVolume* moduleVol = new TGeoVolumeAssembly("moduleVol");
75

    
76
  // Matrices
77
  TGeoRotation* rotNoRot = new TGeoRotation("rotNoRot", 0., 0., 0.);
78
  rotNoRot->RegisterYourself();
79

    
80
  // Structure
81
  // Crystal in shell
82
  shellVol->AddNode(crystalVol, 1, new TGeoCombiTrans("mCrystalInShell", 0., 0., (HeightZ_Shell-HeightZ_Crystal)/2., rotNoRot));
83

    
84
  // Shell in housing
85
  housingVol->AddNode(shellVol, 1);
86
  // housing in Module
87
  moduleVol->AddNode(housingVol, 1);
88

    
89
  // Module in ND
90
  // This is the one but last level in the hierarchy
91
  // This volume-assembly is the only volume to be inserted into TOP
92
  TGeoVolumeAssembly* subdetectorVolAss = new TGeoVolumeAssembly("neutrondet1ch");
93
  subdetectorVolAss->AddNode(moduleVol, 1);
94

    
95
  //        for (UInt_t iX=0; iX<iXmax; iX++) {
96
  //                for (UInt_t iY=0; iY<iYmax; iY++) {
97
  //                        matrixName.Form("mHousingInND_%d", iX*iYmax+iY);
98
  //                        moduleVol->AddNode(submoduleVol, iX*2+iY, new TGeoCombiTrans(matrixName,
99
  // Modules' Positioning Here 
100
  //                            -submoduleXsize/2.+submoduleXsize*iX, -submoduleYsize/2.+submoduleYsize*iY, 0., rotNoRot));
101
  //  Modules' Positioning Here 
102
  //                }
103
  //        }
104
  // Regular positioning below
105
/*
106
  for(Int_t i=0; i<3; i++){
107
  for(Int_t j=0; j<3; j++){
108
  //1. Central cylinder:
109
  if((i==0)&&(j==0)){
110
  NDVol->AddNode(ModuleVol, 26, new TGeoCombiTrans("r1",0,0,r,new TGeoRotation("r2",0,0,0)));
111
  }
112
  //2. Cylinders along the Y-axis:
113
  else if((i==0)&&!(j==0)){
114
  alpha[j]= j*(l/r);
115
  l1[j] =r*sin(alpha[j]);
116
  h[j] = sqrt(4*r*r*sin(alpha[j]/2)*sin(alpha[j]/2) - r*r*sin(alpha[j])*sin(alpha[j]));
117
  NDVol->AddNode(ModuleVol,2*j, new TGeoCombiTrans("r1",0,l1[j], r-h[j], new TGeoRotation("r2",0, -(alpha[j]*rad),0)));
118
  NDVol->AddNode(ModuleVol,2*j+1, new TGeoCombiTrans("r1",0, -l1[j], r-h[j], new TGeoRotation("r2",0, (alpha[j]*rad),0)));
119
  //3. Cylinders along the X-axis:
120
  }else if((j==0)&&!(i==0)){
121
  alpha[i]= i*(l/r);
122
  l1[i] =r*sin(alpha[i]);
123
  h[i] = sqrt(4*r*r*sin(alpha[i]/2)*sin(alpha[i]/2) - r*r*sin(alpha[i])*sin(alpha[i]));
124
  NDVol->AddNode(ModuleVol,2*i+4, new TGeoCombiTrans("r1",l1[i],0, r-h[i], new TGeoRotation("r2",0, 0,-(alpha[i]*rad))));
125
  NDVol->AddNode(ModuleVol,2*i+5, new TGeoCombiTrans("r1",-l1[i],0, r-h[i], new TGeoRotation("r2",0,0, (alpha[i]*rad))));
126
  //4. Cylinders placed on quadrants:
127
  }
128
  else {
129
  NDVol->AddNode(ModuleVol,8*i+2*j, 
130
  new TGeoCombiTrans("r1",l1[i],l1[j], r-h[j]-h[i], 
131
  new TGeoRotation("r2",0, -(alpha[j]*rad),-(alpha[i]*rad))));
132
  NDVol->AddNode(ModuleVol,8*i+2*j+1, 
133
  new TGeoCombiTrans("r1",l1[i], -l1[j], r-h[j]-h[i], 
134
  new TGeoRotation("r2",0,(alpha[j]*rad), -(alpha[i]*rad))));
135
  NDVol->AddNode(ModuleVol,8*i+2*j+4, 
136
  new TGeoCombiTrans("r1",-l1[i],-l1[j], r-h[j]-h[i], 
137
  new TGeoRotation("r2",0, (alpha[j]*rad),(alpha[i]*rad))));
138
  NDVol->AddNode(ModuleVol,8*i+2*j+5, 
139
  new TGeoCombiTrans("r1",-l1[i], l1[j], r-h[j]-h[i], 
140
  new TGeoRotation("r2",0, -(alpha[j]*rad),(alpha[i]*rad))));
141
  }//else
142
  }//for j
143
  }//for i
144
*/
145

    
146
  // World ------------------------------------
147
  TGeoVolumeAssembly* topVolAss = new TGeoVolumeAssembly("TOP");
148
  topVolAss->AddNode(subdetectorVolAss, 1);
149

    
150
  // Finalize
151
  geoM->SetTopVolume(topVolAss);
152
  geoM->CloseGeometry();
153
  geoM->CheckOverlaps();
154
  geoM->PrintOverlaps();
155
  //geoM->CheckGeometry();
156
  //geoM->CheckGeometryFull();
157
  //geoM->Test();
158

    
159
  // Export
160
  //geoM->Export(outGeoFilenameGdml);
161
  TFile* outGeoFileRoot = new TFile(outGeoFilenameRoot, "RECREATE");
162
  geoM->GetTopVolume()->Write();
163
  outGeoFileRoot->Close();
164

    
165
  // Draw
166
  TBrowser* bro = new TBrowser("bro", "bro");
167
  geoM->GetTopVolume()->Draw("ogl");
168
}