////////////////////////////////////////////////////////// // Mapper for TFT // chamberID layerID tubeIDtot // // author: Isabella Garzia ////////////////////////////////////////////////////////// #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 "FairRootManager.h" #include using namespace std; PndFtsMapCreator::PndFtsMapCreator() : fGeoType(0), fFtsParameters(new PndGeoFtsPar()), fTubeInRad(0), fTubeOutRad(0), copy_map() { copy_map.clear(); // Geometry loading FairRootManager* ioman = FairRootManager::Instance(); TFile *infile = ioman->GetInFile(); } //PndFtsMapCreator::PndFtsMapCreator(){} // to use in PndFts PndFtsMapCreator::PndFtsMapCreator(Int_t geoType) : fGeoType(geoType), fFtsParameters(new PndGeoFtsPar()), fTubeInRad(0), fTubeOutRad(0) , copy_map() { copy_map.clear(); if(fGeoType != 1) Info("PndFtsMapCreator","Geometry %i not supported by map", fGeoType); // CHECK } // crete geometry from parameters file PndFtsMapCreator::PndFtsMapCreator(PndGeoFtsPar *ftsPar) : fGeoType(0), fFtsParameters(ftsPar), fTubeInRad(0), fTubeOutRad(0), copy_map() { copy_map.clear(); // set general par SetGeneralParameters(); // choose geometry type fGeoType = ftsPar->GetGeometryType(); // classic, optimized, average, detailed, CAD if(fGeoType != 1) Info("PndFtsMapCreator","Geometry %i not supported by map", fGeoType); // 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; } // ===== 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::GetChamberIDFromName(TString name){ TString pathstring=name; if(pathstring.Contains("fts01")){ //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){ 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==5){tube=tubeID+5504;} if(chamberid==6){tube=tubeID+8848;} //up and down short tubes have different name but the same ID number //I shift the tube ID to give a different ID number to each tube // tubeid chamber 1,2: between 1-128*8, hole:12 tubes //tubeid chamber 3,4: between 1-192*2 for each double layer, hole: 12 tubes //tubeid chamber 5: between 1-400*8, hole: 18 tubes //tubeid chamber 6: between 1-592*8, hole: 18 tubes //chamber 1 and chamber 2 if(chamber==1 || chamberid==2){ int shift=0; if(chamber==2){ layer=layer-8; shift=12*8+12*(layer-1); } if(!tmpstring.Contains("down") && !tmpstring.Contains("up")){ if(tubeid<=58){totTubeID=tube+shift;} else{ if(abs(tubeid-(128*layer))<=58){ totTubeID=tube+12*(layer)+shift; } else{ totTubeID=tube+12*(layer-1)+shift; } } } if(tmpstring.Contains("up")){ totTubeID=tube+12*(layer-1)+shift; } if(tmpstring.Contains("down")){ totTubeID=tube+12*layer+shift; } } // chamber 3 and chamber 4 if(chamberid==3 || chamberid==4){ int shift=12*(layer-1); if(!tmpstring.Contains("down") && !tmpstring.Contains("up")){ if(tubeid<=90){totTubeID=tube+shift;} else{ if(layer%2!=0){ if(abs(tubeid-(192))<=90){ totTubeID=tube+shift+12; } else{totTubeID=tube+shift;} } else{ if(abs(tubeid-(192*2))<=90){ totTubeID=tube+shift+12*2; } else{totTubeID=tube+shift+12;} } } } if(tmpstring.Contains("down")){ if(layer%2!=0){totTubeID=tube+12+shift;} //odd layer else{totTubeID=tube+12*2+shift;} } if(tmpstring.Contains("up")){ if(layer%2!=0){totTubeID=tube+shift;} //odd layer else{totTubeID=tube+12+shift;} } } //chamber 5 //12*32 are the tubes shifted in the previous chambers if(chamber==5){ int shift=12*32; if(!tmpstring.Contains("down") && !tmpstring.Contains("up")){ if(tubeid<=191){totTubeID=tube+shift;} else{ if(abs(tubeid-(400*(layer-32)))<=191){ totTubeID=tube+18*(layer-32)+shift; } else{ totTubeID=tube+18*(layer-33)+shift; } } } if(tmpstring.Contains("up")){ totTubeID=tube+18*(layer-33)+shift; } if(tmpstring.Contains("down")){ totTubeID=tube+18*(layer-32)+shift; } } //chamber 6 if(chamber==6){ int shift=12*32+18*8; if(!tmpstring.Contains("down") && !tmpstring.Contains("up")){ if(tubeid<=287){totTubeID=tube+shift;} else{ if(abs(tubeid-(592*(layer-40)))<=287){ totTubeID=tube+18*(layer-40)+shift; } else{ totTubeID=tube+18*(layer-41)+shift; } } } if(tmpstring.Contains("up")){ totTubeID=tube+18*(layer-41)+shift; } if(tmpstring.Contains("down")){ totTubeID=tube+18*(layer-40)+shift; } } return totTubeID; } Int_t PndFtsMapCreator::GetTubeIDTot2(Int_t chamberid, Int_t layerid, Int_t tubeid,TString name ) { Int_t chamber=chamberid; Int_t layer=layerid; Int_t tubeID=tubeid; TString tmpstring=name; 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")){tube=tube+58;} totTubeID=tube+12*layer; } if(tmpstring.Contains("up")){ if(tmpstring.Contains("up")){tube=tube+58;} totTubeID=tube+12*(layer-1); } if(tube<=58){totTubeID=tube;} } if(chamberid==3 || chamberid==4){ if(tmpstring.Contains("down")){totTubeID=tube+90+12;} if(tmpstring.Contains("up")){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")){ if(layer%2==1){totTubeID=tube+12;} //odd layer else{totTubeID=tube+24;} } if(tmpstring.Contains("up")&& !tmpstring.Contains("up")){ if(layer%2==1){totTubeID=tube;} //odd layer else{totTubeID=tube+12;} } } if(chamber==5){ if(tmpstring.Contains("down") || tube>5329){ if(tmpstring.Contains("down")){tube=tube+191;} totTubeID=tube+(12*32)+(18*(layer-32)); } if(tmpstring.Contains("up")){ if(tmpstring.Contains("up")){tube=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")){tube=tube+287;} totTubeID=tube+(12*32)+(18*(layer-32)); } if(tmpstring.Contains("up")){ if(tmpstring.Contains("up")){tube=tube+287;} totTubeID=tube+(12*32)+(18*(layer-33)); } if(tube<=8607){totTubeID=tube+(12*32)+(18*8);} } return totTubeID; } ///////////////////////////////////////////////////////////// ///this function will be used in PndFtsHitProducesRealFast //////////////////////////////////////////////////////////// // fill the tube map at the beginning of the run TClonesArray * PndFtsMapCreator::FillTubeArray() { std::cout<<"#####Mapper:filltubearray######"<GetGeoPassiveNodes(); Bool_t isCopy = kTRUE; // try as if it was a copy stt01tube#XXX TString tubename = GetNameFromTubeIDGeoType1(tubeid, isCopy); FairGeoNode *pnode = (FairGeoNode*) geoPassNodes->FindObject(tubename); if(!pnode) { // try as if it was a solo stt01tubeXXX isCopy = kFALSE; tubename = GetNameFromTubeIDGeoType1(tubeid, isCopy); pnode = (FairGeoNode*) geoPassNodes->FindObject(tubename); } if(!pnode) { //cout << "PndFtsMapCreator::GetTubeFromTubeIDToFillGeoType1: tube " << tubename << " not f\ound (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::GetTubeFromNameToFillGeoType1(TString tubename) { Int_t tubeid = GetTubeIDFromNameGeoType1(tubename); TObjArray *geoPassNodes = fFtsParameters->GetGeoPassiveNodes(); Bool_t isCopy = kTRUE; // try as if it was a copy stt01tube#XXX FairGeoNode *pnode = (FairGeoNode*) geoPassNodes->FindObject(tubename); if(!pnode) { // try as if it was a solo stt01tubeXXX isCopy = kFALSE; //tubename = GetNameFromTubeIDGeoType1(tubeid, isCopy); //pnode = (FairGeoNode*) geoPassNodes->FindObject(tubename); } if(!pnode) { cout << "PndFtsMapCreator::GetTubeFromNameToFillGeoType1: 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() { TObjArray *geoPassNodes = fFtsParameters->GetGeoPassiveNodes(); TClonesArray *tubeArray = new TClonesArray("PndFtsTube"); tubeArray->Delete(); //std::cout << "TA: entries: " << geoPassNodes->GetEntriesFast() << std::endl; for(int i = 0; i < geoPassNodes->GetEntriesFast(); i++) { FairGeoNode *pnode = (FairGeoNode*) geoPassNodes->At(i); if(!pnode) { std::cout<<"PndFtsMapCreator::FillTubeArrayGeoType1 : tubename="<< pnode->GetName() << " not existing!!!" << std::endl; continue; } TString tubename = pnode->GetName(); //std::cout<<"PndFtsMapCreator::FillTubeArrayGeoType1 : tubename="<GetEntriesFast() << std::endl; return tubeArray; } ClassImp(PndFtsMapCreator)