FairRoot/PandaRoot
PndMdtMagnet.cxx
Go to the documentation of this file.
1 
2 #include <iostream>
3 
4 #include "TClonesArray.h"
5 #include "TLorentzVector.h"
6 #include "TMath.h"
7 #include "TParticle.h"
8 #include "TGeoArb8.h"
9 #include "TGeoTrd2.h"
10 #include "TGeoTube.h"
11 #include "TGeoCompositeShape.h"
12 #include "TGeoMatrix.h"
13 #include "TGeoManager.h"
14 #include "TVirtualMC.h"
15 
16 #include "FairVolume.h"
17 #include "FairGeoMedia.h"
18 #include "FairGeoInterface.h"
19 #include "FairGeoLoader.h"
20 #include "FairGeoBuilder.h"
21 #include "FairRuntimeDb.h"
22 #include "FairRun.h"
23 #include "FairModule.h"
24 
25 #include "PndDetectorList.h"
26 #include "PndStack.h"
27 #include "PndMdt.h"
28 #include "PndMdtMagnet.h"
29 
30 using namespace std;
31 
32 
34 {
35  TString vname = "cave";
36  vname = vname.Strip();
37  TGeoVolume* vcave = gGeoManager->FindVolumeFast(vname.Data());
38 
39  //General definitions
40  TGeoVolume* mag = new TGeoVolumeAssembly("PndMdtMagnet");
41  TGeoVolume* magBarrel = new TGeoVolumeAssembly("PndMdtMagnetBarrel");
42  TGeoVolume* magEndcap = new TGeoVolumeAssembly("PndMdtMagnetEndcap");
43 
44  //Additional definitions
45  Text_t buffer[30];
46  Text_t longbuffer[250];
47  Double_t mpx, mpy, mpz;
48  Double_t mx0, my0, mz0;
49  Double_t my;
50  int k;
51  Double_t dx1, dx2, dy1, dy2, dz;
52  TGeoRotation tRot, tRotSlice;
53  //Double_t angle; //[R.K. 01/2017] unused variable?
54 
55  FairGeoLoader*geoLoad = FairGeoLoader::Instance();
56  FairGeoInterface *geoFace = geoLoad->getGeoInterface();
57  FairGeoMedia *Media = geoFace->getMedia();
58  FairGeoBuilder *geobuild=geoLoad->getGeoBuilder();
59  FairGeoMedium *medmdtiron = Media->getMedium("iron");
60  geobuild->createMedium(medmdtiron);
61 
62  //creating the holes
63  new TGeoBBox("mhbox1",((Double_t)PndMdtMagnet_H01_Length)/10.0,((Double_t)PndMdtMagnet_H01_Length)/10.0,((Double_t)PndMdtMagnet_L201)/10.0,0);
64  new TGeoBBox("mhbox2",((Double_t)PndMdtMagnet_H02_H)/10.0,0.5+((Double_t)PndMdtMagnet_Th2)/10.0,((Double_t)PndMdtMagnet_H02_V)/10.0,0);
65  new TGeoBBox("mhbox3",((Double_t)PndMdtMagnet_H03_H)/10.0,0.5+((Double_t)PndMdtMagnet_Th2)/10.0,((Double_t)PndMdtMagnet_H03_V)/10.0,0);
66  new TGeoBBox("mhbox4",((Double_t)PndMdtMagnet_H04_H)/10.0,0.5+((Double_t)PndMdtMagnet_Th2)/10.0,((Double_t)PndMdtMagnet_H04_V)/10.0,0);
67  new TGeoBBox("mhbox5",((Double_t)PndMdtMagnet_H05_H)/10.0,0.5+((Double_t)PndMdtMagnet_Th2)/10.0,((Double_t)PndMdtMagnet_H05_V)/10.0,0);
68  new TGeoBBox("mhbox6",((Double_t)PndMdtMagnet_H06_H)/10.0,0.5+((Double_t)PndMdtMagnet_Th2)/10.0,((Double_t)PndMdtMagnet_H06_V)/10.0,0);
69 
70  new TGeoBBox("mhupbox",((Double_t)PndMdtMagnet_H_U_X)/10.0,((Double_t)PndMdtMagnet_H_U_Z)/10.0,((Double_t)PndMdtMagnet_L201)/10.0,0);
71  new TGeoTube("mhuptub",0., ((Double_t)PndMdtMagnet_H_U_R)/10.0,((Double_t)PndMdtMagnet_L201)/10.0);
72  new TGeoTube("mhdotub1", 0., ((Double_t)PndMdtMagnet_H_D_R1)/10.0,((Double_t)PndMdtMagnet_L201)/10.0);
73  new TGeoTube("mhdotub2", 0., ((Double_t)PndMdtMagnet_H_D_R2)/10.0,((Double_t)PndMdtMagnet_L201)/10.0);
74 
75 
76  //MdtMagnetBarrel
77  tRot.RotateX(90.0);
80  for(int i=0; i<13; i++)
81  {
82  switch(i)
83  {
84  case 0:
86  mpz = (Double_t)PndMdtMagnet_Th2;
87  break;
88  case 1:
91  break;
92  case 2:
95  break;
96  case 3:
99  break;
100  case 4:
102  mpz = (Double_t)PndMdtMagnet_Th1;
103  break;
104  case 5:
106  mpz = (Double_t)PndMdtMagnet_Th1;
107  break;
108  case 6:
110  mpz = (Double_t)PndMdtMagnet_Th1;
111  break;
112  case 7:
114  mpz = (Double_t)PndMdtMagnet_Th1;
115  break;
116  case 8:
118  mpz = (Double_t)PndMdtMagnet_Th1;
119  break;
120  case 9:
122  mpz = (Double_t)PndMdtMagnet_Th1;
123  break;
124  case 10:
126  mpz = (Double_t)PndMdtMagnet_Th1;
127  break;
128  case 11:
130  mpz = (Double_t)PndMdtMagnet_Th1;
131  break;
132  case 12:
134  mpz = (Double_t)PndMdtMagnet_Th2;
135  break;
136  };
137  my = my0;
138  mpx = (my - mpz)*(TMath::Tan(TMath::ACos(-1.0)/8.0));
139  sprintf(buffer,"mbox%i",i);
140  TGeoBBox* mbox = new TGeoBBox(buffer,mpx/10.0,mpy/10.0,mpz/10.0,0);
141  TGeoTranslation* mtgt = new TGeoTranslation(0.0,mz0/10.0,0.0);
142  mtgt->SetName("mtgt");
143  mtgt->RegisterYourself();
144 
145  // sprintf(buffer,"mbox%i:mtgt-mhbox1",i);
146 // TGeoCompositeShape* mtgcs = new TGeoCompositeShape("mtgcs",buffer);
147  for(int j=0; j<8; j++)
148  {
149  if(j==0 || j==4)
150  {
151  if (i<3)
152  {
153  sprintf(buffer,"mbox%i:mtgt-mhuptub",i);
154  }
155  else
156  {
157  if (j==0) sprintf(buffer,"mbox%i:mtgt-mhupbox",i);
158  if (j==4) sprintf(buffer,"mbox%i:mtgt-mhdotub2",i);
159  }
160  //sprintf(buffer,"mbox%i:mtgt-mhbox1",i);
161  TGeoCompositeShape* mtgcs = new TGeoCompositeShape("mtgcs",buffer);
162 
163  k=j+2;
164  mx0 = my*TMath::Cos(((Double_t)k)*TMath::ACos(-1.0)/4.0);
165  my0 = my*TMath::Sin(((Double_t)k)*TMath::ACos(-1.0)/4.0);
166  sprintf(buffer,"magnet%i",300+8*i+j);
167  TGeoVolume* volume = new TGeoVolume(buffer,mtgcs,gGeoManager->GetMedium("iron"));
168  volume->SetLineColor(3);
169  magBarrel->AddNode(volume,300+8*i+j,new TGeoCombiTrans(mx0/10.0,my0/10.0,0.0,new TGeoRotation(tRot)));
170  }
171  else
172  {
173  if(j==2 || j==6) k=j-2;
174  else k=j;
175  mx0 = my*TMath::Cos(((Double_t)k)*TMath::ACos(-1.0)/4.0);
176  my0 = my*TMath::Sin(((Double_t)k)*TMath::ACos(-1.0)/4.0);
177  sprintf(buffer,"magnet%i",300+8*i+j);
178  TGeoVolume* volume = new TGeoVolume(buffer,mbox,gGeoManager->GetMedium("iron"));
179  volume->SetLineColor(3);
180  magBarrel->AddNode(volume,300+8*i+j,new TGeoCombiTrans(mx0/10.0,my0/10.0,mz0/10.0,new TGeoRotation(tRot)));
181  };
182  tRot.RotateZ(-45.0);
183  };
184  };
185 
186 
187  //MdtMagnetEndcap
188 
189  TGeoRotation magtgrl;
190  magtgrl.RotateY(0.0);
191  TGeoRotation* magtgr0 = new TGeoRotation(magtgrl);
192  magtgr0->SetName("magtgr0");
193  magtgr0->RegisterYourself();
194  magtgrl.RotateY(45.0);
195  TGeoRotation* magtgr1 = new TGeoRotation(magtgrl);
196  magtgr1->SetName("magtgr1");
197  magtgr1->RegisterYourself();
198  magtgrl.RotateY(45.0);
199  TGeoRotation* magtgr2 = new TGeoRotation(magtgrl);
200  magtgr2->SetName("magtgr2");
201  magtgr2->RegisterYourself();
202  magtgrl.RotateY(45.0);
203  TGeoRotation* magtgr3 = new TGeoRotation(magtgrl);
204  magtgr3->SetName("magtgr3");
205  magtgr3->RegisterYourself();
206  magtgrl.RotateY(45.0);
207  TGeoRotation* magtgr4 = new TGeoRotation(magtgrl);
208  magtgr4->SetName("magtgr4");
209  magtgr4->RegisterYourself();
210  magtgrl.RotateY(45.0);
211  TGeoRotation* magtgr5 = new TGeoRotation(magtgrl);
212  magtgr5->SetName("magtgr5");
213  magtgr5->RegisterYourself();
214  magtgrl.RotateY(45.0);
215  TGeoRotation* magtgr6 = new TGeoRotation(magtgrl);
216  magtgr6->SetName("magtgr6");
217  magtgr6->RegisterYourself();
218  magtgrl.RotateY(45.0);
219  TGeoRotation* magtgr7 = new TGeoRotation(magtgrl);
220  magtgr7->SetName("magtgr7");
221  magtgr7->RegisterYourself();
222 
223  dx2 = 0.0;
224  dy1 = (Double_t)PndMdtMagnet_Th2;
225  dy2 = (Double_t)PndMdtMagnet_Th2;
226  dx1 = ((Double_t)PndMdtMagnet_Endcap_Height)*(TMath::Tan(TMath::ACos(-1.0)/8.0));
229  TGeoTranslation* magtgt = new TGeoTranslation(0.0,0.0,my/(-10.0));
230  magtgt->SetName("magtgt");
231  magtgt->RegisterYourself();
232  new TGeoTrd2("magtrd",dx1/10.0,dx2/10.0,dy1/10.0,dy2/10.0,dz/10.0);
233 
234  for(int i=0; i<5; i++)
235  {
236  switch(i)
237  {
238  case 0:
240  break;
241  case 1:
242  mz0 = (Double_t)PndMdtMagnet_L201;
243  break;
244  case 2:
246  break;
247  case 3:
249  break;
250  case 4:
252  break;
253  };
254  for(int j=0; j<8; j++)
255  {
256  sprintf(buffer,"magtgcs%i",(8*i)+j);
257  sprintf(longbuffer,"magtrd:magtgt-mhbox%i:magtgr%i",i+2,j);
258  TGeoCompositeShape* magtgcs = new TGeoCompositeShape(buffer,longbuffer);
259  sprintf(buffer,"magnet%i",500+8*i+j);
260  TGeoVolume* volume = new TGeoVolume(buffer,magtgcs,gGeoManager->GetMedium("iron"));
261  volume->SetLineColor(3);
262  magEndcap->AddNode(volume,500+8*i+j,new TGeoCombiTrans(0.0,0.0,mz0/10.0,new TGeoRotation(tRot)));
263  tRot.RotateZ(-45.0);
264  };
265  };
266 
267  mag->AddNode(magBarrel,1);
268  mag->AddNode(magEndcap,1);
269  vcave->AddNode(mag,1);
270 
271  return;
272 }
273 
275 
#define PndMdtMagnet_L100
Definition: PndMdtMagnet.h:15
#define PndMdtMagnet_L104
Definition: PndMdtMagnet.h:19
#define PndMdtMagnet_L111
Definition: PndMdtMagnet.h:26
#define PndMdtMagnet_H02_V
Definition: PndMdtMagnet.h:42
#define PndMdtMagnet_L108
Definition: PndMdtMagnet.h:23
#define PndMdtMagnet_L102
Definition: PndMdtMagnet.h:17
#define PndMdtMagnet_L200
Definition: PndMdtMagnet.h:32
#define PndMdtMagnet_H05_H
Definition: PndMdtMagnet.h:49
#define PndMdtMagnet_H01_Length
Definition: PndMdtMagnet.h:39
FairGeoLoader * geoLoad
Int_t i
Definition: run_full.C:25
FairGeoMedia * Media
#define PndMdtMagnet_H06_H
Definition: PndMdtMagnet.h:53
static T Sin(const T &x)
Definition: PndCAMath.h:42
#define PndMdtMagnet_H03_H
Definition: PndMdtMagnet.h:45
float Tan(float x)
Definition: PndCAMath.h:165
#define PndMdtMagnet_H02_H
Definition: PndMdtMagnet.h:43
#define PndMdtMagnet_Th1
Definition: PndMdtMagnet.h:8
#define PndMdtMagnet_L203
Definition: PndMdtMagnet.h:35
#define PndMdtMagnet_H_U_R
Definition: PndMdtMagnet.h:58
TGeoManager * gGeoManager
#define PndMdtMagnet_L202
Definition: PndMdtMagnet.h:34
static T Cos(const T &x)
Definition: PndCAMath.h:43
#define PndMdtMagnet_L107
Definition: PndMdtMagnet.h:22
#define PndMdtMagnet_H05_V
Definition: PndMdtMagnet.h:48
void PndMdtMagnet()
#define PndMdtMagnet_H_U_Z
Definition: PndMdtMagnet.h:57
#define PndMdtMagnet_H04_H
Definition: PndMdtMagnet.h:47
FairGeoBuilder * geobuild
Double_t
#define PndMdtMagnet_Barrel_Displacement
Definition: PndMdtMagnet.h:13
#define PndMdtMagnet_L110
Definition: PndMdtMagnet.h:25
#define PndMdtMagnet_H_U_X
Definition: PndMdtMagnet.h:56
#define PndMdtMagnet_Endcap_Height
Definition: PndMdtMagnet.h:30
#define PndMdtMagnet_L101
Definition: PndMdtMagnet.h:16
#define PndMdtMagnet_L201
Definition: PndMdtMagnet.h:33
#define PndMdtMagnet_H_D_R1
Definition: PndMdtMagnet.h:59
#define PndMdtMagnet_Barrel_Length
Definition: PndMdtMagnet.h:12
#define PndMdtMagnet_L106
Definition: PndMdtMagnet.h:21
#define PndMdtMagnet_H04_V
Definition: PndMdtMagnet.h:46
#define PndMdtMagnet_L112
Definition: PndMdtMagnet.h:27
#define PndMdtMagnet_H06_V
Definition: PndMdtMagnet.h:52
#define PndMdtMagnet_L103
Definition: PndMdtMagnet.h:18
#define PndMdtMagnet_Th2
Definition: PndMdtMagnet.h:9
Definition: PndMdt.h:20
ClassImp(PndAnaContFact)
#define PndMdtMagnet_H_D_R2
Definition: PndMdtMagnet.h:60
FairGeoInterface * geoFace
#define PndMdtMagnet_L105
Definition: PndMdtMagnet.h:20
#define PndMdtMagnet_H03_V
Definition: PndMdtMagnet.h:44
#define PndMdtMagnet_L109
Definition: PndMdtMagnet.h:24
#define PndMdtMagnet_L204
Definition: PndMdtMagnet.h:36