]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGHF/vertexingHF/AliAnalysisTaskSELc2V0bachelorTMVA.cxx
Merge branch 'feature-movesplit'
[u/mrichter/AliRoot.git] / PWGHF / vertexingHF / AliAnalysisTaskSELc2V0bachelorTMVA.cxx
index 03214957fc8d425d4123513a7b219ad342e063cb..000a1fd3dd7094f45cea89956aea2c260b846d61 100755 (executable)
@@ -187,7 +187,11 @@ AliAnalysisTaskSE(),
   fCutKFDeviationFromVtxV0(0.),
   fCurrentEvent(-1),
   fBField(0),
-  fKeepingOnlyPYTHIABkg(kFALSE)
+  fKeepingOnlyPYTHIABkg(kFALSE),
+  fHistoMCLcK0SpGen(0x0),
+  fHistoMCLcK0SpGenAcc(0x0),
+  fHistoMCLcK0SpGenLimAcc(0x0),
+  fTriggerMask(0)
 {
   //
   // Default ctor
@@ -307,8 +311,11 @@ AliAnalysisTaskSELc2V0bachelorTMVA::AliAnalysisTaskSELc2V0bachelorTMVA(const Cha
   fCutKFDeviationFromVtxV0(0.),
   fCurrentEvent(-1),
   fBField(0),
-  fKeepingOnlyPYTHIABkg(kFALSE)
-
+  fKeepingOnlyPYTHIABkg(kFALSE),
+  fHistoMCLcK0SpGen(0x0),
+  fHistoMCLcK0SpGenAcc(0x0),
+  fHistoMCLcK0SpGenLimAcc(0x0),
+  fTriggerMask(0)
 {
   //
   // Constructor. Initialization of Inputs and Outputs
@@ -407,7 +414,7 @@ void AliAnalysisTaskSELc2V0bachelorTMVA::Terminate(Option_t*)
   // a query. It always runs on the client, it can be used to present
   // the results graphically or save the results to file.
   
-  //AliInfo("Terminate","");
+  AliInfo("Terminate");
   AliAnalysisTaskSE::Terminate();
   
   fOutput = dynamic_cast<TList*> (GetOutputData(1));
@@ -415,6 +422,27 @@ void AliAnalysisTaskSELc2V0bachelorTMVA::Terminate(Option_t*)
     AliError("fOutput not available");
     return;
   }
+
+  
+  //AliDebug(2, Form("At MC level, %f Lc --> K0S + p were found", fHistoMCLcK0SpGen->GetEntries()));
+  //AliDebug(2, Form("At MC level, %f Lc --> K0S + p were found in the acceptance", fHistoMCLcK0SpGenAcc->GetEntries()));
+  //AliDebug(2, Form("At Reco level, %lld Lc --> K0S + p were found", fVariablesTreeSgn->GetEntries()));
+  if(fHistoMCLcK0SpGen) {
+    AliInfo(Form("At MC level, %f Lc --> K0S + p were found", fHistoMCLcK0SpGen->GetEntries()));
+  } else {
+    AliInfo("fHistoMCLcK0SpGen not available");
+  }
+  if(fHistoMCLcK0SpGenAcc) {
+    AliInfo(Form("At MC level, %f Lc --> K0S + p were found in the acceptance", fHistoMCLcK0SpGenAcc->GetEntries()));
+  } else {
+    AliInfo("fHistoMCLcK0SpGenAcc not available");
+  }
+  if(fVariablesTreeSgn) {
+    AliInfo(Form("At Reco level, %lld Lc --> K0S + p were found", fVariablesTreeSgn->GetEntries()));
+  } else {
+    AliInfo("fVariablesTreeSgn not available");
+  }    
+  
   fOutputKF = dynamic_cast<TList*> (GetOutputData(6));
   if (!fOutputKF) {     
     AliError("fOutputKF not available");
@@ -605,6 +633,12 @@ void AliAnalysisTaskSELc2V0bachelorTMVA::UserCreateOutputObjects() {
   //fOutput->Add(fVariablesTreeSgn);
   //fOutput->Add(fVariablesTreeBkg);
 
+  const Float_t ptbins[15] = {0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 12., 17., 25., 35.};
+
+  fHistoMCLcK0SpGen = new TH1F("fHistoMCLcK0SpGen", "fHistoMCLcK0SpGen", 14, ptbins);
+  fHistoMCLcK0SpGenAcc = new TH1F("fHistoMCLcK0SpGenAcc", "fHistoMCLcK0SpGenAcc", 14, ptbins);
+  fHistoMCLcK0SpGenLimAcc = new TH1F("fHistoMCLcK0SpGenLimAcc", "fHistoMCLcK0SpGenLimAcc", 14, ptbins);
+
   fOutput->Add(fHistoEvents);
   fOutput->Add(fHistoLc);
   fOutput->Add(fHistoLcOnTheFly);
@@ -614,6 +648,9 @@ void AliAnalysisTaskSELc2V0bachelorTMVA::UserCreateOutputObjects() {
   fOutput->Add(fHistoCodesBkg);
   fOutput->Add(fHistoLcpKpiBeforeCuts);
   fOutput->Add(fHistoBackground);
+  fOutput->Add(fHistoMCLcK0SpGen);
+  fOutput->Add(fHistoMCLcK0SpGenAcc);
+  fOutput->Add(fHistoMCLcK0SpGenLimAcc);
 
   PostData(1, fOutput);
   PostData(4, fVariablesTreeSgn);
@@ -824,7 +861,7 @@ void AliAnalysisTaskSELc2V0bachelorTMVA::UserExec(Option_t *)
   }
 
   fCurrentEvent++;
-  Printf("Processing event = %d", fCurrentEvent);
+  AliDebug(2, Form("Processing event = %d", fCurrentEvent));
   AliAODEvent* aodEvent = dynamic_cast<AliAODEvent*>(fInputEvent);
   TClonesArray *arrayLctopKos=0;
 
@@ -854,34 +891,23 @@ void AliAnalysisTaskSELc2V0bachelorTMVA::UserExec(Option_t *)
   
   if ( !fUseMCInfo && fIspA) {
     fAnalCuts->SetTriggerClass("");
-    fAnalCuts->SetTriggerMask(AliVEvent::kINT7);
+    fAnalCuts->SetTriggerMask(fTriggerMask);
   }
-
-  fCounter->StoreEvent(aodEvent,fAnalCuts,fUseMCInfo);
-
-  // AOD primary vertex
-  fVtx1 = (AliAODVertex*)aodEvent->GetPrimaryVertex();
-  if (!fVtx1) return;
-  if (fVtx1->GetNContributors()<1) return;
-
-  fIsEventSelected = fAnalCuts->IsEventSelected(aodEvent);
-
-  if ( !fIsEventSelected ) {
-    fHistoEvents->Fill(0);
-    return; // don't take into account not selected events 
+  
+  Int_t runnumber = aodEvent->GetRunNumber();
+  if (aodEvent->GetTriggerMask() == 0 && (runnumber >= 195344 && runnumber <= 195677)){
+    AliDebug(3,"Event rejected because of null trigger mask");
+    return;
   }
-  fHistoEvents->Fill(1);
-
-  // Setting magnetic field for KF vertexing
-  fBField = aodEvent->GetMagneticField();
-  AliKFParticle::SetField(fBField);
-
+  
+  fCounter->StoreEvent(aodEvent,fAnalCuts,fUseMCInfo);
+  
   // mc analysis 
   TClonesArray *mcArray = 0;
   AliAODMCHeader *mcHeader=0;
 
   if (fUseMCInfo) {
-    // MC array need for maching
+    // MC array need for matching
     mcArray = dynamic_cast<TClonesArray*>(aodEvent->FindListObject(AliAODMCParticle::StdBranchName()));
     if (!mcArray) {
       AliError("Could not find Monte-Carlo in AOD");
@@ -893,7 +919,34 @@ void AliAnalysisTaskSELc2V0bachelorTMVA::UserExec(Option_t *)
       AliError("AliAnalysisTaskSELc2V0bachelorTMVA::UserExec: MC header branch not found!\n");
       return;
     }
+
+    Double_t zMCVertex = mcHeader->GetVtxZ();
+    if (TMath::Abs(zMCVertex) > fAnalCuts->GetMaxVtxZ()){
+      AliDebug(3,Form("z coordinate of MC vertex = %f, it was required to be within [-%f, +%f], skipping event", zMCVertex, fAnalCuts->GetMaxVtxZ(), fAnalCuts->GetMaxVtxZ()));
+      AliInfo(Form("z coordinate of MC vertex = %f, it was required to be within [-%f, +%f], skipping event", zMCVertex, fAnalCuts->GetMaxVtxZ(), fAnalCuts->GetMaxVtxZ()));
+      return;
+    }
+    
+    //Printf("Filling MC histo");
+    FillMCHisto(mcArray);
+  }
+  
+  // AOD primary vertex
+  fVtx1 = (AliAODVertex*)aodEvent->GetPrimaryVertex();
+  if (!fVtx1) return;
+  if (fVtx1->GetNContributors()<1) return;
+
+  fIsEventSelected = fAnalCuts->IsEventSelected(aodEvent);
+
+  if ( !fIsEventSelected ) {
+    fHistoEvents->Fill(0);
+    return; // don't take into account not selected events 
   }
+  fHistoEvents->Fill(1);
+
+  // Setting magnetic field for KF vertexing
+  fBField = aodEvent->GetMagneticField();
+  AliKFParticle::SetField(fBField);
 
   Int_t nSelectedAnal = 0;
   if (fIsK0sAnalysis) {
@@ -909,6 +962,112 @@ void AliAnalysisTaskSELc2V0bachelorTMVA::UserExec(Option_t *)
   PostData(5, fVariablesTreeBkg);
   PostData(6, fOutputKF);
 
+}
+//-------------------------------------------------------------------------------
+void AliAnalysisTaskSELc2V0bachelorTMVA::FillMCHisto(TClonesArray *mcArray){
+
+  // method to fill MC histo: how many Lc --> K0S + p are there at MC level
+  for (Int_t iPart=0; iPart<mcArray->GetEntriesFast(); iPart++) { 
+    AliAODMCParticle* mcPart = dynamic_cast<AliAODMCParticle*>(mcArray->At(iPart));
+    if (!mcPart){
+      AliError("Failed casting particle from MC array!, Skipping particle");
+      continue;
+    }
+    Int_t pdg = mcPart->GetPdgCode();
+    if (TMath::Abs(pdg) != 4122){
+      AliDebug(2, Form("MC particle %d is not a Lc: its pdg code is %d", iPart, pdg));
+      continue;
+    }
+    AliDebug(2, Form("Step 0 ok: MC particle %d is a Lc: its pdg code is %d", iPart, pdg));
+    Int_t labeldaugh0 = mcPart->GetDaughter(0);
+    Int_t labeldaugh1 = mcPart->GetDaughter(1);
+    if (labeldaugh0 <= 0 || labeldaugh1 <= 0){
+      AliDebug(2, Form("The MC particle doesn't have correct daughters, skipping!!"));
+      continue;
+    }
+    else if (labeldaugh1 - labeldaugh0 == 1){
+      AliDebug(2, Form("Step 1 ok: The MC particle has correct daughters!!"));
+      AliAODMCParticle* daugh0 = dynamic_cast<AliAODMCParticle*>(mcArray->At(labeldaugh0));
+      AliAODMCParticle* daugh1 = dynamic_cast<AliAODMCParticle*>(mcArray->At(labeldaugh1));
+      if(!daugh0 || !daugh1){
+       AliDebug(2,"Particle daughters not properly retrieved!");
+       return;
+      }
+      Int_t pdgCodeDaugh0 = TMath::Abs(daugh0->GetPdgCode());
+      Int_t pdgCodeDaugh1 = TMath::Abs(daugh1->GetPdgCode());
+      AliAODMCParticle* bachelorMC = daugh0;
+      AliAODMCParticle* v0MC = daugh1;
+      AliDebug(2, Form("pdgCodeDaugh0 = %d, pdgCodeDaugh1 = %d", pdgCodeDaugh0, pdgCodeDaugh1));
+      if ((pdgCodeDaugh0 == 311 && pdgCodeDaugh1 == 2212) || (pdgCodeDaugh0 == 2212 && pdgCodeDaugh1 == 311)){ 
+       // we are in the case of Lc --> K0 + p; now we have to check if the K0 decays in K0S, and if this goes in pi+pi-
+       /// first, we set the bachelor and the v0: above we assumed first proton and second V0, but we could have to change it:
+       if (pdgCodeDaugh0 == 311 && pdgCodeDaugh1 == 2212) {
+         bachelorMC = daugh1;
+         v0MC = daugh0;
+       }
+       AliDebug(2, Form("Number of Daughters of v0 = %d", v0MC->GetNDaughters()));
+       if (v0MC->GetNDaughters() != 1) { 
+         AliDebug(2, "The K0 does not decay in 1 body only! Impossible... Continuing...");
+         continue;
+       }
+       else { // So far: Lc --> K0 + p, K0 with 1 daughter 
+         AliDebug(2, "Step 2 ok: The K0 does decay in 1 body only! ");
+         Int_t labelK0daugh = v0MC->GetDaughter(0);
+         AliAODMCParticle* partK0S = dynamic_cast<AliAODMCParticle*>(mcArray->At(labelK0daugh));
+         if(!partK0S){
+           AliError("Error while casting particle! returning a NULL array");
+           continue;
+         }
+         else { // So far: Lc --> K0 + p, K0 with 1 daughter that we can access
+           if (partK0S->GetNDaughters() != 2 || TMath::Abs(partK0S->GetPdgCode() != 310)){
+             AliDebug(2, "The K0 daughter is not a K0S or does not decay in 2 bodies");
+             continue;
+           }
+           else { // So far: Lc --> K0 + p, K0 --> K0S, K0S in 2 bodies
+             AliDebug(2, "Step 3 ok: The K0 daughter is a K0S and does decay in 2 bodies");
+             Int_t labelK0Sdaugh0 = partK0S->GetDaughter(0);
+             Int_t labelK0Sdaugh1 = partK0S->GetDaughter(1);
+             AliAODMCParticle* daughK0S0 = dynamic_cast<AliAODMCParticle*>(mcArray->At(labelK0Sdaugh0));
+             AliAODMCParticle* daughK0S1 = dynamic_cast<AliAODMCParticle*>(mcArray->At(labelK0Sdaugh1));
+             if (!daughK0S0 || ! daughK0S1){
+               AliDebug(2, "Could not access K0S daughters, continuing...");
+               continue;
+             }
+             else { // So far: Lc --> K0 + p, K0 --> K0S, K0S in 2 bodies that we can access
+               AliDebug(2, "Step 4 ok: Could access K0S daughters, continuing...");
+               Int_t pdgK0Sdaugh0 = daughK0S0->GetPdgCode();
+               Int_t pdgK0Sdaugh1 = daughK0S1->GetPdgCode();
+               if (TMath::Abs(pdgK0Sdaugh0) != 211 || TMath::Abs(pdgK0Sdaugh1) != 211){
+                 AliDebug(2, "The K0S does not decay in pi+pi-, continuing");
+                 //AliInfo("The K0S does not decay in pi+pi-, continuing");
+               }
+               else { // Full chain: Lc --> K0 + p, K0 --> K0S, K0S --> pi+pi-
+                 if (fAnalCuts->IsInFiducialAcceptance(mcPart->Pt(), mcPart->Y())) {
+                   AliDebug(2, Form("----> Filling histo with pt = %f", mcPart->Pt()));
+                   if(TMath::Abs(mcPart->Y()) < 0.5) fHistoMCLcK0SpGenLimAcc->Fill(mcPart->Pt());
+                   //AliInfo(Form("\nparticle = %d, Filling MC Gen histo\n", iPart));
+                   fHistoMCLcK0SpGen->Fill(mcPart->Pt());
+                   if(!(TMath::Abs(bachelorMC->Eta()) > 0.9 || bachelorMC->Pt() < 0.1 ||
+                        TMath::Abs(daughK0S0->Eta()) > 0.9 || daughK0S0->Pt() < 0.1 ||
+                        TMath::Abs(daughK0S1->Eta()) > 0.9 || daughK0S1->Pt() < 0.1)) {
+                     fHistoMCLcK0SpGenAcc->Fill(mcPart->Pt());
+                   }
+                 }
+                 else {
+                   AliDebug(2, "not in fiducial acceptance! Skipping");
+                   continue;
+                 }
+               }
+             }
+           }
+         }
+       }
+      }
+    }
+  } // closing loop over mcArray
+
+  return; 
+
 }
 
 //-------------------------------------------------------------------------------
@@ -976,7 +1135,7 @@ void AliAnalysisTaskSELc2V0bachelorTMVA::MakeAnalysisForLc2prK0S(TClonesArray *a
       // find associated MC particle for Lc -> p+K0 and K0S->pi+pi
       fmcLabelLc = lcK0spr->MatchToMC(pdgCand, pdgDgLctoV0bachelor[1], pdgDgLctoV0bachelor, pdgDgV0toDaughters, mcArray, kTRUE);
       if (fmcLabelLc>=0) {
-       AliDebug(2,Form(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~cascade number %d (total cascade number = %d)", iLctopK0s, nCascades));
+       AliDebug(2, Form("----> cascade number %d (total cascade number = %d) is a Lc!", iLctopK0s, nCascades));
 
        AliAODMCParticle *partLc = dynamic_cast<AliAODMCParticle*>(mcArray->At(fmcLabelLc));
        if(partLc){
@@ -1119,7 +1278,7 @@ void AliAnalysisTaskSELc2V0bachelorTMVA::MakeAnalysisForLc2prK0S(TClonesArray *a
       }
     }
 
-    FillLc2pK0Sspectrum(lcK0spr, isLc, nSelectedAnal, cutsAnal, mcArray);
+    FillLc2pK0Sspectrum(lcK0spr, isLc, nSelectedAnal, cutsAnal, mcArray, iLctopK0s);
     
   }
   
@@ -1131,7 +1290,7 @@ void AliAnalysisTaskSELc2V0bachelorTMVA::FillLc2pK0Sspectrum(AliAODRecoCascadeHF
                                                             Int_t isLc,
                                                             Int_t &nSelectedAnal,
                                                             AliRDHFCutsLctoV0 *cutsAnal,
-                                                            TClonesArray *mcArray){
+                                                            TClonesArray *mcArray, Int_t iLctopK0s){
   //
   // Fill histos for Lc -> K0S+proton
   //
@@ -1189,8 +1348,8 @@ void AliAnalysisTaskSELc2V0bachelorTMVA::FillLc2pK0Sspectrum(AliAODRecoCascadeHF
   Int_t isInV0window = (((cutsAnal->IsSelectedSingleCut(part, AliRDHFCuts::kCandidate, 2)) & (AliRDHFCutsLctoV0::kLcToK0Spr)) == (AliRDHFCutsLctoV0::kLcToK0Spr)); // cut on V0 invMass
 
   if (isInV0window == 0) {
-    AliDebug(2, "No: The candidate has NOT passed the mass cuts!");
-    if (isLc) Printf("SIGNAL candidate rejected");
+    AliDebug(2, "No: The candidate has NOT passed the V0 window cuts!");
+    if (isLc) Printf("SIGNAL candidate rejected: V0 window cuts");
     return;           
   }
   else AliDebug(2, "Yes: The candidate has passed the mass cuts!");
@@ -1199,12 +1358,13 @@ void AliAnalysisTaskSELc2V0bachelorTMVA::FillLc2pK0Sspectrum(AliAODRecoCascadeHF
 
   if (!isInCascadeWindow) {
     AliDebug(2, "No: The candidate has NOT passed the cascade window cuts!");
-    if (isLc) Printf("SIGNAL candidate rejected");
+    if (isLc) Printf("SIGNAL candidate rejected: cascade window cuts");
     return;
   }
   else AliDebug(2, "Yes: The candidate has passed the cascade window cuts!");
 
   Bool_t isCandidateSelectedCuts = (((cutsAnal->IsSelected(part, AliRDHFCuts::kCandidate)) & (AliRDHFCutsLctoV0::kLcToK0Spr)) == (AliRDHFCutsLctoV0::kLcToK0Spr)); // kinematic/topological cuts
+  AliDebug(2, Form("recoAnalysisCuts = %d", cutsAnal->IsSelected(part, AliRDHFCuts::kCandidate) & (AliRDHFCutsLctoV0::kLcToK0Spr)));
   if (!isCandidateSelectedCuts){
     AliDebug(2, "No: Analysis cuts kCandidate level NOT passed");
     if (isLc) Printf("SIGNAL candidate rejected");
@@ -1543,7 +1703,7 @@ void AliAnalysisTaskSELc2V0bachelorTMVA::FillLc2pK0Sspectrum(AliAODRecoCascadeHF
 
     if (fUseMCInfo) {
       if (isLc){
-       AliDebug(2, "Filling Sgn");
+       AliDebug(2, Form("Reco particle %d --> Filling Sgn", iLctopK0s));
        fVariablesTreeSgn->Fill();
        fHistoCodesSgn->Fill(bachCode, k0SCode);          
       }