]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Some updates + 1 bug fix (thanks to Massimo):
authorfbellini <fbellini@cern.ch>
Thu, 28 Aug 2014 11:13:17 +0000 (13:13 +0200)
committerfbellini <fbellini@cern.ch>
Thu, 28 Aug 2014 11:13:17 +0000 (13:13 +0200)
- Added option to disable/enable request for SPD vertex to AliRsnCutPrimaryVertex
- Added value for number of tracklets
- Improved event statistics plot in mini task to include counters ofr discarded events
- Fixed cut on chi2/dof for AOD tracks
- Updated cuts for D0 analysis + macros

13 files changed:
PWGLF/RESONANCES/AliRsnCutDaughterD0.cxx
PWGLF/RESONANCES/AliRsnCutDaughterD0.h
PWGLF/RESONANCES/AliRsnCutPrimaryVertex.cxx
PWGLF/RESONANCES/AliRsnCutPrimaryVertex.h
PWGLF/RESONANCES/AliRsnCutTrackQuality.cxx
PWGLF/RESONANCES/AliRsnCutTrackQuality.h
PWGLF/RESONANCES/AliRsnMiniAnalysisTask.cxx
PWGLF/RESONANCES/AliRsnMiniAnalysisTask.h
PWGLF/RESONANCES/AliRsnMiniEvent.h
PWGLF/RESONANCES/AliRsnMiniValue.cxx
PWGLF/RESONANCES/AliRsnMiniValue.h
PWGLF/RESONANCES/macros/mini/AddAnalysisTaskD0.C
PWGLF/RESONANCES/macros/mini/ConfigD0.C

index 81aad95a86ff0c8095e5e405c9cdaf9010771431..9a1211d1b0855d7a6a5e4d9b9d2fa75710da7da9 100644 (file)
@@ -18,6 +18,7 @@ ClassImp(AliRsnCutDaughterD0)
 AliRsnCutDaughterD0::AliRsnCutDaughterD0(const char *name, AliPID::EParticleType pid) :
 AliRsnCut(name, AliRsnTarget::kDaughter),
   fNoPID(kFALSE),
+  //fIsCheckOnMother(kFALSE),
   fPID(pid),
   fCutQuality(Form("%sQuality", name)),
   fPionTPCPIDCut(3.0),
@@ -28,20 +29,22 @@ AliRsnCut(name, AliRsnTarget::kDaughter),
 {
   //
   // Constructor
-  // Initialize track quality cuts to 2010 defaults
+  // 
   //
   fCutQuality.SetPtRange(0.15, 1E+20);
   fCutQuality.SetEtaRange(-0.8, 0.8);
-  fCutQuality.SetDCARPtFormula("0.0105+0.0350/pt^1.1");
+  fCutQuality.SetDCARPtFormula("");
   fCutQuality.SetDCARmin(0.0);
   fCutQuality.SetDCAZmax(2.0);
-  fCutQuality.SetSPDminNClusters(1);
+  fCutQuality.SetSPDminNClusters(0);
   fCutQuality.SetITSminNClusters(0);
   fCutQuality.SetITSmaxChi2(1E+20);
-  fCutQuality.SetTPCminNClusters(70);
-  fCutQuality.SetTPCmaxChi2(4.0);
+  fCutQuality.SetTPCminNClusters(0);
+  fCutQuality.SetMinNCrossedRowsTPC(0,kTRUE);
+  fCutQuality.SetMinNCrossedRowsOverFindableClsTPC(0.00,kTRUE);
+  fCutQuality.SetTPCmaxChi2(1E20);
   fCutQuality.SetRejectKinkDaughters();
-  fCutQuality.SetAODTestFilterBit(5);
+  fCutQuality.SetAODTestFilterBit(-1);
 }
 
 //__________________________________________________________________________________________________
@@ -53,6 +56,9 @@ Bool_t AliRsnCutDaughterD0::IsSelected(TObject *obj)
 
   // coherence check
   if (!TargetOK(obj)) return kFALSE;
+  
+  // if this class is used to check the mothers in the acceptance, accept (will be applied only selection on min pt and eta)
+  //if (fIsCheckOnMother) return kTRUE;
 
   // check track
   AliVTrack *track = dynamic_cast<AliVTrack *>(fDaughter->GetRef());
@@ -73,6 +79,7 @@ Bool_t AliRsnCutDaughterD0::IsSelected(TObject *obj)
   // if no PID is required, accept
   if (fNoPID) return kTRUE;
   
+  
   // check initialization of PID object
   AliPIDResponse *pid = fEvent->GetPIDResponse();
   if (!pid) {
@@ -80,9 +87,10 @@ Bool_t AliRsnCutDaughterD0::IsSelected(TObject *obj)
     return kFALSE;
   }
   
-  AliDebugClass(2, "Checking TOF Matching..."); 
-  // check if TOF is matched
+  AliDebugClass(2, "Checking TPC and TOF Matching..."); 
+  // check if TPC and TOF are matched
   // and computes all values used in the PID cut
+  Bool_t   isTPC  = MatchTPC(track);
   Bool_t   isTOF  = MatchTOF(track);   
   AliDebugClass(2, "...passed");
    
