// ********************************************* // // *** D. Kresan 2004-Sep-14 *** // // *** D.Kresan@gsi.de *** // // ********************************************* // #include "FairTrajFilter.h" #include "FairRootManager.h" // for FairRootManager #include "Riosfwd.h" // for ostream #include "TClonesArray.h" // for TClonesArray #include "TError.h" // for Fatal #include "TGeoTrack.h" // for TGeoTrack #include "TMath.h" // for Pi, TwoPi, Log #include "TMathBase.h" // for Abs #include "TParticle.h" // for TParticle #include // for NULL #include // for operator<<, basic_ostream, etc using namespace std; ClassImp(FairTrajFilter) FairTrajFilter* FairTrajFilter::fgInstance = NULL; FairTrajFilter* FairTrajFilter::Instance() { return fgInstance; } FairTrajFilter::FairTrajFilter() : fVxMin (-2000.), fVxMax ( 2000.), fVyMin (-2000.), fVyMax ( 2000.), fVzMin (-2000.), fVzMax ( 2000.), fPMin ( 0.), fPMax ( 1e10), fThetaMin ( 0.), fThetaMax ( TMath::Pi()), fPhiMin ( 0.), fPhiMax ( TMath::TwoPi()), fPxMin (-1e10), fPxMax ( 1e10), fPyMin (-1e10), fPyMax ( 1e10), fPzMin (-1e10), fPzMax ( 1e10), fPtMin ( 0.), fPtMax ( 1e10), fRapidityMin (-1e10), fRapidityMax ( 1e10), fKinCutType ( 0), // polar system by default fEtotMin ( 0.), fEtotMax ( 1e10), fStorePrim ( kTRUE), fStoreSec ( kTRUE), fStepSizeMin ( 0.1), // 1mm by default fTrackCollection(new TClonesArray("TGeoTrack")), fCurrentTrk(NULL) { if(NULL != fgInstance) { Fatal("FairTrajFilter", "Singleton class already exists."); return; } fgInstance = this; } FairTrajFilter::~FairTrajFilter() { fgInstance = NULL; } void FairTrajFilter::Init(TString brName, TString folderName) { FairRootManager::Instance()->Register(brName.Data(), folderName.Data(), fTrackCollection, kTRUE); } void FairTrajFilter::Reset() { fTrackCollection->Delete(); } Bool_t FairTrajFilter::IsAccepted(const TParticle* p) const { if( NULL == p ) { return kFALSE; } // Apply vertex cut if( (p->Vx()Vx()>fVxMax) || (p->Vy()Vy()>fVyMax) || (p->Vz()Vz()>fVzMax) ) { return kFALSE; } // Apply cut on kinematics if( 0 == fKinCutType ) { if( (p->P()P()>fPMax) || (p->Theta()Theta()>fThetaMax) || (p->Phi()Phi()>fPhiMax) ) { return kFALSE; } } else if( 1 == fKinCutType ) { if( (p->Px()Px()>fPxMax) || (p->Py()Py()>fPyMax) || (p->Pz()Pz()>fPzMax) ) { return kFALSE; } } else { Double_t rapidity = 0.5*TMath::Log( (p->Energy()+p->Pz()) / (p->Energy()-p->Pz()) ); if( (p->Pt()Pt()>fPtMax) || (rapidityfRapidityMax) ) { return kFALSE; } } // Apply energy cut if( (p->Energy()Energy()>fEtotMax) ) { return kFALSE; } // Apply generation cut if(-1 == p->GetFirstMother()) { if(kFALSE == fStorePrim) { return kFALSE; } } else { if(kFALSE == fStoreSec) { return kFALSE; } } return kTRUE; } void FairTrajFilter::SetVertexCut(Double_t vxMin, Double_t vyMin, Double_t vzMin, Double_t vxMax, Double_t vyMax, Double_t vzMax) { if( (vxMax2000.) || (TMath::Abs(vxMax)>2000.) || (TMath::Abs(vyMin)>2000.) || (TMath::Abs(vyMax)>2000.) || (TMath::Abs(vzMin)>2000.) || (TMath::Abs(vzMax)>2000.) ) { cout << "-E- FairTrajFilter::SetVertexCut() : invalid region, ignoring." << endl; return; } fVxMin = vxMin; fVxMax = vxMax; fVyMin = vyMin; fVyMax = vyMax; fVzMin = vzMin; fVzMax = vzMax; } void FairTrajFilter::SetMomentumCutP(Double_t pMin, Double_t thetaMin, Double_t phiMin, Double_t pMax, Double_t thetaMax, Double_t phiMax) { if( (pMaxTMath::Pi()) || (phiMin<0.) || (phiMax>TMath::TwoPi()) ) { cout << "-E- FairTrajFilter::SetMomentumCutP() : invalid region, ignoring." << endl; return; } fPMin = pMin; fPMax = pMax; fThetaMin = thetaMin; fThetaMax = thetaMax; fPhiMin = phiMin; fPhiMax = phiMax; fKinCutType = 0; } void FairTrajFilter::SetMomentumCutD(Double_t pxMin, Double_t pyMin, Double_t pzMin, Double_t pxMax, Double_t pyMax, Double_t pzMax) { if( (pxMaxGetId(); } Int_t pdgCode = p->GetPdgCode(); TClonesArray& clref = *fTrackCollection; Int_t tsize = clref.GetEntriesFast(); fCurrentTrk = new(clref[tsize]) TGeoTrack(++trackId,pdgCode,0,p); return fCurrentTrk; } TGeoTrack* FairTrajFilter::GetTrack(Int_t trackId) { return (TGeoTrack*)fTrackCollection->At(trackId); }