29 {163.2 * 0.25, -163.2 * 0.25}, {163.2 * 0.25, -163.2 * 0.25},
30 {163.2 * 0.25, -163.2 * 0.25}, {163.2 * 0.25, -163.2 * 0.25}};
32 {0.0, 0.0}, {0.0, 0.0}, {0.0, 0.0}};
34 {0.0, 0.0}, {0.0, 0.0}, {0.0, 0.0}};
88 input.open(in.
Data(), ios::in);
90 FILE* output = fopen(out.
Data(),
"w");
92 Int_t stat = -1, mod = -1;
93 Int_t statCounter = -1;
95 for (
string line; getline(input, line);) {
98 if (str.Contains(
"<Module")) {
100 if (statCounter % 2 == 0)
105 mis[stat][mod][1], mis[stat][mod][2]);
106 str.ReplaceAll(
"xShift=\"0.0\" yShift=\"0.0\" zShift=\"0.0\"", tmp);
111 fprintf(output,
"%s\n", str.Data());
118 FILE* file = fopen(
"introducedMisalign.dat",
"w");
124 misAlign[iStat][iMod] =
new Double_t[3];
125 for (
Int_t iPar = 0; iPar < 3; iPar++) {
126 misAlign[iStat][iMod][iPar] =
gRandom->Gaus(0., (iPar == 0) ? sigX : (iPar == 1) ? sigY : sigZ);
127 fprintf(file,
"Stat %d Mod %d Par %d %G\n", iStat, iMod, iPar, misAlign[iStat][iMod][iPar]);
134 TFile* f =
new TFile(
"misAlignment.root",
"RECREATE");
135 TTree* outTree =
new TTree(
"cbmsim",
"cbmsim");
137 outTree->
Branch(
"BmnGemAlignCorrections", &misalign);
141 iStat, iMod,
TVector3(misAlign[iStat][iMod][0], misAlign[iStat][iMod][1], misAlign[iStat][iMod][2]));
153 FairGeoMedium* mAir = geoMedia->getMedium(
"air");
155 Fatal(
"Main",
"FairMedium air not found");
156 geoBuild->createMedium(mAir);
159 Fatal(
"Main",
"Medium air not found");
162 FairGeoMedium* mCarbon = geoMedia->getMedium(
"carbon");
164 Fatal(
"Main",
"FairMedium carbon not found");
165 geoBuild->createMedium(mCarbon);
168 Fatal(
"Main",
"Medium carbon not found");
171 FairGeoMedium* mFiberGlass = geoMedia->getMedium(
"fiberglass");
173 Fatal(
"Main",
"FairMedium fiberglass not found");
174 geoBuild->createMedium(mFiberGlass);
177 Fatal(
"Main",
"Medium fiberglass not found");
180 FairGeoMedium* mArCO27030 = geoMedia->getMedium(
"arco27030");
182 Fatal(
"Main",
"FairMedium arco27030 not found");
183 geoBuild->createMedium(mArCO27030);
186 Fatal(
"Main",
"Medium arco27030 not found");
192 TString geoVersion =
"RunSpring2018_misAlign",
193 TString xmlMisalign =
"GemRunSpring2018_misAlign.xml")
209 const TString xmlPath = gPath +
"/parameters/gem/XMLConfigs/";
213 const TString geoDetectorName =
"GEMS";
214 const TString geoDetectorVersion = geoVersion;
215 const TString geoFileName = gPath +
"/geometry/" + geoDetectorName +
"_" + geoDetectorVersion +
".root";
218 FairGeoLoader* geoLoad =
new FairGeoLoader(
"TGeo",
"FairGeoLoader");
219 FairGeoInterface* geoFace = geoLoad->getGeoInterface();
222 TString medFile = gPath +
"/geometry/media.geo";
223 geoFace->setMediaFile(medFile);
224 geoFace->readMedia();
225 FairGeoMedia* geoMedia = geoFace->getMedia();
226 FairGeoBuilder* geoBuild = geoLoad->getGeoBuilder();
233 gGeoMan->SetName(geoDetectorName +
"_geom");
249 Int_t stationNum = 0;
284 GEMS->AddNode(station, 0, station_transform);
289 Int_t stationNum = 1;
324 GEMS->AddNode(station, 0, station_transform);
329 Int_t stationNum = 2;
364 GEMS->AddNode(station, 0, station_transform);
369 Int_t stationNum = 3;
404 GEMS->AddNode(station, 0, station_transform);
409 Int_t stationNum = 4;
444 GEMS->AddNode(station, 0, station_transform);
449 Int_t stationNum = 5;
484 GEMS->AddNode(station, 0, station_transform);
492 gGeoMan->CheckOverlaps(0.0001);
497 TFile* geoFile =
new TFile(geoFileName,
"RECREATE");
517 TGeoShape* moduleS =
new TGeoBBox(
"moduleS", xsize * 0.5, ysize * 0.5, zsize * 0.5);
526 Fatal(
"Main",
"Invalid medium for sensitive modules!");
547 TGeoVolume* horizontal_frameV =
new TGeoVolume(frame_name +
"_horizontal_frameV", horizontal_frameS);
552 vertical_frameV->
SetMedium(frame_medium);
553 horizontal_frameV->
SetMedium(frame_medium);
555 Fatal(
"Main",
"Invalid medium for frames!");
559 Fatal(
"Main",
"Invalid medium for frames!");
581 composite_frameV->
AddNode(vertical_frameV, 0, left_vertical_frame_position);
582 composite_frameV->
AddNode(vertical_frameV, 1, right_vertical_frame_position);
583 composite_frameV->
AddNode(horizontal_frameV, 0, bottom_horizontal_frame_position);
584 composite_frameV->
AddNode(horizontal_frameV, 1, lower_horizontal_frame_position);
586 return composite_frameV;
597 TGeoShape* module_partS =
new TGeoBBox(
"module_partS", xsize * 0.5, ysize * 0.5, zsize * 0.5);
618 Fatal(
"Main",
"Invalid medium for sensitive modules!");
646 new TGeoVolume(frame_name +
"_horizontal_upper_frameV", horizontal_upper_frameS);
648 new TGeoVolume(frame_name +
"_horizontal_bottom_frameV", horizontal_bottom_frameS);
653 vertical_frameV->
SetMedium(frame_medium);
654 horizontal_upper_frameV->
SetMedium(frame_medium);
655 horizontal_bottom_frameV->
SetMedium(frame_medium);
657 Fatal(
"Main",
"Invalid medium for frames!");
661 Fatal(
"Main",
"Invalid medium for frames!");
681 composite_frameV->
AddNode(vertical_frameV, 0, left_vertical_frame_position);
682 composite_frameV->
AddNode(horizontal_upper_frameV, 0, upper_horizontal_frame_position);
683 composite_frameV->
AddNode(horizontal_bottom_frameV, 0, bottom_horizontal_frame_position);
685 return composite_frameV;
void Fatal(const char *location, const char *msgfmt,...)
R__EXTERN TGeoManager * gGeoManager
R__EXTERN TRandom * gRandom
R__EXTERN TSystem * gSystem
static Int_t GetColor(const char *hexcolor)
void Close(Option_t *option="") override
void ReflectX(Bool_t leftside, Bool_t rotonly=kFALSE) override
void SetTranslation(const TGeoTranslation &tr)
virtual void RegisterYourself()
const char * GetName() const override
void SetVisContainers(Bool_t flag=kTRUE) override
virtual TGeoNode * AddNode(TGeoVolume *vol, Int_t copy_no, TGeoMatrix *mat=nullptr, Option_t *option="")
void SetTransparency(Char_t transparency=0)
virtual void SetMedium(TGeoMedium *medium)
void SetLineColor(Color_t lcolor) override
const char * GetName() const override
Int_t GetEntriesFast() const
virtual Int_t Write(const char *name=nullptr, Int_t option=0, Int_t bufsize=0)
const char * Data() const
static TString Format(const char *fmt,...)
static TString Itoa(Int_t value, Int_t base)
Int_t Write(const char *name=nullptr, Int_t option=0, Int_t bufsize=0) const override
virtual Int_t Branch(const char *folder, Int_t bufsize=32000, Int_t splitlevel=99)
const Double_t dYFrame_Station163x45
const Double_t dXFrame_Station66x41
const Double_t dZFrame_Station66x41
const Double_t ZModuleSize_Station66x41
const Double_t YStationPositions[NStations]
const Double_t dYFrame_Station66x41
const Double_t ZModuleSize_Station163x45
const Double_t dXFrame_Station163x45
const Double_t YModuleSize_Station163x45
Double_t XModuleShifts[NStations][NMaxModules]
const Double_t dZFrame_Station163x45
TGeoVolume * CreateModule_Station66x41(TString module_name, Double_t xsize, Double_t ysize, Double_t zsize)
TGeoVolume * CreateFrameForModule_Station163x45(TString frame_name, Double_t dx, Double_t dy, Double_t dz, Double_t hole_radius)
void create_rootgeom_GEMS_RunSpring2018_misAlign(Double_t sigX, Double_t sigY, Double_t sigZ, TString geoVersion="RunSpring2018_misAlign", TString xmlMisalign="GemRunSpring2018_misAlign.xml")
TGeoVolume * CreateStation(TString station_name)
const Double_t ZStationPositions[NStations]
Double_t ZModuleShifts[NStations][NMaxModules]
TGeoMedium * pMedArCO27030
TGeoVolume * CreateModule_Station163x45(TString module_name, Double_t xsize, Double_t ysize, Double_t zsize, Double_t hole_radius)
const Double_t YModuleSize_Station66x41
const Double_t XModuleSize_Station163x45
Double_t *** generateMisalign(Double_t, Double_t, Double_t)
void DefineRequiredMedia(FairGeoMedia *geoMedia, FairGeoBuilder *geoBuild)
const Double_t XModuleSize_Station66x41
TGeoMedium * pMedFiberGlass
const Double_t XStationPositions[NStations]
TGeoVolume * CreateFrameForModule_Station66x41(TString frame_name, Double_t dx, Double_t dy, Double_t dz)
void createNewXML(Double_t ***, TString, TString)
Double_t YModuleShifts[NStations][NMaxModules]