Hi Andrei, I would like to convert TGeometry detector desription to TGeoManager. For this purpose I have written the (not yet complete) script (see attach.). May be it is not very efficient but I hope it does the job in the first approximation. I would be very grateful if you can point out the way to speed up it or optimize volume construction. The first problem I have encountered that resulting geometry is much slower then TGeometry description: I've tryed na49.root geometry file created by tutorial/geometry.C. And then I try to draw it. The second problem: for really big detectors CloseGeometry caused silent ROOT crash on 'Building caches for nodes and matrix' without any complain. ...................... Fixing runtime shapes... Counting nodes... Voxelizing... Building caches for nodes and matrices... bash$ ....................... May be this problem is connected with not very efficient volume filling. So if the first issue will be solved then other will vanish. Best regards, Stanislav. /* ALPHA VERSION!!!! DON'T USE UNLESS YOU HAVE TO!! Try converts TGeometry object int TGeoManager. To use, load libGeom.so, compile by ACLiC, load TGeometry file, and call convert(tgeometry,"newfilname.root") Author: S. Nesterov <Stanislav.Nesterov@cern.ch> */ #include <TGeoManager.h> #include <TGeometry.h> #include <TNode.h> #include <TGeoVolume.h> #include <TGeoMatrix.h> #include <TGeoMedium.h> #include <TGeoMaterial.h> #include <TMaterial.h> #include <TMixture.h> #include <TShape.h> #include <TString.h> #include <TROOT.h> #include <TBRIK.h> #include <TTUBE.h> #include <TCONE.h> #include <TTRAP.h> #include <TTRD1.h> #include <TPGON.h> #include <TPCON.h> #include <TPARA.h> #include <TTUBS.h> #include <TCONS.h> #include <TELTU.h> #include <TGeoEltu.h> #include <TGeoPara.h> #include <TGeoPgon.h> #include <TGeoPcon.h> #include <TGeoTrd1.h> #include <TGeoBBox.h> #include <TGeoTube.h> #include <TGeoCone.h> #include <TGeoArb8.h> #include <Riostream.h> #include <TFile.h> TGeoManager *gGeoMan = 0; TGeoShape *makeshape(TShape*shapa){ TString cn(shapa->ClassName()); if(cn=="TBRIK"){ TBRIK * bri = (TBRIK*)shapa; return new TGeoBBox(bri->GetDx(),bri->GetDy(),bri->GetDz()); } if(cn=="TTUBE"){ TTUBE *tb=(TTUBE*)shapa; return new TGeoTube(tb->GetRmin(),tb->GetRmax(),tb->GetDz()); } if(cn=="TCONE"){ TCONE *tc=(TCONE*)shapa; return new TGeoCone(tc->GetDz(),tc->GetRmin(), tc->GetRmax(),tc->GetRmin2(),tc->GetRmax2()); } if(cn=="TTRAP"){ TTRAP *trp=(TTRAP*)shapa; return new TGeoTrap(trp->GetDz(),trp->GetDx(),trp->GetDy(), trp->GetH1(),trp->GetBl1(),trp->GetTl1(), trp->GetAlpha1(),trp->GetH2(),trp->GetBl2(), trp->GetTl2(),trp->GetAlpha2()); } if(cn=="TTRD1"){ TTRD1 *trd=(TTRD1*)shapa; return new TGeoTrd1(trd->GetDx(),trd->GetDx2(),trd->GetDy(),trd->GetDz()); } if(cn=="TPGON"){ TPGON *pgn=(TPGON*)shapa; Int_t nz = pgn->GetNz(); TGeoPgon*gpg= new TGeoPgon(pgn->GetPhi1(),pgn->GetDhi1(), pgn->GetNdiv(),nz); Float_t *rmin = pgn->GetRmin(); Float_t *rmax = pgn->GetRmax(); Float_t *dz = pgn->GetDz(); for(int i=0;i<nz;i++){ gpg->DefineSection(i,dz[i],rmin[i],rmax[i]); } return gpg; } if(cn=="TPCON"){ TPCON *pgn=(TPCON*)shapa; Int_t nz = pgn->GetNz(); TGeoPcon *gpg = new TGeoPcon(pgn->GetPhi1(),pgn->GetDhi1(),nz); Float_t *rmin = pgn->GetRmin(); Float_t *rmax = pgn->GetRmax(); Float_t *dz = pgn->GetDz(); for(int i=0;i<nz;i++){ gpg->DefineSection(i,dz[i],rmin[i],rmax[i]); } return gpg; } if(cn=="TPARA"){ TPARA *par=(TPARA*)shapa; return new TGeoPara(par->GetDx(),par->GetDy(),par->GetDz(), par->GetAlpha(),par->GetTheta(),par->GetPhi()); } if(cn=="TTUBS"){ TTUBS *tbs=(TTUBS*)shapa; return new TGeoTubeSeg(tbs->GetRmin(),tbs->GetRmax(),tbs->GetDz(), tbs->GetPhi1(),tbs->GetPhi2()); } if(cn=="TCONS"){ TCONS *tcs=(TCONS*)shapa; return new TGeoConeSeg(tcs->GetDz(),tcs->GetRmin(),tcs->GetRmax(), tcs->GetRmin2(),tcs->GetRmax2(), tcs->GetPhi1(),tcs->GetPhi2()); } if(cn=="TELTU"){ TELTU *tut=(TELTU*)shapa; return new TGeoEltu(tut->GetRmax(),tut->GetRmax()*tut->GetAspectRatio(), tut->GetDz()); }/* if(cn=="THYPE"){ THYPE *hyp=(THYPE*)shapa; } if(cn=="TGTRA"){ TGTRA *gtr=(TGTRA*)shapa; } if(cn=="TTRD2"){ TTRD2 *td2=(TTRD2*)shapa; } if(cn=="TXTRU"){ TXTRU *xtr=(TXTRU*)shapa; } */ cerr<<"Non-implemented shape: "<<cn<<endl; return 0; if(cn=="TCTUB"){ // TCTUB *tct=(TCTUB*)shapa; } } void create_volumes(TNode *nd=0,TGeoVolume* volm=0){ if(!nd ) return; if (!volm) return; TIter iter(nd->GetListOfNodes()); cout << ":"<<nd->GetName()<<"("; TNode *next = 0; while((next = (TNode*)iter())) { // Search for translation and rotation transformations TRotMatrix *mtr = next->GetMatrix(); TGeoRotation *grot = 0; TGeoMatrix *gmat = 0; TGeoTranslation *gtran = new TGeoTranslation(next->GetX(),next->GetY(), next->GetZ()); if(mtr->GetType()){ // if the matrix is not identity grot = new TGeoRotation(mtr->GetName()); grot->SetMatrix(mtr->GetMatrix()); gmat = new TGeoCombiTrans(next->GetX(),next->GetY(),next->GetZ(), grot); // gmat = new TGeoCombiTrans(*gtran,*grot); } else gmat = gtran; TGeoVolume *curvol = gGeoMan->GetVolume(next->GetShape()->GetName()); if(!curvol){ cerr<<"No such shape!!: "<<next->GetShape()->GetName()<<endl; } if(next->GetVisibility()>0) curvol->SetVisibility(kTRUE); else curvol->SetVisibility(kFALSE); create_volumes(next,curvol); curvol->SetNumber(curvol->GetNumber()+1); volm->AddNode(curvol,curvol->GetNumber(),gmat); } cout<<")"; } void convert(TGeometry *geom=0,char *name="tmp.root"){ // gSystem->Load("libGeom.so"); TFile stmp(name,"recreate"); gGeoMan = new TGeoManager("geoman","Geomanager"); if(!geom) return; cout<<"Defines media"<<endl; TIter maxt(geom->GetListOfMaterials()); TMaterial *mata = 0; while ((mata = (TMaterial*)maxt())){ TGeoMaterial *geomat = 0; if(mata->ClassName() != "TGeoMixture") { geomat = new TGeoMaterial(mata->GetName(),mata->GetA(), mata->GetZ(),mata->GetDensity(), mata->GetRadLength(), mata->GetInterLength()); } else { TMixture *matax = (TMixture*)mata; geomat = new TGeoMixture(matax->GetName(),matax->GetNmixt()); for(int i=0;i<matax->GetNmixt();i++) ((TGeoMixture*)geomat)->DefineElement(i,matax->GetAmixt()[i],matax->GetZmixt()[i], matax->GetWmixt()[i]); } TGeoMedium *geomed = new TGeoMedium(mata->GetName(),mata->GetNumber(), geomat); geomed = 0; } cout<<"Defines shapes"<<endl; TIter voxt(geom->GetListOfShapes()); TShape *shp = 0; while ((shp = (TShape*)voxt())){ TGeoMedium *gemed = gGeoMan->GetMedium(shp->GetMaterial()->GetName()); TGeoVolume *ngevol = new TGeoVolume(shp->GetName(),makeshape(shp), gemed); ngevol->SetLineColor(shp->GetLineColor()); } cout<<"Defines volumes"<<endl; TIter noxt(geom->GetListOfNodes()); TNode *nd = (TNode*)noxt(); TGeoMaterial *va = new TGeoMaterial("Vacuum",1,0,0,0); TGeoMedium *vac = new TGeoMedium("Vacuum",1,va); TGeoShape *shap = makeshape(nd->GetShape()); if(!shap) { cout<<"Shape is not implemented"<<endl; return; } cout<<"Create hierarchy"<<endl; TGeoVolume *top = new TGeoVolume("TOP",shap,vac); top->SetVisibility(kFALSE); gGeoMan->SetTopVolume(top); /* // just debuggin lines TGeoVolume*gl = gGeoMan->GetVolume("SLGC"); top->AddNode(gl,1, gGeoIdentity); */ // Main recursive procedure to fill geometry volume // VERY CPU consuming procedure create_volumes(nd,top); // Closing geometry - quite lengthy gGeoMan->CloseGeometry(); gGeoMan->SetVisLevel(4); gGeoMan->Write(); stmp.Close(); }
This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:13 MET