#include "PndFtsMapCreator.h" #include "PndFtsTube.h" #include "PndGeoFtsPar.h" #include "FairGeoNode.h" #include "FairGeoVolume.h" #include "FairGeoTransform.h" #include "FairGeoVector.h" #include "FairGeoRotation.h" #include "FairGeoTube.h" #include "TGeoTube.h" #include "TVector3.h" #include "TObjArray.h" #include "TString.h" #include "TGeoVolume.h" #include "TGeoTube.h" #include "TClonesArray.h" #include using namespace std; PndFtsMapCreator::PndFtsMapCreator(){} // to use in PndFts PndFtsMapCreator::PndFtsMapCreator(Int_t geoType){ fGeoType = geoType; if(fGeoType != 1) cout << "geometry not supported by map" << endl; // CHECK } // crete geometry from parameters file PndFtsMapCreator::PndFtsMapCreator(PndGeoFtsPar *ftsPar) { fFtsParameters = ftsPar; // set general par SetGeneralParameters(); // choose geometry type fGeoType = ftsPar->GetGeometryType(); // classic, optimized, average, detailed, CAD if(fGeoType != 1) cout << "geometry not supported by map" << endl; // CHECK } PndFtsMapCreator::~PndFtsMapCreator(){} void PndFtsMapCreator::SetGeneralParameters() { // CHECK whether it depends on geometry or not fTubeInRad = fFtsParameters->GetTubeInRad(); // tube inner radius fTubeOutRad = fFtsParameters->GetTubeOutRad(); // tube outer radius } // during simulation (for tubeID) Int_t PndFtsMapCreator::GetTubeIDFromPath(TString path) { if(fGeoType == 1) return GetTubeIDFromPathGeoType1(path); return -999; } // during parameters reading Int_t PndFtsMapCreator::GetTubeIDFromName(TString name){ if(fGeoType == 1) return GetTubeIDFromNameGeoType1(name); return -999; } // retrieve parameters from tube ID PndFtsTube * PndFtsMapCreator::GetTubeFromTubeID(Int_t tubeid) { if(fGeoType == 1) return GetTubeFromTubeIDGeoType1(tubeid); return NULL; } // fill the tube map at the beginning of the run TClonesArray * PndFtsMapCreator::FillTubeArray() { std::cout<<"PndFtsMapCreator::FillTubeArray##########fGeoType="<GetName(); // if(fGeoType == 1) return GetNameFromTubeIDGeoType1(tubeid); // this can' t work without the difference copy/solo anymore } // ===== GEO TYPE 1 ===== // sensitive volume is gas // when reading the parameters we use fts01tube to retrieve geometrical information // OK // during simulation Int_t PndFtsMapCreator::GetTubeIDFromPathGeoType1(TString path){ TString tmpstring = GetNameFromPathGeoType1(path); return GetTubeIDFromNameGeoType1(tmpstring); } Int_t PndFtsMapCreator::GetChamberIDFromPath(TString path){ TString pathstring=path; if(pathstring.Contains("fts01assembly_1")){ //std::cout<<"chamber 1"<192){ tube=tube-192; i++; } } if(chamberid==5){ i=i+32; while(tube>400){ tube=tube-400; i++; } } if(chamberid==6){ i=i+40; while(tube>592){ tube=tube-592; i++; } } return i; } Int_t PndFtsMapCreator::GetTubeIDTot(Int_t chamberid, Int_t layerid, Int_t tubeid,TString path ){ Int_t chamber=chamberid; Int_t layer=layerid; Int_t tubeID=tubeid; TString tmpstring=path; Int_t tube=0; Int_t totTubeID=0; if(chamberid==1){tube=tubeID;} if(chamberid==2){tube=tubeID+1024;} //if(chamberid==3){tube=tubeID+2240;} //2048 if(chamberid==3){ if(layer==17||layer==18){tube=tubeID+2240;} if(layer==19||layer==20){tube=tubeID+2648;} if(layer==21||layer==22){tube=tubeID+3056;} if(layer==23||layer==24){tube=tubeID+3464;} } if(chamberid==4){ if(layer==25||layer==26){tube=tubeID+3872;} if(layer==27||layer==28){tube=tubeID+4280;} if(layer==29||layer==30){tube=tubeID+4688;} if(layer==31||layer==32){tube=tubeID+5096;} } //if(chamberid==4){tube=tubeID+3584;} if(chamberid==5){tube=tubeID+5120;} if(chamberid==6){tube=tubeID+8320;} //up e down hanno lo stesso id-> devo slittare il tutto per dare a ciascun tubo //un suo numero identificativo if(chamber==1 || chamberid==2){ if(tmpstring.Contains("down") || tube>70){ if(tmpstring.Contains("down_1/fts")){totTubeID=tube+58;} totTubeID=tube+12*layer; } if(tmpstring.Contains("up")){ if(tmpstring.Contains("up_1/fts")){totTubeID=tube+58;} totTubeID=tube+12*(layer-1); } if(tube<=58){totTubeID=tube;} } if(chamberid==3 || chamberid==4){ if(tmpstring.Contains("down_1/fts")){totTubeID=tube+90+12;} if(tmpstring.Contains("up_1/fts")){totTubeID=tube+90;} if(!tmpstring.Contains("down") && !tmpstring.Contains("up")){ if(layer%2==1 && tubeid<=90){totTubeID=tube;} //odd layer if(layer%2==1 && tubeid>90){totTubeID=tube+12;} if(layer%2!=1 && tubeid<=90){totTubeID=tube+12;} if(layer%2!=1 && tubeid>90){totTubeID=tube+24;} } if(tmpstring.Contains("down")&& !tmpstring.Contains("down_1/fts")){ if(layer%2){totTubeID=tube+12;} //odd layer else{totTubeID=tube+24;} } if(tmpstring.Contains("up")&& !tmpstring.Contains("up_1/fts")){ if(layer%2){totTubeID=tube;} //odd layer else{totTubeID=tube+12;} } } if(chamber==5){ if(tmpstring.Contains("down") || tube>5329){ if(tmpstring.Contains("down_1/fts")){totTubeID=tube+191;} totTubeID=tube+(12*32)+(18*(layer-32)); } if(tmpstring.Contains("up")){ if(tmpstring.Contains("up_1/fts")){totTubeID=tube+191;} totTubeID=tube+(12*32)+(18*(layer-33)); } if(tube<=5311){totTubeID=tube+(12*32);} } if(chamber==6){ if(tmpstring.Contains("down") || tube>8625){ if(tmpstring.Contains("down_1/fts")){totTubeID=tube+287;} totTubeID=tube+(12*32)+(18*(layer-32)); } if(tmpstring.Contains("up")){ if(tmpstring.Contains("up_1/fts")){totTubeID=tube+287;} totTubeID=tube+(12*32)+(18*(layer-33)); } if(tube<=8607){totTubeID=tube+(12*32)+(18*8);} } return totTubeID; } // OK // name "#" TString PndFtsMapCreator::GetNameFromTubeIDGeoType1(Int_t tubeid, Bool_t isCopy) { // two possibilities: // copy : XXX --> fts01tube#XXX // solo : XXX --> fts01tubeXXX TString tmpstring; tmpstring += tubeid ; if(isCopy == kTRUE) { tmpstring.Prepend("fts01tube#"); } else { tmpstring.Prepend("fts01tube"); } return tmpstring; } PndFtsTube * PndFtsMapCreator::GetTubeFromTubeIDGeoType1(Int_t tubeid) { std::cout<<"PndFtsMapCreator::GetTubeFromTubeIDGeoType1????????"<GetGeoPassiveNodes(); Bool_t isCopy = copy_map[tubeid]; TString tubename = GetNameFromTubeIDGeoType1(tubeid, isCopy); FairGeoNode *pnode = (FairGeoNode*) geoPassNodes->FindObject(tubename); if(!pnode) { cout << "PndFtsMapCreator::GetTubeFromTubeIDGeoType1: tube " << tubename << " not found (nor as a copy)" << endl; return NULL; } FairGeoTransform *lab = pnode->getLabTransform(); FairGeoVector tra = lab->getTransVector(); FairGeoRotation rot = lab->getRotMatrix(); // geometrical info double x = tra.getX()/10.; // in cm double y = tra.getY()/10.; // in cm double z = tra.getZ()/10.; // in cm double r[3][3]; for(int i = 0; i < 3; i++)for(int j = 0; j < 3; j++) r[i][j] = rot.getElement(i,j); TGeoVolume* rootvol = pnode->getRootVolume(); TGeoTube *tube = (TGeoTube*) rootvol->GetShape(); Double_t halflength = tube->GetDz(); // in cm // sets up the correspondence int (tubeID) <--> int (1 = copy/0 = solo) // copy_map[key] = alloc copy_map[tubeid] = isCopy; return new PndFtsTube((float)x,(float)y,(float)z, r[0][0],r[0][1],r[0][2], r[1][0],r[1][1],r[1][2], r[2][0],r[2][1],r[2][2], fTubeInRad, fTubeOutRad, halflength); } PndFtsTube * PndFtsMapCreator::GetTubeFromTubeIDToFillGeoType1(Int_t tubeid) { TObjArray *geoPassNodes = fFtsParameters->GetGeoPassiveNodes(); Bool_t isCopy = kTRUE; // try as if it was a copy fts01tube#XXX TString tubename = GetNameFromTubeIDGeoType1(tubeid, isCopy); FairGeoNode *pnode = (FairGeoNode*) geoPassNodes->FindObject(tubename); if(!pnode) { // try as if it was a solo fts01tubeXXX isCopy = kFALSE; tubename = GetNameFromTubeIDGeoType1(tubeid, isCopy); pnode = (FairGeoNode*) geoPassNodes->FindObject(tubename); } if(!pnode) { cout << "PndFtsMapCreator::GetTubeFromTubeIDToFillGeoType1: tube " << tubename << " not found (nor as a copy)" << endl; return NULL; } FairGeoTransform *lab = pnode->getLabTransform(); FairGeoVector tra = lab->getTransVector(); FairGeoRotation rot = lab->getRotMatrix(); // geometrical info double x = tra.getX()/10.; // in cm double y = tra.getY()/10.; // in cm double z = tra.getZ()/10.; // in cm double r[3][3]; for(int i = 0; i < 3; i++)for(int j = 0; j < 3; j++) r[i][j] = rot.getElement(i,j); TGeoVolume* rootvol = pnode->getRootVolume(); TGeoTube *tube = (TGeoTube*) rootvol->GetShape(); Double_t halflength = tube->GetDz(); // in cm // sets up the correspondence int (tubeID) <--> int (1 = copy/0 = solo) // copy_map[key] = alloc copy_map[tubeid] = isCopy; return new PndFtsTube((float)x,(float)y,(float)z, r[0][0],r[0][1],r[0][2], r[1][0],r[1][1],r[1][2], r[2][0],r[2][1],r[2][2], fTubeInRad, fTubeOutRad, halflength); } TClonesArray* PndFtsMapCreator::FillTubeArrayGeoType1() { std::cout<<"PndFtsMapCreator::FillTubeArrayGeoType1()##########"<GetGeoPassiveNodes(); TClonesArray *tubeArray = new TClonesArray("PndFtsTube"); tubeArray->Clear(); std::cout<<"PndFtsMapCreator::FillTubeArrayGeoType1():geoPassNodes->GetEntriesFast() "<GetEntriesFast()<GetEntriesFast(); i++) { //FairGeoNode *pnode = (FairGeoNode*) geoPassNodes->At(i); FairGeoVolume *pnode = (FairGeoVolume*) geoPassNodes->At(i); if(!pnode) continue; std::cout<<"pnode="<GetName(); std::cout<<"tubename############="< tubeID new((*tubeArray)[tubeID]) PndFtsTube(*ftstube); */ } return tubeArray; } ClassImp(PndFtsMapCreator)