@@ -96,24 +104,25 @@ Bool_t AliRsnCutDaughterD0::IsSelected(TObject *obj)
 
   if(!fPtDepPIDCut){
     // applies the cut differently depending on the PID and the momentum
-    if (isTOF) {
+    if (isTPC && isTOF) {
       if (fPID == AliPID::kPion) {maxTPC = fPionTPCPIDCut; maxTOF = fPionTOFPIDCut;}
       if (fPID == AliPID::kKaon) {maxTPC = fKaonTPCPIDCut; maxTOF = fKaonTOFPIDCut;}
       return (nsTPC <= maxTPC && nsTOF <= maxTOF);
-    } else {
+    } else if (isTPC){
       if (fPID == AliPID::kPion) maxTPC = fPionTPCPIDCut;
       if (fPID == AliPID::kKaon) maxTPC = fKaonTPCPIDCut;
       return (nsTPC <= maxTPC); 
     }
+    else return kTRUE;
   } else {
     // applies the cut differently depending on the PID and the momentum
-    if (isTOF) {
+    if (isTPC && isTOF) {
       // TPC: 5sigma cut for all
       if (nsTPC > 5.0) return kFALSE;
       // TOF: 3sigma below 1.5 GeV, 2sigma above
       if (p < 1.5) maxTOF = 3.0; else maxTOF = 2.0;
       return (nsTOF <= maxTOF);
-    } else {
+    } else if(isTPC){
       // TPC:
       // all   below   350         MeV: 5sigma
       // all   between 350 and 500 MeV: 3sigma
@@ -136,6 +145,7 @@ Bool_t AliRsnCutDaughterD0::IsSelected(TObject *obj)
       }
       return (nsTPC <= maxTPC);
     } 
+    else return kTRUE;
   }    
   
   AliDebugClass(2, "...passed"); 
index e8c5e43d2f4c8d4b8fd22ec28654a2d095a6885b..57c9d73c347bdbc7f3162fea93b89c38a4187625 100644 (file)
@@ -9,6 +9,8 @@
 //
 
 #include "AliVTrack.h"
+#include "AliPID.h"
+#include "AliPIDResponse.h"
 #include "AliRsnCut.h"
 #include "AliRsnCutTrackQuality.h"
 
@@ -22,6 +24,7 @@ class AliRsnCutDaughterD0 : public AliRsnCut {
   virtual ~AliRsnCutDaughterD0() { }
 
   void           SetNoPID(Bool_t yn = kTRUE)                  {fNoPID = yn;}
+  //void           SetIsCheckOnMother(Bool_t yn = kTRUE)        {fIsCheckOnMother = yn;}
   void           SetPtDependentPIDCut(Bool_t yn = kTRUE)      {fPtDepPIDCut = yn;}
   void           SetPID(AliPID::EParticleType type)           {fPID = type;}
    
@@ -33,10 +36,12 @@ class AliRsnCutDaughterD0 : public AliRsnCut {
    
   AliRsnCutTrackQuality *CutQuality()                       {return &fCutQuality;}
   Bool_t                 MatchTOF(const AliVTrack *vtrack);
+  Bool_t                 MatchTPC(const AliVTrack *vtrack);
   virtual Bool_t         IsSelected(TObject *obj);
    
  private:
   Bool_t                fNoPID;            // flag to switch off PID check
+  //Bool_t                fIsCheckOnMother;  // flag to switch off tracks check
   AliPID::EParticleType fPID;              // PID for track
   AliRsnCutTrackQuality fCutQuality;       // track quality cut 
 
@@ -47,7 +52,7 @@ class AliRsnCutDaughterD0 : public AliRsnCut {
   Double_t         fKaonTOFPIDCut;                // TOF nsigmas for kaons
   Bool_t           fPtDepPIDCut;                  // flag for setting a pt dependent or independent PID cut
 
-  ClassDef(AliRsnCutDaughterD0, 2)          // cut definitions for D0
+  ClassDef(AliRsnCutDaughterD0, 3)          // cut definitions for D0
     };
 
 //__________________________________________________________________________________________________
@@ -61,11 +66,47 @@ inline Bool_t AliRsnCutDaughterD0::MatchTOF(const AliVTrack *vtrack)
     AliWarning("NULL argument: impossible to check status");
     return kFALSE;
   }
+  AliPIDResponse *fPidResponse = fEvent->GetPIDResponse();
+  if (!fPidResponse) {
+    AliFatal("NULL PID response");
+    return kFALSE;
+  }
+  
+  AliPIDResponse::EDetPidStatus status = fPidResponse->CheckPIDStatus(AliPIDResponse::kTOF,vtrack);
+  if (status != AliPIDResponse::kDetPidOk) return kFALSE; 
+  Float_t probMis = fPidResponse->GetTOFMismatchProbability(vtrack);
+  if (probMis > 0.01) return kFALSE;
+  if ((vtrack->GetStatus()&AliESDtrack::kTOFpid )==0 && vtrack->GetStatus()&AliESDtrack::kITSrefit )   return kFALSE;
+  return kTRUE;
+  
 
-  if (!(vtrack->GetStatus() & AliESDtrack::kTOFout)) return kFALSE;
-  if (!(vtrack->GetStatus() & AliESDtrack::kTIME  )) return kFALSE;
+  //if (!(vtrack->GetStatus() & AliESDtrack::kTOFout)) return kFALSE;
+  //if (!(vtrack->GetStatus() & AliESDtrack::kTIME  )) return kFALSE;
 
   return kTRUE;
 }
 
+//___________________________________________________________________________________________________
+inline Bool_t AliRsnCutDaughterD0::MatchTPC(const AliVTrack *vtrack) 
+{
+  // Check if the track is good for TPC PID
+  
+  
+  if (!vtrack) {
+    AliWarning("NULL argument: impossible to check status");
+    return kFALSE;
+  }
+  AliPIDResponse *fPidResponse = fEvent->GetPIDResponse();
+  if (!fPidResponse) {
+    AliFatal("NULL PID response");
+    return kFALSE;
+  }
+  
+  AliPIDResponse::EDetPidStatus status = fPidResponse->CheckPIDStatus(AliPIDResponse::kTPC,vtrack);
+  if (status != AliPIDResponse::kDetPidOk) return kFALSE;
+  UInt_t nclsTPCPID = vtrack->GetTPCsignalN();
+  if(nclsTPCPID<0) return kFALSE;
+  return kTRUE;
+}
+
 #endif
index 6c4354861587ffe1680892cce87926fb6fb1b744..47a97769138b21756be507b62be7473bcd6b544a 100644 (file)
@@ -15,9 +15,10 @@ ClassImp(AliRsnCutPrimaryVertex)
 
 //_________________________________________________________________________________________________
 AliRsnCutPrimaryVertex::AliRsnCutPrimaryVertex
-(const char *name, Double_t maxVz, Int_t nContributors, Bool_t acceptTPC) :
+(const char *name, Double_t maxVz, Int_t nContributors, Bool_t acceptTPC, Bool_t acceptSPD) :
    AliRsnCut(name, AliRsnCut::kEvent, 0, nContributors - 1, -maxVz, maxVz + 1E-6),
    fAcceptTPC(acceptTPC),
+   fAcceptSPD(acceptSPD),
    fCheckPileUp(kFALSE)
 {
 //
@@ -78,8 +79,12 @@ Bool_t AliRsnCutPrimaryVertex::IsSelected(TObject *object)
          fCutValueI = ncTrk;
          fCutValueD = vzTrk;
       } else if (vSPD && ncSPD > 0) {
+         if (!fAcceptSPD)
+            return kFALSE;
+         else {
          fCutValueI = ncSPD;
          fCutValueD = vzSPD;
+        }
       } else if (vTPC && ncTPC > 0) {
          if (!fAcceptTPC)
             return kFALSE;
@@ -94,31 +99,47 @@ Bool_t AliRsnCutPrimaryVertex::IsSelected(TObject *object)
       // we first check if the SPD primary vertex is there
       // if it is not, then the only available is the TPC
       // stand-alone primary vertex, which is rejected
-      AliAODVertex *aodv = aod->GetPrimaryVertexSPD();
-      if (!aodv) {
-         AliDebugClass(1, "Not found SPD vertex --> TPC only available, skipped");
-         return kFALSE;
-      }
-      // now check primary vertex
-      aodv = (AliAODVertex *)aod->GetPrimaryVertex();
-      if (CheckVertex(aodv)) {
-         AliDebugClass(1, "Vertex TRK is OK");
-         fCutValueD = aodv->GetZ();
-         fCutValueI = aodv->GetNDaughters(); //aodv->GetNContributors();
-      }
-      else {
-         aodv = aod->GetPrimaryVertexSPD();
-         if (CheckVertex(aodv)) {
-            AliDebugClass(1, "Vertex TRK is BAD, but vertex SPD is OK");
-            fCutValueD = aodv->GetZ();
-            fCutValueI = aodv->GetNDaughters(); //aodv->GetNContributors();
-         } else {
-            AliDebugClass(1, "Vertex TRK is BAD, and vertex SPD is BAD");
-            return kFALSE;
-         }
-      }
-   } else
-      return kFALSE;
+      
+      if(fAcceptSPD){
+       AliAODVertex *aodv = aod->GetPrimaryVertexSPD();
+       if (!aodv) {
+               AliDebugClass(1, "Not found SPD vertex --> TPC only available, skipped");
+               return kFALSE;
+       }
+       // now check primary vertex
+       aodv = (AliAODVertex *)aod->GetPrimaryVertex();
+       if (CheckVertex(aodv)) {
+               AliDebugClass(1, "Vertex TRK is OK");
+               fCutValueD = aodv->GetZ();
+               fCutValueI = aodv->GetNDaughters(); //aodv->GetNContributors();
+       }
+       else {
+               aodv = aod->GetPrimaryVertexSPD();
+               if (CheckVertex(aodv)) {
+               AliDebugClass(1, "Vertex TRK is BAD, but vertex SPD is OK");
+               fCutValueD = aodv->GetZ();
+               fCutValueI = aodv->GetNDaughters(); //aodv->GetNContributors();
+               } else {
+               AliDebugClass(1, "Vertex TRK is BAD, and vertex SPD is BAD");
+               return kFALSE;
+               }
+        
+               } 
+     }
+     else{     
+        const AliVVertex *vertex = aod->GetPrimaryVertex();
+        if(!vertex) return kFALSE;
+        else{
+        TString title=vertex->GetTitle();
+        if(title.Contains("Z") ) return kFALSE;
+        else if(title.Contains("3D") ) return kFALSE;
+        fCutValueI = vertex->GetNContributors();
+        fCutValueD = TMath::Abs(vertex->GetZ());
+        }
+     }
+     
+     } else
+       return kFALSE;
 
    // output
    Bool_t result = ((!OkRangeI()) && OkRangeD());
