SND@LHC Software
Loading...
Searching...
No Matches
MufluxTargetStation.cxx
Go to the documentation of this file.
2
3#include "TGeoManager.h"
4#include "FairRun.h" // for FairRun
5#include "FairRuntimeDb.h" // for FairRuntimeDb
6#include <iosfwd> // for ostream
7#include "TList.h" // for TListIter, TList (ptr only)
8#include "TObjArray.h" // for TObjArray
9#include "TString.h" // for TString
10#include "TGeoBBox.h"
11#include "TGeoCompositeShape.h"
12#include "TGeoShapeAssembly.h"
13#include "TGeoTube.h"
14#include "TGeoMaterial.h"
15#include "FairGeoMedia.h"
16#include "FairGeoBuilder.h"
17#include "TGeoMedium.h"
18#include <stddef.h> // for NULL
19#include <iostream> // for operator<<, basic_ostream, etc
20
21using std::cout;
22using std::endl;
23
24
29 : FairModule("MufluxTargetStation", "")
30{
31}
32
33MufluxTargetStation::MufluxTargetStation(const char* name, const Double_t tl,const Double_t al,const Double_t tz,
34 const Double_t az, const int nS, const Double_t sl, const char* Title )
35 : FairModule(name ,Title)
36{
37 fTargetLength = tl;
38 fAbsorberLength = al;
39 fAbsorberZ = az;
40 fTargetZ = tz;
41 fnS = nS;
42 fsl = sl;
43}
44
45MufluxTargetStation::MufluxTargetStation(const char* name, const Double_t tl,const Double_t tz,
46 const int nS, const Double_t sl, const char* Title )
47 : FairModule(name ,Title)
48{
49 fTargetLength = tl;
50 fAbsorberLength = 0;
51 fAbsorberZ = 0;
52 fTargetZ = tz;
53 fnS = nS;
54 fsl = sl;
55}
56
57// ----- Private method InitMedium
58Int_t MufluxTargetStation::InitMedium(const char* name)
59{
60 static FairGeoLoader *geoLoad=FairGeoLoader::Instance();
61 static FairGeoInterface *geoFace=geoLoad->getGeoInterface();
62 static FairGeoMedia *media=geoFace->getMedia();
63 static FairGeoBuilder *geoBuild=geoLoad->getGeoBuilder();
64
65 FairGeoMedium *ShipMedium=media->getMedium(name);
66
67 if (!ShipMedium)
68 {
69 Fatal("InitMedium","Material %s not defined in media file.", name);
70 return -1111;
71 }
72 TGeoMedium* medium=gGeoManager->GetMedium(name);
73 if (medium!=NULL)
74 return ShipMedium->getMediumIndex();
75 return geoBuild->createMedium(ShipMedium);
76}
77
78void MufluxTargetStation::SetIronAbsorber(Double_t absorber_x, Double_t absorber_y)
79{
80 fabsorber_x=absorber_x;
81 fabsorber_y=absorber_y;
82
83}
84
85
86void MufluxTargetStation::SetAbsorberCutout(Double_t absorbercutout_x, Double_t absorbercutout_y)
87{
88 fabsorbercutout_x=absorbercutout_x;
89 fabsorbercutout_y=absorbercutout_y;
90}
91
92void MufluxTargetStation::SetIronShield(Double_t ironshield_x, Double_t ironshield_y, Double_t ironshield_z)
93{
94 fironshield_x=ironshield_x;
95 fironshield_y=ironshield_y;
96 fironshield_z=ironshield_z;
97}
98
99void MufluxTargetStation::SetConcreteShield(Double_t concreteshield_x, Double_t concreteshield_y, Double_t concreteshield_z)
100{
101 fconcreteshield_x=concreteshield_x;
102 fconcreteshield_y=concreteshield_y;
103 fconcreteshield_z=concreteshield_z;
104}
105
106void MufluxTargetStation::SetAboveTargetShield(Double_t abovetargetshield_x, Double_t abovetargetshield_y,Double_t abovetargetshield_z)
107{
108 fabovetargetshield_x=abovetargetshield_x;
109 fabovetargetshield_y=abovetargetshield_y;
110 fabovetargetshield_z=abovetargetshield_z;
111}
112
113void MufluxTargetStation::SetAboveAbsorberShield(Double_t aboveabsorbershield_x, Double_t aboveabsorbershield_y, Double_t aboveabsorbershield_z)
114{
115 faboveabsorbershield_x=aboveabsorbershield_x;
116 faboveabsorbershield_y=aboveabsorbershield_y;
117 faboveabsorbershield_z=aboveabsorbershield_z;
118}
119
120void MufluxTargetStation::SetAboveAboveTargetShield(Double_t aboveabovetargetshield_y)
121{
122
123 faboveabovetargetshield_y=aboveabovetargetshield_y;
124
125}
126
127void MufluxTargetStation::SetFloor(Double_t floor_x, Double_t floor_y, Double_t floor_z)
128{
129 ffloor_x=floor_x;
130 ffloor_y=floor_y;
131 ffloor_z=floor_z;
132}
133
134void MufluxTargetStation::SetFloorT34(Double_t floorT34_x, Double_t floorT34_y, Double_t floorT34_z)
135{
136 ffloorT34_x=floorT34_x;
137 ffloorT34_y=floorT34_y;
138 ffloorT34_z=floorT34_z;
139}
140
141void MufluxTargetStation::SetFloorRPC(Double_t floorRPC_x, Double_t floorRPC_y, Double_t floorRPC_z)
142{
143 ffloorRPC_x=floorRPC_x;
144 ffloorRPC_y=floorRPC_y;
145 ffloorRPC_z=floorRPC_z;
146}
147
148
150{
151 TGeoVolume *top=gGeoManager->GetTopVolume();
152 InitMedium("tungstenmisis");
153 TGeoMedium *tungstenmisis =gGeoManager->GetMedium("tungstenmisis");
154 InitMedium("Concrete");
155 TGeoMedium *concrete =gGeoManager->GetMedium("Concrete");
156 InitMedium("iron");
157 TGeoMedium *iron =gGeoManager->GetMedium("iron");
158 InitMedium("H2O");
159 TGeoMedium *water =gGeoManager->GetMedium("H2O");
160 InitMedium("molybdenummisis");
161 TGeoMedium *momisis =gGeoManager->GetMedium("molybdenummisis");
162 InitMedium("air");
163 TGeoMedium *air = gGeoManager->GetMedium("air");
164 InitMedium("PlasticBase");
165 TGeoMedium *plasticbase = gGeoManager->GetMedium("PlasticBase");
166 InitMedium("steel");
167 TGeoMedium *steel = gGeoManager->GetMedium("steel");
168
169 TGeoVolume *tTarget = new TGeoVolumeAssembly("TargetArea");
170 //Double_t zPos = -2.09; //for front end endcap
171 Double_t zPos = 0.; //for front end endcap
172 Int_t slots = fnS;
173 slots = slots-1;
174
175 TGeoVolume *frontcap;
176 TGeoVolume *endcap;
177 TGeoVolume *targettube;
178 frontcap = gGeoManager->MakeTube("FrontCap", steel, 0, 15./2., 0.5/2.);
179 frontcap->SetLineColor(20);
180 endcap = gGeoManager->MakeTube("EndCap", steel, 0, 15./2., 0.5/2.);
181 endcap->SetLineColor(20);
182 targettube = gGeoManager->MakeTube("TargetTube", steel, fDiameter/2.+0.5, fDiameter/2.+1.1, fTargetLength/2.-0.5); //subtract 1 (front&endcaps)
183 targettube->SetLineColor(20);
184
185 TGeoVolume *target;
186 TGeoVolume *slit;
187
188 for (Int_t i=0; i<fnS; i++) {
189 TString nmi = "Target_"; nmi += i+1;
190 TString sm = "Slit_"; sm += i+1;
191 TGeoMedium *material;
192 if (fM.at(i)=="molybdenummisis") {material = momisis;};
193
194 if (fM.at(i)=="tungstenmisis") {material = tungstenmisis;};
195
196
197 if (fnS == 18) { // new target layout
198 target = gGeoManager->MakeTube(nmi, material, 0., fDiameter/2., fL.at(i)/2.);
199 }
200 else {
201 target = gGeoManager->MakeBox(nmi, material, fDiameter/2., fDiameter/2., fL.at(i)/2.);
202 }
203 if (fM.at(i)=="molybdenummisis") {
204 target->SetLineColor(28);
205 } else {target->SetLineColor(38);}; // silver/blue
206 tTarget->AddNode(target, 1, new TGeoTranslation(0, 0, zPos + fL.at(i)/2.) );
207 if (i < slots){
208 if(fnS == 18) {
209 slit = gGeoManager->MakeTube(sm, plasticbase, 0., fDiameter/2., fsl/2.);
210 }
211 else {
212 slit = gGeoManager->MakeBox(sm, water, fDiameter/2., fDiameter/2., fsl/2.);
213 }
214 slit->SetLineColor(7); // cyan
215 if (i==0) {
216 tTarget->AddNode(frontcap, 11, new TGeoTranslation(0, 0, zPos-0.2501) );
217 }
218 tTarget->AddNode(slit, 1, new TGeoTranslation(0, 0, zPos+fL.at(i)+fsl/2.) );
219 zPos+=fL.at(i)+fsl;
220 } else {
221 zPos+=fL.at(i);
222 if (fnS==18) {
223 tTarget->AddNode(targettube, 13, new TGeoTranslation(0, 0, fTargetLength/2-0.5));
224 tTarget->AddNode(endcap, 12, new TGeoTranslation(0, 0, fTargetLength-0.7499) );
225 }
226 zPos+=1.27;
227 }
228 }
229
230 TGeoVolume *absorber;
231 TGeoVolume *absorbercutout;
232 TGeoVolume *aboveabsorbershield;
233 TGeoVolume *ironshield;
234 TGeoVolume *concreteshield;
235 TGeoVolume *abovetargetshield;
236 TGeoVolume *aboveabovetargetshield;
237 TGeoVolume *floor;
238 TGeoVolume *floorT34;
239 TGeoVolume *floorRPC;
240
241 zPos = fTargetZ - fTargetLength/2.;
242 // Absorber made of iron
243 absorber = gGeoManager->MakeBox("Absorber", iron, fabsorber_x, fabsorber_y, fAbsorberLength/2.);
244 absorbercutout = gGeoManager->MakeBox("AbsorberCO", iron, fabsorbercutout_x, fabsorbercutout_y, fAbsorberLength/2.);
245
246 ironshield = gGeoManager->MakeBox("IronShield", iron, fironshield_x, fironshield_y, fironshield_z);
247 concreteshield = gGeoManager->MakeBox("ConcreteShield", concrete, fconcreteshield_x, fconcreteshield_y, fconcreteshield_z);
248 abovetargetshield = gGeoManager->MakeBox("AboveTargetShield", concrete, fabovetargetshield_x, fabovetargetshield_y, fabovetargetshield_z);
249 aboveabsorbershield = gGeoManager->MakeBox("AboveBsorberShield", concrete, faboveabsorbershield_x, faboveabsorbershield_y, faboveabsorbershield_z);
250 aboveabovetargetshield = gGeoManager->MakeBox("AboveAboveTargetShield", concrete, fAbsorberLength, faboveabovetargetshield_y, fAbsorberLength);
251 floor = gGeoManager->MakeBox("Floor", concrete, ffloor_x, ffloor_y, ffloor_z);
252 floorT34 = gGeoManager->MakeBox("FloorT34", concrete, ffloorT34_x, ffloorT34_y, ffloorT34_z);
253 floorRPC = gGeoManager->MakeBox("FloorRPC", concrete, ffloorRPC_x, ffloorRPC_y, ffloorRPC_z);
254
255 ironshield->SetLineColor(42); // brown / light red
256 concreteshield->SetLineColor(kGray); // gray
257 floor->SetLineColor(kGray); // gray
258 floorT34->SetLineColor(kGray); // gray
259 floorRPC->SetLineColor(kGray); // gray
260 aboveabsorbershield->SetLineColor(kGray); // gray
261 abovetargetshield->SetLineColor(kGray); // gray
262 aboveabovetargetshield->SetLineColor(kGray); // gray
263 frontcap->SetLineColor(29); // blue-ish
264 endcap->SetLineColor(29); // blue-ish
265 absorber->SetLineColor(42); // brown / light red
266
267 tTarget->AddNode(absorbercutout, 11, new TGeoTranslation(18., 97.5, fAbsorberZ-zPos));
268 tTarget->AddNode(absorber, 1, new TGeoTranslation(0., -27.5, fAbsorberZ-zPos));
269
270 //TGeoNode *node = GetNode("Absorber");
271 //tTarget->ReplaceNode(node,new TGeoTube(1.,2.,10.),new TGeoTranslation(0,-100.2,12),iron); //
272
273 tTarget->AddNode(floor, 7, new TGeoTranslation(0., -217., 500.));
274 tTarget->AddNode(floorT34, 8, new TGeoTranslation(0., -120., fAbsorberZ-zPos+771.125));
275 tTarget->AddNode(floorRPC, 9, new TGeoTranslation(0., -94.49, fAbsorberZ-zPos+1075.));
276
277 TGeoShapeAssembly* asmb = dynamic_cast<TGeoShapeAssembly*>(tTarget->GetShape());
278 Double_t totLength = asmb->GetDZ();
279
280 top->AddNode(tTarget, 1, new TGeoTranslation(0, 0,fTargetZ - fTargetLength/2. + totLength));
281 top->AddNode(ironshield, 2, new TGeoTranslation(-50., -47.5,fTargetZ - 83.49)); //3.6
282 top->AddNode(concreteshield, 3, new TGeoTranslation(85.,-47.5,fTargetZ - 83.49));
283 top->AddNode(abovetargetshield, 4, new TGeoTranslation(50.,77.5,fTargetZ - 83.49));
284 top->AddNode(aboveabovetargetshield, 5, new TGeoTranslation(-50.,165.0,fAbsorberZ-zPos-624.5));
285 top->AddNode(aboveabsorbershield, 6, new TGeoTranslation(0.,165.0,-26.48));
286
287 cout << "target and absorber positioned at " << fTargetZ <<" "<< fAbsorberZ << " m"<< endl;
288
289}
290
std::vector< std::string > fM
void SetAbsorberCutout(Double_t absorbercutout_x, Double_t absorbercutout_y)
void SetFloorRPC(Double_t floorRPC_x, Double_t floorRPC_y, Double_t floorRPC_z)
void SetAboveTargetShield(Double_t abovetargetshield_x, Double_t abovetargetshield_y, Double_t abovetargetshield_z)
void SetFloorT34(Double_t floorT34_x, Double_t floorT34_y, Double_t floorT34_z)
void SetIronShield(Double_t ironshield_x, Double_t ironshield_y, Double_t ironshield_z)
void SetAboveAboveTargetShield(Double_t aboveabovetargetshield_y)
ClassDef(MufluxTargetStation, 4) private Double_t fabsorber_y
void SetConcreteShield(Double_t concreteshield_x, Double_t concreteshield_y, Double_t concreteshield_z)
void SetIronAbsorber(Double_t absorber_x, Double_t absorber_y)
void SetFloor(Double_t floor_x, Double_t floor_y, Double_t floor_z)
void SetAboveAbsorberShield(Double_t aboveabsorbershield_x, Double_t aboveabsorbershield_y, Double_t aboveabsorbershield_z)
Int_t InitMedium(const char *name)
std::vector< float > fL
ClassImp(ecalContFact) ecalContFact