diff --git a/macro/rich/Import_GDML_Export_ROOT.c b/macro/rich/Import_GDML_Export_ROOT.c index c4a0a31e69fa4c47f0ed8fc54f7838a8f8d6d3dc..64ed443c7bd167f64c5bfeb510ed7f1d7491c4aa 100644 --- a/macro/rich/Import_GDML_Export_ROOT.c +++ b/macro/rich/Import_GDML_Export_ROOT.c @@ -1,30 +1,105 @@ void Import_GDML_Export_ROOT() { - // we need to use latest root version to work with gdml geometry - // system(string("source /usr/local/Cellar/root/6.20.04_1/bin/thisroot.sh").c_str()); - // For v17a geometries one need to use root5, one can use installation on lustre - //"source /cvmfs/fairroot.gsi.de/fairsoft/may16_root5/bin/thisroot.sh" + TString richGeoFilename = "rich_v21a.gdml"; + cout << "Importing '" << richGeoFilename << "'." << endl; - TString richGeoFilename = "rich_v17a_1e_pcarb_bcarb.gdml"; + // Load FairRunSim to ensure the correct unit system + FairRunSim* sim = new FairRunSim(); - TGeoManager* gdml = new TGeoManager("gdml", "FAIRGeom"); + // Since the GDML file does not contain any information about the materials beside the + // material name, the material have to be created prior to the import of the GDML + // geometry from the media.geo file. This is done using the FairRoot tolls - cout << "Importing '" << richGeoFilename << "'." << endl; + // ------- Load media from media file ----------------------------------- + FairGeoLoader* geoLoad = new FairGeoLoader("TGeo", "FairGeoLoader"); + FairGeoInterface* geoFace = geoLoad->getGeoInterface(); + TString geoPath = gSystem->Getenv("VMCWORKDIR"); + TString medFile = geoPath + "/geometry/media.geo"; + geoFace->setMediaFile(medFile); + geoFace->readMedia(); + + // ----------------- Get and create the required media ----------------- + FairGeoMedia* geoMedia = geoFace->getMedia(); + FairGeoBuilder* geoBuild = geoLoad->getGeoBuilder(); + + // ---> CsI + FairGeoMedium* mCsI = geoMedia->getMedium("CsI"); + if (!mCsI) Fatal("Main", "FairMedium CsI not found"); + geoBuild->createMedium(mCsI); + TGeoMedium* CsI = gGeoManager->GetMedium("CsI"); + if (!CsI) Fatal("Main", "Medium CsI not found"); + + // ---> iron + FairGeoMedium* miron = geoMedia->getMedium("iron"); + if (!miron) Fatal("Main", "FairMedium iron not found"); + geoBuild->createMedium(miron); + TGeoMedium* iron = gGeoManager->GetMedium("iron"); + if (!iron) Fatal("Main", "Medium iron not found"); + + // ---> vacuum + FairGeoMedium* mvacuum = geoMedia->getMedium("vacuum"); + if (!mvacuum) Fatal("Main", "FairMedium vacuum not found"); + geoBuild->createMedium(mvacuum); + TGeoMedium* vacuum = gGeoManager->GetMedium("vacuum"); + if (!vacuum) Fatal("Main", "Medium vacuum not found"); + + // ---> kapton + FairGeoMedium* mkapton = geoMedia->getMedium("kapton"); + if (!mkapton) Fatal("Main", "FairMedium kapton not found"); + geoBuild->createMedium(mkapton); + TGeoMedium* kapton = gGeoManager->GetMedium("kapton"); + if (!kapton) Fatal("Main", "Medium kapton not found"); + + // ---> aluminium + FairGeoMedium* mAluminium = geoMedia->getMedium("aluminium"); + if (!mAluminium) Fatal("Main", "FairMedium aluminium not found"); + geoBuild->createMedium(mAluminium); + TGeoMedium* aluminium = gGeoManager->GetMedium("aluminium"); + if (!aluminium) Fatal("Main", "Medium aluminium not found"); + + // ---> PMTglass + FairGeoMedium* mPMTglass = geoMedia->getMedium("PMTglass"); + if (!mPMTglass) Fatal("Main", "FairMedium PMTglass not found"); + geoBuild->createMedium(mPMTglass); + TGeoMedium* PMTglass = gGeoManager->GetMedium("PMTglass"); + if (!PMTglass) Fatal("Main", "Medium PMTglass not found"); + + // ---> RICHglass + FairGeoMedium* mRICHglass = geoMedia->getMedium("RICHglass"); + if (!mRICHglass) Fatal("Main", "FairMedium RICHglass not found"); + geoBuild->createMedium(mRICHglass); + TGeoMedium* RICHglass = gGeoManager->GetMedium("RICHglass"); + if (!RICHglass) Fatal("Main", "Medium RICHglass not found"); + + // ---> RICHgas_CO2_dis + FairGeoMedium* mRICHgas_CO2_dis = geoMedia->getMedium("RICHgas_CO2_dis"); + if (!mRICHgas_CO2_dis) Fatal("Main", "FairMedium RICHgas_CO2_dis not found"); + geoBuild->createMedium(mRICHgas_CO2_dis); + TGeoMedium* RICHgas_CO2_dis = gGeoManager->GetMedium("RICHgas_CO2_dis"); + if (!RICHgas_CO2_dis) Fatal("Main", "Medium RICHgas_CO2_dis not found"); + + // ---> RICHgas_CO2_dis+ + FairGeoMedium* mRICHgas_CO2_disp = geoMedia->getMedium("RICHgas_CO2_dis+"); + if (!mRICHgas_CO2_disp) Fatal("Main", "FairMedium RICHgas_CO2_dis+ not found"); + geoBuild->createMedium(mRICHgas_CO2_disp); + TGeoMedium* RICHgas_CO2_disp = gGeoManager->GetMedium("RICHgas_CO2_dis+"); + if (!RICHgas_CO2_disp) Fatal("Main", "Medium RICHgas_CO2_dis+ not found"); TGDMLParse parser; // Define your input GDML file HERE TGeoVolume* gdmlTop = parser.GDMLReadFile(richGeoFilename); TGeoVolume* rootTop = new TGeoVolumeAssembly("TOP"); + gdmlTop->Print(); gGeoManager->SetTopVolume(rootTop); // Starting from the version v18a position is defined inside the GDML file // Define your position HERE // Z coordinate for v16a = 270, for v17a = 258.75, for v18a = 0. TGeoRotation* rot = new TGeoRotation("rot", 0., 0., 0.); - TGeoCombiTrans* posrot = new TGeoCombiTrans(0., 0., 258.75, rot); // v16a - 270, v17a - 258.75, v18a - 0 + TGeoCombiTrans* posrot = new TGeoCombiTrans(0., 0., 218.75, rot); // v16a - 270, v17a - 258.75, v18a - 0 rootTop->AddNode(gdmlTop, 1, posrot); @@ -47,8 +122,17 @@ void Import_GDML_Export_ROOT() cout << "Exporting '" << richGeoOutFilename << "'." << endl; - // Define you output ROOT file HERE - TFile* outfile = new TFile(richGeoOutFilename, "RECREATE"); - rootTop->Write(); + // Export RICH geometry to the output ROOT file + gdmlTop->Export(richGeoOutFilename); + // Write the transformation matrix into the output file + TFile* outfile = new TFile(richGeoOutFilename, "UPDATE"); + posrot->Write(); outfile->Close(); + + // create medialist for this geometry + TString createmedialist = gSystem->Getenv("VMCWORKDIR"); + createmedialist += "/macro/geometry/create_medialist.C"; + std::cout << "Loading macro " << createmedialist << std::endl; + gROOT->LoadMacro(createmedialist); + gROOT->ProcessLine("create_medialist(\"\", false)"); }