@@ -134,6 +155,7 @@ void AliRsnCutPrimaryVertex::Print(const Option_t *) const
 
    AliInfo(Form("Cut name                     : %s", GetName()));
    AliInfo(Form("Accepting TPC primary vertex : %s", (fAcceptTPC ? "YES" : "NO")));
+   AliInfo(Form("Accepting SPD primary vertex : %s", (fAcceptSPD ? "YES" : "NO")));
    AliInfo(Form("Contributors range (outside) : %d - %d", fMinI, fMaxI));
    AliInfo(Form("Z-vertex     range (inside)  : %f - %f", fMinD, fMaxD));
 }
index 7a583d447d4232fd20476f373e36f7f8ce237348..e246a88b9a0d0e279e606fa2dfb8a2bccd2b2202 100644 (file)
@@ -17,7 +17,7 @@ class AliVVertex;
 class AliRsnCutPrimaryVertex : public AliRsnCut {
 public:
 
-   AliRsnCutPrimaryVertex(const char *name = "cutPrimVert", Double_t maxVz = 10.0, Int_t minContributors = 1, Bool_t acceptTPC = kFALSE);
+   AliRsnCutPrimaryVertex(const char *name = "cutPrimVert", Double_t maxVz = 10.0, Int_t minContributors = 1, Bool_t acceptTPC = kFALSE, Bool_t acceptSPD = kTRUE);
    virtual ~AliRsnCutPrimaryVertex() {;};
 
    void           SetCheckPileUp(Bool_t doit = kTRUE) {fCheckPileUp = doit;}
@@ -29,8 +29,9 @@ protected:
    Bool_t CheckVertex(AliVVertex *vert);
 
    Bool_t fAcceptTPC;   // if kTRUE, the TPC primary vertexes are accepted
+   Bool_t fAcceptSPD;   // if kTRUE, the SPD primary vertexes are accepted
    Bool_t fCheckPileUp; // check and reject pileupped events (pp)
-   ClassDef(AliRsnCutPrimaryVertex, 1)
+   ClassDef(AliRsnCutPrimaryVertex, 2)
 };
 
 #endif
index 8cac06f045d13ff330a951ff1e5665b42a03d907..48f18bcdd0151f2448c79f3ac231de8499c972ce 100644 (file)
@@ -50,6 +50,7 @@ AliRsnCutTrackQuality::AliRsnCutTrackQuality(const char *name) :
    fTPCminNClusters(0),
    fTPCmaxChi2(1E20),
    fCutMaxChi2TPCConstrainedVsGlobal(1E20),
+   fTrackMaxChi2(1E20),
    fIsUseCrossedRowsCut(kFALSE),
    fTPCminNCrossedRows(0),
    fTPCminCrossedRowsOverFindableCls(0),
@@ -88,6 +89,7 @@ AliRsnCutTrackQuality::AliRsnCutTrackQuality(const AliRsnCutTrackQuality &copy)
    fTPCminNClusters(copy.fTPCminNClusters),
    fTPCmaxChi2(copy.fTPCmaxChi2),
    fCutMaxChi2TPCConstrainedVsGlobal(copy.fCutMaxChi2TPCConstrainedVsGlobal),
+   fTrackMaxChi2(copy.fTrackMaxChi2),
    fIsUseCrossedRowsCut(copy.fIsUseCrossedRowsCut),
    fTPCminNCrossedRows(copy.fTPCminNCrossedRows),
    fTPCminCrossedRowsOverFindableCls(copy.fTPCminCrossedRowsOverFindableCls),
@@ -135,6 +137,7 @@ AliRsnCutTrackQuality &AliRsnCutTrackQuality::operator=(const AliRsnCutTrackQual
    fTPCminNClusters = copy.fTPCminNClusters;
    fTPCmaxChi2 = copy.fTPCmaxChi2;
    fCutMaxChi2TPCConstrainedVsGlobal = copy.fCutMaxChi2TPCConstrainedVsGlobal;
+   fTrackMaxChi2 = copy.fTrackMaxChi2;
    fIsUseCrossedRowsCut=copy.fIsUseCrossedRowsCut;
    fTPCminNCrossedRows = copy.fTPCminNCrossedRows;
    fTPCminCrossedRowsOverFindableCls = copy.fTPCminCrossedRowsOverFindableCls;
@@ -176,6 +179,7 @@ void AliRsnCutTrackQuality::DisableAll()
    fTPCmaxChi2 = 1E20;
    fAODTestFilterBit = -1;
    fCutMaxChi2TPCConstrainedVsGlobal = 1E20;
+   fTrackMaxChi2 = 1E20;
    fIsUseCrossedRowsCut = 0;
    fTPCminNCrossedRows = 0;
    fTPCminCrossedRowsOverFindableCls = 0;
@@ -358,12 +362,8 @@ Bool_t AliRsnCutTrackQuality::CheckAOD(AliAODTrack *track)
       return kFALSE;
    }
 
