]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Fixing wrong commit
authorfbellini <fbellini@cern.ch>
Fri, 16 Jan 2015 08:34:34 +0000 (09:34 +0100)
committerfbellini <fbellini@cern.ch>
Fri, 16 Jan 2015 08:34:34 +0000 (09:34 +0100)
PWGLF/RESONANCES/macros/mini/ConfigD0.C

index b26b3ec4470d8e75ad116b95bf013c4afe2a7a5a..c6a73f8541173717c43b8239f12fc307461e25ab 100644 (file)
-/***************************************************************************
-              fbellini@cern.ch - last modified on 06/08/2012
 //
-// General macro to configure the RSN analysis task.
-// It calls all configs desired by the user, by means
-// of the boolean switches defined in the first lines.
-// ---
-// Inputs:
-//  1) flag to know if running on MC or data
-//  2) path where all configs are stored
-// ---
-// Returns:
-//  kTRUE  --> initialization successful
-//  kFALSE --> initialization failed (some config gave errors)
+// *** Configuration script for D0 analysis ***
+// 
+// A configuration script for RSN package needs to define the followings:
 //
-****************************************************************************/
-
-AliRsnMiniAnalysisTask * AddAnalysisTaskD0
-(
-   Bool_t      isMC,
-   Bool_t      isPP,
-   Bool_t      ispPb,
-   Bool_t      monitor = kTRUE,
-   Bool_t      centortracklets = kTRUE,
-   Bool_t      sanityhistos = kTRUE,
-   TString     centrality = "V0M",
-   Int_t       aodFilterBit = 5,  
-   Float_t     nsigmaTPCPi = 3.0,
-   Float_t     nsigmaTPCKa = 3.0,
-   Float_t     nsigmaTOFPi = 2.0,
-   Float_t     nsigmaTOFKa = 2.0,
-   Float_t     trackDCAcutMax = 7.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,
-   Bool_t      useNTPCclt = kTRUE,   
-   Bool_t      maxDCAcutFixed = kFALSE,
-   Bool_t      ptdepPIDcut = kFALSE,
-   Bool_t      fixedYcut = kTRUE,
-   Bool_t      checkpileup = kFALSE,
-   Bool_t      SPDpileup = kTRUE,
-   Bool_t      doCalculationInMC = kTRUE,
-   UShort_t    originDselection = 0,
-   Int_t       nmix = 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,
-   Float_t     max_inv_mass = 2.2,
-   Int_t       bins = 320,
-   Float_t     maxDiffVzMix = 1.0,
-   Float_t     maxDiffMultMix = 10.0,
-   Float_t     maxDiffAngleMixDeg = 20.0,
-   TString     outNameSuffix = "D0"  
+// (1) decay tree of each resonance to be studied, which is needed to select
+//     true pairs and to assign the right mass to all candidate daughters
+// (2) cuts at all levels: single daughters, tracks, events
+// (3) output objects: histograms or trees
+//
+Bool_t ConfigD0
+(  
+   AliRsnMiniAnalysisTask *task, 
+   Bool_t                  isPP,
+   Bool_t                  isMC,
+   Bool_t                  monitor = kTRUE,
+   Bool_t                         centortracklets = kTRUE, 
+   Bool_t                         sanityhistos = kTRUE, 
+   Float_t                nsigmaTPCPi = 3.0,
+   Float_t                nsigmaTPCKa = 3.0,
+   Float_t                nsigmaTOFPi = 2.0,
+   Float_t                nsigmaTOFKa = 2.0,
+   Int_t                   aodFilterBit = 5,
+   Float_t                trackDCAcutMax = 7.0,
+   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,
+   Bool_t                  checkP = kTRUE,
+   Bool_t                         useNTPCclt = kTRUE,
+   Bool_t                  minDCAcutFixed = kFALSE,
+   Bool_t                  maxDCAcutFixed = kFALSE,
+   Bool_t                  ptdepPIDcut = kFALSE,
+   Bool_t                         checkFeedDown = kTRUE,
+   Bool_t                         checkQuark = kTRUE,
+   Bool_t                         doCalculationInMC = kTRUE,
+   UShort_t                       originDselection = 0,
+   Float_t                 mineta = -0.8,
+   Float_t                 maxeta = 0.8,
+   Float_t                min_inv_mass = 0.6,
+   Float_t                max_inv_mass = 2.2,
+   Int_t                   bins = 320,
+   const char            *suffix,
+   AliRsnCutSet           *cutsPairY,
+   AliRsnCutSet           *cutsPair
 )
-{  
-  //
-  // -- INITIALIZATION ----------------------------------------------------------------------------
-  // retrieve analysis manager
-  //
-  Float_t     trackDCAcutMin = 0.0;
-  Bool_t      minDCAcutFixed = kTRUE;
-  Double_t    dcaProduct = 100.0;
-  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;
-  
-  UInt_t trigger = 0;
-  
-  
-  
-  TString eventType = "";
-   if(triggerMask=="AliVEvent::kMB | AliVEvent::kCentral") {trigger = AliVEvent::kMB | AliVEvent::kCentral; eventType+="Central";}
-   else if(triggerMask=="AliVEvent::kMB | AliVEvent::kSemiCentral") {trigger = AliVEvent::kMB | AliVEvent::kSemiCentral; eventType+="SemiCentral";}
-   else if(triggerMask=="AliVEvent::kINT7") {trigger = AliVEvent::kINT7; eventType+="kINT7";}
-   else if(triggerMask=="AliVEvent::kMB") {trigger = AliVEvent::kMB; eventType+="MinimumBias";}
-
-  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
-   if (!mgr) {
-      ::Error("AddAnalysisTaskD0", "No analysis manager to connect to.");
-      return NULL;
-   } 
-
-   // create the task and configure 
-   TString taskName = Form("D0%s%s_%.1f_%d_%.2f_%d_%.1f_%.1f_%.1f_%.1f_%.1f_%.1f_%.2f_%d_%s", (isPP? "pp" : ispPb? "pPB": "PbPb"), (isMC ? "MC" : "Data"), cutV, NTPCcluster, NTPCcrratio, minSPDclt, nsigmaTPCPi, nsigmaTPCKa, nsigmaTOFPi, nsigmaTOFKa, trackDCAcutMax, trackDCAZcutMax, 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"));
-     task->SetUseCentralityPatch(aodN==49);
-   }
+{
+   // manage suffix
+   if (strlen(suffix) > 0) suffix = Form("_%s", suffix);
    
-   ::Info("AddAnalysisTaskD0", Form("TriggerMask: %i",trigger));
+   TString s = ""; s+=trackDCAcutMax; s+="*(0.0015+0.0050/pt^1.01)";
 
-   task->SelectCollisionCandidates(trigger);
-   task->SetMaxNDaughters(maxSisters);
-   task->SetCheckMomentumConservation(checkP);
-   task->SetCheckFeedDown(checkFeedDown);
-   task->SetRejectCandidateIfNotFromQuark(checkQuark);
-   task->SetDselection(originDselection);
-   task->KeepMotherInAcceptance(kTRUE);
-   task->SetMotherAcceptanceCutMinPt(minpt);
-   task->SetMotherAcceptanceCutMaxEta(maxeta);
+   const char *formula = s;
    
-      
-   ::Info("AddAnalysisTaskD0", Form("Maximum numbers of daughters allowed (-1 means cut not applied): %i",maxSisters));
-   ::Info("AddAnalysisTaskD0", Form("Are we checking the momentum conservation? %s", checkP? "yes" : "no"));
-   ::Info("AddAnalysisTaskD0", Form("Are we checking the feeddown? %s", checkFeedDown? "yes" : "no"));
-   ::Info("AddAnalysisTaskD0", Form("Are we rejecting the Hijing generated? %s", checkQuark? "yes" : "no"));
-   ::Info("AddAnalysisTaskD0", Form("Which D0 are we keeping? %s", (originDselection==0? "only from c quark" : originDselection==1? "only from b quark" : "both from c and b quark") ));
-   ::Info("AddAnalysisTaskD0", Form("Selecting Mother in Acceptance: Min pT %.1f, Eta Range %.1f - %.1f", minpt, mineta, maxeta));
-
-
-   if (isPP) 
-     task->UseMultiplicity("QUALITY");
-   else
-     task->UseCentrality(centrality);   
-   // set event mixing options
-   task->UseContinuousMix();
-   //task->UseBinnedMix();
-   task->SetNMix(nmix);
-   task->SetMaxDiffVz(maxDiffVzMix);
-   task->SetMaxDiffMult(maxDiffMultMix);
-   if (!isPP && !ispPb) task->SetMaxDiffAngle(maxDiffAngleMixDeg*TMath::DegToRad()); //set angle diff in rad
-   ::Info("AddAnalysisTaskD0", Form("Event mixing configuration: \n events to mix = %i \n max diff. vtxZ = cm %5.3f \n max diff multi = %5.3f \n max diff EP angle = %5.3f deg", nmix, maxDiffVzMix, maxDiffMultMix, (isPP ? 0.0 : ispPb ? 0.0 : maxDiffAngleMixDeg)));
-   
-   mgr->AddTask(task);
+   TString s2 = ""; s2+=trackDCAcutMin; s2+="*(0.0015+0.0050/pt^1.01)";
+
+   const char *formulaMin = s2;
    
-   //
-   // -- EVENT CUTS (same for all configs) ---------------------------------------------------------
-   //  
-   // cut on primary vertex:
-   // - 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, 1, kFALSE, kFALSE);
-   AliRsnCutEventUtils *cutEventUtils = new AliRsnCutEventUtils("cutEventUtils", kFALSE, kTRUE);
-   
-   if(checkpileup == kTRUE){
-       
-       if(SPDpileup == kTRUE) {cutEventUtils->SetRemovePileUppA2013(kTRUE); 
-                               //cutEventUtils->SetRemoveFirstEvtInChunk(kTRUE);
-                               //cutEventUtils->SetUseVertexSelection2013pA(kTRUE);
-                               cutEventUtils->SetUseMVPlpSelection(kFALSE); 
-                               cutEventUtils->SetMinPlpContribSPD(5);
-                                                                         }
-       if(SPDpileup == kFALSE){cutEventUtils->SetRemovePileUppA2013(kTRUE); 
-                               //cutEventUtils->SetRemoveFirstEvtInChunk(kTRUE);
-                               //cutEventUtils->SetUseVertexSelection2013pA(kTRUE);
-                               cutEventUtils->SetUseMVPlpSelection(kTRUE); 
-                               cutEventUtils->SetMinPlpContribMV(5);
-                                                                         }
-   } 
-                
-   ::Info("AddAnalysisTaskD0", Form("Checking Pile up? %s", (checkpileup ? "yes" : "no") ));
-   ::Info("AddAnalysisTaskD0", Form("Which Method? %s", (checkpileup? (SPDpileup ? "SPD" : "Multi Vertex") : "none" )));
-   
-   // define and fill cut set for event cut
-   AliRsnCutSet *eventCuts = new AliRsnCutSet("eventCuts", AliRsnTarget::kEvent);
-   eventCuts->AddCut(cutVertex);
-   //if(SPDpileup == kFALSE) eventCuts->AddCut(cutEventUtils);
-   eventCuts->AddCut(cutEventUtils);
-   eventCuts->SetCutScheme(Form("%s&%s", cutEventUtils->GetName(), cutVertex->GetName() ));
-   eventCuts->ShowCuts();
-   eventCuts->PrintSetInfo();
-   // set cuts in task
-   task->SetEventCuts(eventCuts);
    
+   // 
+   // -- Define track cuts -------------------------------------------------------------------------
    //
-   // -- EVENT-ONLY COMPUTATIONS -------------------------------------------------------------------
-   //   
-   //vertex
-   Int_t vtxID = task->CreateValue(AliRsnMiniValue::kVz, kFALSE);
-   AliRsnMiniOutput *outVtx = task->CreateOutput("eventVtx", "HIST", "EVENT");
-   outVtx->AddAxis(vtxID, 400, -20.0, 20.0);
-   
-   //multiplicity or centrality
-   Int_t multID = task->CreateValue(AliRsnMiniValue::kMult, kFALSE);
-   AliRsnMiniOutput *outMult = task->CreateOutput("eventMult", "HIST", "EVENT");
-   if (isPP) 
-     outMult->AddAxis(multID, 400, 0.0, 400.0);
-   else
-     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, 250, -0.5, 249.5);
-   
-   
-   //event plane (only for PbPb)
-   Int_t planeID = task->CreateValue(AliRsnMiniValue::kPlaneAngle, kFALSE);
-   AliRsnMiniOutput *outPlane = 0x0;
-   if (!isPP){
-     outPlane = task->CreateOutput("eventPlane", "HIST", "EVENT");
-     outPlane->AddAxis(planeID, 180, 0.0, TMath::Pi());
-     }
-     
-   TH2F* hvz=new TH2F("hVzVsCent","",100,0.,100., 220,-11.,11.);
-   task->SetEventQAHist("vz",hvz);//plugs this histogram into the fHAEventVz data member
-
-   TH2F* hmc=new TH2F("MultiVsCent","",100,0.,100.,1000,0.,1000.);
-   hmc->GetYaxis()->SetTitle("QUALITY");
-   task->SetEventQAHist("multicent",hmc);//plugs this histogram into the fHAEventMultiCent data member
-
-   TH2F* hep=new TH2F("hEventPlaneVsCent","",100,0.,100., 180,0.,TMath::Pi());
-   task->SetEventQAHist("eventplane",hep);//plugs this histogram into the fHAEventPlane data member
+   
+   // integrated pion cut
+   AliRsnCutDaughterD0 *cutPi = new AliRsnCutDaughterD0("cutPionForD0", AliPID::kPion);
+   //cutPi->SetNoPID(kTRUE);
+   cutPi->SetTPCPionPIDCut(nsigmaTPCPi);
+   cutPi->SetTOFPionPIDCut(nsigmaTOFPi);
+   cutPi->SetPtDependentPIDCut(ptdepPIDcut);
+   AliRsnCutTrackQuality *cutQuality = (AliRsnCutTrackQuality*) cutPi->CutQuality();
+   cutQuality->SetCheckOnlyFilterBit(kFALSE);
+   cutQuality->SetAODTestFilterBit(aodFilterBit);
+   if(maxDCAcutFixed)cutQuality->SetDCARmax(trackDCAcutMax);            
+   else cutQuality->SetDCARPtFormula(formula);
+   if(minDCAcutFixed) cutQuality->SetDCARmin(trackDCAcutMin);
+   else cutQuality->SetDCARPtFormulaMin(formulaMin);
+   if(useNTPCclt)cutQuality->SetTPCminNClusters(NTPCcluster);
+   if(!useNTPCclt)cutQuality->SetMinNCrossedRowsTPC(NTPCcluster,kTRUE);
+   if(!useNTPCclt)cutQuality->SetMinNCrossedRowsOverFindableClsTPC(NTPCcrratio,kTRUE);
+   cutQuality->SetPtRange(minpt,1E20);
+   cutQuality->SetEtaRange(mineta, maxeta);
+   cutQuality->SetDCAZmax(trackDCAZcutMax);
+   cutQuality->SetSPDminNClusters(minSPDclt);
+   cutQuality->SetITSminNClusters(0);
+   cutQuality->SetITSmaxChi2(1E20);
+   cutQuality->SetTPCmaxChi2(1E20);
+   cutQuality->SetRejectKinkDaughters();
+   cutQuality->Print();
+                
+
+   
+   // cut set
+   AliRsnCutSet *cutSetPi = new AliRsnCutSet("setPionD0", AliRsnTarget::kDaughter);
+   cutSetPi->AddCut(cutPi);
+   cutSetPi->SetCutScheme(cutPi->GetName());
+   // add to task
+   Int_t iCutPi = task->AddTrackCuts(cutSetPi);
+   
+   
+   
+   // integrated kaon cut
+   AliRsnCutDaughterD0 *cutK = new AliRsnCutDaughterD0("cutKaonForD0", AliPID::kKaon);
+   //cutK->SetNoPID(kTRUE);
+   cutK->SetTPCKaonPIDCut(nsigmaTPCKa);
+   cutK->SetTOFKaonPIDCut(nsigmaTOFKa);
+   cutK->SetPtDependentPIDCut(ptdepPIDcut);    
+   AliRsnCutTrackQuality *cutQuality = (AliRsnCutTrackQuality*) cutK->CutQuality();
+   cutQuality->SetCheckOnlyFilterBit(kFALSE);
+   cutQuality->SetAODTestFilterBit(aodFilterBit);
+   if(maxDCAcutFixed)cutQuality->SetDCARmax(trackDCAcutMax);            
+   else cutQuality->SetDCARPtFormula(formula);
+   if(minDCAcutFixed) cutQuality->SetDCARmin(trackDCAcutMin);
+   else cutQuality->SetDCARPtFormulaMin(formulaMin);
+   if(useNTPCclt)cutQuality->SetTPCminNClusters(NTPCcluster);
+   if(!useNTPCclt)cutQuality->SetMinNCrossedRowsTPC(NTPCcluster,kTRUE);
+   if(!useNTPCclt)cutQuality->SetMinNCrossedRowsOverFindableClsTPC(NTPCcrratio,kTRUE);
+   cutQuality->SetPtRange(minpt,1E20);
+   cutQuality->SetEtaRange(mineta, maxeta);
+   cutQuality->SetDCAZmax(trackDCAZcutMax);
+   cutQuality->SetSPDminNClusters(minSPDclt);
+   cutQuality->SetITSminNClusters(0);
+   cutQuality->SetITSmaxChi2(1E20);
+   cutQuality->SetTPCmaxChi2(1E20);
+   cutQuality->SetRejectKinkDaughters();
+   cutQuality->Print();
+       
+   
+   
+   // cut set
+   AliRsnCutSet *cutSetK = new AliRsnCutSet("setKaonD0", AliRsnTarget::kDaughter);
+   cutSetK->AddCut(cutK);
+   cutSetK->SetCutScheme(cutK->GetName());
+   // add to task
+   Int_t iCutK = task->AddTrackCuts(cutSetK);
+   
+   
+   
+   ////////////////////////////////////////////////////////////////////////////////////////////////
+  
+  // -- Values ------------------------------------------------------------------------------------
+  /* invariant mass     */ Int_t imID       = task->CreateValue(AliRsnMiniValue::kInvMass, kFALSE);
+  /* IM resolution      */ Int_t resID      = task->CreateValue(AliRsnMiniValue::kInvMassRes, kTRUE);
+  /* transv. momentum   */ Int_t ptID       = task->CreateValue(AliRsnMiniValue::kPt, kFALSE);
+  /* centrality         */ Int_t centID     = task->CreateValue(AliRsnMiniValue::kMult, kFALSE);
+  /* pseudorapidity     */ Int_t etaID      = task->CreateValue(AliRsnMiniValue::kEta, kFALSE);
+  /* rapidity           */ Int_t yID        = task->CreateValue(AliRsnMiniValue::kY, kFALSE);
+  /* dca product        */ Int_t dcapID     = task->CreateValue(AliRsnMiniValue::kDCAproduct, kFALSE);
+  /* first daughter pt  */ Int_t daug1ptID  = task->CreateValue(AliRsnMiniValue::kFirstDaughterPt, kFALSE);
+  /* second daughter pt */ Int_t daug2ptID  = task->CreateValue(AliRsnMiniValue::kSecondDaughterPt, kFALSE);
+  /* first daughter dca */ Int_t daug1dcaID = task->CreateValue(AliRsnMiniValue::kFirstDaughterDCA, kFALSE);
+  /* second daughter dca*/ Int_t daug2dcaID = task->CreateValue(AliRsnMiniValue::kSecondDaughterDCA, kFALSE);
+  /* number of Sisters  */ Int_t nsistID    = task->CreateValue(AliRsnMiniValue::kNSisters, kFALSE);
+  /* number of trackl.  */ Int_t trackletsID = task->CreateValue(AliRsnMiniValue::kTracklets, kFALSE);
    
    //
-   // -- PAIR CUTS (common to all resonances) ------------------------------------------------------
+   // -- Create all needed outputs -----------------------------------------------------------------
    //
-   AliRsnCutMiniPair *cutY = 0x0;
    
-   if(fixedYcut == kTRUE){
-   cutY = new AliRsnCutMiniPair("cutRapidity", AliRsnCutMiniPair::kRapidityRange);
-   cutY->SetRangeD(minYlab, maxYlab);
+   // use an array for more compact writing, which are different on mixing and charges
+   // [0] = unlike
+   // [1] = mixing
+   // [2] = like ++
+   // [3] = like --
+   
+   
+   if(!isMC || doCalculationInMC == kTRUE){
+   
+   Bool_t   use     [8] = { 1      ,  1       ,  1       ,  1       ,  1        ,  1        ,  1       ,  1      };
+   Bool_t   useIM   [8] = { 1      ,  1       ,  1       ,  1       ,  1        ,  1        ,  1       ,  1      };
+   TString  name    [8] = {"Unlike1", "Unlike2", "Mixing1", "Mixing2", "RotateK1", "RotateK2", "LikePP" , "LikeMM"};
+   TString  comp    [8] = {"PAIR"   , "PAIR"   , "MIX"   , "MIX"    , "ROTATE1" , "ROTATE1" , "PAIR"   , "PAIR"  };
+   TString  output  [8] = {"SPARSE" , "SPARSE" , "SPARSE" , "SPARSE" , "SPARSE"  , "SPARSE"  , "SPARSE" , "SPARSE"};
+   Char_t   charge1 [8] = {'-'     , '+'      , '-'      , '+'      , '-'       , '+'       , '+'      , '-'     };
+   Char_t   charge2 [8] = {'+'     , '-'      , '+'      , '-'      , '+'       , '-'       , '+'      , '-'     };
+   Int_t    cutID1  [8] = { iCutK   ,  iCutK   ,  iCutK   ,  iCutK   ,  iCutK    ,  iCutK    ,  iCutK   ,  iCutK  };
+   Int_t    cutID2  [8] = { iCutPi  ,  iCutPi  ,  iCutPi  ,  iCutPi  ,  iCutPi   ,  iCutPi   ,  iCutPi  ,  iCutPi };
+   Int_t    ipdg    [8] = { 421     , -421     ,  421    , -421     ,  421      , -421      ,  421     , -421    };
+   Double_t mass    [8] = { 1.86486 ,  1.86486 ,  1.86486 ,  1.86486 ,  1.86486  ,  1.86486  ,  1.86486 ,  1.86486};
+   
+   for (Int_t i = 0; i < 8; i++) {
+      if (!use[i]) continue;
+      
+      // create output
+      AliRsnMiniOutput *out = task->CreateOutput(Form("D0_%s%s", name[i].Data(), suffix), output[i].Data(), comp[i].Data());
+      // selection settings
+      out->SetCutID(0, cutID1[i]);
+      out->SetCutID(1, cutID2[i]);
+      out->SetDaughter(0, AliRsnDaughter::kKaon);
+      out->SetDaughter(1, AliRsnDaughter::kPion);
+      out->SetCharge(0, charge1[i]);
+      out->SetCharge(1, charge2[i]);
+      out->SetMotherPDG(ipdg[i]);
+      out->SetMotherMass(mass[i]);
+      // pair cuts
+      out->SetPairCuts(cutsPair);
+
+      // axis X: invmass (or resolution)
+      //if (useIM[i]) 
+         out->AddAxis(imID, bins, min_inv_mass, max_inv_mass);
+      //else
+      //   out->AddAxis(resID, 200, -0.02, 0.02);
+      // axis Y: transverse momentum
+      out->AddAxis(ptID, 200, 0.0, 20.0);
+      
+      // axiz Z: pseudorapidity
+      //if(sanityhistos==kTRUE) out->AddAxis(etaID, 100, -1, 1);
+         
+      
+      if (!isPP)  {if(!centortracklets) out->AddAxis(centID, 100, 0.0, 100.0);
+                          else out->AddAxis(trackletsID, 250, -0.5, 249.5);}
+      else {if(!centortracklets) out->AddAxis(centID, 400, 0.0, 400.0);
+       else out->AddAxis(trackletsID, 250, -0.5, 249.5);}
+   }
+
+   if(sanityhistos==kTRUE){
+
+   // SANITY CHECK HISTOS
+   
+   TString mode = "SPARSE";
+   
+   // create output
+   AliRsnMiniOutput *out = task->CreateOutput("D0_MixingPP", mode.Data(), "MIX");
+   // selection settings
+   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
+   out->SetPairCuts(cutsPair);
+  
+   // binnings
+   out->AddAxis(imID, bins, min_inv_mass, max_inv_mass);
+   out->AddAxis(ptID, 200, 0.0, 20.0);
+   //out->AddAxis(etaID, 100, -1, 1);
+
+
+   if (!isPP)  {if(!centortracklets) out->AddAxis(centID, 100, 0.0, 100.0);
+                       else out->AddAxis(trackletsID, 250, -0.5, 249.5);}
+   else {if(!centortracklets) out->AddAxis(centID, 400, 0.0, 400.0);
+       else out->AddAxis(trackletsID, 250, -0.5, 249.5);}
+   
+   // create output
+   AliRsnMiniOutput *out = task->CreateOutput("D0_MixingMM", mode.Data(), "MIX");
+   // selection settings
+   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
+   out->SetPairCuts(cutsPair);
+   
+   // binnings
+   out->AddAxis(imID, bins, min_inv_mass, max_inv_mass);
+   out->AddAxis(ptID, 200, 0.0, 20.0);
+   //out->AddAxis(etaID, 100, -1, 1);
+
+   if (!isPP)  {if(!centortracklets) out->AddAxis(centID, 100, 0.0, 100.0);
+                       else out->AddAxis(trackletsID, 250, -0.5, 249.5);}
+   else {if(!centortracklets) out->AddAxis(centID, 400, 0.0, 400.0);
+       else out->AddAxis(trackletsID, 250, -0.5, 249.5);}
+
+
+   }
+
+   
    }
-   else {
-   cutY = new AliRsnCutMiniPair("cutRapidity", AliRsnCutMiniPair::kRapidityFiducialRegion);
-   cutY->SetRangeD(-0.8, 0.8);
-   cutY->SetPtDepCut(kTRUE);
-   cutY->SetMinPt(0.0);
-   cutY->SetMaxPt(5.0);
-   cutY->SetPtDepCutMaxFormula("-0.2/15*pt*pt+1.9/15*pt+0.5");
-   cutY->SetPtDepCutMinFormula("0.2/15*pt*pt-1.9/15*pt-0.5");
+   
+   if(monitor == kTRUE){
+   AddMonitorOutput_PionEta(cutSetPi->GetMonitorOutput());
+   AddMonitorOutput_PionY(cutSetPi->GetMonitorOutput());
+   AddMonitorOutput_PionMinPt(cutSetPi->GetMonitorOutput());
+   AddMonitorOutput_PionDCA(cutSetPi->GetMonitorOutput());
+   AddMonitorOutput_PionTPC_PIDCut(cutSetPi->GetMonitorOutput());
+   AddMonitorOutput_PionTOF_PIDCut(cutSetPi->GetMonitorOutput());
+   AddMonitorOutput_PionNTPC(cutSetPi->GetMonitorOutput());
+   
+   AddMonitorOutput_KaonEta(cutSetK->GetMonitorOutput());
+   AddMonitorOutput_KaonY(cutSetK->GetMonitorOutput());
+   AddMonitorOutput_KaonMinPt(cutSetK->GetMonitorOutput());
+   AddMonitorOutput_KaonDCA(cutSetK->GetMonitorOutput());
+   AddMonitorOutput_KaonTPC_PIDCut(cutSetK->GetMonitorOutput());
+   AddMonitorOutput_KaonTOF_PIDCut(cutSetK->GetMonitorOutput());
+   AddMonitorOutput_KaonNTPC(cutSetK->GetMonitorOutput());
    }
    
-   ::Info("AddAnalysisTaskD0", Form("Fixed Y cut? %s", (fixedYcut ? "yes" : "no") ));
    
-   AliRsnCutMiniPair *cutDCAproduct = new AliRsnCutMiniPair("cutDCAproduct", AliRsnCutMiniPair::kDCAproduct);
-   cutDCAproduct->SetRangeD(-1E20, dcaProduct);
+   if (isMC) {
    
-   AliRsnCutSet *cutsPairY = new AliRsnCutSet("pairCutsY", AliRsnTarget::kMother);
-   cutsPairY->AddCut(cutY);
-   cutsPairY->UseMonitor(kTRUE);
-   cutsPairY->SetCutScheme("setPairD0_Y");
-   cutsPairY->ShowCuts();
-   cutsPairY->PrintSetInfo();
+   // TRUE RECONSTRUCTED PAIRS
    
-   AliRsnCutSet *cutsPair = new AliRsnCutSet("pairCuts", AliRsnTarget::kMother);
-   cutsPair->AddCut(cutY);
-   cutsPair->AddCut(cutDCAproduct);
-   cutsPair->UseMonitor(kTRUE);
-   cutsPair->SetCutScheme(Form("%s&%s", cutY->GetName(), cutDCAproduct->GetName()));
-   cutsPair->ShowCuts();
-   cutsPair->PrintSetInfo();
+   TString mode = "SPARSE";
    
-   //
-   // -- CONFIG ANALYSIS --------------------------------------------------------------------------
-   gROOT->LoadMacro("$ALICE_ROOT/PWGLF/RESONANCES/macros/mini/ConfigD0.C");
+   // create output
+   AliRsnMiniOutput *out = task->CreateOutput("D0_True1", mode.Data(), "TRUE");
+   // selection settings
+   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
+   out->SetPairCuts(cutsPair);
+   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);
+   //out->AddAxis(dcapID, 100, -0.001, 0.001);
+   //out->AddAxis(nsistID, 10, 0, 5);
 
-   if (isMC) {
-       Printf("========================== MC analysis - PID cuts used");
-   } else 
-     Printf("========================== DATA analysis - PID cuts used");
-   if (!ConfigD0(task, isPP, isMC, monitor, centortracklets, sanityhistos, nsigmaTPCPi, nsigmaTPCKa, nsigmaTOFPi, nsigmaTOFKa, aodFilterBit, trackDCAcutMax, trackDCAcutMin, trackDCAZcutMax, NTPCcluster, NTPCcrratio, minSPDclt, minpt, maxSisters, checkP, useNTPCclt, minDCAcutFixed, maxDCAcutFixed, ptdepPIDcut, checkFeedDown, checkQuark, doCalculationInMC, originDselection, mineta, maxeta, min_inv_mass, max_inv_mass, bins, "", cutsPairY, cutsPair)) return 0x0;
+   if (!isPP)  {if(!centortracklets) out->AddAxis(centID, 100, 0.0, 100.0);
+                       else out->AddAxis(trackletsID, 250, -0.5, 249.5);}
+   else {if(!centortracklets) out->AddAxis(centID, 400, 0.0, 400.0);
+       else out->AddAxis(trackletsID, 250, -0.5, 249.5);}
+   
+   // create output
+   AliRsnMiniOutput *out = task->CreateOutput("D0_True2", mode.Data(), "TRUE");
+   // selection settings
+   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
+   out->SetPairCuts(cutsPair);
+   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);
+   //out->AddAxis(dcapID, 100, -0.001, 0.001);
+   //out->AddAxis(nsistID, 10, 0, 5);
+
+   if (!isPP)  {if(!centortracklets) out->AddAxis(centID, 100, 0.0, 100.0);
+                       else out->AddAxis(trackletsID, 250, -0.5, 249.5);}
+   else {if(!centortracklets) out->AddAxis(centID, 400, 0.0, 400.0);
+       else out->AddAxis(trackletsID, 250, -0.5, 249.5);}
    
-   //
-   // -- CONTAINERS --------------------------------------------------------------------------------
-   //
-   TString outputFileName = AliAnalysisManager::GetCommonFileName();
-   Printf("AddAnalysisTaskD0 - Set OutputFileName : \n %s\n", outputFileName.Data() );
    
-   AliAnalysisDataContainer *output = mgr->CreateContainer(Form("%s_%.1f_%d_%.2f_%d_%.1f_%.1f_%.1f_%.1f_%.1f_%.1f_%.2f_%d_%s",outNameSuffix.Data(),cutV,NTPCcluster,NTPCcrratio,minSPDclt,nsigmaTPCPi,nsigmaTPCKa,nsigmaTOFPi,nsigmaTOFKa,trackDCAcutMax,trackDCAZcutMax,minpt,originDselection,eventType.Data()), 
-                                                          TList::Class(), 
-                                                          AliAnalysisManager::kOutputContainer, 
-                                                          outputFileName);
-   mgr->ConnectInput(task, 0, mgr->GetCommonInputContainer());
-   mgr->ConnectOutput(task, 1, output);
+   // GENERATED MOTHERS
+   
+   TString mode = "SPARSE";
+   
+   // create output
+   AliRsnMiniOutput *out = task->CreateOutput("D0_TrueMC1", mode.Data(), "MOTHER");
+   // selection settings
+   out->SetDaughter(0, AliRsnDaughter::kKaon);
+   out->SetDaughter(1, AliRsnDaughter::kPion);
+   out->SetMotherPDG(421);
+   out->SetMotherMass(1.86486);
+   // pair cuts
+   out->SetPairCuts(cutsPairY);
+   // 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)  {if(!centortracklets) out->AddAxis(centID, 100, 0.0, 100.0);
+                       else out->AddAxis(trackletsID, 250, -0.5, 249.5);}
+   else {if(!centortracklets) out->AddAxis(centID, 400, 0.0, 400.0);
+       else out->AddAxis(trackletsID, 250, -0.5, 249.5);}
+   
+   // create output
+   AliRsnMiniOutput *out = task->CreateOutput("D0_TrueMC2", mode.Data(), "MOTHER");
+   // selection settings
+   out->SetDaughter(0, AliRsnDaughter::kKaon);
+   out->SetDaughter(1, AliRsnDaughter::kPion);
+   out->SetMotherPDG(-421);
+   out->SetMotherMass(1.86486);
+   // pair cuts
+   out->SetPairCuts(cutsPairY);
+   // 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)  {if(!centortracklets) out->AddAxis(centID, 100, 0.0, 100.0);
+                       else out->AddAxis(trackletsID, 250, -0.5, 249.5);}
+   else {if(!centortracklets) out->AddAxis(centID, 400, 0.0, 400.0);
+       else out->AddAxis(trackletsID, 250, -0.5, 249.5);}
    
-   return task;
+   
+   // GENERATED MOTHERS IN THE ACCEPTANCE
+   
+   TString mode = "SPARSE";
+   
+   // create output
+   AliRsnMiniOutput *out = task->CreateOutput("D0_TrueMC_InAcc1", mode.Data(), "MOTHER_IN_ACC");
+   // selection settings
+   out->SetDaughter(0, AliRsnDaughter::kKaon);
+   out->SetDaughter(1, AliRsnDaughter::kPion);
+   out->SetMotherPDG(421);
+   out->SetMotherMass(1.86486);
+   // pair cuts
+   out->SetPairCuts(cutsPairY);
+   // 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)  {if(!centortracklets) out->AddAxis(centID, 100, 0.0, 100.0);
+                      else out->AddAxis(trackletsID, 250, -0.5, 249.5);}
+   else {if(!centortracklets) out->AddAxis(centID, 400, 0.0, 400.0);
+       else out->AddAxis(trackletsID, 250, -0.5, 249.5);}
+   
+   // create output
+   AliRsnMiniOutput *out = task->CreateOutput("D0_TrueMC_InAcc2", mode.Data(), "MOTHER_IN_ACC");
+   // selection settings
+   out->SetDaughter(0, AliRsnDaughter::kKaon);
+   out->SetDaughter(1, AliRsnDaughter::kPion);
+   out->SetMotherPDG(-421);
+   out->SetMotherMass(1.86486);
+   // pair cuts
+   out->SetPairCuts(cutsPairY);
+   // 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)  {if(!centortracklets) out->AddAxis(centID, 100, 0.0, 100.0);
+                       else out->AddAxis(trackletsID, 250, -0.5, 249.5);}
+   else {if(!centortracklets) out->AddAxis(centID, 400, 0.0, 400.0);
+       else out->AddAxis(trackletsID, 250, -0.5, 249.5);}
+   
+   
+   }
+
+
+   return kTRUE;
+}
+
+
+void AddMonitorOutput_PionEta(TObjArray *mon=0,TString opt="",AliRsnLoopDaughter *peta=0)
+{
+
+   // PionEta
+   AliRsnValueDaughter *axisPionEta = new AliRsnValueDaughter("pion_eta", AliRsnValueDaughter::kEta);
+   axisPionEta->SetBins(-1.0,1.0,0.05);
+
+   // output: 2D histogram
+   AliRsnListOutput *outMonitorPionEta = new AliRsnListOutput("Pion_Eta", AliRsnListOutput::kHistoDefault);
+   outMonitorPionEta->AddValue(axisPionEta);
+
+   // add outputs to loop
+   if (mon) mon->Add(outMonitorPionEta);
+   if (peta) peta->AddOutput(outMonitorPionEta);
+  
+}
+
+void AddMonitorOutput_PionY(TObjArray *mon=0,TString opt="",AliRsnLoopDaughter *py=0)
+{
+
+   // PionY
+   AliRsnValueDaughter *axisPionY = new AliRsnValueDaughter("pion_y", AliRsnValueDaughter::kY);
+   axisPionY->SetBins(-1.0,1.0,0.05);
+
+   // output: 2D histogram
+   AliRsnListOutput *outMonitorPionY = new AliRsnListOutput("Pion_Y", AliRsnListOutput::kHistoDefault);
+   outMonitorPionY->AddValue(axisPionY);
+
+   // add outputs to loop
+   if (mon) mon->Add(outMonitorPionY);
+   if (py) py->AddOutput(outMonitorPionY);
+  
+}
+
+void AddMonitorOutput_PionMinPt(TObjArray *mon=0,TString opt="",AliRsnLoopDaughter *pmpt=0)
+{
+
+   // PionMinPt
+   AliRsnValueDaughter *axisPionMinPt = new AliRsnValueDaughter("pion_minpt", AliRsnValueDaughter::kPt);
+   axisPionMinPt->SetBins(0.0,1,0.05);
+
+   // output: 2D histogram
+   AliRsnListOutput *outMonitorPionMinPt = new AliRsnListOutput("Pion_MinPt", AliRsnListOutput::kHistoDefault);
+   outMonitorPionMinPt->AddValue(axisPionMinPt);
+
+   // add outputs to loop
+   if (mon) mon->Add(outMonitorPionMinPt);
+   if (pmpt) pmpt->AddOutput(outMonitorPionMinPt);
+  
+}
+
+void AddMonitorOutput_PionDCA(TObjArray *mon=0,TString opt="",AliRsnLoopDaughter *pdca=0)
+{
+
+   // PionDCA
+   AliRsnValueDaughter *axisPionDCA = new AliRsnValueDaughter("pion_dca", AliRsnValueDaughter::kDCAXY);
+   axisPionDCA->SetBins(-1.0,1,0.05);
+
+   // output: 2D histogram
+   AliRsnListOutput *outMonitorPionDCA = new AliRsnListOutput("Pion_DCA", AliRsnListOutput::kHistoDefault);
+   outMonitorPionDCA->AddValue(axisPionDCA);
+
+   // add outputs to loop
+   if (mon) mon->Add(outMonitorPionDCA);
+   if (pdca) pdca->AddOutput(outMonitorPionDCA);
+  
+}
+
+void AddMonitorOutput_PionTPC_PIDCut(TObjArray *mon=0,TString opt="",AliRsnLoopDaughter *piTPCPID=0)
+{
+
+   // Pion PID Cut
+   AliRsnValueDaughter *axisPionTPCPIDCut = new AliRsnValueDaughter("pionTPCPID", AliRsnValueDaughter::kTPCnsigmaPi);
+   axisPionTPCPIDCut->SetBins(0.0,5,0.1);
+
+   // output: 2D histogram
+   AliRsnListOutput *outMonitorPionTPCPIDCut = new AliRsnListOutput("Pion_TPC_PID_Cut", AliRsnListOutput::kHistoDefault);
+   outMonitorPionTPCPIDCut->AddValue(axisPionTPCPIDCut);
+
+   // add outputs to loop
+   if (mon) mon->Add(outMonitorPionTPCPIDCut);
+   if (piTPCPID) piTPCPID->AddOutput(outMonitorPionPIDCut);
+  
+}
+
+void AddMonitorOutput_PionTOF_PIDCut(TObjArray *mon=0,TString opt="",AliRsnLoopDaughter *piTOFPID=0)
+{
+
+   // Pion PID Cut
+   AliRsnValueDaughter *axisPionTOFPIDCut = new AliRsnValueDaughter("pionTOFPID", AliRsnValueDaughter::kTOFnsigmaPi);
+   axisPionTOFPIDCut->SetBins(0.0,5,0.1);
+
+   // output: 2D histogram
+   AliRsnListOutput *outMonitorPionTOFPIDCut = new AliRsnListOutput("Pion_TOF_PID_Cut", AliRsnListOutput::kHistoDefault);
+   outMonitorPionTOFPIDCut->AddValue(axisPionTOFPIDCut);
+
+   // add outputs to loop
+   if (mon) mon->Add(outMonitorPionTOFPIDCut);
+   if (piTOFPID) piTOFPID->AddOutput(outMonitorPionTOFPIDCut);
+  
+}
+
+void AddMonitorOutput_PionNTPC(TObjArray *mon=0,TString opt="",AliRsnLoopDaughter *piNTPC=0)
+{
+
+   // Pion PID Cut
+   AliRsnValueDaughter *axisPionNTPC = new AliRsnValueDaughter("pionNTPC", AliRsnValueDaughter::kNTPCclusters);
+   axisPionNTPC->SetBins(0.0,200,1);
+
+   // output: 2D histogram
+   AliRsnListOutput *outMonitorPionNTPC = new AliRsnListOutput("Pion_NTPC", AliRsnListOutput::kHistoDefault);
+   outMonitorPionNTPC->AddValue(axisPionNTPC);
+
+   // add outputs to loop
+   if (mon) mon->Add(outMonitorPionNTPC);
+   if (piNTPC) piNTPC->AddOutput(outMonitorPionNTPC);
+  
+}
+
+void AddMonitorOutput_KaonEta(TObjArray *mon=0,TString opt="",AliRsnLoopDaughter *keta=0)
+{
+
+   // KaonEta
+   AliRsnValueDaughter *axisKaonEta = new AliRsnValueDaughter("kaon_eta", AliRsnValueDaughter::kEta);
+   axisKaonEta->SetBins(-1.0,1.0,0.05);
+
+   // output: 2D histogram
+   AliRsnListOutput *outMonitorKaonEta = new AliRsnListOutput("Kaon_Eta", AliRsnListOutput::kHistoDefault);
+   outMonitorKaonEta->AddValue(axisKaonEta);
+
+   // add outputs to loop
+   if (mon) mon->Add(outMonitorKaonEta);
+   if (keta) keta->AddOutput(outMonitorKaonEta);
+  
+}
+
+void AddMonitorOutput_KaonY(TObjArray *mon=0,TString opt="",AliRsnLoopDaughter *ky=0)
+{
+
+   // KaonY
+   AliRsnValueDaughter *axisKaonY = new AliRsnValueDaughter("kaon_y", AliRsnValueDaughter::kY);
+   axisKaonY->SetBins(-1.0,1.0,0.05);
+
+   // output: 2D histogram
+   AliRsnListOutput *outMonitorKaonY = new AliRsnListOutput("Kaon_Y", AliRsnListOutput::kHistoDefault);
+   outMonitorKaonY->AddValue(axisKaonY);
+
+   // add outputs to loop
+   if (mon) mon->Add(outMonitorKaonY);
+   if (ky) ky->AddOutput(outMonitorKaonY);
+  
+}
+
+void AddMonitorOutput_KaonMinPt(TObjArray *mon=0,TString opt="",AliRsnLoopDaughter *kmpt=0)
+{
+
+   // KaonMinPt
+   AliRsnValueDaughter *axisKaonMinPt = new AliRsnValueDaughter("kaon_minpt", AliRsnValueDaughter::kPt);
+   axisKaonMinPt->SetBins(0.0,1,0.05);
+
+   // output: 2D histogram
+   AliRsnListOutput *outMonitorKaonMinPt = new AliRsnListOutput("Kaon_MinPt", AliRsnListOutput::kHistoDefault);
+   outMonitorKaonMinPt->AddValue(axisKaonMinPt);
+
+   // add outputs to loop
+   if (mon) mon->Add(outMonitorKaonMinPt);
+   if (kmpt) kmpt->AddOutput(outMonitorKaonMinPt);
+  
+}
+
+void AddMonitorOutput_KaonDCA(TObjArray *mon=0,TString opt="",AliRsnLoopDaughter *kdca=0)
+{
+
+   // KaonDCA
+   AliRsnValueDaughter *axisKaonDCA = new AliRsnValueDaughter("kaon_dca", AliRsnValueDaughter::kDCAXY);
+   axisKaonDCA->SetBins(-1.0,1,0.05);
+
+   // output: 2D histogram
+   AliRsnListOutput *outMonitorKaonDCA = new AliRsnListOutput("Kaon_DCA", AliRsnListOutput::kHistoDefault);
+   outMonitorKaonDCA->AddValue(axisKaonDCA);
+
+   // add outputs to loop
+   if (mon) mon->Add(outMonitorKaonDCA);
+   if (kdca) kdca->AddOutput(outMonitorKaonDCA);
+  
 }
