AliESDtrack *track=static_cast<AliESDtrack*>(particle);
track->SetESDEvent(static_cast<AliESDEvent*>(ev)); //only in trunk...
}
+
//apply track cuts
if (fTrackFilter.IsSelected(particle)!=selectedMask) continue;
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);
TNamed(),
fArrTrackP("AliESDtrack",1000),
fArrTrackN("AliESDtrack",1000),
+ fArrVertexP("AliAODVertex",1000),
+ fArrVertexN("AliAODVertex",1000),
fArrPairs("AliKFParticle",0),
fNTracksP(0),
fNTracksN(0),
TNamed(name, title),
fArrTrackP("AliESDtrack",1000),
fArrTrackN("AliESDtrack",1000),
+ fArrVertexP("AliAODVertex",1000),
+ fArrVertexN("AliAODVertex",1000),
fArrPairs("AliKFParticle",0),
fNTracksP(0),
fNTracksN(0),
//
fArrTrackP.Delete();
fArrTrackN.Delete();
+ fArrVertexP.Delete();
+ fArrVertexN.Delete();
fArrPairs.Delete();
}
fNTracksP=0;
//check size of the arrays
- if (fArrTrackP.GetSize()<arrP.GetSize()) fArrTrackP.Expand(arrP.GetSize());
- if (fArrTrackN.GetSize()<arrN.GetSize()) fArrTrackN.Expand(arrN.GetSize());
+ if (fArrTrackP.GetSize()<arrP.GetSize()) {
+ fArrTrackP.Expand(arrP.GetSize());
+ fArrVertexP.Expand(arrP.GetSize());
+ }
+ if (fArrTrackN.GetSize()<arrN.GetSize()) {
+ fArrTrackN.Expand(arrN.GetSize());
+ fArrVertexN.Expand(arrN.GetSize());
+ }
// fill particles
Int_t tracks=0;
} else {
AliAODTrack *track=dynamic_cast<AliAODTrack*>(arrP.At(itrack));
if (!track) continue;
+
new (fArrTrackP[tracks]) AliAODTrack(*track);
+ new (fArrVertexP[tracks]) AliAODVertex(*(track->GetProdVertex()));
++tracks;
}
}
} else {
AliAODTrack *track=dynamic_cast<AliAODTrack*>(arrN.At(itrack));
if (!track) continue;
+
new (fArrTrackN[tracks]) AliAODTrack(*track);
+ new (fArrVertexN[tracks]) AliAODVertex(*(track->GetProdVertex()));
++tracks;
}
}
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);
//
// 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;
}
// copy only evnet variables
//
for (Int_t i=AliDielectronVarManager::kPairMax; i<AliDielectronVarManager::kNMaxValues;++i) fEventData[i]=data[i];
-}
\ No newline at end of file
+}
#include <TNamed.h>
#include <TClonesArray.h>
+#include "AliVVertex.h"
#include "AliDielectronVarManager.h"
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; }
private:
TClonesArray fArrTrackP; //positive tracks
TClonesArray fArrTrackN; //negative tracks
+ TClonesArray fArrVertexP; //positive tracks vertex
+ TClonesArray fArrVertexN; //negative tracks vertex
TClonesArray fArrPairs; //Pair array
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);
//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);
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()<fDepth) return;
//
// perform the mixing
//
-
+
//buffer track arrays and copy them back afterwards
TObjArray arrTrDummy[4];
for (Int_t i=0; i<4; ++i) arrTrDummy[i]=diele->fTracks[i];
//setup track arrays
AliDielectronEvent *ev2=static_cast<AliDielectronEvent*>(pool.At(i2));
-
ev1P.Reset();
ev1N.Reset();
TIter ev2P(ev2->GetTrackArrayP());
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);
while ( (o=ev2N()) ) diele->fTracks[2].Add(o);
diele->FillPairArrays(1,2);
}
+
}
}
//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.GetSize(); ++ipool){
TClonesArray *poolp=static_cast<TClonesArray*>(fArrPools.At(ipool));
if (!poolp || !poolp->GetEntriesFast() || !poolp->At(0)) continue;
#include "AliDielectronTrackCuts.h"
#include "AliVTrack.h"
+#include "AliAODTrack.h"
ClassImp(AliDielectronTrackCuts)
fITSclusterCutType(kOneOf),
fRequireITSRefit(kFALSE),
fRequireTPCRefit(kFALSE),
- fTPCNclRobustCut(-1)
+ fTPCNclRobustCut(-1),
+ fAODFilterBit(kSwitchOff)
{
//
// Default Constructor
fITSclusterCutType(kOneOf),
fRequireITSRefit(kFALSE),
fRequireTPCRefit(kFALSE),
- fTPCNclRobustCut(-1)
+ fTPCNclRobustCut(-1),
+ fAODFilterBit(kSwitchOff)
{
//
// Named Constructor
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;
}
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);
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
//
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;
"NclsTRD",
"TRDntracklets",
"TRDpidQuality",
+ "TRDchi2",
"TRDpidProb_Electrons",
"TRDpidProb_Pions",
"TRDphi",
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
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();
//TODO: set correctly
values[AliDielectronVarManager::kTRDprobEle] = 0;
values[AliDielectronVarManager::kTRDprobPio] = 0;
-
+ values[AliDielectronVarManager::kTRDchi2] = -1;
+
values[AliDielectronVarManager::kTPCsignalN] = 0;
values[AliDielectronVarManager::kTPCsignalNfrac]= 0;
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.;