-   //check chi square
-   if (track->Chi2perNDF() > fTPCmaxChi2) {
-      AliDebug(AliLog::kDebug + 2, "Bad chi2. Rejected");
-      return kFALSE;
-   }
-   if (track->Chi2perNDF() > fITSmaxChi2) {
+   //check track chi square
+   if (track->Chi2perNDF() > fTrackMaxChi2) {
       AliDebug(AliLog::kDebug + 2, "Bad chi2. Rejected");
       return kFALSE;
    }
index 78a4fc539dcda7d7be028ed452af9692c3f289be..fa537f9e389340956d87a2501b5b623a204e4106 100644 (file)
@@ -50,6 +50,7 @@ public:
    void      SetTPCminNClusters(Int_t value)           {fTPCminNClusters = value;}
    void      SetTPCmaxChi2(Double_t value)             {fTPCmaxChi2 = value;}
    void      SetMaxChi2TPCConstrainedGlobal(Float_t max) {fCutMaxChi2TPCConstrainedVsGlobal = max; }
+   void      SetTrackMaxChi2(Double_t value)           {fTrackMaxChi2 = value;}
    void      SetMinNCrossedRowsTPC(Double_t min, Bool_t useTPCCrossedRows) {fTPCminNCrossedRows=min; fIsUseCrossedRowsCut=useTPCCrossedRows;}
    void      SetMinNCrossedRowsOverFindableClsTPC(Double_t min, Bool_t useTPCCrossedRows) {fTPCminCrossedRowsOverFindableCls=min; fIsUseCrossedRowsCut=useTPCCrossedRows;}
    void      SetMinLengthActiveVolumeTPC(Double_t min, Bool_t on = kFALSE) {fCutMinLengthActiveVolumeTPC=min; fIsUseLengthActiveVolumeTPCCut=on;}
@@ -100,6 +101,8 @@ protected:
    Double_t   fTPCmaxChi2;             // maximum chi2 / number of clusters in TPC
    Float_t    fCutMaxChi2TPCConstrainedVsGlobal;  // max chi2 TPC track constrained with vtx vs. global track
    
+   Double_t   fTrackMaxChi2;           // maximum track chi2/NDF
+   
    Bool_t     fIsUseCrossedRowsCut;     //enable cut on minimum number of TPC crossed rows
    Float_t    fTPCminNCrossedRows;     // minimum number of TPC crossed rows
    Float_t    fTPCminCrossedRowsOverFindableCls;     // minimum number of crossed rows/findable clusters
@@ -110,6 +113,6 @@ protected:
    Bool_t     fCheckOnlyFilterBit;     // check only the filter bit
    AliESDtrackCuts *fESDtrackCuts;     // pointer to AliESDtrackCuts object
 
-   ClassDef(AliRsnCutTrackQuality, 4)
+   ClassDef(AliRsnCutTrackQuality, 5)
 };
 #endif
index 9ae2d8c2313dc1768e4eff18d161cdf34b52a37e..a80ed5c8b0b9f651669a40d6013cdb347b6a35db 100644 (file)
@@ -61,6 +61,7 @@ AliRsnMiniAnalysisTask::AliRsnMiniAnalysisTask() :
    fValues("AliRsnMiniValue", 0),
    fHEventStat(0x0),
    fHAEventsVsMulti(0x0),
+   fHAEventsVsTracklets(0x0),
    fHAEventVz(0x0),
    fHAEventMultiCent(0x0),
    fHAEventPlane(0x0),
@@ -106,6 +107,7 @@ AliRsnMiniAnalysisTask::AliRsnMiniAnalysisTask(const char *name, Bool_t useMC) :
    fValues("AliRsnMiniValue", 0),
    fHEventStat(0x0),
    fHAEventsVsMulti(0x0),
+   fHAEventsVsTracklets(0x0),
    fHAEventVz(0x0),
    fHAEventMultiCent(0x0),
    fHAEventPlane(0x0),
@@ -156,6 +158,7 @@ AliRsnMiniAnalysisTask::AliRsnMiniAnalysisTask(const AliRsnMiniAnalysisTask &cop
    fValues(copy.fValues),
    fHEventStat(0x0),
    fHAEventsVsMulti(0x0),
+   fHAEventsVsTracklets(0x0),
    fHAEventVz(0x0),
    fHAEventMultiCent(0x0),
    fHAEventPlane(0x0),
@@ -211,6 +214,7 @@ AliRsnMiniAnalysisTask &AliRsnMiniAnalysisTask::operator=(const AliRsnMiniAnalys
    fValues = copy.fValues;
    fHEventStat = copy.fHEventStat;
    fHAEventsVsMulti = copy.fHAEventsVsMulti;
+   fHAEventsVsTracklets = copy.fHAEventsVsTracklets;
    fHAEventVz = copy.fHAEventVz;
    fHAEventMultiCent = copy.fHAEventMultiCent;
    fHAEventPlane = copy.fHAEventPlane;
@@ -297,11 +301,16 @@ void AliRsnMiniAnalysisTask::UserCreateOutputObjects()
    fOutput->SetOwner();
 
    // initialize event statistics counter
-   fHEventStat = new TH1F("hEventStat", "Event statistics", 4, 0.0, 4.0);
+   fHEventStat = new TH1F("hEventStat", "Event statistics", 8, 0.0, 8.0);
    fHEventStat->GetXaxis()->SetBinLabel(1, "CINT1B");
    fHEventStat->GetXaxis()->SetBinLabel(2, "V0AND");
    fHEventStat->GetXaxis()->SetBinLabel(3, "Candle");
    fHEventStat->GetXaxis()->SetBinLabel(4, "Accepted");
+   fHEventStat->GetXaxis()->SetBinLabel(5, "Not Accepted - Total");
+   fHEventStat->GetXaxis()->SetBinLabel(6, "Not Accepted - No Track Vertex");
+   fHEventStat->GetXaxis()->SetBinLabel(7, "Not Accepted - Not Enough Contributors");
+   fHEventStat->GetXaxis()->SetBinLabel(8, "Not Accepted - No Vertex inside |z| < 10 cm");
+   
    fOutput->Add(fHEventStat);
 
    if (fUseCentrality)
@@ -309,6 +318,9 @@ void AliRsnMiniAnalysisTask::UserCreateOutputObjects()
    else
       fHAEventsVsMulti = new TH1F("hAEventsVsMulti", "Accepted events vs Multiplicity",1000, 0, 1000.0);
    fOutput->Add(fHAEventsVsMulti);
+   
+   fHAEventsVsTracklets = new TH1F("hAEventsVsTracklets", "Accepted events vs Tracklet Number",1000, 0, 1000.0);
+   fOutput->Add(fHAEventsVsTracklets);
 
    if(fHAEventVz) fOutput->Add(fHAEventVz);
    if(fHAEventMultiCent) fOutput->Add(fHAEventMultiCent);
@@ -737,12 +749,23 @@ Char_t AliRsnMiniAnalysisTask::CheckCurrentEvent()
    if (isSelected) {
       fHEventStat->Fill(3.1);
       Double_t multi = ComputeCentrality((output == 'E'));
+      Double_t tracklets = ComputeTracklets();
       fHAEventsVsMulti->Fill(multi);
+      fHAEventsVsTracklets->Fill(tracklets);
       if(fHAEventVz) fHAEventVz->Fill(multi,fInputEvent->GetPrimaryVertex()->GetZ());
       if(fHAEventMultiCent) fHAEventMultiCent->Fill(multi,ComputeMultiplicity(output == 'E',fHAEventMultiCent->GetYaxis()->GetTitle()));
       if(fHAEventPlane) fHAEventPlane->Fill(multi,ComputeAngle());
       return output;
    } else {
+      fHEventStat->Fill(4.1);
+      const AliVVertex *vertex = fInputEvent->GetPrimaryVertex();
+         if(!vertex) fHEventStat->Fill(5.1);
+        else{
+        TString title=vertex->GetTitle();
+        if( (title.Contains("Z")) || (title.Contains("3D")) ) fHEventStat->Fill(5.1);
+        if(vertex->GetNContributors()<1.) fHEventStat->Fill(6.1);
+        if(TMath::Abs(vertex->GetZ())>10.) fHEventStat->Fill(7.1);
+        }
       return 0;
    }
 }
@@ -761,6 +784,7 @@ void AliRsnMiniAnalysisTask::FillMiniEvent(Char_t evType)
    fMiniEvent->Vz()    = fInputEvent->GetPrimaryVertex()->GetZ();
    fMiniEvent->Angle() = ComputeAngle();
    fMiniEvent->Mult()  = ComputeCentrality((evType == 'E'));
+   fMiniEvent->Tracklets() = ComputeTracklets();
    AliDebugClass(2, Form("Event %d: type = %c -- vz = %f -- mult = %f -- angle = %f", fEvNum, evType, fMiniEvent->Vz(), fMiniEvent->Mult(), fMiniEvent->Angle()));
 
    // loop on daughters and assign track-related values
@@ -918,6 +942,29 @@ Double_t AliRsnMiniAnalysisTask::ComputeMultiplicity(Bool_t isESD,TString type)
    }
 }
 