+
+void AddMonitorOutput_KaonTPC_PIDCut(TObjArray *mon=0,TString opt="",AliRsnLoopDaughter *kTPCPID=0)
+{
+
+   // Kaon TPC PID Cut
+   AliRsnValueDaughter *axisKaonTPCPIDCut = new AliRsnValueDaughter("kaonTPCPID", AliRsnValueDaughter::kTPCnsigmaK);
+   axisKaonTPCPIDCut->SetBins(0.0,5,0.1);
+
+   // output: 2D histogram
+   AliRsnListOutput *outMonitorKaonTPCPIDCut = new AliRsnListOutput("Kaon_TPC_PID_Cut", AliRsnListOutput::kHistoDefault);
+   outMonitorKaonTPCPIDCut->AddValue(axisKaonTPCPIDCut);
+
+   // add outputs to loop
+   if (mon) mon->Add(outMonitorKaonTPCPIDCut);
+   if (kTPCPID) kTPCPID->AddOutput(outMonitorKaonTPCPIDCut);
+  
+}
+
+void AddMonitorOutput_KaonTOF_PIDCut(TObjArray *mon=0,TString opt="",AliRsnLoopDaughter *kTOFPID=0)
+{
+
+   // Kaon TOF PID Cut
+   AliRsnValueDaughter *axisKaonTOFPIDCut = new AliRsnValueDaughter("kaonTOFPID", AliRsnValueDaughter::kTOFnsigmaK);
+   axisKaonTOFPIDCut->SetBins(0.0,5,0.1);
+
+   // output: 2D histogram
+   AliRsnListOutput *outMonitorKaonTOFPIDCut = new AliRsnListOutput("Kaon_TOF_PID_Cut", AliRsnListOutput::kHistoDefault);
+   outMonitorKaonTOFPIDCut->AddValue(axisKaonTOFPIDCut);
+
+   // add outputs to loop
+   if (mon) mon->Add(outMonitorKaonTOFPIDCut);
+   if (kTOFPID) kTOFPID->AddOutput(outMonitorKaonTOFPIDCut);
+  
+}
+
+void AddMonitorOutput_KaonNTPC(TObjArray *mon=0,TString opt="",AliRsnLoopDaughter *kNTPC=0)
+{
+
+   // Kaon PID Cut
+   AliRsnValueDaughter *axisKaonNTPC = new AliRsnValueDaughter("kaonNTPC", AliRsnValueDaughter::kNTPCclusters);
+   axisKaonNTPC->SetBins(0.0,200,1);
+
+   // output: 2D histogram
+   AliRsnListOutput *outMonitorKaonNTPC = new AliRsnListOutput("Kaon_NTPC", AliRsnListOutput::kHistoDefault);
+   outMonitorKaonNTPC->AddValue(axisKaonNTPC);
+
+   // add outputs to loop
+   if (mon) mon->Add(outMonitorKaonNTPC);
+   if (kNTPC) kNTPC->AddOutput(outMonitorKaonNTPC);
+  
+}
+