]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
o updats (Julian)
authorwiechula <wiechula@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 21 Jun 2012 15:20:16 +0000 (15:20 +0000)
committerwiechula <wiechula@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 21 Jun 2012 15:20:16 +0000 (15:20 +0000)
  - fix mixing in AOD
  - add cut for AOD track bits

PWGDQ/dielectron/AliDielectron.cxx
PWGDQ/dielectron/AliDielectron.h
PWGDQ/dielectron/AliDielectronEvent.cxx
PWGDQ/dielectron/AliDielectronEvent.h
PWGDQ/dielectron/AliDielectronMixingHandler.cxx
PWGDQ/dielectron/AliDielectronTrackCuts.cxx
PWGDQ/dielectron/AliDielectronTrackCuts.h
PWGDQ/dielectron/AliDielectronVarManager.cxx
PWGDQ/dielectron/AliDielectronVarManager.h

index a8ac94093118e0002735cc501997a83a9ab1d8fc..29930501055a614ab54c589d7c1718a583bfbdb6 100644 (file)
@@ -584,6 +584,7 @@ void AliDielectron::FillTrackArrays(AliVEvent * const ev, Int_t eventNr)
       AliESDtrack *track=static_cast<AliESDtrack*>(particle);
       track->SetESDEvent(static_cast<AliESDEvent*>(ev)); //only in trunk...
     }
+
     //apply track cuts
     if (fTrackFilter.IsSelected(particle)!=selectedMask) continue;
 
index 7e23a20510b363ff2fac65c0b4fd14c2c8267121..39b4ae1d52e10f545ba8b265300f7e31907e6758 100644 (file)
@@ -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);
index 01cdeb05f56332da3e96faed8610e9038a453a46..d5b7bf7e138a117f85547b79c0d999f34d38c0c9 100644 (file)
@@ -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.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;
@@ -107,7 +119,9 @@ void AliDielectronEvent::SetTracks(const TObjArray &arrP, const TObjArray &arrN,
     } else {
       AliAODTrack *track=dynamic_cast<AliAODTrack*>(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<AliAODTrack*>(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<AliDielectronVarManager::kNMaxValues;++i) fEventData[i]=data[i];
-}
\ No newline at end of file
+}
index cf2e53b587ddd9b3c86e5e86c06bdd2deca63715..7b8a5aa2e1ec26fad7695c4f4d3c95ea2260d1d3 100644 (file)
@@ -16,6 +16,7 @@
 #include <TNamed.h>
 #include <TClonesArray.h>
 
+#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);
 
index 64d8a288a885ad76f16821fb1f42b8e4032b7d1e..b2226aff7c9bddb0aff63c5fc1f9757235f8e329 100644 (file)
@@ -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()<fDepth) return;
 
@@ -188,7 +188,7 @@ void AliDielectronMixingHandler::DoMixing(TClonesArray &pool, AliDielectron *die
   //
   // 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];
@@ -217,7 +217,6 @@ void AliDielectronMixingHandler::DoMixing(TClonesArray &pool, AliDielectron *die
       
       //setup track arrays
       AliDielectronEvent *ev2=static_cast<AliDielectronEvent*>(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.GetSize(); ++ipool){
     TClonesArray *poolp=static_cast<TClonesArray*>(fArrPools.At(ipool));
     if (!poolp || !poolp->GetEntriesFast() || !poolp->At(0)) continue;
index b476b3a7fe8af6e89160d2bb15fc7162380cccf7..cb243e34d23656f39ca6a75013fc87440e884d48 100644 (file)
@@ -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;
 }
 
index 566743e911f2e1be97829b31ee9d1a6f7506b5fc..c8d4370fc6ebbfb264a60311103d8ed70bb9565d 100644 (file)
@@ -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;
   
index e92fa24045a88028e0773cae234c5ddc0bee363d..f333b58ed7ffe7a52fdbc7752fb3314248565da2 100644 (file)
@@ -61,6 +61,7 @@ const char* AliDielectronVarManager::fgkParticleNames[AliDielectronVarManager::k
   "NclsTRD",
   "TRDntracklets",
   "TRDpidQuality",
+  "TRDchi2",
   "TRDpidProb_Electrons",
   "TRDpidProb_Pions",
   "TRDphi",
index 0920b272cb16ff6d35191a75de92a349f0329b99..b6e0b2d3e245619dc9b51089d81d41391f56ac8e 100644 (file)
@@ -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.;