// ------------------------------------------------------------------------- // ----- PndDrc source file ----- // ----- Created 11/10/06 by Annalisa Cecchi ----- // ----- Modified 2006++ by Carsten Schwarz ----- // ----- Modified 2010++ by Maria Patsyuk ----- // ----- ----- // ------------------------------------------------------------------------- #include "PndGeoDrc.h" #include "PndDrcPDPoint.h" #include "PndDrcBarPoint.h" #include "PndGeoDrcPar.h" #include "PndDetectorList.h" #include "PndDrc.h" #include "TString.h" //#include using std::endl; using std::cout; #include "TClonesArray.h" #include "TVirtualMC.h" #include "TObjArray.h" #include "TGeoMCGeometry.h" #include "TGeoManager.h" #include "TLorentzVector.h" #include "TParticle.h" #include "TVirtualMC.h" #include "TGeoPgon.h" #include "TGeoSphere.h" #include "TGeoBBox.h" #include "TGeoArb8.h" #include "TGeoCone.h" #include "TGeoTrd2.h" #include "TGeoCompositeShape.h" #include "TGeoMatrix.h" #include "TGeoManager.h" #include "TObject.h" #include "TColor.h" #include "TCanvas.h" #include "FairGeoInterface.h" #include "FairGeoLoader.h" #include "FairGeoNode.h" #include "FairRootManager.h" #include "FairVolume.h" #include "FairGeoMedia.h" #include "FairGeoMedium.h" #include "FairGeoRootBuilder.h" #include "PndStack.h" #include "PndDetectorList.h" // add on for debug //#include "FairGeoG3Builder.h" #include "FairRun.h" //#include "FairRunSim.h" #include "FairRuntimeDb.h" #include // ----- Default constructor ------------------------------------------- PndDrc::PndDrc() { fDrcPDCollection = new TClonesArray("PndDrcPDPoint"); fDrcBarCollection = new TClonesArray("PndDrcBarPoint"); fPosIndex = 0; volDetector = 0; fRunCherenkov = kTRUE; fGeo = new PndGeoDrc(); fStopTime = kFALSE; fTakeDirect = kFALSE; fDetEffAtProduction = kFALSE; ffocusing = 0; fTakeRealReflectivity = kTRUE; fListOfSensitives.push_back("Sensor"); if(fVerboseLevel > 0){ std::cout<<"-I- PndBarrelDIRC: fListOfSensitives contains:"; for(Int_t k=0; k 0){ std::cout<<"-I- PndBarrelDIRC: fListOfSensitives contains:"; for(Int_t k=0; kDelete(); delete fDrcPDCollection; } if (fDrcBarCollection) { fDrcBarCollection->Delete(); delete fDrcBarCollection; } if (fGeo) delete fGeo; } // ------------------------------------------------------------------------- // ----- Public method Intialize --------------------------------------- void PndDrc::Initialize() { cout << " -I- PndDrc: Intialization started... " << endl; FairDetector::Initialize(); //FairRun *sim = FairRun::Instance(); //FairRuntimeDb *rtdb = sim->GetRuntimeDb(); //PndGeoDrcPar *par = (PndGeoDrcPar*)(rtdb->getContainer("PndGeoDrcPar")); if (fRunCherenkov==kFALSE) cout << " -I- PndDrc: Switching OFF Cherenkov Propagation" << endl; // print out for debugging all names and pointers stored in manager // manager->Print(); // bar ID number: fbarID =gMC->VolId("DrcBarSensor"); cout<<"bar 1 id = "<VolId("DrcLENS3Sensor"); //cout<<"lens1 = "<FindNode("DrcLENS1_1")->GetVolume()->GetNumber()<< // ", lens2 = "<FindNode("DrcLENS2_1")->GetVolume()->GetNumber()<< // ", lens3 = "<FindNode("DrcLENS3Sensor_1")->GetVolume()->GetNumber()<0) cout<<" \n\n>>>>>>>>>>>>>>>>>>>>new event in the Barrel DIRC" <GetName(); Int_t num = vol->getMCid(); //Register points in the barrel (PndDrcBarPoints) fEventID = gMC->CurrentEvent(); fPdgCode = gMC->TrackPid(); //TLorentzVector fPos, fMom; gMC->TrackPosition(fPos); if (fPdgCode == 50000050){ if (fRunCherenkov==kFALSE ) { gMC->StopTrack(); if (fVerboseLevel >0) cout<< "Photon killed" << endl; } // apply detector efficiency at the production stage: if(fDetEffAtProduction && fLastTrackID != gMC->GetStack()->GetCurrentTrackNumber()){ gMC->TrackMomentum(fMom1); Double_t Px= fMom1.Px(); Double_t Py= fMom1.Py(); Double_t Pz= fMom1.Pz(); Double_t fP = sqrt(Px*Px + Py*Py +Pz*Pz); Double_t lambda=197.0*2.0*TMath::Pi()/(fP*1.0E9); Double_t ra = frand.Uniform(0., 1.); if(ra > fDetEff->Eval(lambda)){ gMC->StopTrack(); } } /* // check whether function 'ConstructOpGeometry' works: if(gMC->IsTrackExiting()==1){ //if(nam.BeginsWith("DrcBar")){ if(num == fbarID){ // if(fPos.Z() > -110. && fPos.Z() < -109. && aaa < 11){ cout<<"track is exiting the bar at z = "<IsTrackExiting()==1){ if(num == fbarID && fPos.Z() < fBarEnd){ //std::cout<<"Track is exiting the "<TrackPosition(fPos); gMC->TrackMomentum(fMom); if ((fPos.X()*fMom.X() + fPos.Y()*fMom.Y()) < 0.){ gMC->StopTrack(); } } } } // kill photons older than fPhoMaxTime: if (fStopTime == kTRUE && gMC->TrackTime()*1.0e09 > fPhoMaxTime){ gMC->StopTrack(); } if (gMC->IsTrackEntering()==1){ if( num == fpdID){ //if (nam.BeginsWith("DrcPD")){ fCopyNo = vol->getCopyNo(); fTrackID = gMC->GetStack()->GetCurrentTrackNumber(); //track ID gMC->TrackPosition(fPos); gMC->TrackMomentum(fMom); // GeV/c fTime=gMC->TrackTime()*1.0e09; // ns fLength = gMC->TrackLength(); // cm ?? AddHit(fTrackID, fCopyNo, TVector3(fPos.X(), fPos.Y(), fPos.Z()), TVector3(fMom.Px(), fMom.Py(), fMom.Pz()), fTime, fLength, fPdgCode, fEventID); } PndStack* stack = (PndStack*) gMC->GetStack(); stack->AddPoint(kDRC); } }else if(gMC->TrackCharge()!=0. && gMC->IsTrackEntering()==1 ){ //if (nam.BeginsWith("DrcBar")) { if(num == fbarID){ // Double_t fCharge = gMC->TrackCharge(); fTrackID = gMC->GetStack()->GetCurrentTrackNumber(); fTime = gMC->TrackTime() * 1.0e09; fLength = gMC->TrackLength(); // Int_t copyNo = vol->getCopyNo(); Int_t s=0, b=0; //side and bar fNBar=0; TString path = gMC->CurrentVolPath(); //cout<<"+++++++++++++++++++++++++++++++++"<CurrentVolPath() << endl; //cout<<"+++++++++++++++++++++++++++++++++"<0) cout<< "Volume: " << gMC->CurrentVolPath() << endl; sscanf(path, "/cave_1/BarrelDIRC_0/DrcBarBox_%d/DrcAirBox_0/DrcBarSensor_%d", &s, &b); //cout<<"side no.= "<Register("DrcPDPoint","Drc", fDrcPDCollection, kTRUE); } // ---------------------------------------------------------------------------- // ----- Public method GetCollection -------------------------------------- TClonesArray* PndDrc::GetCollection(Int_t iColl) const { if (iColl == 0) return fDrcPDCollection; if (iColl == 1) return fDrcBarCollection; return NULL; } // ---------------------------------------------------------------------------- // ----- Public method Print ---------------------------------------------- void PndDrc::Print() const { Int_t nPDHits = fDrcPDCollection->GetEntriesFast(); Int_t nbarHits = fDrcBarCollection->GetEntriesFast(); cout << "-I- PndDrc: " << nPDHits << " points registered in the photodetector for this event." << endl; cout << "-I- PndDrc: " << nbarHits << " points registered in the bar for this event." << endl; if (fVerboseLevel>1){ for (Int_t i=0; iPrint(); for (Int_t i=0; iPrint(); } } // ---------------------------------------------------------------------------- // ----- Public method Reset ---------------------------------------------- void PndDrc::Reset() { fDrcPDCollection->Delete(); fDrcBarCollection->Delete(); fPosIndex = 0; } // ---------------------------------------------------------------------------- // guarda in FairRootManager::CopyClones // ----- Public method CopyClones ----------------------------------------- void PndDrc::CopyClones(TClonesArray* clPD1, TClonesArray* clPD2,TClonesArray* clBar1, TClonesArray* clBar2, Int_t offset ) { Int_t nPDEntries = clPD1->GetEntriesFast(); cout << "-I- PndDrc: " << nPDEntries << " entries to add." << endl; TClonesArray& clrefPD = *clPD2; Int_t nBarEntries = clBar1->GetEntriesFast(); cout << "-I- PndDrc: " << nBarEntries << " entries to add." << endl; TClonesArray& clrefBar = *clBar2; PndDrcPDPoint* oldpointPD = NULL; PndDrcBarPoint* oldpointBar = NULL; for (Int_t i=0; iAt(i); Int_t indexPD = oldpointPD->GetTrackID() + offset; oldpointPD->SetTrackID(indexPD); new (clrefPD[fPosIndex]) PndDrcPDPoint(*oldpointPD); fPosIndex++; } for (Int_t i=0; iAt(i); Int_t indexBar = oldpointBar->GetTrackID() + offset; oldpointBar->SetTrackID(indexBar); new (clrefBar[fPosIndex]) PndDrcBarPoint(*oldpointBar); fPosIndex++; } cout << " -I- PndDrc: " << clPD2->GetEntriesFast() << " merged entries." << endl; cout << " -I- PndDrc: " << clBar2->GetEntriesFast() << " merged entries." << endl; } // ---------------------------------------------------------------------------- // ----- Public method ConstructGeometry ----------------------------------- void PndDrc::ConstructGeometry() { cout<< " " << endl; cout<< " ======= DRC:: ConstructGeometry() ======== " << endl; cout<< " ============================================= " << endl; TString fileName = GetGeometryFileName(); if(fileName.EndsWith(".root")){ ConstructRootGeometry(); if(fileName.Contains("_l0_")){ fBarEnd = -119.999; ffocusing = 0; } if(fileName.Contains("_l2_")){ fBarEnd = -119.999; ffocusing = 2; } if(fileName.Contains("_l1_")){ fBarEnd = -118.725; ffocusing = 1; } } else{ std::cout<<"Geometry format not supported!"<DefineOpSurface("BarSurface", kGlisur, kDielectric_dielectric, kPolished, 0.0); gMC->DefineOpSurface("MirrSurface", kGlisur, kDielectric_metal, kPolished, 0.0); for(Int_t i=0; ibarNum(); i++){ //gMC->SetBorderSurface("BarAirSurface", "DrcBarSensor", i+1, "DrcAirBox", 0, "BarSurface"); if(ffocusing == 1 || ffocusing == 0){ // lens or no focusing //gMC->SetBorderSurface("Lens1AirSurface", "DrcLENS1", i+1, "DrcAirBox", 0, "BarSurface"); //gMC->SetBorderSurface("Lens2AirSurface", "DrcLENS2", i+1, "DrcAirBox", 0, "BarSurface"); //gMC->SetBorderSurface("Lens3AirSurface", "DrcLENS3", i+1, "DrcAirBox", 0, "BarSurface"); gMC->SetBorderSurface("BarMirrSurface", "DrcBarSensor", i+1, "DrcMirr", i+1, "MirrSurface"); } /*if(ffocusing == 2){ // forward mirror gMC->SetBorderSurface("Block1AirSurface", "DrcBlock1", i+1, "DrcAirBox", 0, "BarSurface"); gMC->SetBorderSurface("Block2AirSurface", "DrcBlock2", i+1, "DrcAirBox", 0, "BarSurface"); } */ } //gMC->SetMaterialProperty("BarSurface", "REFLECTIVITY", npoints, ephoton, reflectivity); if(fTakeRealReflectivity == kFALSE){ gMC->SetMaterialProperty("MirrSurface", "REFLECTIVITY", npoints_i, ephoton_i, reflectivity_i); } if(fTakeRealReflectivity == kTRUE){ gMC->SetMaterialProperty("MirrSurface", "REFLECTIVITY", npoints_r, ephoton_r, reflectivity_r); } gMC->DefineOpSurface("EVSurface", kGlisur, kDielectric_metal, kPolished, 0.0); gMC->SetBorderSurface("EVAirSurface", "DrcEV", 1, "BarrelDIRC", 0, "EVSurface"); gMC->SetMaterialProperty("EVSurface", "REFLECTIVITY", npoints_i, ephoton_i, reflectivity_i); gMC->DefineOpSurface("PDSurface", kGlisur, kDielectric_dielectric, kPolished, 0.0); gMC->SetBorderSurface("EVPDSurface", "DrcEV", 1, "DrcPDSensor", 1, "PDSurface"); gMC->SetMaterialProperty("PDSurface", "EFFICIENCY", npoints_i, ephoton_i, reflectivity_i); cout<<" ======= DRC::ConstructOpGeometry -> Finished! ====== "<< endl; } // ----- Public method CheckIfSensitive -------------------------------------- bool PndDrc::CheckIfSensitive(std::string name) { for (Int_t i = 0; i < fListOfSensitives.size(); i++){ if (name.find(fListOfSensitives[i]) != std::string::npos) return true; } return false; } // ----- Private method AddHit -------------------------------------------- PndDrcPDPoint* PndDrc::AddHit(Int_t trackID, Int_t copyNo, TVector3 pos, TVector3 mom, Double_t time, Double_t length, Int_t pdgCode, Int_t eventID) { TClonesArray& clrefPD = *fDrcPDCollection; Int_t size = clrefPD.GetEntriesFast(); if (fVerboseLevel>1) cout << "-I- PndDrc: Adding Point at (" << pos.X() << ", " << pos.Y() << ", " << pos.Z() << ") cm, detector " << copyNo << ", track " << trackID <<" event "<1) cout << "-I- PndBarDrc: Adding Point at (" << pos.X() << ", " << pos.Y() << ", " << pos.Z() << ") cm, detector " << copyNo << ", track " << trackID <<" event "<