From 67fd1119b87614660234bcf78e24ec1f214fa802 Mon Sep 17 00:00:00 2001 From: wiechula Date: Thu, 21 Jun 2012 15:20:16 +0000 Subject: [PATCH] o updats (Julian) - fix mixing in AOD - add cut for AOD track bits --- PWGDQ/dielectron/AliDielectron.cxx | 1 + PWGDQ/dielectron/AliDielectron.h | 1 + PWGDQ/dielectron/AliDielectronEvent.cxx | 28 ++++++++++--- PWGDQ/dielectron/AliDielectronEvent.h | 9 +++- .../dielectron/AliDielectronMixingHandler.cxx | 42 +++++++++++++++---- PWGDQ/dielectron/AliDielectronTrackCuts.cxx | 17 +++++++- PWGDQ/dielectron/AliDielectronTrackCuts.h | 7 +++- PWGDQ/dielectron/AliDielectronVarManager.cxx | 1 + PWGDQ/dielectron/AliDielectronVarManager.h | 18 +++++--- 9 files changed, 101 insertions(+), 23 deletions(-) diff --git a/PWGDQ/dielectron/AliDielectron.cxx b/PWGDQ/dielectron/AliDielectron.cxx index a8ac9409311..29930501055 100644 --- a/PWGDQ/dielectron/AliDielectron.cxx +++ b/PWGDQ/dielectron/AliDielectron.cxx @@ -584,6 +584,7 @@ void AliDielectron::FillTrackArrays(AliVEvent * const ev, Int_t eventNr) AliESDtrack *track=static_cast(particle); track->SetESDEvent(static_cast(ev)); //only in trunk... } + //apply track cuts if (fTrackFilter.IsSelected(particle)!=selectedMask) continue; diff --git a/PWGDQ/dielectron/AliDielectron.h b/PWGDQ/dielectron/AliDielectron.h index 7e23a20510b..39b4ae1d52e 100644 --- a/PWGDQ/dielectron/AliDielectron.h +++ b/PWGDQ/dielectron/AliDielectron.h @@ -46,6 +46,7 @@ public: kEv1PEv2M, kEv1MEv2M, kEv2PM, kEv2MM, kEv1PMRot }; enum ELegType { kEv1P, kEv1M, kEv2P, kEv2M }; + enum EFilterBit { kNone=0, kTPCqual=1, kTPCqualSPDany=4, kTPCqualSPDanyPIDele=8 }; AliDielectron(); AliDielectron(const char* name, const char* title); diff --git a/PWGDQ/dielectron/AliDielectronEvent.cxx b/PWGDQ/dielectron/AliDielectronEvent.cxx index 01cdeb05f56..d5b7bf7e138 100644 --- a/PWGDQ/dielectron/AliDielectronEvent.cxx +++ b/PWGDQ/dielectron/AliDielectronEvent.cxx @@ -39,6 +39,8 @@ AliDielectronEvent::AliDielectronEvent() : TNamed(), fArrTrackP("AliESDtrack",1000), fArrTrackN("AliESDtrack",1000), + fArrVertexP("AliAODVertex",1000), + fArrVertexN("AliAODVertex",1000), fArrPairs("AliKFParticle",0), fNTracksP(0), fNTracksN(0), @@ -56,6 +58,8 @@ AliDielectronEvent::AliDielectronEvent(const char* name, const char* title) : TNamed(name, title), fArrTrackP("AliESDtrack",1000), fArrTrackN("AliESDtrack",1000), + fArrVertexP("AliAODVertex",1000), + fArrVertexN("AliAODVertex",1000), fArrPairs("AliKFParticle",0), fNTracksP(0), fNTracksN(0), @@ -75,6 +79,8 @@ AliDielectronEvent::~AliDielectronEvent() // fArrTrackP.Delete(); fArrTrackN.Delete(); + fArrVertexP.Delete(); + fArrVertexN.Delete(); fArrPairs.Delete(); } @@ -93,8 +99,14 @@ void AliDielectronEvent::SetTracks(const TObjArray &arrP, const TObjArray &arrN, fNTracksP=0; //check size of the arrays - if (fArrTrackP.GetSize()(arrP.At(itrack)); if (!track) continue; + new (fArrTrackP[tracks]) AliAODTrack(*track); + new (fArrVertexP[tracks]) AliAODVertex(*(track->GetProdVertex())); ++tracks; } } @@ -123,7 +137,9 @@ void AliDielectronEvent::SetTracks(const TObjArray &arrP, const TObjArray &arrN, } else { AliAODTrack *track=dynamic_cast(arrN.At(itrack)); if (!track) continue; + new (fArrTrackN[tracks]) AliAODTrack(*track); + new (fArrVertexN[tracks]) AliAODVertex(*(track->GetProdVertex())); ++tracks; } } @@ -143,10 +159,12 @@ void AliDielectronEvent::Clear(Option_t *opt) for (Int_t i=fArrTrackP.GetEntriesFast()-1; i>=0; --i){ delete fArrTrackP.RemoveAt(i); + delete fArrVertexP.RemoveAt(i); } for (Int_t i=fArrTrackN.GetEntriesFast()-1; i>=0; --i){ delete fArrTrackN.RemoveAt(i); + delete fArrVertexN.RemoveAt(i); } fArrPairs.Clear(opt); @@ -159,8 +177,8 @@ void AliDielectronEvent::SetAOD() // // use AOD as input // - fArrTrackP.SetClass("AliAODTrack"); - fArrTrackN.SetClass("AliAODTrack"); + // fArrTrackP.SetClass("AliAODTrack"); //not needed since AODTracks are smaller than ESDtracks + // fArrTrackN.SetClass("AliAODTrack"); fIsAOD=kTRUE; } @@ -171,4 +189,4 @@ void AliDielectronEvent::SetEventData(const Double_t data[AliDielectronVarManage // copy only evnet variables // for (Int_t i=AliDielectronVarManager::kPairMax; i #include +#include "AliVVertex.h" #include "AliDielectronVarManager.h" @@ -29,14 +30,16 @@ public: virtual ~AliDielectronEvent(); void SetAOD(); + Bool_t IsAOD() { return fIsAOD; } void SetTracks(const TObjArray &arrP, const TObjArray &arrN, const TObjArray &arrPairs); void SetEventData(const Double_t data[AliDielectronVarManager::kNMaxValues]); const Double_t* GetEventData() const {return fEventData;} - const TClonesArray* GetTrackArrayP() const { return &fArrTrackP; } const TClonesArray* GetTrackArrayN() const { return &fArrTrackN; } + const TClonesArray* GetVertexArrayP() const { return &fArrVertexP; } + const TClonesArray* GetVertexArrayN() const { return &fArrVertexN; } Int_t GetNTracksP() const { return fNTracksP; } Int_t GetNTracksN() const { return fNTracksN; } @@ -47,6 +50,8 @@ virtual void Clear(Option_t *opt="C"); private: TClonesArray fArrTrackP; //positive tracks TClonesArray fArrTrackN; //negative tracks + TClonesArray fArrVertexP; //positive tracks vertex + TClonesArray fArrVertexN; //negative tracks vertex TClonesArray fArrPairs; //Pair array @@ -56,7 +61,7 @@ private: Bool_t fIsAOD; // if we deal with AODs Double_t fEventData[AliDielectronVarManager::kNMaxValues]; // event informaion from the var manager - + AliDielectronEvent(const AliDielectronEvent &c); AliDielectronEvent &operator=(const AliDielectronEvent &c); diff --git a/PWGDQ/dielectron/AliDielectronMixingHandler.cxx b/PWGDQ/dielectron/AliDielectronMixingHandler.cxx index 64d8a288a88..b2226aff7c9 100644 --- a/PWGDQ/dielectron/AliDielectronMixingHandler.cxx +++ b/PWGDQ/dielectron/AliDielectronMixingHandler.cxx @@ -136,7 +136,7 @@ void AliDielectronMixingHandler::Fill(const AliVEvent *ev, AliDielectron *diele) //check if there are tracks available if (diele->GetTrackArray(0)->GetEntriesFast()==0 && diele->GetTrackArray(1)->GetEntriesFast()==0) return; - + //find mixing bin Double_t values[AliDielectronVarManager::kNMaxValues]={0.}; AliDielectronVarManager::Fill(ev,values); @@ -162,10 +162,10 @@ void AliDielectronMixingHandler::Fill(const AliVEvent *ev, AliDielectron *diele) AliDebug(10,Form("new event at %d: %d",bin,pool.GetEntriesFast())); AliDielectronEvent *event=new(pool[pool.GetEntriesFast()]) AliDielectronEvent(); - + if(ev->IsA() == AliAODEvent::Class()) event->SetAOD(); event->SetTracks(*diele->GetTrackArray(0), *diele->GetTrackArray(1), *diele->GetPairArray(1)); event->SetEventData(values); - + // check if pool depth is reached. if (pool.GetEntriesFast()fTracks[i]; @@ -217,7 +217,6 @@ void AliDielectronMixingHandler::DoMixing(TClonesArray &pool, AliDielectron *die //setup track arrays AliDielectronEvent *ev2=static_cast(pool.At(i2)); - ev1P.Reset(); ev1N.Reset(); TIter ev2P(ev2->GetTrackArrayP()); @@ -254,8 +253,36 @@ void AliDielectronMixingHandler::DoMixing(TClonesArray &pool, AliDielectron *die ev2N.Reset(); } + // set the vertex to the track in case (AOD only) + if ( ev1->IsAOD() && ev2->IsAOD() ) { + Int_t idx = 0; + + while ( (o=ev1N()) ) { + idx = ev1->GetTrackArrayN()->IndexOf(o); + ((AliAODTrack *)o)->SetProdVertex(ev1->GetVertexArrayN()->At(idx)); + } + while ( (o=ev1P()) ) { + idx = ev1->GetTrackArrayP()->IndexOf(o); + ((AliAODTrack *)o)->SetProdVertex(ev1->GetVertexArrayP()->At(idx)); + } + while ( (o=ev2N()) ) { + idx = ev2->GetTrackArrayN()->IndexOf(o); + ((AliAODTrack *)o)->SetProdVertex(ev2->GetVertexArrayN()->At(idx)); + } + while ( (o=ev2P()) ) { + idx = ev2->GetTrackArrayP()->IndexOf(o); + ((AliAODTrack *)o)->SetProdVertex(ev2->GetVertexArrayP()->At(idx)); + } + + // reset the iterators + ev1N.Reset(); + ev1P.Reset(); + ev2N.Reset(); + ev2P.Reset(); + } + //mixing of ev1- ev2+ (pair type4). This is common for all mixing types - while ( (o=ev1N()) ) diele->fTracks[1].Add(o); + while ( (o=ev1N()) ) diele->fTracks[1].Add(o); while ( (o=ev2P()) ) diele->fTracks[2].Add(o); diele->FillPairArrays(1,2); @@ -276,6 +303,7 @@ void AliDielectronMixingHandler::DoMixing(TClonesArray &pool, AliDielectron *die while ( (o=ev2N()) ) diele->fTracks[2].Add(o); diele->FillPairArrays(1,2); } + } } @@ -299,7 +327,7 @@ void AliDielectronMixingHandler::MixRemaining(AliDielectron *diele) //Check if there was any processed data and it is requested to mix incomplete bins if (!diele || !diele->PairArray(0) || !fMixIncomplete ) return; - + AliDielectronVarManager::SetEvent(0x0); for (Int_t ipool=0; ipool(fArrPools.At(ipool)); if (!poolp || !poolp->GetEntriesFast() || !poolp->At(0)) continue; diff --git a/PWGDQ/dielectron/AliDielectronTrackCuts.cxx b/PWGDQ/dielectron/AliDielectronTrackCuts.cxx index b476b3a7fe8..cb243e34d23 100644 --- a/PWGDQ/dielectron/AliDielectronTrackCuts.cxx +++ b/PWGDQ/dielectron/AliDielectronTrackCuts.cxx @@ -30,6 +30,7 @@ Detailed description #include "AliDielectronTrackCuts.h" #include "AliVTrack.h" +#include "AliAODTrack.h" ClassImp(AliDielectronTrackCuts) @@ -41,7 +42,8 @@ AliDielectronTrackCuts::AliDielectronTrackCuts() : fITSclusterCutType(kOneOf), fRequireITSRefit(kFALSE), fRequireTPCRefit(kFALSE), - fTPCNclRobustCut(-1) + fTPCNclRobustCut(-1), + fAODFilterBit(kSwitchOff) { // // Default Constructor @@ -61,7 +63,8 @@ AliDielectronTrackCuts::AliDielectronTrackCuts(const char* name, const char* tit fITSclusterCutType(kOneOf), fRequireITSRefit(kFALSE), fRequireTPCRefit(kFALSE), - fTPCNclRobustCut(-1) + fTPCNclRobustCut(-1), + fAODFilterBit(kSwitchOff) { // // Named Constructor @@ -116,6 +119,16 @@ Bool_t AliDielectronTrackCuts::IsSelected(TObject* track) Int_t nclr=TMath::Nint(vtrack->GetTPCClusterInfo(2,1)); accept*=(nclr>fTPCNclRobustCut); } + + // use filter bit to speed up the AOD analysis (track pre-filter) + // relevant filter bits are: + // kTPCqual==1 -> TPC quality cuts + // kTPCqualSPDany==4 -> + SPD any + // kTPCqualSPDanyPIDele==8 -> + nSigmaTPCele +-3 (inclusion) + if (track->IsA()==AliAODTrack::Class() && fAODFilterBit!=kSwitchOff) { + accept*=((AliAODTrack*)track)->TestFilterBit(fAODFilterBit); + } + return accept; } diff --git a/PWGDQ/dielectron/AliDielectronTrackCuts.h b/PWGDQ/dielectron/AliDielectronTrackCuts.h index 566743e911f..c8d4370fc6e 100644 --- a/PWGDQ/dielectron/AliDielectronTrackCuts.h +++ b/PWGDQ/dielectron/AliDielectronTrackCuts.h @@ -30,6 +30,7 @@ public: kSDD0=0x0004, kSDD1=0x0008, kSSD0=0x0010, kSSD1=0x0020}; enum ITSclusterCutType { kOneOf=0, kAtLeast, kExact }; + enum EFilterBit { kSwitchOff=0, kTPCqual=1, kTPCqualSPDany=4, kTPCqualSPDanyPIDele=8 }; AliDielectronTrackCuts(); AliDielectronTrackCuts(const char*name, const char* title); @@ -48,6 +49,9 @@ public: ITSClusterRequirement GetClusterRequirementITS(Detector det) const { return fCutClusterRequirementITS[det]; } void SetITSclusterCut(ITSclusterCutType type, UChar_t map) { fITSclusterBitMap=map; fITSclusterCutType=type; } + + void SetAODFilterBit(EFilterBit type) { fAODFilterBit = type; } + // //Analysis cuts interface // @@ -71,7 +75,8 @@ private: Bool_t fRequireTPCRefit; // require TPC refit Int_t fTPCNclRobustCut; // TPC Ncl cut, Robust - + Int_t fAODFilterBit; // Filter bit for AOD analysis + Bool_t CheckITSClusterRequirement(ITSClusterRequirement req, Bool_t clusterL1, Bool_t clusterL2) const; Bool_t CheckITSClusterCut(UChar_t itsBits) const; diff --git a/PWGDQ/dielectron/AliDielectronVarManager.cxx b/PWGDQ/dielectron/AliDielectronVarManager.cxx index e92fa24045a..f333b58ed7f 100644 --- a/PWGDQ/dielectron/AliDielectronVarManager.cxx +++ b/PWGDQ/dielectron/AliDielectronVarManager.cxx @@ -61,6 +61,7 @@ const char* AliDielectronVarManager::fgkParticleNames[AliDielectronVarManager::k "NclsTRD", "TRDntracklets", "TRDpidQuality", + "TRDchi2", "TRDpidProb_Electrons", "TRDpidProb_Pions", "TRDphi", diff --git a/PWGDQ/dielectron/AliDielectronVarManager.h b/PWGDQ/dielectron/AliDielectronVarManager.h index 0920b272cb1..b6e0b2d3e24 100644 --- a/PWGDQ/dielectron/AliDielectronVarManager.h +++ b/PWGDQ/dielectron/AliDielectronVarManager.h @@ -104,6 +104,7 @@ public: kNclsTRD, // number of clusters assigned in the TRD kTRDntracklets, // number of TRD tracklets used for tracking/PID TODO: correct getter kTRDpidQuality, // number of TRD tracklets used for PID + kTRDchi2, // chi2 in TRD kTRDprobEle, // TRD electron pid probability kTRDprobPio, // TRD electron pid probability kTRDphi, // Phi angle of the track at the entrance of the TRD @@ -487,6 +488,7 @@ inline void AliDielectronVarManager::FillVarESDtrack(const AliESDtrack *particle values[AliDielectronVarManager::kNclsTRD] = particle->GetNcls(2); // TODO: get rid of the plain numbers values[AliDielectronVarManager::kTRDntracklets] = particle->GetTRDntracklets(); // TODO: GetTRDtracklets/GetTRDntracklets? values[AliDielectronVarManager::kTRDpidQuality] = particle->GetTRDntrackletsPID(); + values[AliDielectronVarManager::kTRDchi2] = particle->GetTRDchi2(); values[AliDielectronVarManager::kTPCclsDiff] = tpcSignalN-tpcNcls; values[AliDielectronVarManager::kTrackStatus] = (Double_t)particle->GetStatus(); @@ -677,7 +679,8 @@ inline void AliDielectronVarManager::FillVarAODTrack(const AliAODTrack *particle //TODO: set correctly values[AliDielectronVarManager::kTRDprobEle] = 0; values[AliDielectronVarManager::kTRDprobPio] = 0; - + values[AliDielectronVarManager::kTRDchi2] = -1; + values[AliDielectronVarManager::kTPCsignalN] = 0; values[AliDielectronVarManager::kTPCsignalNfrac]= 0; @@ -1742,11 +1745,14 @@ inline Bool_t AliDielectronVarManager::GetDCA(const AliAODTrack *track, Double_t return kTRUE; } - Double_t covd0z0[3]; - AliAODTrack copy(*track); - AliAODVertex *vtx =(AliAODVertex*)(fgEvent->GetPrimaryVertex()); - Double_t fBzkG = fgEvent->GetMagneticField(); // z componenent of field in kG - Bool_t ok = copy.PropagateToDCA(vtx,fBzkG,kVeryBig,d0z0,covd0z0); + Bool_t ok=kFALSE; + if(fgEvent) { + Double_t covd0z0[3]; + AliAODTrack copy(*track); + AliAODVertex *vtx =(AliAODVertex*)(fgEvent->GetPrimaryVertex()); + Double_t fBzkG = fgEvent->GetMagneticField(); // z componenent of field in kG + ok = copy.PropagateToDCA(vtx,fBzkG,kVeryBig,d0z0,covd0z0); + } if(!ok){ d0z0[0]=-999.; d0z0[1]=-999.; -- 2.43.0