+//__________________________________________________________________________________________________
+Double_t AliRsnMiniAnalysisTask::ComputeTracklets()
+{
+//
+// Get number of tracklets
+//
+
+   Double_t count = 100;
+
+   if (fInputEvent->InheritsFrom(AliESDEvent::Class())){
+      AliESDEvent *esdEvent = (AliESDEvent *)fInputEvent;
+      const AliMultiplicity *spdmult = esdEvent->GetMultiplicity();
+      count = 1.0*spdmult->GetNumberOfTracklets();
+      }
+   else if (fInputEvent->InheritsFrom(AliAODEvent::Class())) {
+      AliAODEvent *aodEvent = (AliAODEvent *)fInputEvent;
+      AliAODTracklets *spdmult = aodEvent->GetTracklets();
+      count = 1.0*spdmult->GetNumberOfTracklets();
+   }
+
+   return count;
+}
+
 //__________________________________________________________________________________________________
 void AliRsnMiniAnalysisTask::FillTrueMotherESD(AliRsnMiniEvent *miniEvent)
 {
index 50afb0916c6f8a23bfe9db8c333907a25ed206a3..6b12298d647a1a70a53d72eeee57461afe8cf0ee 100644 (file)
@@ -78,6 +78,7 @@ private:
    Double_t ComputeAngle();
    Double_t ComputeCentrality(Bool_t isESD);
    Double_t ComputeMultiplicity(Bool_t isESD,TString type);
+   Double_t ComputeTracklets();
    Double_t ApplyCentralityPatchAOD049();
    Double_t ApplyCentralityPatchPbPb2011();
    void     FillTrueMotherESD(AliRsnMiniEvent *event);
@@ -104,6 +105,7 @@ private:
    TClonesArray         fValues;          //  list of values to be computed
    TH1F                *fHEventStat;      //  histogram of event statistics
    TH1F                *fHAEventsVsMulti; //  histogram of event statistics
+   TH1F                *fHAEventsVsTracklets; //  histogram of event statistics
    TH2F                *fHAEventVz;       //  histogram of vertex-z vs. multiplicity/centrality
    TH2F                *fHAEventMultiCent;//  histogram of multiplicity vs. centrality
    TH2F                *fHAEventPlane;    //  histogram of event plane vs. multiplicity/centrality
@@ -126,7 +128,7 @@ private:
    Bool_t              fKeepDfromBOnly;     // flag to keep only the charm particles that comes from beauty decays (specific for D meson analysis)
    Bool_t              fRejectIfNoQuark;    // flag to remove events not generated with PYTHIA
 
-   ClassDef(AliRsnMiniAnalysisTask, 9);   // AliRsnMiniAnalysisTask
+   ClassDef(AliRsnMiniAnalysisTask, 10);   // AliRsnMiniAnalysisTask
 };
 
 
index 84ec4b271f542526b7a9fbc085bb625fbb831117..34217b77d638516fed6c44322b8a4d98dbf9ab8b 100644 (file)
@@ -16,12 +16,13 @@ class AliRsnMiniParticle;
 class AliRsnMiniEvent : public TObject {
 public:
 
-   AliRsnMiniEvent() : fID(-1), fVz(0.0), fMult(0.0), fAngle(0.0), fLeading(-1), fParticles("AliRsnMiniParticle", 0) {}
+   AliRsnMiniEvent() : fID(-1), fVz(0.0), fMult(0.0),  fTracklets(0.0), fAngle(0.0), fLeading(-1), fParticles("AliRsnMiniParticle", 0) {}
    ~AliRsnMiniEvent() {fParticles.Delete();}
 
    Int_t              &ID()        {return fID;}
    Float_t            &Vz()        {return fVz;}
    Float_t            &Mult()      {return fMult;}
+   Float_t            &Tracklets() {return fTracklets;}
    Float_t            &Angle()     {return fAngle;}
    TClonesArray       &Particles() {return fParticles;}
    Bool_t              IsEmpty()   {return fParticles.IsEmpty();}
@@ -36,12 +37,13 @@ private:
    Int_t         fID;         // ID number
    Float_t       fVz;         // z-position of vertex
    Float_t       fMult;       // multiplicity or centrality
+   Float_t       fTracklets;  // tracklets
    Float_t       fAngle;      // angle of reaction plane to main reference frame
 
    Int_t         fLeading;    // index of leading particle
    TClonesArray  fParticles;  // list of selected particles
 
-   ClassDef(AliRsnMiniEvent,2)
+   ClassDef(AliRsnMiniEvent,4)
 };
 
 #endif
index 74f4985f84c830ba501712f74b802c3062913bfa..d0c4c12b9840263fb9ed47bb6811086955546b4d 100644 (file)
@@ -98,6 +98,7 @@ const char *AliRsnMiniValue::TypeName(EType type)
    switch (type) {
       case kVz:           return "EventVz";
       case kMult:         return "EventMult";
+      case kTracklets:    return "EventTracklets";
       case kPlaneAngle:   return "EventPlane";
       case kLeadingPt:    return "EventLeadingPt";
       case kPt:           return "Pt";
@@ -152,6 +153,8 @@ Float_t AliRsnMiniValue::Eval(AliRsnMiniPair *pair, AliRsnMiniEvent *event)
          return event->Vz();
       case kMult:
          return event->Mult();
+      case kTracklets:
+         return event->Tracklets();     
       case kPlaneAngle:
          return event->Angle();
       case kLeadingPt:
index 736e1cfd3b2d9e141043422320296fc9ae0fbfdb..450ae29b4c64448b03dd345440e8064e84ebd232 100644 (file)
@@ -19,6 +19,7 @@ public:
    enum EType {
       kVz,            // event Z position of primary vertex
       kMult,          // event multiplicity or centrality (depends on task settings)
+      kTracklets,     // event tracklets
       kPlaneAngle,    // event reaction plane angle
       kLeadingPt,     // event leading particle momentum
       kEventCuts,     // -- limit of event cuts ----------------------------------------------------
index 65d01a2ab0d0d6fd6aa7de31702c8b96fe76c2f5..3929e9fdead26e0262327b5b2674f416f4143148 100644 (file)
@@ -31,11 +31,10 @@ AliRsnMiniAnalysisTask * AddAnalysisTaskD0
    Float_t     trackDCAcutMin = 0.0,
    Float_t     trackDCAZcutMax = 2.0,
    Int_t       NTPCcluster = 70,
+   Double_t    NTPCcrratio = 0.8,
    Int_t       minSPDclt = 0,
    Double_t    minpt = 0.15,
    TString     triggerMask = AliVEvent::kMB,
-   Short_t     maxSisters = 2,
-   Bool_t      checkP = kTRUE,
    Bool_t      minDCAcutFixed = kFALSE,
    Bool_t      maxDCAcutFixed = kFALSE,
    Bool_t      ptdepPIDcut = kFALSE,
@@ -45,8 +44,8 @@ AliRsnMiniAnalysisTask * AddAnalysisTaskD0
    Bool_t      doCalculationInMC = kTRUE,
    UShort_t    originDselection = 0,
    Int_t       nmix = 5,
-   Double_t    minYlab =  -0.5,
-   Double_t    maxYlab =  0.5,
+   Double_t    minYlab = -0.5,
+   Double_t    maxYlab = 0.5,
    Float_t     mineta = -0.8,
    Float_t     maxeta = 0.8,
    Float_t     min_inv_mass = 0.6,
@@ -64,6 +63,8 @@ AliRsnMiniAnalysisTask * AddAnalysisTaskD0
   // retrieve analysis manager
   //
   Float_t     cutV = 10.0;
+  Short_t     maxSisters = 2;
+  Bool_t      checkP = kTRUE;
   Bool_t      checkFeedDown = kTRUE;
   Bool_t      checkQuark = kTRUE;
   Int_t       aodN = 0;
@@ -86,7 +87,7 @@ AliRsnMiniAnalysisTask * AddAnalysisTaskD0
    } 
 
    // create the task and configure 
-   TString taskName = Form("D0%s%s_%.1f_%d_%d_%.1f_%.1f_%.1f_%.1f_%.1f_%.4f_%.1f_%.5f_%.2f_%d_%s", (isPP? "pp" : ispPb? "pPB": "PbPb"), (isMC ? "MC" : "Data"), cutV, NTPCcluster, minSPDclt, nsigmaTPCPi, nsigmaTPCKa, nsigmaTOFPi, nsigmaTOFKa, trackDCAcutMax, trackDCAcutMin, trackDCAZcutMax, dcaProduct, minpt, originDselection, eventType.Data());
+   TString taskName = Form("D0%s%s_%.1f_%d_%.2f_%d_%.1f_%.1f_%.1f_%.1f_%.1f_%.4f_%.1f_%.5f_%.2f_%d_%s", (isPP? "pp" : ispPb? "pPB": "PbPb"), (isMC ? "MC" : "Data"), cutV, NTPCcluster, NTPCcrratio, minSPDclt, nsigmaTPCPi, nsigmaTPCKa, nsigmaTOFPi, nsigmaTOFKa, trackDCAcutMax, trackDCAcutMin, trackDCAZcutMax, dcaProduct, minpt, originDselection, eventType.Data());
    AliRsnMiniAnalysisTask *task = new AliRsnMiniAnalysisTask(taskName.Data(), isMC);
    if (!isMC && !isPP){
      Printf(Form("========== SETTING USE CENTRALITY PATCH AOD049 : %s", (aodN==49)? "yes" : "no"));
@@ -132,7 +133,7 @@ AliRsnMiniAnalysisTask * AddAnalysisTaskD0
    // - 2nd argument --> |Vz| range
    // - 3rd argument --> minimum required number of contributors
    // - 4th argument --> tells if TPC stand-alone vertexes must be accepted
-   AliRsnCutPrimaryVertex *cutVertex = new AliRsnCutPrimaryVertex("cutVertex", cutV, 0, kFALSE);
+   AliRsnCutPrimaryVertex *cutVertex = new AliRsnCutPrimaryVertex("cutVertex", cutV, 1, kFALSE, kFALSE);
    if(checkpileup == kTRUE){
        if(SPDpileup == kTRUE)cutVertex->SetCheckPileUp(kTRUE);
        AliRsnCutEventUtils *eventUtils = new AliRsnCutEventUtils("cutEventUtils", kFALSE, kFALSE); 
@@ -146,6 +147,8 @@ AliRsnMiniAnalysisTask * AddAnalysisTaskD0
    AliRsnCutSet *eventCuts = new AliRsnCutSet("eventCuts", AliRsnTarget::kEvent);
    eventCuts->AddCut(cutVertex);
    eventCuts->SetCutScheme(cutVertex->GetName());
+   eventCuts->ShowCuts();
+   eventCuts->PrintSetInfo();
    // set cuts in task
    task->SetEventCuts(eventCuts);
    
@@ -166,9 +169,9 @@ AliRsnMiniAnalysisTask * AddAnalysisTaskD0
      outMult->AddAxis(multID, 100, 0.0, 100.0);
      
    //tracklets
-   //Int_t trackletID = task->CreateValue(AliRsnMiniValue::kTracklets, kFALSE);
-   //AliRsnMiniOutput *outTracklets = task->CreateOutput("eventTracklets", "HIST", "EVENT");
-   //outTracklets->AddAxis(trackletID, 400, 0.0, 400.0);
+   Int_t trackletID = task->CreateValue(AliRsnMiniValue::kTracklets, kFALSE);
+   AliRsnMiniOutput *outTracklets = task->CreateOutput("eventTracklets", "HIST", "EVENT");
+   outTracklets->AddAxis(trackletID, 400, 0.0, 400.0);
    
    
    //event plane (only for PbPb)
@@ -236,7 +239,7 @@ AliRsnMiniAnalysisTask * AddAnalysisTaskD0
        Printf("========================== MC analysis - PID cuts used");
    } else 
      Printf("========================== DATA analysis - PID cuts used");
-   if (!ConfigD0(task, isPP, isMC, monitor, nsigmaTPCPi, nsigmaTPCKa, nsigmaTOFPi, nsigmaTOFKa, aodFilterBit, trackDCAcutMax, trackDCAcutMin, trackDCAZcutMax, NTPCcluster, minSPDclt, minpt, maxSisters, checkP,  minDCAcutFixed, maxDCAcutFixed, ptdepPIDcut, checkFeedDown, checkQuark, doCalculationInMC, originDselection, mineta, maxeta, min_inv_mass, max_inv_mass, bins, "", cutsPairY, cutsPair)) return 0x0;
+   if (!ConfigD0(task, isPP, isMC, monitor, nsigmaTPCPi, nsigmaTPCKa, nsigmaTOFPi, nsigmaTOFKa, aodFilterBit, trackDCAcutMax, trackDCAcutMin, trackDCAZcutMax, NTPCcluster, NTPCcrratio, minSPDclt, minpt, maxSisters, checkP,  minDCAcutFixed, maxDCAcutFixed, ptdepPIDcut, checkFeedDown, checkQuark, doCalculationInMC, originDselection, mineta, maxeta, min_inv_mass, max_inv_mass, bins, "", cutsPairY, cutsPair)) return 0x0;
    
    //
    // -- CONTAINERS --------------------------------------------------------------------------------
@@ -244,7 +247,7 @@ AliRsnMiniAnalysisTask * AddAnalysisTaskD0
    TString outputFileName = AliAnalysisManager::GetCommonFileName();
    Printf("AddAnalysisTaskD0 - Set OutputFileName : \n %s\n", outputFileName.Data() );
    
-   AliAnalysisDataContainer *output = mgr->CreateContainer(Form("%s_%.1f_%d_%d_%.1f_%.1f_%.1f_%.1f_%.1f_%.4f_%.1f_%.5f_%.2f_%d_%s",outNameSuffix.Data(),cutV,NTPCcluster,minSPDclt,nsigmaTPCPi,nsigmaTPCKa,nsigmaTOFPi,nsigmaTOFKa,trackDCAcutMax,trackDCAcutMin,trackDCAZcutMax,dcaProduct,minpt,originDselection,eventType.Data()), 
+   AliAnalysisDataContainer *output = mgr->CreateContainer(Form("%s_%.1f_%d_%.2f_%d_%.1f_%.1f_%.1f_%.1f_%.1f_%.4f_%.1f_%.5f_%.2f_%d_%s",outNameSuffix.Data(),cutV,NTPCcluster,NTPCcrratio,minSPDclt,nsigmaTPCPi,nsigmaTPCKa,nsigmaTOFPi,nsigmaTOFKa,trackDCAcutMax,trackDCAcutMin,trackDCAZcutMax,dcaProduct,minpt,originDselection,eventType.Data()), 
                                                           TList::Class(), 
                                                           AliAnalysisManager::kOutputContainer, 
                                                           outputFileName);
index 6f0e7c9d09319973053753f0faefaebc7ac675d2..9a48f659306ac2d3fdf93d560173541061c597ee 100644 (file)
@@ -1,5 +1,5 @@
-/
-// *** Configuration script for phi->KK analysis with 2010 runs ***
+//
+// *** Configuration script for D0 analysis ***
 // 
 // A configuration script for RSN package needs to define the followings:
 //
@@ -23,6 +23,7 @@ Bool_t ConfigD0
    Float_t                trackDCAcutMin = 0.0,
    Float_t                trackDCAZcutMax = 2.0,
    Int_t                  NTPCcluster = 70,
+   Double_t                NTPCcrratio = 0.8,
    Int_t                  minSPDclt = 0,
    Double_t                minpt = 0.15,
    Short_t                        maxSisters = 2,
@@ -62,6 +63,7 @@ Bool_t ConfigD0
    
    // integrated pion cut
    AliRsnCutDaughterD0 *cutPi = new AliRsnCutDaughterD0("cutPionForD0", AliPID::kPion);
+   //cutPi->SetNoPID(kTRUE);
    cutPi->SetTPCPionPIDCut(nsigmaTPCPi);
    cutPi->SetTOFPionPIDCut(nsigmaTOFPi);
    cutPi->SetPtDependentPIDCut(ptdepPIDcut);
@@ -71,15 +73,18 @@ Bool_t ConfigD0
    if(maxDCAcutFixed)cutQuality->SetDCARmax(trackDCAcutMax);            
    else cutQuality->SetDCARPtFormula(formula);
    if(minDCAcutFixed) cutQuality->SetDCARmin(trackDCAcutMin);
-   else cutQuality->SetDCARPtFormulaMin(formulaMin); 
-   cutQuality->SetTPCminNClusters(NTPCcluster);
+   else cutQuality->SetDCARPtFormulaMin(formulaMin);
+   cutQuality->SetTPCminNClusters(NTPCcluster); 
+   //if(!isPP)cutQuality->SetTPCminNClusters(NTPCcluster);
+   //if(isPP)cutQuality->SetMinNCrossedRowsTPC(NTPCcluster,kTRUE);
+   //if(isPP)cutQuality->SetMinNCrossedRowsOverFindableClsTPC(NTPCcrratio,kTRUE);
    cutQuality->SetPtRange(minpt,1E20);
    cutQuality->SetEtaRange(mineta, maxeta);
    cutQuality->SetDCAZmax(trackDCAZcutMax);
    cutQuality->SetSPDminNClusters(minSPDclt);
    cutQuality->SetITSminNClusters(0);
-   cutQuality->SetITSmaxChi2(36);
-   cutQuality->SetTPCmaxChi2(4.0);
+   cutQuality->SetITSmaxChi2(1E20);
+   cutQuality->SetTPCmaxChi2(1E20);
    cutQuality->SetRejectKinkDaughters();
    cutQuality->Print();
                 
@@ -96,6 +101,7 @@ Bool_t ConfigD0
    
    // integrated kaon cut
    AliRsnCutDaughterD0 *cutK = new AliRsnCutDaughterD0("cutKaonForD0", AliPID::kKaon);
+   //cutK->SetNoPID(kTRUE);
    cutK->SetTPCKaonPIDCut(nsigmaTPCKa);
    cutK->SetTOFKaonPIDCut(nsigmaTOFKa);
    cutK->SetPtDependentPIDCut(ptdepPIDcut);    
@@ -107,13 +113,16 @@ Bool_t ConfigD0
    if(minDCAcutFixed) cutQuality->SetDCARmin(trackDCAcutMin);
    else cutQuality->SetDCARPtFormulaMin(formulaMin);
    cutQuality->SetTPCminNClusters(NTPCcluster);
+   //if(!isPP)cutQuality->SetTPCminNClusters(NTPCcluster);
+   //if(isPP)cutQuality->SetMinNCrossedRowsTPC(NTPCcluster,kTRUE);
+   //if(isPP)cutQuality->SetMinNCrossedRowsOverFindableClsTPC(NTPCcrratio,kTRUE);
    cutQuality->SetPtRange(minpt,1E20);
    cutQuality->SetEtaRange(mineta, maxeta);
    cutQuality->SetDCAZmax(trackDCAZcutMax);
    cutQuality->SetSPDminNClusters(minSPDclt);
    cutQuality->SetITSminNClusters(0);
-   cutQuality->SetITSmaxChi2(36);
-   cutQuality->SetTPCmaxChi2(4.0);
+   cutQuality->SetITSmaxChi2(1E20);
+   cutQuality->SetTPCmaxChi2(1E20);
    cutQuality->SetRejectKinkDaughters();
    cutQuality->Print();
        
@@ -126,6 +135,84 @@ Bool_t ConfigD0
    // add to task
    Int_t iCutK = task->AddTrackCuts(cutSetK);
    
+   
+   
+   
+   
+   ////////////////////////////////////////////////////////////////////////////////////////////////
+   // Cut set for mothers -- To be used only for the efficiency evaluation when using the charm enriched sample
+   /*
+   AliRsnCutDaughterD0 *cutPi_mother = new AliRsnCutDaughterD0("cutPionForD0_MC", AliPID::kPion);
+   cutPi_mother->SetIsCheckOnMother(kTRUE);
+   cutPi_mother->SetNoPID(kTRUE);
+   cutPi_mother->SetTPCPionPIDCut(1E20);
+   cutPi_mother->SetTOFPionPIDCut(1E20);
+   cutPi_mother->SetPtDependentPIDCut(kFALSE);
+   AliRsnCutTrackQuality *cutQuality = (AliRsnCutTrackQuality*) cutPi_mother->CutQuality();
+   cutQuality->SetCheckOnlyFilterBit(kFALSE);
+   cutQuality->SetAODTestFilterBit(-1);
+   if(maxDCAcutFixed)cutQuality->SetDCARmax(1E20);              
+   else cutQuality->SetDCARPtFormula("");
+   if(minDCAcutFixed) cutQuality->SetDCARmin(0);
+   else cutQuality->SetDCARPtFormulaMin(""); 
+   if(!isPP)cutQuality->SetTPCminNClusters(0);
+   if(isPP)cutQuality->SetMinNCrossedRowsTPC(0,kTRUE);
+   if(isPP)cutQuality->SetMinNCrossedRowsOverFindableClsTPC(0,kTRUE);
+   cutQuality->SetPtRange(0,1E20);
+   cutQuality->SetEtaRange(-1E20, 1E20);
+   cutQuality->SetDCAZmax(1E20);
+   cutQuality->SetSPDminNClusters(0);
+   cutQuality->SetITSminNClusters(0);
+   cutQuality->SetITSmaxChi2(1E20);
+   cutQuality->SetTPCmaxChi2(1E20);
+   cutQuality->SetRejectKinkDaughters();
+   cutQuality->Print();
+   
+   
+   // cut set
+   AliRsnCutSet *cutSetPi_mother = new AliRsnCutSet("setPionD0_mother", AliRsnTarget::kDaughter);
+   cutSetPi_mother->AddCut(cutPi_mother);
+   cutSetPi_mother->SetCutScheme(cutPi_mother->GetName());
+   // add to task
+   Int_t iCutPi_mother = task->AddTrackCuts(cutSetPi_mother);
+   
+   
+   AliRsnCutDaughterD0 *cutK_mother = new AliRsnCutDaughterD0("cutKaonForD0_MC", AliPID::kKaon);
+   cutK_mother->SetIsCheckOnMother(kTRUE);
+   cutK_mother->SetNoPID(kTRUE);
+   cutK_mother->SetTPCKaonPIDCut(1E20);
+   cutK_mother->SetTOFKaonPIDCut(1E20);
+   cutK_mother->SetPtDependentPIDCut(kFALSE);  
+   AliRsnCutTrackQuality *cutQuality = (AliRsnCutTrackQuality*) cutK_mother->CutQuality();
+   cutQuality->SetCheckOnlyFilterBit(kFALSE);
+   cutQuality->SetAODTestFilterBit(-1);
+   if(maxDCAcutFixed)cutQuality->SetDCARmax(1E20);              
+   else cutQuality->SetDCARPtFormula("");
+   if(minDCAcutFixed) cutQuality->SetDCARmin(0);
+   else cutQuality->SetDCARPtFormulaMin("");
+   if(!isPP)cutQuality->SetTPCminNClusters(0);
+   if(isPP)cutQuality->SetMinNCrossedRowsTPC(0,kTRUE);
+   if(isPP)cutQuality->SetMinNCrossedRowsOverFindableClsTPC(0,kTRUE);
+   cutQuality->SetPtRange(0,1E20);
+   cutQuality->SetEtaRange(-1E20, 1E20);
+   cutQuality->SetDCAZmax(1E20);
+   cutQuality->SetSPDminNClusters(0);
+   cutQuality->SetITSminNClusters(0);
+   cutQuality->SetITSmaxChi2(1E20);
+   cutQuality->SetTPCmaxChi2(1E20);
+   cutQuality->SetRejectKinkDaughters();
+   cutQuality->Print();
+   
+   
+   // cut set
+   AliRsnCutSet *cutSetK_mother = new AliRsnCutSet("setKaonD0_mother", AliRsnTarget::kDaughter);
+   cutSetK_mother->AddCut(cutK_mother);
+   cutSetK_mother->SetCutScheme(cutK_mother->GetName());
+   // add to task
+   Int_t iCutK_mother = task->AddTrackCuts(cutSetK_mother);
+   */
+   
+   ////////////////////////////////////////////////////////////////////////////////////////////////
   
   // -- Values ------------------------------------------------------------------------------------
   /* invariant mass     */ Int_t imID       = task->CreateValue(AliRsnMiniValue::kInvMass, kFALSE);
@@ -263,10 +350,12 @@ Bool_t ConfigD0
    // create output
    AliRsnMiniOutput *out = task->CreateOutput("D0_True2", mode.Data(), "TRUE");
    // selection settings
-   out->SetCharge(0, '+');
-   out->SetCharge(1, '-');
+   out->SetCutID(0, iCutK);
+   out->SetCutID(1, iCutPi);
    out->SetDaughter(0, AliRsnDaughter::kKaon);
    out->SetDaughter(1, AliRsnDaughter::kPion);
+   out->SetCharge(0, '+');
+   out->SetCharge(1, '-');
    out->SetMotherPDG(-421);
    out->SetMotherMass(1.86486);
    // pair cuts
@@ -326,8 +415,65 @@ Bool_t ConfigD0
    else out->AddAxis(centID, 400, 0.0, 400.0);
    
    
-   }
+   // GENERATED MOTHERS IN THE ACCEPTANCE
+   /*
+   TString mode = "SPARSE";
+   
+   // create output
+   AliRsnMiniOutput *out = task->CreateOutput("D0_TrueMC1_Acc", mode.Data(), "TRUE");
+   // selection settings
+   out->SetCutID(0, iCutK_mother);
+   out->SetCutID(1, iCutPi_mother);
+   out->SetDaughter(0, AliRsnDaughter::kKaon);
+   out->SetDaughter(1, AliRsnDaughter::kPion);
+   out->SetCharge(0, '-');
+   out->SetCharge(1, '+');
+   out->SetMotherPDG(421);
+   out->SetMotherMass(1.86486);
+   // pair cuts
+   out->SetPairCuts(cutsPairY);
+   out->SetMaxNSisters(maxSisters);
+   out->SetCheckMomentumConservation(checkP);
+   out->SetCheckFeedDown(checkFeedDown);
+   out->SetRejectCandidateIfNotFromQuark(checkQuark);
+   out->SetDselection(originDselection);
+   // binnings
+   out->AddAxis(imID, bins, min_inv_mass, max_inv_mass);
+   out->AddAxis(ptID, 200, 0.0, 20.0);
+   //out->AddAxis(yID, 100, -1, 1);
 
+   if (!isPP) out->AddAxis(centID, 100, 0.0, 100.0);
+   else out->AddAxis(centID, 400, 0.0, 400.0);
+   
+   // create output
+   AliRsnMiniOutput *out = task->CreateOutput("D0_TrueMC2_Acc", mode.Data(), "TRUE");
+   // selection settings
+   out->SetCutID(0, iCutK_mother);
+   out->SetCutID(1, iCutPi_mother);
+   out->SetDaughter(0, AliRsnDaughter::kKaon);
+   out->SetDaughter(1, AliRsnDaughter::kPion);
+   out->SetCharge(0, '+');
+   out->SetCharge(1, '-');
+   out->SetMotherPDG(-421);
+   out->SetMotherMass(1.86486);
+   // pair cuts
+   out->SetPairCuts(cutsPairY);
+   out->SetMaxNSisters(maxSisters);
+   out->SetCheckMomentumConservation(checkP);
+   out->SetCheckFeedDown(checkFeedDown);
+   out->SetRejectCandidateIfNotFromQuark(checkQuark);
+   out->SetDselection(originDselection);
+   // binnings
+   out->AddAxis(imID, bins, min_inv_mass, max_inv_mass);
+   out->AddAxis(ptID, 200, 0.0, 20.0);
+   //out->AddAxis(yID, 100, -1, 1);
+
+   if (!isPP) out->AddAxis(centID, 100, 0.0, 100.0);
+   else out->AddAxis(centID, 400, 0.0, 400.0);
+   
+   
+   }
+   */
 
    return kTRUE;
 }