Updates + addition of EMCal
authorandronic <andronic@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 19 Apr 2011 12:02:23 +0000 (12:02 +0000)
committerandronic <andronic@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 19 Apr 2011 12:02:23 +0000 (12:02 +0000)
91 files changed:
PWG3/hfe/AliAnalysisTaskDCA.cxx
PWG3/hfe/AliAnalysisTaskDCA.h
PWG3/hfe/AliAnalysisTaskDisplacedElectrons.cxx
PWG3/hfe/AliAnalysisTaskDisplacedElectrons.h
PWG3/hfe/AliAnalysisTaskHFE.cxx
PWG3/hfe/AliAnalysisTaskHFE.h
PWG3/hfe/AliAnalysisTaskHFEpidQA.cxx
PWG3/hfe/AliAnalysisTaskHFEpidQA.h
PWG3/hfe/AliHFEV0cuts.cxx
PWG3/hfe/AliHFEV0cuts.h
PWG3/hfe/AliHFEV0info.cxx
PWG3/hfe/AliHFEV0info.h
PWG3/hfe/AliHFEV0pid.cxx
PWG3/hfe/AliHFEV0pid.h
PWG3/hfe/AliHFEV0pidMC.cxx
PWG3/hfe/AliHFEV0pidMC.h
PWG3/hfe/AliHFEcollection.cxx
PWG3/hfe/AliHFEcollection.h
PWG3/hfe/AliHFEcontainer.cxx
PWG3/hfe/AliHFEcontainer.h
PWG3/hfe/AliHFEcutStep.cxx
PWG3/hfe/AliHFEcutStep.h
PWG3/hfe/AliHFEcuts.cxx
PWG3/hfe/AliHFEcuts.h
PWG3/hfe/AliHFEdca.cxx
PWG3/hfe/AliHFEdca.h
PWG3/hfe/AliHFEdetPIDqa.cxx
PWG3/hfe/AliHFEdetPIDqa.h
PWG3/hfe/AliHFEdisplacedElectrons.cxx
PWG3/hfe/AliHFEdisplacedElectrons.h
PWG3/hfe/AliHFEefficiency.h
PWG3/hfe/AliHFEelecbackground.cxx
PWG3/hfe/AliHFEelecbackground.h
PWG3/hfe/AliHFEemcalPIDqa.cxx [new file with mode: 0644]
PWG3/hfe/AliHFEemcalPIDqa.h [new file with mode: 0644]
PWG3/hfe/AliHFEextraCuts.cxx
PWG3/hfe/AliHFEextraCuts.h
PWG3/hfe/AliHFEextraEventCuts.cxx [new file with mode: 0644]
PWG3/hfe/AliHFEextraEventCuts.h [new file with mode: 0644]
PWG3/hfe/AliHFEmcQA.cxx
PWG3/hfe/AliHFEmcQA.h
PWG3/hfe/AliHFEpairs.cxx
PWG3/hfe/AliHFEpairs.h
PWG3/hfe/AliHFEpid.cxx
PWG3/hfe/AliHFEpid.h
PWG3/hfe/AliHFEpidBase.cxx
PWG3/hfe/AliHFEpidBase.h
PWG3/hfe/AliHFEpidEMCAL.cxx [new file with mode: 0644]
PWG3/hfe/AliHFEpidEMCAL.h [new file with mode: 0644]
PWG3/hfe/AliHFEpidESD.h
PWG3/hfe/AliHFEpidITS.cxx
PWG3/hfe/AliHFEpidITS.h
PWG3/hfe/AliHFEpidMC.cxx
PWG3/hfe/AliHFEpidMC.h
PWG3/hfe/AliHFEpidQA.h
PWG3/hfe/AliHFEpidQAmanager.cxx
PWG3/hfe/AliHFEpidQAmanager.h
PWG3/hfe/AliHFEpidTOF.cxx
PWG3/hfe/AliHFEpidTOF.h
PWG3/hfe/AliHFEpidTPC.cxx
PWG3/hfe/AliHFEpidTPC.h
PWG3/hfe/AliHFEpidTRD.cxx
PWG3/hfe/AliHFEpidTRD.h
PWG3/hfe/AliHFEpostAnalysis.cxx
PWG3/hfe/AliHFEpostAnalysis.h
PWG3/hfe/AliHFEpriVtx.cxx
PWG3/hfe/AliHFEpriVtx.h
PWG3/hfe/AliHFEsecVtx.cxx
PWG3/hfe/AliHFEsecVtx.h
PWG3/hfe/AliHFEsecVtxs.cxx
PWG3/hfe/AliHFEsecVtxs.h
PWG3/hfe/AliHFEsignalCuts.cxx
PWG3/hfe/AliHFEsignalCuts.h
PWG3/hfe/AliHFEspectrum.cxx
PWG3/hfe/AliHFEspectrum.h
PWG3/hfe/AliHFEtaggedTrackAnalysis.cxx
PWG3/hfe/AliHFEtaggedTrackAnalysis.h
PWG3/hfe/AliHFEtofPIDqa.cxx
PWG3/hfe/AliHFEtofPIDqa.h
PWG3/hfe/AliHFEtools.cxx
PWG3/hfe/AliHFEtools.h
PWG3/hfe/AliHFEtpcPIDqa.cxx
PWG3/hfe/AliHFEtpcPIDqa.h
PWG3/hfe/AliHFEtrackFilter.cxx
PWG3/hfe/AliHFEtrackFilter.h
PWG3/hfe/AliHFEtrdPIDqa.cxx
PWG3/hfe/AliHFEtrdPIDqa.h
PWG3/hfe/AliHFEtrdPIDqaV1.cxx
PWG3/hfe/AliHFEtrdPIDqaV1.h
PWG3/hfe/AliHFEvarManager.cxx
PWG3/hfe/AliHFEvarManager.h

index 3d21abc..2480a44 100644 (file)
@@ -12,9 +12,6 @@
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */
-
 //
 // The analysis task:
 // impact parameter resolution and pull study
@@ -91,15 +88,6 @@ AliAnalysisTaskDCA::AliAnalysisTaskDCA():
   //
   // Dummy constructor
   //
-  DefineInput(0, TChain::Class());
-  DefineOutput(1, TH1I::Class());
-  DefineOutput(2, TList::Class());
-
-  //printf(" ---> Dummy constructor used!\n"); 
-  AliInfo("Dummy constructor used!");
-  fDefaultPID = new AliESDpid();
-  fHFEpid = new AliHFEpid("dummyPID");
-
 }
 
 //____________________________________________________________
index c2a211b..5c746b0 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIANALYSISTASKDCA_H
-#define ALIANALYSISTASKDCA_H
-
 /**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */ 
-
 //
 // Task for impact parameter (DCA) analysis
 // study DCA in rphi (xy) and z: resolution and pull 
 // For further information see implementation file
 
 
+#ifndef ALIANALYSISTASKDCA_H
+#define ALIANALYSISTASKDCA_H
 #ifndef ALIANALYSISTASKSE_H
 #include "AliAnalysisTaskSE.h"
 #endif
index 7caccb4..832a7d8 100644 (file)
@@ -12,9 +12,6 @@
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */
-
 //
 // The analysis task:
 // study displaced electrons from beauty and charm 
@@ -84,17 +81,6 @@ AliAnalysisTaskDisplacedElectrons::AliAnalysisTaskDisplacedElectrons():
   //
   // Dummy constructor
   //
-  DefineInput(0, TChain::Class());
-  DefineOutput(1, TList::Class());  // displacedElectron
-  DefineOutput(2, TList::Class());  // correction framework
-  DefineOutput(3, TList::Class());  // QA
-  
-  // Initialize pid
-  
-  fDeDefaultPID = new AliESDpid;
-  fDePID = new AliHFEpid("DEPID");
-  
-
 }
 
 //____________________________________________________________
index ac14a7b..eba5ac3 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIANALYSISTASKDISPLACEDELECTRONS_H
-#define ALIANALYSISTASKDISPLACEDELECTRONS_H
-
 /**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
@@ -15,9 +12,6 @@
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */ 
-
 //
 // Analysis task: 
 // study displaced electrons from beauty and charm 
@@ -31,6 +25,9 @@
 
 
 
+#ifndef ALIANALYSISTASKDISPLACEDELECTRONS_H
+#define ALIANALYSISTASKDISPLACEDELECTRONS_H
+
 #ifndef ALIANALYSISTASKSE_H
 #include "AliAnalysisTaskSE.h"
 #endif
index 59af658..196c843 100644 (file)
@@ -12,9 +12,6 @@
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */
-
 //
 // The analysis task:
 // Filling an AliCFContainer with the quantities pt, eta and phi
 #include <TObjArray.h>
 #include <TParticle.h>
 #include <TProfile.h>
-#include <TString.h>
+//#include <TString.h>
 #include <TF1.h>
 #include <TTree.h>
 
 #include "AliAODInputHandler.h"
 #include "AliAODMCParticle.h"
 #include "AliAODTrack.h"
+#include "AliAODVertex.h"
 #include "AliCFContainer.h"
 #include "AliCFManager.h"
 #include "AliESDEvent.h"
@@ -89,12 +87,17 @@ AliAnalysisTaskHFE::AliAnalysisTaskHFE():
   , fQAlevel(0)
   , fPlugins(0)
   , fFillSignalOnly(kTRUE)
+  , fBackGroundFactorApply(kFALSE)
   , fRemovePileUp(kFALSE)
   , fIdentifiedAsPileUp(kFALSE)
   , fIdentifiedAsOutInz(kFALSE)
   , fPassTheEventCut(kFALSE)
+  , fHasSpecialTriggerSelection(kFALSE)
+  , fSpecialTrigger("NONE")
   , fCentralityF(99.0)
-  , fBackGroundFactorsFunction(NULL)
+  , fContributors(0.5)
+  , fWeightBackGround(0.)
+  , fVz(0.0)
   , fContainer(NULL)
   , fVarManager(NULL)
   , fSignalCuts(NULL)
@@ -130,12 +133,17 @@ AliAnalysisTaskHFE::AliAnalysisTaskHFE(const char * name):
   , fQAlevel(0)
   , fPlugins(0)
   , fFillSignalOnly(kTRUE)
+  , fBackGroundFactorApply(kFALSE)
   , fRemovePileUp(kFALSE)
   , fIdentifiedAsPileUp(kFALSE)
   , fIdentifiedAsOutInz(kFALSE)
   , fPassTheEventCut(kFALSE)  
+  , fHasSpecialTriggerSelection(kFALSE)
+  , fSpecialTrigger("NONE")
   , fCentralityF(99.0)
-  , fBackGroundFactorsFunction(NULL)
+  , fContributors(0.5)
+  , fWeightBackGround(0.)
+  , fVz(0.0)
   , fContainer(NULL)
   , fVarManager(NULL)
   , fSignalCuts(NULL)
@@ -177,12 +185,17 @@ AliAnalysisTaskHFE::AliAnalysisTaskHFE(const AliAnalysisTaskHFE &ref):
   , fQAlevel(0)
   , fPlugins(0)
   , fFillSignalOnly(ref.fFillSignalOnly)
+  , fBackGroundFactorApply(ref.fBackGroundFactorApply)
   , fRemovePileUp(ref.fRemovePileUp)
   , fIdentifiedAsPileUp(ref.fIdentifiedAsPileUp)
   , fIdentifiedAsOutInz(ref.fIdentifiedAsOutInz)
   , fPassTheEventCut(ref.fPassTheEventCut)
+  , fHasSpecialTriggerSelection(ref.fHasSpecialTriggerSelection)
+  , fSpecialTrigger(ref.fSpecialTrigger)
   , fCentralityF(ref.fCentralityF)
-  , fBackGroundFactorsFunction(NULL)
+  , fContributors(ref.fContributors)
+  , fWeightBackGround(ref.fWeightBackGround)
+  , fVz(ref.fVz)
   , fContainer(NULL)
   , fVarManager(NULL)
   , fSignalCuts(NULL)
@@ -232,12 +245,17 @@ void AliAnalysisTaskHFE::Copy(TObject &o) const {
   target.fQAlevel = fQAlevel;
   target.fPlugins = fPlugins;
   target.fFillSignalOnly = fFillSignalOnly;
+  target.fBackGroundFactorApply = fBackGroundFactorApply;
   target.fRemovePileUp = fRemovePileUp;
   target.fIdentifiedAsPileUp = fIdentifiedAsPileUp;
   target.fIdentifiedAsOutInz = fIdentifiedAsOutInz;
   target.fPassTheEventCut = fPassTheEventCut;
+  target.fHasSpecialTriggerSelection = fHasSpecialTriggerSelection;
+  target.fSpecialTrigger = fSpecialTrigger;
   target.fCentralityF = fCentralityF;
-  target.fBackGroundFactorsFunction = fBackGroundFactorsFunction;
+  target.fContributors = fContributors;
+  target.fWeightBackGround = fWeightBackGround;
+  target.fVz = fVz;
   target.fContainer = fContainer;
   target.fVarManager = fVarManager;
   target.fSignalCuts = fSignalCuts;
@@ -360,7 +378,7 @@ void AliAnalysisTaskHFE::UserCreateOutputObjects(){
   }
 
   // Initialize correction Framework and Cuts
-  const Int_t kNcutSteps = AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kNcutStepsRecTrack + AliHFEcuts::kNcutStepsDETrack;
+  const Int_t kNcutSteps = AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kNcutStepsRecTrack + AliHFEcuts::kNcutStepsDETrack + AliHFEcuts::kNcutStepsSecvtxTrack;
   fCFM = new AliCFManager;
   fCFM->SetNStepParticle(kNcutSteps);
   MakeParticleContainer();
@@ -424,9 +442,22 @@ void AliAnalysisTaskHFE::UserCreateOutputObjects(){
   // tagged tracks
   if(GetPlugin(kTaggedTrackAnalysis)){
     AliInfo("Analysis on V0-tagged tracks enabled");
-    fTaggedTrackAnalysis = new AliHFEtaggedTrackAnalysis;
+    fTaggedTrackAnalysis = new AliHFEtaggedTrackAnalysis(Form("taggedTrackAnalysis%s", GetName()));
     fTaggedTrackAnalysis->SetCuts(fTaggedTrackCuts);
     fTaggedTrackAnalysis->SetClean(fCleanTaggedTrack);
+    AliHFEvarManager *varManager = fTaggedTrackAnalysis->GetVarManager();
+    TObjArray *array = fVarManager->GetVariables();
+    Int_t nvars = array->GetEntriesFast();
+    TString namee;
+    for(Int_t v = 0; v < nvars; v++) {
+      AliHFEvarManager::AliHFEvariable *variable = (AliHFEvarManager::AliHFEvariable *) array->At(v);
+      if(!variable) continue;
+      TString name(((AliHFEvarManager::AliHFEvariable *)variable)->GetName());
+      if(!name.CompareTo("source")) namee = TString("species");
+      else namee = TString(name);
+      varManager->AddVariable(namee);
+      //printf("For AliTaggedTrackAnalysis, had the variable %s and the one used %s\n",(const char*)variable->GetName(),(const char*) namee);
+    }
     if(fPIDqa->HasHighResolutionHistos()) 
       fTaggedTrackAnalysis->GetPIDqa()->SetHighResolutionHistos();
     fTaggedTrackAnalysis->SetPID(fPID);
@@ -462,6 +493,7 @@ void AliAnalysisTaskHFE::UserExec(Option_t *){
     return;
   }
 
+
   if(IsESDanalysis() && HasMCData()){
     // Protect against missing MC trees
     AliMCEventHandler *mcH = dynamic_cast<AliMCEventHandler *>(AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
@@ -475,9 +507,10 @@ void AliAnalysisTaskHFE::UserExec(Option_t *){
   }
 
   // need the centrality for everything (MC also)
-  fCentralityF = 99.0;
-  ReadCentrality();
-  //printf("fCentralityF %f\n",fCentralityF);
+  fCentralityF = -100.0;
+  if(!ReadCentrality()) fCentralityF = -100.0;
+  //printf("pass centrality\n");
+  //printf("Reading fCentralityF %f\n",fCentralityF);
   
   // See if pile up and z in the range
   RejectionPileUpVertexRangeEventCut();
@@ -494,6 +527,11 @@ void AliAnalysisTaskHFE::UserExec(Option_t *){
     fPID->SetAODpid(aodworkingpid); 
     ProcessAOD();
   } else {
+    // Check Trigger selection
+    if(fHasSpecialTriggerSelection){
+      AliESDEvent *ev = dynamic_cast<AliESDEvent *>(fInputEvent);
+      if(!(ev && ev->IsTriggerClassFired(fSpecialTrigger.Data()))) return;
+    }
     AliESDInputHandler *inH = dynamic_cast<AliESDInputHandler *>(fInputHandler);
     if(!inH){
       AliError("No ESD Input handler available");
@@ -596,14 +634,17 @@ void AliAnalysisTaskHFE::ProcessMC(){
   // In case MC QA is on also MC QA loop is done
   //
   AliDebug(3, "Processing MC Information");
-  Double_t eventContainer [3];
+  Double_t eventContainer [4];
   eventContainer[0] = fMCEvent->GetPrimaryVertex()->GetZ();
   eventContainer[2] = fCentralityF;
+  eventContainer[3] = fContributors;
+  fVz = eventContainer[0];
   //printf("z position is %f\n",eventContainer[0]);
   //if(fCFM->CheckEventCuts(AliHFEcuts::kEventStepGenerated, fMCEvent)) 
   fCFM->GetEventContainer()->Fill(eventContainer,AliHFEcuts::kEventStepGenerated);
   Int_t nElectrons = 0;
   if(IsESDanalysis()){
+   if(!((fIdentifiedAsPileUp) || (TMath::Abs(fVz) > fCuts->GetVertexRange()) || (TMath::Abs(fCentralityF+100.0) < 0.01))){ //kStepMCGeneratedZOutNoPileUpCentralityFine
     if (HasMCData() && IsQAOn(kMCqa)) {
       AliDebug(2, "Running MC QA");
 
@@ -611,6 +652,8 @@ void AliAnalysisTaskHFE::ProcessMC(){
              fMCQA->SetMCEvent(fMCEvent);
         fMCQA->SetGenEventHeader(fMCEvent->GenEventHeader());
         fMCQA->Init();
+       
+        fMCQA->GetMesonKine();
 
         // loop over all tracks for decayed electrons
         for (Int_t igen = 0; igen < fMCEvent->GetNumberOfTracks(); igen++){
@@ -639,9 +682,10 @@ void AliAnalysisTaskHFE::ProcessMC(){
       }
 
     } // end of MC QA loop
-    // -----------------------------------------------------------------
-    fCFM->SetMCEventInfo(fMCEvent);
-    // fCFM->CheckEventCuts(AliCFManager::kEvtRecCuts, fESD);
+   }
+   // -----------------------------------------------------------------
+   fCFM->SetMCEventInfo(fMCEvent);
+   // fCFM->CheckEventCuts(AliCFManager::kEvtRecCuts, fESD);
   } else {
     fCFM->SetMCEventInfo(fInputEvent);
   }
@@ -672,14 +716,21 @@ void AliAnalysisTaskHFE::ProcessESD(){
   }
 
   // Set magnetic field if V0 task on
-  if(fTaggedTrackAnalysis) fTaggedTrackAnalysis->SetMagneticField(fESD->GetMagneticField());
+  if(fTaggedTrackAnalysis) {
+    fTaggedTrackAnalysis->SetMagneticField(fESD->GetMagneticField());
+    fTaggedTrackAnalysis->SetCentrality(fCentralityF);
+  }
 
   // Do event Normalization
-  Double_t eventContainer[3];
+  Double_t eventContainer[4];
   eventContainer[0] = 0.0;
-  if(fESD->GetPrimaryVertexTracks()) eventContainer[0] = fESD->GetPrimaryVertexTracks()->GetZ();
+  if(HasMCData()) eventContainer[0] = fVz;
+  else {
+    if(fESD->GetPrimaryVertexTracks()) eventContainer[0] = fESD->GetPrimaryVertexTracks()->GetZ();
+  }
   eventContainer[1] = 0.;
   eventContainer[2] = fCentralityF;
+  eventContainer[3] = fContributors;
   if(fTriggerAnalysis->IsOfflineTriggerFired(fESD, AliTriggerAnalysis::kV0AND))
     eventContainer[1] = 1.;
 
@@ -691,6 +742,11 @@ void AliAnalysisTaskHFE::ProcessESD(){
   fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepRecNoPileUp);
 
   //
+  if(TMath::Abs(fCentralityF+100.0) < 0.01) return; 
+  fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepRecCentralityOk);
+  //printf("In ProcessESD %f\n",fCentralityF);
+
+  //
   if(fIdentifiedAsOutInz) return;
   fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepZRange);  
 
@@ -748,6 +804,7 @@ void AliAnalysisTaskHFE::ProcessESD(){
   for(Int_t itrack = 0; itrack < fESD->GetNumberOfTracks(); itrack++){
     AliDebug(4, "New ESD track");
     track = fESD->GetTrack(itrack);
+    track->SetESDEvent(fESD);
 
     // fill counts of v0-identified particles
     Int_t v0pid = -1;
@@ -778,7 +835,7 @@ void AliAnalysisTaskHFE::ProcessESD(){
       if(!(mctrack = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(TMath::Abs(track->GetLabel()))))) continue;
       mctrack4QA = mctrack->Particle();
 
-      if(fFillSignalOnly && !fCFM->CheckParticleCuts(AliHFEcuts::kStepMCGenerated, mctrack)) signal = kFALSE;
+      if(fFillSignalOnly && !fCFM->CheckParticleCuts(AliHFEcuts::kStepMCGenerated, mctrack)) signal = kFALSE; 
       else AliDebug(3, "Signal Electron");
     } 
     // Cache new Track information inside the var manager
@@ -866,19 +923,24 @@ void AliAnalysisTaskHFE::ProcessESD(){
     // Fill Containers
     if(signal) {
       // Apply weight for background contamination
-      if(fBackGroundFactorsFunction) {
-             Double_t weightBackGround = fBackGroundFactorsFunction->Eval(TMath::Abs(track->P()));
-             if(weightBackGround < 0.0) weightBackGround = 0.0;
-        else if(weightBackGround > 1.0) weightBackGround = 1.0;
+           if(fBackGroundFactorApply==kTRUE) {
+             if(IsPbPb()) fWeightBackGround =  fBackGroundFactorArray[(Int_t)fCentralityF]->Eval(TMath::Abs(track->P()));
+             else    fWeightBackGround =  fBackGroundFactorArray[0]->Eval(TMath::Abs(track->P())); // pp case
+
+             if(fWeightBackGround < 0.0) fWeightBackGround = 0.0;
+             else if(fWeightBackGround > 1.0) fWeightBackGround = 1.0;
         // weightBackGround as special weight
-        fVarManager->FillContainer(fContainer, "hadronicBackground", 1, kFALSE, weightBackGround);
+        fVarManager->FillContainer(fContainer, "hadronicBackground", 1, kFALSE, fWeightBackGround);
       }
       fVarManager->FillCorrelationMatrix(fContainer->GetCorrelationMatrix("correlationstepafterPID"));
     }
 
     if(GetPlugin(kSecVtx)) {
       AliDebug(2, "Running Secondary Vertex Analysis");
-      fSecVtx->Process(track);
+      if(fSecVtx->Process(track) && signal) {
+        fVarManager->FillContainer(fContainer, "recTrackContSecvtxReco", AliHFEcuts::kStepHFEcutsSecvtx, kFALSE);
+        fVarManager->FillContainer(fContainer, "recTrackContSecvtxMC", AliHFEcuts::kStepHFEcutsSecvtx, kTRUE);
+      }
     }
 
     if(HasMCData()){
@@ -939,6 +1001,7 @@ void AliAnalysisTaskHFE::ProcessESD(){
       }
       // Fill Containers for impact parameter analysis
       if(!fCFM->CheckParticleCuts(AliHFEcuts::kStepHFEcutsDca + AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kNcutStepsRecTrack,track)) continue;
+
       if(signal) {
         fVarManager->FillContainer(fContainer, "recTrackContDEReco", AliHFEcuts::kStepHFEcutsDca, kFALSE);
         fVarManager->FillContainer(fContainer, "recTrackContDEMC", AliHFEcuts::kStepHFEcutsDca, kTRUE);
@@ -946,7 +1009,6 @@ void AliAnalysisTaskHFE::ProcessESD(){
       }
       if(HasMCData()){
         if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode()) != 11)){
-          fVarManager->FillContainer(fContainer, "hadronicBackground", 2, kFALSE);
           fQACollection->Fill("hadronsAfterIPcut",track->Pt());
           fQACollection->Fill("hadronsAfterIPcutMC",mctrack->Pt());
         }
@@ -964,10 +1026,14 @@ void AliAnalysisTaskHFE::ProcessAOD(){
   // Function is still in development
   //
   AliDebug(3, "Processing AOD Event");
-  Double_t eventContainer[3];
-  eventContainer[0] = fInputEvent->GetPrimaryVertex()->GetZ();
+  Double_t eventContainer[4];
+  if(HasMCData()) eventContainer[0] = fVz;
+  else {
+    eventContainer[0] = fInputEvent->GetPrimaryVertex()->GetZ();
+  }
   eventContainer[1] = 1.; // No Information available in AOD analysis, assume all events have V0AND
   eventContainer[2] = fCentralityF; 
+  eventContainer[3] = fContributors; 
   
   AliAODEvent *fAOD = dynamic_cast<AliAODEvent *>(fInputEvent);
   if(!fAOD){
@@ -1022,11 +1088,19 @@ void AliAnalysisTaskHFE::ProcessAOD(){
     if(!fPID->IsSelected(&hfetrack, fContainer, "recTrackCont", fPIDqa)) continue;    // we will do PID here as soon as possible
     // Apply weight for background contamination
     Double_t weightBackGround = 1.0;
-    if(fBackGroundFactorsFunction) {
-      weightBackGround = fBackGroundFactorsFunction->Eval(TMath::Abs(track->P()));
+
+    // not correct treatment for pp
+    if(fBackGroundFactorApply==kTRUE) {
+           if(IsPbPb()) weightBackGround =  fBackGroundFactorArray[(Int_t)fCentralityF]->Eval(TMath::Abs(track->P()));
+      else weightBackGround =  fBackGroundFactorArray[0]->Eval(TMath::Abs(track->P()));
+
       if(weightBackGround < 0.0) weightBackGround = 0.0;
+           else if(weightBackGround > 1.0) weightBackGround = 1.0;
+           fVarManager->FillContainer(fContainer, "hadronicBackground", 1, kFALSE, weightBackGround);
     }
-    fVarManager->FillContainer(fContainer, "hadronicBackground", 1, kFALSE);
+
+
+
     nElectronCandidates++;    
     if(HasMCData()){
       dataE[0] = track->Pt();
@@ -1035,7 +1109,8 @@ void AliAnalysisTaskHFE::ProcessAOD(){
       dataE[3] = track->Charge();
       dataE[4] = -1;
       dataE[5] = -1;
-     // Track selected: distinguish between true and fake
+      // Track selected: distinguish between true and fake
+      // COVERITY: missing test if mctrack != 0
       AliDebug(1, Form("Candidate Selected, filling THnSparse, PID: %d\n", mctrack->GetPdgCode()));
       if((pid = TMath::Abs(mctrack->GetPdgCode())) == 11){
       
@@ -1076,7 +1151,7 @@ Bool_t AliAnalysisTaskHFE::ProcessMCtrack(AliVParticle *track){
   // Additionally Fill a THnSparse for Signal To Background Studies
   // Works for AOD and MC analysis Type
   //
-  fVarManager->NewTrack(track, NULL, -1, kTRUE);
+  fVarManager->NewTrack(track, NULL, fCentralityF, -1, kTRUE);
   Double_t signalContainer[6];
 
   signalContainer[0] = track->Pt();
@@ -1125,8 +1200,9 @@ Bool_t AliAnalysisTaskHFE::ProcessMCtrack(AliVParticle *track){
   fQACollection->Fill("alpha_sim", track->Phi() - TMath::Pi());
 
   // Step GeneratedZOutNoPileUp
-  if((fIdentifiedAsPileUp) || (fIdentifiedAsOutInz)) return kFALSE;
-  fVarManager->FillContainer(fContainer, "MCTrackCont", AliHFEcuts::kStepMCGeneratedZOutNoPileUp, kFALSE);
+  if((fIdentifiedAsPileUp) || (TMath::Abs(fVz) > fCuts->GetVertexRange()) || (TMath::Abs(fCentralityF+100.0) < 0.01)) return kFALSE;
+  fVarManager->FillContainer(fContainer, "MCTrackCont", AliHFEcuts::kStepMCGeneratedZOutNoPileUpCentralityFine, kFALSE);
+  //printf("In ProcessMCtrack %f\n",fCentralityF);
 
   // Step Generated Event Cut
   if(!fPassTheEventCut) return kFALSE;
@@ -1188,24 +1264,54 @@ void AliAnalysisTaskHFE::MakeEventContainer(){
   // Create the event container for the correction framework and link it
   // 1st bin: Vertex z-position
   // 2nd bin: V0AND decision (normalization to sigma_inel)
-  // 3rd bin: Centrality class (for pp defined as 99.)
+  // 3rd bin: Centrality class (for pp defined as number of contributors in vertex.)
   //
-  const Int_t kNvar = 3;  // number of variables on the grid: 
-  Int_t nBins[kNvar] = {120, 2, 11};
-  Double_t binMin[kNvar] = {-30. , 0., 0.0};
-  Double_t binMax[kNvar] = {30., 2., 11.0};
-
-  AliCFContainer *evCont = new AliCFContainer("eventContainer", "Container for events", AliHFEcuts::kNcutStepsEvent, kNvar, nBins);
-
-  Double_t *vertexBins = AliHFEtools::MakeLinearBinning(nBins[0], binMin[0], binMax[0]);
-  Double_t *v0andBins = AliHFEtools::MakeLinearBinning(nBins[1], binMin[1], binMax[1]);
-  Double_t *centralityBins = AliHFEtools::MakeLinearBinning(nBins[2], binMin[2], binMax[2]);
-  evCont->SetBinLimits(0, vertexBins);
-  evCont->SetBinLimits(1, v0andBins);
-  evCont->SetBinLimits(2, centralityBins);
-  delete[] vertexBins; delete[] v0andBins; delete[] centralityBins;
-
-  fCFM->SetEventContainer(evCont);
+  
+  if(IsPbPb()) {
+
+    //printf("This is PbPb!!!!!!!!!!!\n");
+
+    const Int_t kNvar = 4;  // number of variables on the grid: 
+    Int_t nBins[kNvar] = {120, 2, 11, 2};
+    Double_t binMin[kNvar] = {-30. , 0., 0.0, 0.};
+    Double_t binMax[kNvar] = {30., 2., 11.0, 2.};
+    
+    AliCFContainer *evCont = new AliCFContainer("eventContainer", "Container for events", AliHFEcuts::kNcutStepsEvent, kNvar, nBins);
+    
+    Double_t *vertexBins = AliHFEtools::MakeLinearBinning(nBins[0], binMin[0], binMax[0]);
+    Double_t *v0andBins = AliHFEtools::MakeLinearBinning(nBins[1], binMin[1], binMax[1]);
+    Double_t *centralityBins = AliHFEtools::MakeLinearBinning(nBins[2], binMin[2], binMax[2]);
+    Double_t *contributorsBins = AliHFEtools::MakeLinearBinning(nBins[3], binMin[3], binMax[3]);
+    evCont->SetBinLimits(0, vertexBins);
+    evCont->SetBinLimits(1, v0andBins);
+    evCont->SetBinLimits(2, centralityBins);
+    evCont->SetBinLimits(3, contributorsBins);
+    delete[] vertexBins; delete[] v0andBins; delete[] centralityBins; delete[] contributorsBins;
+    
+    fCFM->SetEventContainer(evCont);
+  }
+  else {
+
+    //printf("This is pp!!!!!!!!!!!\n");
+
+    const Int_t kNvar = 3;  // number of variables on the grid: 
+    Int_t nBins[kNvar] = {120, 2, 11};
+    Double_t binMin[kNvar] = {-30. , 0., 0.0};
+    Double_t binMax[kNvar] = {30., 2., 11.0};
+    
+    AliCFContainer *evCont = new AliCFContainer("eventContainer", "Container for events", AliHFEcuts::kNcutStepsEvent, kNvar, nBins);
+    
+    Double_t *vertexBins = AliHFEtools::MakeLinearBinning(nBins[0], binMin[0], binMax[0]);
+    Double_t *v0andBins = AliHFEtools::MakeLinearBinning(nBins[1], binMin[1], binMax[1]);
+    Double_t *centralityBins = AliHFEtools::MakeLinearBinning(nBins[2], binMin[2], binMax[2]);
+    evCont->SetBinLimits(0, vertexBins);
+    evCont->SetBinLimits(1, v0andBins);
+    evCont->SetBinLimits(2, centralityBins);
+    delete[] vertexBins; delete[] v0andBins; delete[] centralityBins;
+    
+    fCFM->SetEventContainer(evCont);
+  }
+  
 }
 
 //____________________________________________________________
@@ -1223,9 +1329,11 @@ void AliAnalysisTaskHFE::MakeParticleContainer(){
   fContainer->CreateContainer("recTrackContReco", "Track Container filled with MC information", AliHFEcuts::kNcutStepsRecTrack + fPID->GetNumberOfPIDdetectors());
   fContainer->CreateContainer("recTrackContMC", "Track Container filled with MC information", AliHFEcuts::kNcutStepsRecTrack + fPID->GetNumberOfPIDdetectors());
   
-  fContainer->CreateContainer("hadronicBackground", "Container for Hadronic Background", 3);
+  fContainer->CreateContainer("hadronicBackground", "Container for Hadronic Background", 2);
   fContainer->CreateContainer("recTrackContDEReco", "Container for displaced electron analysis with Reco information", 1);
   fContainer->CreateContainer("recTrackContDEMC", "Container for displaced electron analysis with MC information", 1);
+  fContainer->CreateContainer("recTrackContSecvtxReco", "Container for secondary vertexing analysis with Reco information", 1);
+  fContainer->CreateContainer("recTrackContSecvtxMC", "Container for secondary vertexing analysis with MC information", 1);
   fContainer->CreateCorrelationMatrix("correlationstepafterPID","THnSparse with correlations");
   fContainer->CreateCorrelationMatrix("correlationstepafterDE","THnSparse with correlations");
   if(!fVarManager->IsVariableDefined("centrality")) {
@@ -1274,6 +1382,9 @@ void AliAnalysisTaskHFE::InitPIDperformanceQA(){
 
 //____________________________________________________________
 void AliAnalysisTaskHFE::InitContaminationQA(){
+  // 
+  // Add QA for Impact Parameter cut
+  //
   const Double_t kPtbound[2] = {0.1, 20.};
   Int_t iBin[1];
   iBin[0] = 44; // bins in pt
@@ -1381,7 +1492,7 @@ Bool_t AliAnalysisTaskHFE::ProcessCutStep(Int_t cutStep, AliVParticle *track){
   return kTRUE;
 }
 //___________________________________________________
-void AliAnalysisTaskHFE::ReadCentrality() {
+Bool_t AliAnalysisTaskHFE::ReadCentrality() {
   //
   // Recover the centrality of the event from ESD or AOD
   //
@@ -1390,12 +1501,64 @@ void AliAnalysisTaskHFE::ReadCentrality() {
    AliAODEvent *fAOD = dynamic_cast<AliAODEvent *>(fInputEvent);
    if(!fAOD){
      AliError("AOD Event required for AOD Analysis")
-       return;
+       return kFALSE;
    }
-   // Centrality
-   //AliAODCentrality *aodCentrality = fAOD->GetCentrality();
-   //Double_t fCentralityF = aodCentrality->GetCentralityPercentile("V0M");
-   fCentralityF = 99.0; // Fake for the moment
+
+   if(IsPbPb()) {
+     // Centrality
+     AliCentrality *aodCentrality = fAOD->GetCentrality();
+     Float_t fCentralityFtemp = aodCentrality->GetCentralityPercentile("V0M");
+     
+     if( fCentralityFtemp >=  0. && fCentralityFtemp <  10.) fCentralityF =  0;
+     else if ( fCentralityFtemp >=  10. && fCentralityFtemp <  20.) fCentralityF =  1;
+     else if ( fCentralityFtemp >= 20. && fCentralityFtemp <  30.) fCentralityF = 2;
+     else if ( fCentralityFtemp >= 30. && fCentralityFtemp <  40.) fCentralityF = 3;
+     else if ( fCentralityFtemp >= 40. && fCentralityFtemp <  50.) fCentralityF = 4;
+     else if ( fCentralityFtemp >= 50. && fCentralityFtemp <  60.) fCentralityF = 5;
+     else if ( fCentralityFtemp >= 60. && fCentralityFtemp <  90.) fCentralityF = 6;
+     else if ( fCentralityFtemp >= 90. && fCentralityFtemp <=  100.) fCentralityF = 7;
+     //else if ( fCentralityF_temp >= 90. && fCentralityF_temp <  95.) fCentralityF = 8;
+     //else if ( fCentralityF_temp >= 95. && fCentralityF_temp <  90.) fCentralityF = 9;
+     //else if ( fCentralityF_temp >= 90. && fCentralityF_temp <=100.) fCentralityF = 10;
+     else return kFALSE;
+     // contributors
+     fContributors = 0.5;
+     Int_t contributorstemp = 0;
+     const AliAODVertex *vtxAOD = fAOD->GetPrimaryVertex();
+     if(vtxAOD) contributorstemp = vtxAOD->GetNContributors();
+     
+     //printf("PbPb contributors_temp %d\n",contributors_temp);
+     
+     if( contributorstemp <=  0) fContributors =  0.5;
+     else fContributors = 1.5;   
+   
+
+
+   }
+   else {
+     fCentralityF = 0;
+     Int_t centralityFtemp = 0;
+     const AliAODVertex *vtxAOD = fAOD->GetPrimaryVertex();
+     if(vtxAOD) centralityFtemp = vtxAOD->GetNContributors();
+     
+     //printf("pp centralityF_temp %d\n",centralityF_temp);
+     
+     if( centralityFtemp <=  0) fCentralityF =  0;
+     else if ( centralityFtemp >  0 && centralityFtemp <  2) fCentralityF = 1;
+     else if ( centralityFtemp >=  2 && centralityFtemp <  3) fCentralityF = 2;
+     else if ( centralityFtemp >= 3 && centralityFtemp <  4) fCentralityF = 3;
+     else if ( centralityFtemp >= 4 && centralityFtemp <  5) fCentralityF = 4;
+     else if ( centralityFtemp >= 5 && centralityFtemp <  10) fCentralityF = 5;
+     else if ( centralityFtemp >= 10 && centralityFtemp <  20) fCentralityF = 6;
+     else if ( centralityFtemp >= 20 && centralityFtemp <  30) fCentralityF = 7;
+     else if ( centralityFtemp >= 30 && centralityFtemp <  40) fCentralityF = 8;
+     else if ( centralityFtemp >= 40 && centralityFtemp <  50) fCentralityF = 9;
+     else if ( centralityFtemp >= 50) fCentralityF = 10;
+     
+   }
+
+   return kTRUE;
 
    
  } else {
@@ -1404,7 +1567,7 @@ void AliAnalysisTaskHFE::ReadCentrality() {
    AliESDEvent *fESD = dynamic_cast<AliESDEvent *>(fInputEvent);
    if(!fESD){
      AliError("ESD Event required for ESD Analysis")
-       return;
+       return kFALSE;
    }
    const char* type = fESD->GetBeamType();
 
@@ -1412,50 +1575,73 @@ void AliAnalysisTaskHFE::ReadCentrality() {
    
    // Centrality
    AliCentrality *esdCentrality = fESD->GetCentrality();
-   Float_t fCentralityF_temp = esdCentrality->GetCentralityPercentile("V0M");
-
-   if( fCentralityF_temp >=  0. && fCentralityF_temp <   5.) fCentralityF =  0;
-   else if ( fCentralityF_temp >=  5. && fCentralityF_temp <  10.) fCentralityF =  1;
-   else if ( fCentralityF_temp >= 10. && fCentralityF_temp <  20.) fCentralityF = 2;
-   else if ( fCentralityF_temp >= 20. && fCentralityF_temp <  30.) fCentralityF = 3;
-   else if ( fCentralityF_temp >= 30. && fCentralityF_temp <  40.) fCentralityF = 4;
-   else if ( fCentralityF_temp >= 40. && fCentralityF_temp <  50.) fCentralityF = 5;
-   else if ( fCentralityF_temp >= 50. && fCentralityF_temp <  60.) fCentralityF = 6;
-   else if ( fCentralityF_temp >= 60. && fCentralityF_temp <  70.) fCentralityF = 7;
-   else if ( fCentralityF_temp >= 70. && fCentralityF_temp <  80.) fCentralityF = 8;
-   else if ( fCentralityF_temp >= 80. && fCentralityF_temp <  90.) fCentralityF = 9;
-   else if ( fCentralityF_temp >= 90. && fCentralityF_temp <=100.) fCentralityF = 10;
+   Float_t fCentralityFtemp = esdCentrality->GetCentralityPercentile("V0M");
+   //printf("PbPb fCentralityF_temp %f\n",fCentralityF_temp);
+
+   if( fCentralityFtemp >=  0. && fCentralityFtemp <   10.) fCentralityF =  0;
+   else if ( fCentralityFtemp >= 10. && fCentralityFtemp <  20.) fCentralityF =  1;
+   else if ( fCentralityFtemp >= 20. && fCentralityFtemp <  30.) fCentralityF = 2;
+   else if ( fCentralityFtemp >= 30. && fCentralityFtemp <  40.) fCentralityF = 3;
+   else if ( fCentralityFtemp >= 40. && fCentralityFtemp <  50.) fCentralityF = 4;
+   else if ( fCentralityFtemp >= 50. && fCentralityFtemp <  60.) fCentralityF = 5;
+   else if ( fCentralityFtemp >= 60. && fCentralityFtemp <  90.) fCentralityF = 6;
+   else if ( fCentralityFtemp >= 90. && fCentralityFtemp <=  100.) fCentralityF = 7;
+   //else if ( fCentralityF_temp >= 70. && fCentralityF_temp <  80.) fCentralityF = 8;
+   //else if ( fCentralityF_temp >= 80. && fCentralityF_temp <  90.) fCentralityF = 9;
+   //else if ( fCentralityF_temp >= 90. && fCentralityF_temp <=100.) fCentralityF = 10;
+   else return kFALSE;
+
+   //   Float_t fCentralityF_temp10 = esdCentrality->GetCentralityClass10("V0M");
+   //   printf("PbPb fCentralityF_temp %f %f %f \n",fCentralityF_temp, fCentralityF_temp10, fCentralityF);
+
+   // contributors
+   fContributors = 0.5;
+   Int_t contributorstemp = 0;
+   const AliESDVertex *vtxESD = fESD->GetPrimaryVertexTracks();
+   if(vtxESD && vtxESD->GetStatus()) contributorstemp = vtxESD->GetNContributors();
+   
+   //printf("PbPb contributors_temp %d\n",contributors_temp);
+   
+   if( contributorstemp <=  0) fContributors =  0.5;
+   else fContributors = 1.5;   
+   
+   return kTRUE;
 
    }
 
    
    if (strstr(type,"p-p")) {
      fCentralityF = 0;
-     Int_t centralityF_temp = 0;
+     Int_t centralityFtemp = 0;
      const AliESDVertex *vtxESD = fESD->GetPrimaryVertexTracks();
-     if(vtxESD && vtxESD->GetStatus()) centralityF_temp = vtxESD->GetNContributors();
+     if(vtxESD && vtxESD->GetStatus()) centralityFtemp = vtxESD->GetNContributors();
      
-     //printf("centralityF_temp %d\n",centralityF_temp);
+     //printf("pp centralityF_temp %d\n",centralityF_temp);
      
-     if( centralityF_temp <=  0) fCentralityF =  0;
-     else if ( centralityF_temp >  0 && centralityF_temp <  2) fCentralityF = 1;
-     else if ( centralityF_temp >=  2 && centralityF_temp <  3) fCentralityF = 2;
-     else if ( centralityF_temp >= 3 && centralityF_temp <  4) fCentralityF = 3;
-     else if ( centralityF_temp >= 4 && centralityF_temp <  5) fCentralityF = 4;
-     else if ( centralityF_temp >= 5 && centralityF_temp <  10) fCentralityF = 5;
-     else if ( centralityF_temp >= 10 && centralityF_temp <  20) fCentralityF = 6;
-     else if ( centralityF_temp >= 20 && centralityF_temp <  30) fCentralityF = 7;
-     else if ( centralityF_temp >= 30 && centralityF_temp <  40) fCentralityF = 8;
-     else if ( centralityF_temp >= 40 && centralityF_temp <  50) fCentralityF = 9;
-     else if ( centralityF_temp >= 50) fCentralityF = 10;
+     if( centralityFtemp <=  0) fCentralityF =  0;
+     else if ( centralityFtemp >  0 && centralityFtemp <  2) fCentralityF = 1;
+     else if ( centralityFtemp >=  2 && centralityFtemp <  3) fCentralityF = 2;
+     else if ( centralityFtemp >= 3 && centralityFtemp <  4) fCentralityF = 3;
+     else if ( centralityFtemp >= 4 && centralityFtemp <  5) fCentralityF = 4;
+     else if ( centralityFtemp >= 5 && centralityFtemp <  10) fCentralityF = 5;
+     else if ( centralityFtemp >= 10 && centralityFtemp <  20) fCentralityF = 6;
+     else if ( centralityFtemp >= 20 && centralityFtemp <  30) fCentralityF = 7;
+     else if ( centralityFtemp >= 30 && centralityFtemp <  40) fCentralityF = 8;
+     else if ( centralityFtemp >= 40 && centralityFtemp <  50) fCentralityF = 9;
+     else if ( centralityFtemp >= 50) fCentralityF = 10;
+    
+     return kTRUE; 
      
-
    }
 
-  //printf("centrality %f\n",fCentralityF);
+   return kFALSE;
 
+  //printf("centrality %f\n",fCentralityF);
+   
  }
 
+ //printf("centrality %f\n",fCentralityF);
+
 }
 //___________________________________________________
 void AliAnalysisTaskHFE::RejectionPileUpVertexRangeEventCut() {
@@ -1492,7 +1678,7 @@ void AliAnalysisTaskHFE::RejectionPileUpVertexRangeEventCut() {
    // Z vertex
    fIdentifiedAsOutInz = kFALSE;
    if(fESD->GetPrimaryVertexTracks()){
-     if(TMath::Abs(fESD->GetPrimaryVertexTracks()->GetZ()) > fCuts->GetVertexRange()) fIdentifiedAsOutInz = kTRUE;
+       if(TMath::Abs(fESD->GetPrimaryVertexTracks()->GetZ()) > fCuts->GetVertexRange()) fIdentifiedAsOutInz = kTRUE;
    }
    //Event Cut
    fPassTheEventCut = kTRUE;
index 8d305e6..07d57cc 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIANALYSISTASKHFE_H
-#define ALIANALYSISTASKHFE_H
-
 /**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */ 
-
 //
 // Task for Heavy Flavour Electron Analysis
 // Fills a single-inclusive electron pt-spectrum
 // For further information see implementation file
 //
+#ifndef ALIANALYSISTASKHFE_H
+#define ALIANALYSISTASKHFE_H
+
 #ifndef ALIANALYSISTASKSE_H
 #include "AliAnalysisTaskSE.h"
 #endif
 
+#ifndef ROOT_TString
+#include <TString.h>
+#endif
+
 class AliHFEcontainer;
 class AliHFEcollection;
 class AliHFEcuts;
@@ -83,6 +84,7 @@ class AliAnalysisTaskHFE : public AliAnalysisTaskSE{
     Bool_t IsAODanalysis() const { return TestBit(kAODanalysis); };
     Bool_t IsESDanalysis() const { return !TestBit(kAODanalysis); };
     Bool_t HasMCData() const { return TestBit(kHasMCdata); }
+    Bool_t IsPbPb() const { return TestBit(kBeamType); }
     Bool_t GetPlugin(Int_t plug) const { return TESTBIT(fPlugins, plug); };
 
     // Get Components for configuration
@@ -104,15 +106,20 @@ class AliAnalysisTaskHFE : public AliAnalysisTaskSE{
     void SetPIDPreselect(AliHFEpid * const cuts) { fPIDpreselect = cuts; };
     void SetAODAnalysis() { SetBit(kAODanalysis, kTRUE); };
     void SetESDAnalysis() { SetBit(kAODanalysis, kFALSE); };
-    void SetBackGroundFactorsFunction(TF1 * const backGroundFactorsFunction) { fBackGroundFactorsFunction = backGroundFactorsFunction; };
+    void SetPbPbAnalysis(Bool_t isPbPb = kFALSE) { SetBit(kBeamType, isPbPb); };
+    void SetBackGroundFactorsFunction(TF1 * const backGroundFactorsFunction, Int_t centralitybin=0)
+    {  fBackGroundFactorArray[centralitybin]=backGroundFactorsFunction;
+       fBackGroundFactorApply=kTRUE;};
     void PrintStatus() const;
-    void ReadCentrality();
+    Bool_t ReadCentrality();
     void RejectionPileUpVertexRangeEventCut();  
+    void SelectSpecialTrigger(const Char_t *trgclust){ fHasSpecialTriggerSelection = kTRUE; fSpecialTrigger = trgclust; }
  
   private:
     enum{
       kHasMCdata = BIT(19),
-      kAODanalysis = BIT(20)
+      kAODanalysis = BIT(20),
+      kBeamType = BIT(21)
     };
 
     Bool_t FillProductionVertex(const AliVParticle * const track) const;
@@ -129,12 +136,18 @@ class AliAnalysisTaskHFE : public AliAnalysisTaskSE{
     ULong_t fQAlevel;                     // QA level
     UShort_t fPlugins;                    // Enabled Plugins
     Bool_t fFillSignalOnly;               // Fill container only with MC Signal Tracks
+    Bool_t fBackGroundFactorApply;        // Apply Background Function Subtraction
     Bool_t fRemovePileUp;                 // Remove Pile Up
     Bool_t fIdentifiedAsPileUp;           // Identified as pile-up
     Bool_t fIdentifiedAsOutInz;           // Out Of Range in z
     Bool_t fPassTheEventCut;              // Pass The Event Cut
+    Bool_t fHasSpecialTriggerSelection;   // Select special triggered events
+    TString fSpecialTrigger;              // Special trigger selection
     Float_t fCentralityF;                 // Centrality
-    TF1  *fBackGroundFactorsFunction;     // BackGround factors
+    Float_t fContributors;                // Contributors
+    Double_t fWeightBackGround;            // weight background function
+    Double_t fVz;                         // z position of the primary vertex
+    TF1  *fBackGroundFactorArray[12];     // Array of BackGround factors for each centrality bin, bin0 = min bias
     AliHFEcontainer *fContainer;          //! The HFE container
     AliHFEvarManager *fVarManager;        // The var manager as the backbone of the analysis
     AliHFEsignalCuts *fSignalCuts;        //! MC true signal (electron coming from certain source) 
index 1802293..e5573ff 100644 (file)
@@ -12,9 +12,6 @@
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */
-
 //
 // Task for PID QA
 // Using AliHFEpidQA and AliHFEMCpidQA
index 42aa892..2b08443 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIANALYSISTASKHFEPIDQA_H
-#define ALIANALYSISTASKHFEPIDQA_H
-
 /**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */ 
-
 //
 // Task for PID QA
 // Using AliHFEpidQA and AliHFEMCpidQA
 // More information can be found in the source file
 //
+#ifndef ALIANALYSISTASKHFEPIDQA_H
+#define ALIANALYSISTASKHFEPIDQA_H
+
 #ifndef ALIANALYSISTASKSE_H
 #include "AliAnalysisTaskSE.h"
 #endif
index 77cb7cb..ff6dfec 100644 (file)
@@ -12,9 +12,6 @@
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */
-
 //  * 20/04/2010 *
 // Class for optimising and applying V0 cuts to obtain clean V0 samples
 // Compatible with ESDs only
@@ -139,7 +136,7 @@ void AliHFEV0cuts::Init(const char* name){
   fQA->CreateTH1Fvector1(2, "h_cut_Gamma_VtxR", "Radius of the gamma conversion vertex; r (cm); counts", 1000, 0, 100);
   fQA->CreateTH1Fvector1(2, "h_cut_Gamma_PP", "gamma psi pair angle; psi pairangle (rad); counts", 100, 0, 2);
   fQA->CreateTH1Fvector1(2, "h_cut_Gamma_Chi2", "gamma Chi2/NDF; Chi2/NDF; counts", 100, 0, 50);
-  fQA->CreateTH1Fvector1(2, "h_cut_Gamma_Sep", "gamma separation dist at TPC inned wall", 100, 0, 50);
+  fQA->CreateTH1Fvector1(2, "h_cut_Gamma_Sep", "gamma separation dist at TPC inned wall", 100, 0, 10);
   fQA->CreateTH1Fvector1(7, "h_Gamma_Mass", "Invariant mass of gammas; mass (GeV/c^{2}); counts", 100, 0, 0.2);
   
  
@@ -226,8 +223,10 @@ void AliHFEV0cuts::Init(const char* name){
   fQAmc->CreateTH2Fvector1(2, "h_cut_Gamma_DCA_S", "S - DCA between the gamma daughters; mom (GeV/c); dca (cm)", pN, pMin, pMax, 50, 0, 2, 0);
   fQAmc->CreateTH2Fvector1(2, "h_cut_Gamma_VtxR_S", "S - Radius of the gamma conversion vertex; mom (GeV/c); r (cm)", pN, pMin, pMax, 100, 0, 100, 0);
   fQAmc->CreateTH2Fvector1(2, "h_cut_Gamma_PP_S", "S - gamma psi pair angle; mom (GeV/c); psi pairangle (rad)", pN, pMin, pMax, 50, 0, 0.5, 0);
-  fQAmc->CreateTH2Fvector1(2, "h_cut_Gamma_Chi2_S", "S - gamma Chi2/NDF; mom (GeV/c); Chi2/NDF", pN, pMin, pMax, 50, 0, 100, 0);
-  fQAmc->CreateTH2Fvector1(2, "h_cut_Gamma_Sep_S", "S - gamma separation TPC-inner; mom (GeV/c); tracks separatin (cm)", pN, pMin, pMax, 100, 0, 50, 0);
+  fQAmc->CreateTH2Fvector1(2, "h_cut_Gamma_Chi2_S", "S - gamma Chi2/NDF; mom (GeV/c); Chi2/NDF", pN, pMin, pMax, 50, 0, 25, 0);
+  fQAmc->CreateTH2Fvector1(2, "h_cut_Gamma_Sep_S", "S - gamma separation TPC-inner; mom (GeV/c); tracks separatin (cm)", pN, pMin, pMax, 100, 0, 10, 0);
+  // as a function of radius, not momentum
+  fQAmc->CreateTH2Fvector1(2, "h_cut_Gamma_SepR_S", "S - gamma separation TPC-inner; radius cm; tracks separatin (cm)", 20, 0, 100, 100, 0, 20);
 
   fQAmc->CreateTH1Fvector1(9, "h_Gamma_Mass_S", "S - Invariant mass of gammas; mass (GeV/c^{2}); counts", 100, 0, 0.2);
   // gamma background
@@ -235,23 +234,24 @@ void AliHFEV0cuts::Init(const char* name){
   fQAmc->CreateTH2Fvector1(2, "h_cut_Gamma_DCA_B", "B - DCA between the gamma daughters; mom (GeV/c); dca (cm)", pN, pMin, pMax, 50, 0, 2, 0);
   fQAmc->CreateTH2Fvector1(2, "h_cut_Gamma_VtxR_B", "B - Radius of the gamma conversion vertex; mom (GeV/c); r (cm)", pN, pMin, pMax, 100, 0, 100, 0);
   fQAmc->CreateTH2Fvector1(2, "h_cut_Gamma_PP_B", "B - gamma psi pair angle; mom (GeV/c); psi pairangle (rad)", pN, pMin, pMax, 50, 0, 0.5, 0);
-  fQAmc->CreateTH2Fvector1(2, "h_cut_Gamma_Chi2_B", "B - gamma Chi2/NDF; mom (GeV/c); Chi2/NDF", pN, pMin, pMax, 50, 0, 100, 0);
+  fQAmc->CreateTH2Fvector1(2, "h_cut_Gamma_Chi2_B", "B - gamma Chi2/NDF; mom (GeV/c); Chi2/NDF", pN, pMin, pMax, 50, 0, 25, 0);
   fQAmc->CreateTH2Fvector1(2, "h_cut_Gamma_Sep_B", "B - gamma separation TPC-inner; mom (GeV/c); tracks separatin (cm)", pN, pMin, pMax, 100, 0, 50, 0);
-
+  //
+  fQAmc->CreateTH2Fvector1(2, "h_cut_Gamma_SepR_B", "S - gamma separation TPC-inner; radius cm; tracks separatin (cm)", 20, 0, 100, 100, 0, 20);
   fQAmc->CreateTH1Fvector1(9, "h_Gamma_Mass_B", "B - Invariant mass of gammas; mass (GeV/c^{2}); counts", 100, 0, 0.2);  
  
   // kaons signal
   fQAmc->CreateTH2Fvector1(2, "h_cut_K0_CosPoint_S", "S - K0 Cosine pointing angle; mom (GeV/c); cos point. angle", pN, pMin, pMax, 50, 0, 0.1, 0);
   fQAmc->CreateTH2Fvector1(2, "h_cut_K0_DCA_S", "S - DCA between the K0 daughters; mom (GeV/c); dca (cm)", pN, pMin, pMax, 50, 0, 2, 0);
   fQAmc->CreateTH2Fvector1(2, "h_cut_K0_VtxR_S", "S - Radius of the K0 decay vertex; mom (GeV/c); r (cm)", pN, pMin, pMax, 50, 0, 100, 0);
-  fQAmc->CreateTH2Fvector1(2, "h_cut_K0_Chi2_S", "S - K0 Chi2/NDF; mom (GeV/c); Chi2/NDF", pN, pMin, pMax, 50, 0, 100, 0);
+  fQAmc->CreateTH2Fvector1(2, "h_cut_K0_Chi2_S", "S - K0 Chi2/NDF; mom (GeV/c); Chi2/NDF", pN, pMin, pMax, 50, 0, 25, 0);
 
   fQAmc->CreateTH1Fvector1(5, "h_K0_Mass_S", "S - Invariant mass of K0; mass (GeV/c^{2}); counts", 125, 0.45, 0.55);
   // kaons background
   fQAmc->CreateTH2Fvector1(2, "h_cut_K0_CosPoint_B", "B - K0 Cosine pointing angle; mom (GeV/c); cos point. angle", pN, pMin, pMax, 50, 0, 0.1, 0);
   fQAmc->CreateTH2Fvector1(2, "h_cut_K0_DCA_B", "B - DCA between the K0 daughters; mom (GeV/c); dca (cm)", pN, pMin, pMax, 50, 0, 2, 0);
   fQAmc->CreateTH2Fvector1(2, "h_cut_K0_VtxR_B", "B - Radius of the K0 decay vertex; mom (GeV/c); r (cm)", pN, pMin, pMax, 50, 0, 100, 0);
-  fQAmc->CreateTH2Fvector1(2, "h_cut_K0_Chi2_B", "B - K0 Chi2/NDF; mom (GeV/c); Chi2/NDF", pN, pMin, pMax, 50, 0, 100, 0);
+  fQAmc->CreateTH2Fvector1(2, "h_cut_K0_Chi2_B", "B - K0 Chi2/NDF; mom (GeV/c); Chi2/NDF", pN, pMin, pMax, 50, 0, 50, 0);
 
   fQAmc->CreateTH1Fvector1(5, "h_K0_Mass_B", "B - Invariant mass of K0; mass (GeV/c^{2}); counts", 125, 0.45, 0.55);
 
@@ -259,7 +259,7 @@ void AliHFEV0cuts::Init(const char* name){
   fQAmc->CreateTH2Fvector1(2, "h_cut_L_CosPoint_S", "S - L Cosine pointing angle; mom (GeV/c); cos point. angle", pN, pMin, pMax, 50, 0, 0.1, 0);
   fQAmc->CreateTH2Fvector1(2, "h_cut_L_DCA_S", "S - DCA between the L daughters; mom (GeV/c); dca (cm)", pN, pMin, pMax, 50, 0, 2, 0);
   fQAmc->CreateTH2Fvector1(2, "h_cut_L_VtxR_S", "S - Radius of the L decay vertex; mom (GeV/c); r (cm)", pN, pMin, pMax, 50, 0, 100, 0);
-  fQAmc->CreateTH2Fvector1(2, "h_cut_L_Chi2_S", "S - L Chi2/NDF; mom (GeV/c); Chi2/NDF", pN, pMin, pMax, 50, 0, 100, 0);
+  fQAmc->CreateTH2Fvector1(2, "h_cut_L_Chi2_S", "S - L Chi2/NDF; mom (GeV/c); Chi2/NDF", pN, pMin, pMax, 50, 0, 50, 0);
 
   fQAmc->CreateTH1Fvector1(5, "h_L_Mass_S", "S - Invariant mass of L; mass (GeV/c^{2}); counts", 60, 1.1, 1.13);
   fQAmc->CreateTH1Fvector1(5, "h_AL_Mass_S", "S - Invariant mass of anti L; mass (GeV/c^{2}); counts", 60, 1.1, 1.13);
@@ -267,7 +267,7 @@ void AliHFEV0cuts::Init(const char* name){
   fQAmc->CreateTH2Fvector1(2, "h_cut_L_CosPoint_B", "B - L Cosine pointing angle; mom (GeV/c); cos point. angle", pN, pMin, pMax, 50, 0, 0.1, 0);
   fQAmc->CreateTH2Fvector1(2, "h_cut_L_DCA_B", "B - DCA between the L daughters; mom (GeV/c); dca (cm)", pN, pMin, pMax, 50, 0, 2, 0);
   fQAmc->CreateTH2Fvector1(2, "h_cut_L_VtxR_B", "B - Radius of the L decay vertex; mom (GeV/c); r (cm)", pN, pMin, pMax, 50, 0, 100, 0);
-  fQAmc->CreateTH2Fvector1(2, "h_cut_L_Chi2_B", "B - L Chi2/NDF; mom (GeV/c); Chi2/NDF", pN, pMin, pMax, 50, 0, 100, 0);
+  fQAmc->CreateTH2Fvector1(2, "h_cut_L_Chi2_B", "B - L Chi2/NDF; mom (GeV/c); Chi2/NDF", pN, pMin, pMax, 50, 0, 50, 0);
   fQAmc->CreateTH2Fvector1(2, "h_cut_L_rdp_v_mp_S", "S - relative L daughter mom -v- mother mom; L mom (GeV/c); relative daughter mom p2/p1", 100, 0.1, 10, 100, 0, 1);
   fQAmc->CreateTH2Fvector1(2, "h_cut_L_rdp_v_mp_B", "B - relative L daughter mom -v- mother mom; L mom (GeV/c); relative daughter mom p2/p1", 100, 0.1, 10, 100, 0, 1);
   fQAmc->CreateTH1Fvector1(5, "h_LAL_Mass_B", "B - Invariant mass of anti L; mass (GeV/c^{2}); counts", 60, 1.1, 1.13);
@@ -441,10 +441,10 @@ Bool_t AliHFEV0cuts::GammaCuts(AliESDv0 *v0){
   Float_t p[2] = {d[0]->GetP(), d[1]->GetP()};
 
   // Cut values
-  const Double_t cutChi2NDF = 10.;              // ORG [7.]  
-  const Double_t cutCosPoint[2] = {0., 0.02};  // ORG [0., 0.03]
+  const Double_t cutChi2NDF = 1.5;              // ORG [7.]  
+  const Double_t cutCosPoint[2] = {0., 0.007};  // ORG [0., 0.02]
   const Double_t cutDCA[2] = {0., 0.25};       // ORG [0., 0.25]
-  const Double_t cutProdVtxR[2] = {3., 90.};   // ORG [6., 9999]
+  const Double_t cutProdVtxR[2] = {6., 90.};   // ORG [3., 90]
   const Double_t cutPsiPair[2] = {0., 0.05};   // ORG [0. 0.05]
   // mass cut
   const Double_t cutMass = 0.05;               // ORG [0.05]
@@ -536,6 +536,7 @@ Bool_t AliHFEV0cuts::GammaCuts(AliESDv0 *v0){
        fQAmc->Fill("h_cut_Gamma_Chi2_S", 0, iP, chi2ndf);
        fQAmc->Fill("h_cut_Gamma_Chi2_S", 1, iP, chi2ndf);
        fQAmc->Fill("h_cut_Gamma_Sep_S", 0, iP, sep);
+       fQAmc->Fill("h_cut_Gamma_SepR_S", 0,r2, sep);
        fQAmc->Fill("h_Electron_P_S", 0, p[0]);
        fQAmc->Fill("h_Electron_P_S", 0, p[1]);
       }
@@ -548,6 +549,7 @@ Bool_t AliHFEV0cuts::GammaCuts(AliESDv0 *v0){
        fQAmc->Fill("h_cut_Gamma_Chi2_B", 0, iP, chi2ndf);
        fQAmc->Fill("h_cut_Gamma_Chi2_B", 1, iP, chi2ndf);
        fQAmc->Fill("h_cut_Gamma_Sep_B", 0, iP, sep);
+       fQAmc->Fill("h_cut_Gamma_SepR_B", 0,r2, sep);
        fQAmc->Fill("h_Electron_P_B", 0, p[0]);
        fQAmc->Fill("h_Electron_P_B", 0, p[1]); 
       }
@@ -685,11 +687,13 @@ Bool_t AliHFEV0cuts::GammaCuts(AliESDv0 *v0){
     if(iMass < cutMass){
       if(1 == fCurrentV0id){
        fQAmc->Fill("h_cut_Gamma_Sep_S", 1, iP, sep);
+       fQAmc->Fill("h_cut_Gamma_SepR_S", 1,r2, sep);
        fQAmc->Fill("h_Electron_P_S", 5, p[0]);
        fQAmc->Fill("h_Electron_P_S", 5, p[1]);
       }
       else if(-2 != fCurrentV0id){
        fQAmc->Fill("h_cut_Gamma_Sep_B", 1, iP, sep);
+       fQAmc->Fill("h_cut_Gamma_SepR_B", 1,r2, sep);
        fQAmc->Fill("h_Electron_P_B", 5, p[0]);
        fQAmc->Fill("h_Electron_P_B", 5, p[1]);
       }
@@ -797,7 +801,7 @@ Bool_t AliHFEV0cuts::K0Cuts(AliESDv0 *v0){
   Double_t data[4] = {0., 0., 0., 0.};
 
   // Cut values
-  const Double_t cutChi2NDF = 10.;              // ORG [7.]
+  const Double_t cutChi2NDF = 2.;              // ORG [7.]
   const Double_t cutCosPoint[2] = {0., 0.02};  // ORG [0., 0.03]
   const Double_t cutDCA[2] = {0., 0.2};        // ORG [0., 0.1]
   const Double_t cutProdVtxR[2] = {2.0, 30.};   // ORG [0., 8.1]
@@ -1096,8 +1100,8 @@ Bool_t AliHFEV0cuts::LambdaCuts(AliESDv0 *v0, Bool_t &isLambda ){
   Float_t iP = v0->P();
 
    // Cuts
-  const Double_t cutChi2NDF = 10.;              // ORG [5.]
-  const Double_t cutCosPoint[2] = {0., 0.02};  // ORG [0., 0.03]
+  const Double_t cutChi2NDF = 2.;              // ORG [5.]
+  const Double_t cutCosPoint[2] = {0., 0.01};  // ORG [0., 0.02]
   const Double_t cutDCA[2] = {0., 0.2};        // ORG [0., 0.2]
   const Double_t cutProdVtxR[2] = {2., 40.};   // ORG [0., 24.]
   const Double_t cutMass[2] = {1.11, 1.12};   // ORG [1.11, 1.12]
@@ -1452,40 +1456,12 @@ AliKFParticle *AliHFEV0cuts::CreateMotherParticle(AliVTrack* const pdaughter, Al
   // - check the number of tracks that take part in the creaton of primary vertex.
   //   important: after removeal of candidate tracks there must be at least 2 tracks left
   //   otherwise the primary vertex will be corrupted  
-  
-  // ESD Analyis
-  //const AliESDVertex *esdvertex = dynamic_cast<const AliESDVertex *>(fInputEvent->GetPrimaryVertex());
-  //if(!esdvertex) return NULL;
-  //UShort_t *contrib = esdvertex->GetIndices();
-  
-  //
-  // not using the removal of the daughter track now
-  //
-  //   Int_t nTracks = esdvertex->GetNIndices();
-  //   printf(" -D: N Vertex tracks: %i\n", nTracks);
-  //   printf(" -D: N Contributors: %i\n", fPrimaryVertex->GetNContributors()); 
-  //   Int_t nfound = 0;
-  //   for(Int_t id = 0; id < esdvertex->GetNIndices(); id++){
-  //     if(contrib[id] == pdaughter->GetID()){
-  //       if( (nTracks - nfound) <= 2 ) return NULL;
-  //       *fPrimaryVertex -= pkfdaughter;
-  //       removed[0] = kTRUE;
-  //       nfound++;
-  //     }
-  //     if(contrib[id] == ndaughter->GetID()){
-  //       if( (nTracks - nfound) <=2 ) return NULL;
-  //       *fPrimaryVertex -= nkfdaughter;
-  //       removed[1] = kTRUE;
-  //       nfound++;
-  //     }
-  //     if(nfound == 2) break;
-  //   }
-  
-  //  printf(" -D: n removed: %i\n", nfound);
   
   // Create the mother particle 
   AliKFParticle *m = new AliKFParticle(pkfdaughter, nkfdaughter);
-  // DEBUG - testing
+  // important !!!
+  m->SetField(fInputEvent->GetMagneticField());
   if(TMath::Abs(kElectron) == pspec && TMath::Abs(kElectron) == nspec) m->SetMassConstraint(0, 0.001);
   else if(TMath::Abs(kPiPlus) == pspec && TMath::Abs(kPiPlus) == nspec) m->SetMassConstraint(TDatabasePDG::Instance()->GetParticle(kK0Short)->Mass(), 0.);
   else if(TMath::Abs(kProton) == pspec && TMath::Abs(kPiPlus) == nspec) m->SetMassConstraint(TDatabasePDG::Instance()->GetParticle(kLambda0)->Mass(), 0.);
index 6605369..8651d4d 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIHFEV0CUTS_H
-#define ALIHFEV0CUTS_H
-
 /**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */ 
-
 //
 // Class for the V0 cuts - tuned to obtain clean eletron, pion and proton samples.
 // NOT suitable for V0 analysis
 //
+#ifndef ALIHFEV0CUTS_H
+#define ALIHFEV0CUTS_H
+
 #include "AliHFEcollection.h"
 
 class TList;
@@ -29,7 +26,7 @@ class TList;
 class AliMCParticle;
 class AliVEvent;
 class AliMCEvent;
-class AliESDtraack;
+class AliESDtrack;
 class AliESDv0;
 class AliKFVertex;
 class AliKFParticle;
index fd871f0..8ed8b0f 100644 (file)
@@ -12,9 +12,6 @@
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */
-
 //
 // Stores aditional information about the V0 candidates
 // author: M.Fasel@gsi.de
index 905a705..522ed65 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIHFEV0INF0_H
-#define ALIHFEV0INFO_H
-
 /**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */ 
-
 //
 // Stores aditional information about the V0 candidates
 // author: M.Fasel@gsi.de
 //
+#ifndef ALIHFEV0INF0_H
+#define ALIHFEV0INFO_H
+
 #ifndef ROOT_TObject
 #include <TObject.h>
 #endif
index 66581a7..8b2006d 100644 (file)
@@ -198,7 +198,6 @@ void AliHFEV0pid::Process(AliVEvent * const inputEvent){
 
   //BenchmarkV0finder();
 
-
   for(Int_t iv0 = 0; iv0 < fInputEvent->GetNumberOfV0s(); iv0++){
     if(!TString(fInputEvent->IsA()->GetName()).CompareTo("AliESDEvent")){
       // case ESD
@@ -237,6 +236,7 @@ void AliHFEV0pid::Process(AliVEvent * const inputEvent){
   AliDebug(1, Form("Number of protons        : %d", fProtons->GetEntries()));
   
   delete  fPrimaryVertex;
+
 }
 
 //____________________________________________________________
@@ -282,7 +282,6 @@ Int_t AliHFEV0pid::ProcessV0(TObject *v0){
 
   // preselect the V0 candidates based on the Armenteros plot
   Int_t id = PreselectV0(esdV0, idMC);
-
   // store the resutls
   if(AliHFEV0cuts::kRecoGamma == id && IsGammaConv(v0)){
     fQA->Fill("h_nV0s", AliHFEV0cuts::kRecoGamma);
@@ -296,7 +295,9 @@ Int_t AliHFEV0pid::ProcessV0(TObject *v0){
     fQA->Fill("h_nV0s", AliHFEV0cuts::kRecoLambda);    
     return AliHFEV0cuts::kRecoLambda;
   }
-  else return AliHFEV0cuts::kUndef;
+  else return AliHFEV0cuts::kUndef; 
+
+
     
 }
 //____________________________________________________________
index 668ded5..a56638a 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIHFEV0PID_H
-#define ALIHFEV0PID_H
-
 /**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */ 
-
 //
 // Utility class for V0 PID
 // Provides smaples of electrons, pions and protons
 // More information can be found in the implementation file
 //
+#ifndef ALIHFEV0PID_H
+#define ALIHFEV0PID_H
+
 #ifndef ROOT_TObject
 #include <TObject.h>
 #endif
index a8a22e0..51f7f11 100644 (file)
@@ -12,9 +12,6 @@
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */
-
 //
 // class to benchmark the V0 pid capabilties
 // runs over reconstructed V0 candidates and uses MC information for 
@@ -216,4 +213,13 @@ Int_t AliHFEV0pidMC::PDGtoAliPID(Int_t pdg) const {
   };
   return -1;
 }
+//____________________________________________________________
+TList *AliHFEV0pidMC::GetListOfQAhistograms(){
+  //
+  // Get QA histograms
+  //
+  if(fColl)
+    return fColl->GetList();
+  return NULL;
+}
 
index d0d1153..77c2adc 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIHFEV0PIDMC_H
-#define ALIHFEV0PIDMC_H
-
 /**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */ 
-
 //
 // Benchmarking class for V0 finder and PID. 
 // Relies on MC information
 // For more see source file
 //
 
+#ifndef ALIHFEV0PIDMC_H
+#define ALIHFEV0PIDMC_H
+
 #ifndef ROOT_TObject
 #include <TObject.h>
 #endif
@@ -46,7 +43,7 @@ class AliHFEV0pidMC : public TObject {
 
   void     SetMCEvent(AliMCEvent * const mc) { fMC = mc; };
 
-  inline TList* GetListOfQAhistograms();
+  TList* GetListOfQAhistograms();
 
  private:
   AliHFEV0pidMC(const AliHFEV0pidMC &);
@@ -61,13 +58,4 @@ class AliHFEV0pidMC : public TObject {
 
    ClassDef(AliHFEV0pidMC, 1)   // QA class for V0 PID
 };
-//____________________________________________________________
-TList *AliHFEV0pidMC::GetListOfQAhistograms(){
-  //
-  // Get QA histograms
-  //
-  if(fColl)
-    return fColl->GetList();
-  return NULL;
-}
 #endif
index bdd01fd..0a9050f 100644 (file)
@@ -12,9 +12,6 @@
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */
-
 //
 // Collection class for histograms
 // Stores either histograms or vectors of histograms
@@ -133,6 +130,24 @@ Bool_t AliHFEcollection::CreateTH1F(const char* name, const char* title, Int_t n
     return CheckObject(name);
   }
 }
+
+//___________________________________________________________________
+Bool_t AliHFEcollection::CreateTH1Farray(const char* name, const char* title, Int_t nBin, const Double_t* xbins){
+
+  //
+  // Creates a TH1F histogram for the collection 2nd version 
+  //
+
+  if(!fList){
+    AliError("No TList pointer ! ");
+    return kFALSE;
+  }
+  else{
+    fList->Add(new TH1F(name, title, nBin, xbins));
+    return CheckObject(name);
+  }
+}
+
 //___________________________________________________________________
 Bool_t AliHFEcollection::CreateTH2F(const char* name, const char* title, Int_t nBinX, Float_t nMinX, Float_t nMaxX, Int_t nBinY, Float_t nMinY, Float_t nMaxY, Int_t logAxis){
 
index 766b817..d1e3150 100644 (file)
@@ -1,10 +1,6 @@
-#ifndef ALIHFECOLLECTION_H
-#define ALIHFECOLLECTION_H
-
 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
- * See cxx source for full Copyright notice                               */
-
-/* $Id$ */ 
+ * See cxx source for full Copyright notice      
+ */
 
 //                                                                      
 // Class for AliHFEcollection                                           
@@ -27,6 +23,9 @@
  */
 
 
+#ifndef ALIHFECOLLECTION_H
+#define ALIHFECOLLECTION_H
+
 #ifndef ROOT_TNamed
 #include "TNamed.h"
 #endif
@@ -53,6 +52,7 @@ class AliHFEcollection : public TNamed{
 
   // Set & Create functions
   Bool_t CreateTH1F(const char* name, const char* title, Int_t nBin, Float_t nMin, Float_t nMax, Int_t logAxis = -1);
+  Bool_t CreateTH1Farray(const char* name, const char* title, Int_t nBin, const Double_t* xbins);
 
   Bool_t CreateTH2F(const char* name, const char* title, Int_t nBinX, Float_t nMinX, Float_t nMaxX, Int_t nBinY, Float_t nMinY, Float_t nMaxY, Int_t logAxis = -1);
 
index 143dcf1..697bd0b 100644 (file)
@@ -50,8 +50,6 @@ AliHFEcontainer::AliHFEcontainer():
   //
   // Default constructor
   //
-  fContainers = new THashList();
-  fContainers->SetOwner();
 }
 
 //__________________________________________________________________
@@ -318,7 +316,7 @@ THnSparseF *AliHFEcontainer::GetCorrelationMatrix(const Char_t *name) const{
 }
 
 //__________________________________________________________________
-void AliHFEcontainer::FillCFContainer(const Char_t *name, UInt_t step, Double_t *content, Double_t weight) const {
+void AliHFEcontainer::FillCFContainer(const Char_t *name, UInt_t step, const Double_t * const content, Double_t weight) const {
   //
   // Fill container
   //
@@ -328,7 +326,7 @@ void AliHFEcontainer::FillCFContainer(const Char_t *name, UInt_t step, Double_t
 }
 
 //__________________________________________________________________
-void AliHFEcontainer::FillCFContainerStepname(const Char_t *name, const Char_t *steptitle, Double_t *content, Double_t weight)const{
+void AliHFEcontainer::FillCFContainerStepname(const Char_t *name, const Char_t *steptitle, const Double_t * const content, Double_t weight)const{
   //
   // Fill container
   //
index b34bd29..59d0078 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIHFECONTAINER_H
-#define ALIHFECONTAINER_H
-
 /**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */ 
-
 //
 // HFE correction framework container
 // Contains many single containers
 // Extra fuctionality like appending added
 //
+#ifndef ALIHFECONTAINER_H
+#define ALIHFECONTAINER_H
+
 #ifndef ROOT_TNamed
 #include <TNamed.h>
 #endif
@@ -61,8 +58,8 @@ class AliHFEcontainer : public TNamed{
     AliCFContainer *GetCFContainer(const Char_t *name) const;
     THnSparseF *GetCorrelationMatrix(const Char_t *name) const;
     THashList *GetListOfCorrelationMatrices() const { return fCorrelationMatrices; }
-    void FillCFContainer(const Char_t *name, UInt_t step, Double_t *content, Double_t weight = 1.) const;
-    void FillCFContainerStepname(const Char_t *name, const Char_t *step, Double_t *content, Double_t weight = 1.) const;
+    void FillCFContainer(const Char_t *name, UInt_t step, const Double_t * const content, Double_t weight = 1.) const;
+    void FillCFContainerStepname(const Char_t *name, const Char_t *step, const Double_t *const content, Double_t weight = 1.) const;
     AliCFContainer *MakeMergedCFContainer(const Char_t *name, const Char_t *title, const Char_t *contnames) const;
 
     Int_t GetNumberOfCFContainers() const;
index 9eeb68a..530c82c 100644 (file)
@@ -12,9 +12,6 @@
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */
-
 //
 // Cut step class
 // Select all tracks surviving cuts in one special cut step
@@ -120,7 +117,7 @@ void AliHFEcutStep::AddCut(AliAnalysisCuts *cut){
 }
 
 //__________________________________________________________________
-void AliHFEcutStep::SetMC(AliMCEvent *mc){
+void AliHFEcutStep::SetMC(const AliMCEvent *mc){
   //
   // Set MC information to the cuts in the cut step
   //
@@ -131,7 +128,7 @@ void AliHFEcutStep::SetMC(AliMCEvent *mc){
 }
 
 //__________________________________________________________________
-void AliHFEcutStep::SetRecEvent(AliVEvent *rec){
+void AliHFEcutStep::SetRecEvent(const AliVEvent *rec){
   //
   // Publish rec event to the cut step
   //
index dab912b..079aada 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIHFECUTSTEP_H
-#define ALIHFECUTSTEP_H
-
 /**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */ 
-
 //
 // Cut step class
 // Select all tracks surviving cuts in one special cut step
 // Used in AliHFEtrackFilter
 // 
+#ifndef ALIHFECUTSTEP_H
+#define ALIHFECUTSTEP_H
+
 #include <TNamed.h>
 
 class TObjArray;
@@ -42,8 +39,8 @@ class AliHFEcutStep : public TNamed{
       AliAnalysisCuts *GetCut(const Char_t *name);
       Bool_t IsSelected(TObject *o);
 
-      void SetMC(AliMCEvent *mc);
-      void SetRecEvent(AliVEvent *mc);
+      void SetMC(const AliMCEvent *mc);
+      void SetRecEvent(const AliVEvent *mc);
 
     private:
       TObjArray *fCuts; // List of cuts in one cut step
index 21ccf86..941c732 100644 (file)
@@ -12,9 +12,6 @@
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */
-
 //
 // Cut menagement class implemented by the
 // ALICE Heavy Flavour Electron Group
@@ -68,6 +65,7 @@
 #include "AliCFTrackKineCuts.h"
 #include "AliCFTrackQualityCuts.h"
 #include "AliESDtrack.h"
+#include "AliHFEextraEventCuts.h"
 
 #include "AliHFEcuts.h"
 
@@ -75,7 +73,7 @@ ClassImp(AliHFEcuts)
 
 const Char_t *AliHFEcuts::fgkMCCutName[AliHFEcuts::kNcutStepsMCTrack] = {
   "MCGenerated",
-  "MCGeneratedZOutNoPileUp",
+  "MCGeneratedZOutNoPileUpCentralityFine",
   "MCGeneratedEventCut",
   "MCInAcceptance"
 };
@@ -92,6 +90,10 @@ const Char_t * AliHFEcuts::fgkDECutName[AliHFEcuts::kNcutStepsDETrack] = {
   "HFEDCA"
 };
 
+const Char_t * AliHFEcuts::fgkSecvtxCutName[AliHFEcuts::kNcutStepsSecvtxTrack] = {
+  "HFESecvtx"
+};
+
 const Char_t * AliHFEcuts::fgkEventCutName[AliHFEcuts::kNcutStepsEvent] = {
   "EventStepGenerated",
   "EventStepRecNoCut",
@@ -118,6 +120,9 @@ AliHFEcuts::AliHFEcuts():
   fSigmaToVtx(0.),
   fVertexRangeZ(20.),
   fTOFPIDStep(kFALSE),
+  fTOFMISMATCHStep(kFALSE),
+  fUseMixedVertex(kTRUE),
+  fIsIPSigmacut(kFALSE),
   fHistQA(0x0),
   fCutList(0x0),
   fDebugLevel(0)
@@ -143,6 +148,9 @@ AliHFEcuts::AliHFEcuts(const Char_t *name, const Char_t *title):
   fSigmaToVtx(0.),
   fVertexRangeZ(20.),
   fTOFPIDStep(kFALSE),
+  fTOFMISMATCHStep(kFALSE),
+  fUseMixedVertex(kTRUE),
+  fIsIPSigmacut(kFALSE),
   fHistQA(0x0),
   fCutList(0x0),
   fDebugLevel(0)
@@ -153,6 +161,7 @@ AliHFEcuts::AliHFEcuts(const Char_t *name, const Char_t *title):
   memset(fProdVtx, 0, sizeof(Double_t) * 4);
   memset(fDCAtoVtx, 0, sizeof(Double_t) * 2);
   memset(fPtRange, 0, sizeof(Double_t) * 2);
+  memset(fIPCutParams, 0, sizeof(Float_t) * 4);
 }
 
 //__________________________________________________________________
@@ -171,6 +180,9 @@ AliHFEcuts::AliHFEcuts(const AliHFEcuts &c):
   fSigmaToVtx(0),
   fVertexRangeZ(20.),
   fTOFPIDStep(kFALSE),
+  fTOFMISMATCHStep(kFALSE),
+  fUseMixedVertex(kTRUE),
+  fIsIPSigmacut(kFALSE),
   fHistQA(0x0),
   fCutList(0x0),
   fDebugLevel(0)
@@ -210,11 +222,15 @@ void AliHFEcuts::Copy(TObject &c) const {
   target.fSigmaToVtx = fSigmaToVtx;
   target.fVertexRangeZ = fVertexRangeZ;
   target.fTOFPIDStep = fTOFPIDStep;
+  target.fTOFMISMATCHStep = fTOFMISMATCHStep;
+  target.fUseMixedVertex = fUseMixedVertex;
+  target.fIsIPSigmacut = fIsIPSigmacut;
   target.fDebugLevel = 0;
 
   memcpy(target.fProdVtx, fProdVtx, sizeof(Double_t) * 4);
   memcpy(target.fDCAtoVtx, fDCAtoVtx, sizeof(Double_t) * 2);
   memcpy(target.fPtRange, fPtRange, sizeof(Double_t) *2);
+  memcpy(target.fIPCutParams, fIPCutParams, sizeof(Float_t) * 4);
 
   // Copy cut List
   if(target.fCutList){
@@ -226,15 +242,13 @@ void AliHFEcuts::Copy(TObject &c) const {
     if(target.fCutList) target.fCutList->SetOwner(); // Coverity
   }
   if(target.fHistQA){
-    target.fHistQA->Clear();
     delete target.fHistQA;
-    target.fHistQA = NULL;
   }
   if(fHistQA){
     // If the QA list was already produced, then we create it new, loop over the cuts and connect all the histos with this list
     target.fHistQA = new TList;
     target.fHistQA->SetName(Form("%s_CutQAhistograms", GetName()));
-    fHistQA->SetOwner(kFALSE);
+    fHistQA->SetOwner(kTRUE);
     TIter cit(target.fCutList);
     TObjArray *clist = NULL;
     AliCFCutBase *co = NULL;
@@ -255,8 +269,7 @@ AliHFEcuts::~AliHFEcuts(){
     delete fCutList;
   }
   fCutList = 0x0;
-  if(fHistQA) fHistQA->Clear();
-  delete fHistQA;
+  if(fHistQA) delete fHistQA;
 }
 
 //__________________________________________________________________
@@ -277,7 +290,7 @@ void AliHFEcuts::Initialize(AliCFManager *cfm){
   if(IsQAOn()){
     fHistQA = new TList;
     fHistQA->SetName(Form("%s_CutQAhistograms", GetName()));
-    fHistQA->SetOwner(kFALSE);
+    fHistQA->SetOwner(kTRUE);
   }
  
   // Call all the setters for the cuts
@@ -362,18 +375,29 @@ void AliHFEcuts::SetEventCutList(Int_t istep){
     arr->SetName("fEvGenCuts");
     arr->AddLast(evGenCuts);
   } else {
-    AliCFEventRecCuts *evRecCuts = new AliCFEventRecCuts((Char_t *)"fCutsEvRec", (Char_t *)"Event Reconstructed cuts");
-    //evRecCuts->SetNTracksCut(1);
-    evRecCuts->SetRequireVtxCuts(kTRUE);
-    //evRecCuts->SetVertexXCut(-1, 1);
-    //evRecCuts->SetVertexYCut(-1, 1);
-    //evRecCuts->SetVertexZCut(-30, 30);
-    evRecCuts->SetVertexZCut(-fVertexRangeZ, fVertexRangeZ);
-    evRecCuts->SetVertexNContributors(1,(Int_t)1.e9);
-    if(IsQAOn()) evRecCuts->SetQAOn(fHistQA);
-
-    arr->SetName("fEvRecCuts");
-    arr->AddLast(evRecCuts);
+
+    if(!fUseMixedVertex) {
+      AliCFEventRecCuts *evRecCuts = new AliCFEventRecCuts((Char_t *)"fCutsEvRec", (Char_t *)"Event Reconstructed cuts");
+      //evRecCuts->SetNTracksCut(1);
+      evRecCuts->SetRequireVtxCuts(kTRUE);
+      //evRecCuts->SetVertexXCut(-1, 1);
+      //evRecCuts->SetVertexYCut(-1, 1);
+      //evRecCuts->SetVertexZCut(-30, 30);
+      evRecCuts->SetVertexZCut(-fVertexRangeZ, fVertexRangeZ);
+      evRecCuts->SetVertexNContributors(1,(Int_t)1.e9);
+      if(IsQAOn()) evRecCuts->SetQAOn(fHistQA);
+      arr->SetName("fEvRecCuts");
+      arr->AddLast(evRecCuts);
+    } else {
+      AliHFEextraEventCuts *evRecCuts = new AliHFEextraEventCuts((Char_t *)"fCutsEvRec", (Char_t *)"Event Reconstructed cuts");
+      evRecCuts->SetRequireVtxCuts(kTRUE);
+      evRecCuts->SetUseMixedVertex();
+      evRecCuts->SetVertexZCut(-fVertexRangeZ, fVertexRangeZ);
+      //evRecCuts->SetVertexNContributors(1,(Int_t)1.e9);
+      if(IsQAOn()) evRecCuts->SetQAOn(fHistQA);
+      arr->SetName("fEvRecCuts");
+      arr->AddLast(evRecCuts);
+    }
   }
   fCutList->AddLast(arr);
 }
@@ -557,6 +581,7 @@ void AliHFEcuts::SetHFElectronTRDCuts(){
   AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTRD","Extra cuts from the HFE group");
   if(fMinTrackletsTRD > 0.) hfecuts->SetMinTrackletsTRD(fMinTrackletsTRD);
   if(fTOFPIDStep) hfecuts->SetTOFPID(kTRUE);
+  if(fTOFMISMATCHStep) hfecuts->SetTOFMISMATCH(kTRUE);
   if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
   hfecuts->SetDebugLevel(fDebugLevel);
   
@@ -573,8 +598,7 @@ void AliHFEcuts::SetHFElectronDcaCuts(){
   //
   AliDebug(2, "Called\n");
   AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupDCA","Extra cuts from the HFE group");
-  hfecuts->SetMinHFEImpactParamR();
-  //hfecuts->SetMinHFEImpactParamNsigmaR();
+  hfecuts->SetMinHFEImpactParamR(fIPCutParams,fIsIPSigmacut);
   if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
   hfecuts->SetDebugLevel(fDebugLevel);
 
@@ -590,7 +614,7 @@ Bool_t AliHFEcuts::CheckParticleCuts(UInt_t step, TObject *o){
   // Checks the cuts without using the correction framework manager
   // 
   AliDebug(2, "Called\n");
-  TString stepnames[kNcutStepsMCTrack + kNcutStepsRecTrack + kNcutStepsDETrack + 1] = {"fPartGenCuts","fPartEvCutPileupZ","fPartEvCut","fPartAccCuts","fPartRecNoCuts","fPartRecKineITSTPCCuts", "fPartPrimCuts", "fPartHFECutsITS","fPartHFECutsTRD","fPartHFECutsDca"};
+  TString stepnames[kNcutStepsMCTrack + kNcutStepsRecTrack + kNcutStepsDETrack + kNcutStepsSecvtxTrack + 1] = {"fPartGenCuts","fPartEvCutPileupZ","fPartEvCut","fPartAccCuts","fPartRecNoCuts","fPartRecKineITSTPCCuts", "fPartPrimCuts", "fPartHFECutsITS","fPartHFECutsTRD","fPartHFECutsDca", "fPartHFECutsSecvtx"};
   AliDebug(2, Form("Doing cut %s", stepnames[step].Data()));
  TObjArray *cuts = dynamic_cast<TObjArray *>(fCutList->FindObject(stepnames[step].Data()));
   if(!cuts) return kTRUE;
index 73edf45..95c98f4 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIHFECUTS_H
-#define ALIHFECUTS_H
-
 /**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */ 
-
 //
 // Cut container class for the ALICE HFE group
 // Serves also as interface to the correction Framework
 // Provides a set of standard cuts
 //
+#ifndef ALIHFECUTS_H
+#define ALIHFECUTS_H
+
 #ifndef ROOT_TNamed
 #include <TNamed.h>
 #endif
@@ -53,8 +50,12 @@ class AliHFEcuts : public TNamed{
       kNcutStepsDETrack = 1
     } DECutStep_t;
     typedef enum{
+      kStepHFEcutsSecvtx = 0, 
+      kNcutStepsSecvtxTrack = 1
+    } SecvtxCutStep_t;
+    typedef enum{
       kStepMCGenerated = 0,
-      kStepMCGeneratedZOutNoPileUp = 1,
+      kStepMCGeneratedZOutNoPileUpCentralityFine = 1,
       kStepMCGeneratedEventCut = 2,
       kStepMCInAcceptance = 3,
       kNcutStepsMCTrack =  4
@@ -63,9 +64,10 @@ class AliHFEcuts : public TNamed{
       kEventStepGenerated = 0,
       kEventStepRecNoCut = 1,
       kEventStepRecNoPileUp = 2,
-      kEventStepZRange = 3,
-      kEventStepReconstructed = 4,
-      kNcutStepsEvent = 5
+      kEventStepRecCentralityOk = 3,
+      kEventStepZRange = 4,
+      kEventStepReconstructed = 5,
+      kNcutStepsEvent = 6
     } EventCutStep_t;
 
     AliHFEcuts();
@@ -103,6 +105,10 @@ class AliHFEcuts : public TNamed{
       if(step >= kNcutStepsDETrack) return fgkUndefined;
       return fgkDECutName[step];
     }
+    static const Char_t *SecvtxCutName(UInt_t step){
+      if(step >= kNcutStepsSecvtxTrack) return fgkUndefined;
+      return fgkSecvtxCutName[step];
+    }
     static const Char_t *EventCutName(UInt_t step){
       if(step >= kNcutStepsEvent) return fgkUndefined;
       return fgkEventCutName[step];
@@ -126,6 +132,7 @@ class AliHFEcuts : public TNamed{
     void SetMinNTrackletsTRD(UChar_t minNtrackletsTRD) { fMinTrackletsTRD = minNtrackletsTRD; }
     void SetMaxChi2perClusterTPC(Double_t chi2) { fMaxChi2clusterTPC = chi2; };
     inline void SetMaxImpactParam(Double_t radial, Double_t z);
+    inline void SetIPcutParam(Float_t p0, Float_t p1, Float_t p2, Float_t p3, Bool_t isipsigma);
     void SetMinRatioTPCclusters(Double_t minRatioTPC) { fMinClusterRatioTPC = minRatioTPC; };
     void SetPtRange(Double_t ptmin, Double_t ptmax){fPtRange[0] = ptmin; fPtRange[1] = ptmax;};
     inline void SetProductionVertex(Double_t xmin, Double_t xmax, Double_t ymin, Double_t ymax);
@@ -135,7 +142,9 @@ class AliHFEcuts : public TNamed{
       fTPCratioDef = ratioDef;
     }
     void SetVertexRange(Double_t zrange){fVertexRangeZ = zrange;};
-    void SetTOFPIDStep(Bool_t tofPidStep) {fTOFPIDStep = tofPidStep;};    
+    void SetTOFPIDStep(Bool_t tofPidStep) {fTOFPIDStep = tofPidStep;};
+    void SetTOFMISMATCHStep(Bool_t tofMismatchStep) {fTOFMISMATCHStep = tofMismatchStep;};
+    void SetUseMixedVertex(Bool_t useMixedVertex) {fUseMixedVertex = useMixedVertex;};    
     
     inline void CreateStandardCuts();
     
@@ -177,6 +186,7 @@ class AliHFEcuts : public TNamed{
     static const Char_t* fgkMCCutName[kNcutStepsMCTrack];     // Cut step names for MC single Track cuts
     static const Char_t* fgkRecoCutName[kNcutStepsRecTrack];  // Cut step names for Rec single Track cuts
     static const Char_t* fgkDECutName[kNcutStepsDETrack];     // Cut step names for impact parameter cuts
+    static const Char_t* fgkSecvtxCutName[kNcutStepsSecvtxTrack];     // Cut step names for secondary vertexing cuts
     static const Char_t* fgkEventCutName[kNcutStepsEvent];    // Cut step names for Event cuts
     static const Char_t* fgkUndefined;                        // Name for undefined (overflow)
   
@@ -196,6 +206,10 @@ class AliHFEcuts : public TNamed{
     Double_t fSigmaToVtx;              // Sigma To Vertex
     Double_t fVertexRangeZ;             // Vertex Range reconstructed
     Bool_t   fTOFPIDStep;               // TOF matching step efficiency
+    Bool_t   fTOFMISMATCHStep;        // TOF mismatch step
+    Bool_t   fUseMixedVertex;         // Use primary vertex from track only as before
+    Float_t  fIPCutParams[4];         // Parameters of impact parameter cut parametrization
+    Bool_t   fIsIPSigmacut;           // if abs IP cut or IP sigma cut 
 
     
     TList *fHistQA;                        //! QA Histograms
@@ -230,6 +244,16 @@ void AliHFEcuts::SetMaxImpactParam(Double_t radial, Double_t z){
 }
 
 //__________________________________________________________________
+void AliHFEcuts::SetIPcutParam(Float_t p0, Float_t p1, Float_t p2, Float_t p3, Bool_t isipsigma){
+  // Set parameters for impact parameter cut parametrization
+  fIPCutParams[0] = p0;
+  fIPCutParams[1] = p1;
+  fIPCutParams[2] = p2;
+  fIPCutParams[3] = p3;
+  fIsIPSigmacut = isipsigma;
+}
+
+//__________________________________________________________________
 void AliHFEcuts::SetCutITSpixel(UChar_t cut){
   SetRequireITSPixel();
   fCutITSPixel = cut;
index 6e09074..5223146 100644 (file)
@@ -12,9 +12,6 @@
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */
-
 //
 // Class for impact parameter (DCA) of charged particles
 // Study resolution and pull: prepare for beauty study
@@ -265,7 +262,7 @@ AliHFEdca::~AliHFEdca()
 }
 
 //________________________________________________________________________
-void AliHFEdca::InitAnalysis(){
+void AliHFEdca::InitAnalysis()const{
 
  //Printf("initialize analysis\n");
 
@@ -809,7 +806,7 @@ void AliHFEdca::CreateHistogramsDataPid(TList *pidList){
 
 
 //_______________________________________________________________________________________________
-void AliHFEdca::FillHistogramsDca(AliESDEvent * const esdEvent, AliESDtrack * const track, AliMCEvent * const mcEvent)
+void AliHFEdca::FillHistogramsDca(const AliESDEvent * const esdEvent, const AliESDtrack * const track, AliMCEvent * const mcEvent)
 {
  // the kDca plugin
  // MC vertex
@@ -842,7 +839,8 @@ void AliHFEdca::FillHistogramsDca(AliESDEvent * const esdEvent, AliESDtrack * co
  Double_t dz[2];   // error of dca in cm
  Double_t covardz[3];
 
- if(!track->PropagateToDCA(primVtx,magneticField, beampiperadius, dz, covardz)) return;  // protection
+ AliESDtrack ctrack(*track);
+ if(!ctrack.PropagateToDCA(primVtx,magneticField, beampiperadius, dz, covardz)) return;  // protection
 
  AliMCParticle *mctrack = dynamic_cast<AliMCParticle *>(mcEvent->GetTrack(TMath::Abs(track->GetLabel()))); 
  if(!mctrack) return;
@@ -939,7 +937,7 @@ void AliHFEdca::FillHistogramsDca(AliESDEvent * const esdEvent, AliESDtrack * co
 }
 
 //_______________________________________________________________________________________________
-void AliHFEdca::FillHistogramsKfDca(AliESDEvent * const esdEvent, AliESDtrack * const track, const AliMCEvent * const mcEvent)
+void AliHFEdca::FillHistogramsKfDca(const AliESDEvent * const esdEvent, const AliESDtrack * const track, const AliMCEvent * const mcEvent)
  {
  // the kKfDca plugin
 
@@ -959,7 +957,8 @@ void AliHFEdca::FillHistogramsKfDca(AliESDEvent * const esdEvent, AliESDtrack *
  Double_t beampiperadius=3.;  
  Double_t dz[2];   // error of dca in cm
  Double_t covardz[3];
- if(!track->PropagateToDCA(primVtx,magneticField, beampiperadius, dz, covardz)) return; // protection 
+ AliESDtrack ctrack(*track);
+ if(!ctrack.PropagateToDCA(primVtx,magneticField, beampiperadius, dz, covardz)) return; // protection 
 
  AliMCParticle *mctrack = dynamic_cast<AliMCParticle *>(mcEvent->GetTrack(TMath::Abs(track->GetLabel())));  
  if(!mctrack) return;
@@ -1058,7 +1057,7 @@ void AliHFEdca::FillHistogramsKfDca(AliESDEvent * const esdEvent, AliESDtrack *
 
 
 //_______________________________________________________________________________________________
-void AliHFEdca::FillHistogramsVtx(AliESDEvent *const esdEvent, AliMCEvent *const mcEvent)
+void AliHFEdca::FillHistogramsVtx(const AliESDEvent *const esdEvent, const AliMCEvent *const mcEvent)
 {
 
  // MC vertex
@@ -1083,7 +1082,7 @@ void AliHFEdca::FillHistogramsVtx(AliESDEvent *const esdEvent, AliMCEvent *const
 }
 
 //_______________________________________________________________________________________________
-void AliHFEdca::FillHistogramsPid(AliESDtrack * const track, const AliMCEvent * const mcEvent)
+void AliHFEdca::FillHistogramsPid(const AliESDtrack * const track, const AliMCEvent * const mcEvent)
 {
 
 
@@ -1127,7 +1126,7 @@ void AliHFEdca::FillHistogramsPid(AliESDtrack * const track, const AliMCEvent *
 
 
 ////_______________________________________________________________________________________________
-void AliHFEdca::FillHistogramsDataDca(AliESDEvent * const esdEvent, AliESDtrack * const track, AliESDVertex * const vtxESDSkip)
+void AliHFEdca::FillHistogramsDataDca(const AliESDEvent * const esdEvent, const AliESDtrack * const track, const AliESDVertex * const vtxESDSkip)
 {
 // filling historgams track by track
 // obtaining reconstructed dca --------------------------------------------------------------
@@ -1152,7 +1151,8 @@ void AliHFEdca::FillHistogramsDataDca(AliESDEvent * const esdEvent, AliESDtrack
  Double_t dz[2];   // error of dca in cm
  Double_t covardz[3];
 
- if(!track->PropagateToDCA(primVtx,magneticField, beampiperadius, dz, covardz)) return;  // protection
+ AliESDtrack ctrack(*track);
+ if(!ctrack.PropagateToDCA(primVtx,magneticField, beampiperadius, dz, covardz)) return;  // protection
 
 
  Double_t pull[2] = {0, 0};
@@ -1165,7 +1165,7 @@ void AliHFEdca::FillHistogramsDataDca(AliESDEvent * const esdEvent, AliESDtrack
 
  Double_t dzwo[2], covardzwo[3];
  Double_t pullwo[2] = {0, 0};
- if(!track->PropagateToDCA(vtxESDSkip, magneticField, beampiperadius, dzwo, covardzwo)) return;   // protection
+ if(!ctrack.PropagateToDCA(vtxESDSkip, magneticField, beampiperadius, dzwo, covardzwo)) return;   // protection
 
  Double_t errorwo[2] ={TMath::Sqrt(TMath::Abs(covardzwo[0])), TMath::Sqrt(TMath::Abs(covardzwo[2]))};
  for(Int_t i=0; i<2; i++){
@@ -1217,7 +1217,7 @@ void AliHFEdca::FillHistogramsDataDca(AliESDEvent * const esdEvent, AliESDtrack
 }
 
 //_______________________________________________________________________________________________
-void AliHFEdca::FillHistogramsDataVtx(AliESDEvent * const esdEvent)
+void AliHFEdca::FillHistogramsDataVtx(const AliESDEvent * const esdEvent)
 {
 
 
@@ -1238,7 +1238,7 @@ void AliHFEdca::FillHistogramsDataVtx(AliESDEvent * const esdEvent)
 
 
 ////_______________________________________________________________________________________________
-void AliHFEdca::FillHistogramsDataPid(AliESDtrack * const track)
+void AliHFEdca::FillHistogramsDataPid(const AliESDtrack * const track)
 {
 // filling historgams track by track
 // obtaining reconstructed dca --------------------------------------------------------------
@@ -1263,7 +1263,7 @@ void AliHFEdca::FillHistogramsDataPid(AliESDtrack * const track)
 }  
 
 //_________________________________________________________________________________________________
-void AliHFEdca::ApplyExtraCuts(AliESDEvent * const esdEvent, Int_t nMinPrimVtxContributor)
+void AliHFEdca::ApplyExtraCuts(const AliESDEvent * const esdEvent, Int_t nMinPrimVtxContributor)
 { 
 
  //
@@ -1278,7 +1278,7 @@ void AliHFEdca::ApplyExtraCuts(AliESDEvent * const esdEvent, Int_t nMinPrimVtxCo
 }
 
 //_____________________________________________________
-Int_t AliHFEdca::GetCombinedPid(AliESDtrack *const track) 
+Int_t AliHFEdca::GetCombinedPid(const AliESDtrack *const track) 
 {
 
  // combined detector pid             
@@ -1505,7 +1505,7 @@ void AliHFEdca::CreateHistogramsHfeDataDca(TList *hfeDataDcaList){
 
 
 //_______________________________________________________________________________________________
-void AliHFEdca::FillHistogramsHfeDca(AliESDEvent * const esdEvent, AliESDtrack * const track, AliMCEvent * const mcEvent)
+void AliHFEdca::FillHistogramsHfeDca(const AliESDEvent * const esdEvent, const AliESDtrack * const track, const AliMCEvent * const mcEvent)
 {
  // the kHFEpid plugin
 
@@ -1536,7 +1536,8 @@ void AliHFEdca::FillHistogramsHfeDca(AliESDEvent * const esdEvent, AliESDtrack *
  Double_t beampiperadius=3.;
  Double_t dz[2];   // error of dca in cm
  Double_t covardz[3];
- if(!track->PropagateToDCA(primVtx,magneticField, beampiperadius, dz, covardz)) return; // protection
+ AliESDtrack ctrack(*track);
+ if(!ctrack.PropagateToDCA(primVtx,magneticField, beampiperadius, dz, covardz)) return; // protection
 
  AliMCParticle *mctrack = dynamic_cast<AliMCParticle *>(mcEvent->GetTrack(TMath::Abs(track->GetLabel())));  
  if(!mctrack) return;
@@ -1612,7 +1613,7 @@ void AliHFEdca::FillHistogramsHfeDca(AliESDEvent * const esdEvent, AliESDtrack *
 
 
 //_______________________________________________________________________________________________
-void AliHFEdca::FillHistogramsHfeDataDca(AliESDEvent * const esdEvent, AliESDtrack * const track, AliESDVertex * const vtxESDSkip)
+void AliHFEdca::FillHistogramsHfeDataDca(const AliESDEvent * const esdEvent, const AliESDtrack * const track, const AliESDVertex * const vtxESDSkip)
 {
 // filling historgams track by track
 // obtaining reconstructed dca --------------------------------------------------------------
@@ -1636,7 +1637,8 @@ void AliHFEdca::FillHistogramsHfeDataDca(AliESDEvent * const esdEvent, AliESDtra
  Double_t dz[2];   // error of dca in cm
  Double_t covardz[3];
 
- if(!track->PropagateToDCA(vtxESDSkip,magneticField, beampiperadius, dz, covardz)) return; // protection
+ AliESDtrack ctrack(*track); // Propagate on copy track
+ if(!ctrack.PropagateToDCA(vtxESDSkip,magneticField, beampiperadius, dz, covardz)) return; // protection
 
  Double_t pull[2] = {0, 0};
  Double_t error[2] ={TMath::Sqrt(covardz[0]), TMath::Sqrt(covardz[2])};
index 3b27338..d46b714 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIHFEDCA_H
-#define ALIHFEDCA_H
-
 /**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
@@ -15,9 +12,6 @@
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */ 
-
 //
 // Class for checking impact parameter (DCA) study 
 // + study DCA in rphi (xy) and z
@@ -26,6 +20,9 @@
 // + add plugin for primary vertex 
 //
 
+#ifndef ALIHFEDCA_H
+#define ALIHFEDCA_H
+
 #ifndef ROOT_TObject
 #include <TObject.h>
 #endif
@@ -90,26 +87,26 @@ class AliHFEdca : public TObject{
   void CreateHistogramsHfeDataDca(TList *hfeDataDcaList);
 
   
-  void InitAnalysis();  
-  void FillHistogramsDca(AliESDEvent *esdEvent,  AliESDtrack *track,  AliMCEvent *mcEvent);
-  void FillHistogramsVtx(AliESDEvent *esdEvent,  AliMCEvent *mcEvent);
-  void FillHistogramsPid(AliESDtrack *track, const  AliMCEvent *mcEvent);
+  void InitAnalysis()const;  
+  void FillHistogramsDca(const AliESDEvent * const esdEvent,  const AliESDtrack *const track,  AliMCEvent *const mcEvent);
+  void FillHistogramsVtx(const AliESDEvent * const esdEvent,  const AliMCEvent *const mcEvent);
+  void FillHistogramsPid(const AliESDtrack *track, const  AliMCEvent * const mcEvent);
 
-  void FillHistogramsKfDca(AliESDEvent *esdEvent,  AliESDtrack *track,  const AliMCEvent *mcEvent);
+  void FillHistogramsKfDca(const AliESDEvent * const esdEvent,  const AliESDtrack *const track,  const AliMCEvent *const mcEvent);
 
-  void FillHistogramsDataDca(AliESDEvent *esdEvent,  AliESDtrack *track, AliESDVertex *vtxESDSkip);
-  void FillHistogramsDataVtx(AliESDEvent *esdEvent);
-  void FillHistogramsDataPid(AliESDtrack *track);
+  void FillHistogramsDataDca(const AliESDEvent * const esdEvent,  const AliESDtrack * const track, const AliESDVertex * const vtxESDSkip);
+  void FillHistogramsDataVtx(const AliESDEvent * const esdEvent);
+  void FillHistogramsDataPid(const AliESDtrack * const track);
 
-  void FillHistogramsHfeDca(AliESDEvent *esdEvent,  AliESDtrack *track,  AliMCEvent *mcEvent);
-  void FillHistogramsHfeDataDca(AliESDEvent *esdEvent,AliESDtrack *track,AliESDVertex *vtxESDSkip);
+  void FillHistogramsHfeDca(const AliESDEvent *const esdEvent,  const AliESDtrack * const track,  const AliMCEvent * const mcEvent);
+  void FillHistogramsHfeDataDca(const AliESDEvent * const esdEvent, const AliESDtrack * const track, const AliESDVertex * const vtxESDSkip);
 
 
-  void ApplyExtraCuts(AliESDEvent * const esdEvent, Int_t nMinPrimVtxContributor);
+  void ApplyExtraCuts(const AliESDEvent * const esdEvent, Int_t nMinPrimVtxContributor);
 
   void PostAnalysis() const;
 
-  Int_t GetCombinedPid(AliESDtrack *track);
+  Int_t GetCombinedPid(const AliESDtrack * const track);
 
  private:   
 
index 221fb4f..e0a6326 100644 (file)
@@ -12,9 +12,6 @@
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */
-
 //
 // Class AliHFEdetPIDqa
 // Base class for detector PID QA describing the interface to the PID QA
index 844f34a..a210663 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIHFEDETPIDQA_H
-#define ALIHFEDETPIDQA_H
-
 /**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */ 
-
 //
 // Class AliHFEdetPIDqa
 // Base class for detector PID QA describing the interface to the PID QA
 // manager, keeping also commom functionality
 // More information can be found inside the implementation file
 //
+#ifndef ALIHFEDETPIDQA_H
+#define ALIHFEDETPIDQA_H
+
 #ifndef ROOT_TNamed
 #include <TNamed.h>
 #endif
index 57dbdcb..7875875 100644 (file)
@@ -12,9 +12,6 @@
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */
-
 //
 // Class for electrons from beauty study
 // Counting electrons from beauty
@@ -333,7 +330,7 @@ void AliHFEdisplacedElectrons::CreateOutputs(TList* const displacedList){
 
 
 //__________________________________________________________
-void AliHFEdisplacedElectrons::FillMcOutput(AliESDEvent *const fESD, AliMCEvent* const fMC, AliMCParticle* const mctrack)
+void AliHFEdisplacedElectrons::FillMcOutput(const AliESDEvent *const fESD, AliMCEvent* const fMC, const AliMCParticle* const mctrack)
 {
 
   // fill output
@@ -473,7 +470,7 @@ void AliHFEdisplacedElectrons::FillMcOutput(AliESDEvent *const fESD, AliMCEvent*
 
 
 //__________________________________________________________
-void AliHFEdisplacedElectrons::FillEsdOutput(AliESDEvent * const fESDEvent, AliESDtrack* const esdTrack, AliStack * const stack)
+void AliHFEdisplacedElectrons::FillEsdOutput(const AliESDEvent * const fESDEvent, AliESDtrack* const esdTrack, AliStack * const stack)
 {
   // after esd event selection, esd track cuts, and hfe pid 
   // this is the case for ESD tracks, with MC information
@@ -601,7 +598,7 @@ void AliHFEdisplacedElectrons::FillEsdOutput(AliESDEvent * const fESDEvent, AliE
 }
 
 //__________________________________________________________
-void AliHFEdisplacedElectrons::FillDataOutput(AliESDEvent * const fESDEvent, AliESDtrack* const esdTrack)
+void AliHFEdisplacedElectrons::FillDataOutput(const AliESDEvent * const fESDEvent, AliESDtrack* const esdTrack)
 {
   
   // this is pure data, without MC information at all
index d1e1d82..3583847 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIHFEDISPLACEDELECTRONS_H
-#define ALIHFEDISPLACEDELECTRONS_H
-
 /**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
@@ -15,9 +12,6 @@
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */ 
-
 //
 // Class for electrons from beauty study
 // Counting electrons from beauty
@@ -28,6 +22,9 @@
 //  Carlo Bombonati <Carlo.Bombonati@cern.ch>
 // 
 
+#ifndef ALIHFEDISPLACEDELECTRONS_H
+#define ALIHFEDISPLACEDELECTRONS_H
+
 #ifndef ROOT_TObject
 #include <TObject.h>
 #endif
@@ -81,9 +78,9 @@ class AliHFEdisplacedElectrons : public TObject{
   void InitAnalysis();  
   void CreateOutputs(TList* const displacedList);
 
-  void FillMcOutput(AliESDEvent* fESD, AliMCEvent* fMC, AliMCParticle* mctrack);
-  void FillEsdOutput(AliESDEvent* fESDEvent, AliESDtrack *track, AliStack *stack);
-  void FillDataOutput(AliESDEvent* fESDEvent, AliESDtrack *track);
+  void FillMcOutput(const AliESDEvent * const fESD, AliMCEvent * const fMC, const AliMCParticle * const mctrack);
+  void FillEsdOutput(const AliESDEvent * const fESDEvent, AliESDtrack * const track, AliStack *stack);
+  void FillDataOutput(const AliESDEvent * const fESDEvent, AliESDtrack * const track);
 
   Int_t GetMCpid(AliStack* stack, Int_t label) const;
 
index be977eb..ff2f53a 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIHFEEFFICIENCY_H
-#define ALIHFEEFFICIENCY_H
-
 /**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */ 
-
 //
 // Task for Efficiency studies
 // Used for testing classes AliHFEcontainer and AliHFEfilter
 // Creates Efficiency Histograms
 //
+#ifndef ALIHFEEFFICIENCY_H
+#define ALIHFEEFFICIENCY_H
+
 #include "AliAnalysisTaskSE.h"
 
 class TList;
index 20fa733..514b60f 100644 (file)
@@ -12,9 +12,6 @@
  * about the suitability of this software for any purpose. It is          *
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
-
-/* $Id$ */
-
 //
 //
 // First implementation of a class
@@ -62,7 +59,7 @@
 ClassImp(AliHFEelecbackground)
 
 Bool_t AliHFEelecbackground::fgUseMCPID = kFALSE;
-const Double_t    AliHFEelecbackground::fgkMe = 0.00051099892;
+
 
 //___________________________________________________________________________________________
 AliHFEelecbackground::AliHFEelecbackground():
@@ -1032,7 +1029,7 @@ void AliHFEelecbackground::CalculateMotherVariableR(AliESDtrack* const track, Al
   
 }
 //_________________________________________________________________________________
-void AliHFEelecbackground::FillOutput(Double_t *results, Double_t *resultsr, Int_t sign) 
+void AliHFEelecbackground::FillOutput(const Double_t *results, const Double_t *resultsr,Int_t sign) 
 {
   //
   // Fill the Data and MC THnSparseF 
@@ -1093,7 +1090,7 @@ void AliHFEelecbackground::FillOutput(Double_t *results, Double_t *resultsr, Int
  
 }    
 //_______________________________________________________________________________________________
-Bool_t AliHFEelecbackground::SingleTrackCut(AliESDtrack* const trackPart) const
+Bool_t AliHFEelecbackground::SingleTrackCut(const AliESDtrack* const trackPart) const
 {
   //
   // Return minimum quality for the partner
index d6a15ff..0fb9545 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIHFEELECBACKGROUND_H
-#define ALIHFEELECBACKGROUND_H
-
 /**************************************************************************
  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
  *                                                                        *
  * about the suitability of this software for any purpose. It is          *
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
-
-/* $Id$ */ 
-
 //
 //  Secondary vertexing construction Class
 //  Construct secondary vertex from Beauty hadron with electron and
 //  hadrons, then apply selection criteria
 //
 
+#ifndef ALIHFEELECBACKGROUND_H
+#define ALIHFEELECBACKGROUND_H
+
 #ifndef ROOT_TObject
 //#include <TObject.h>
 #endif
@@ -91,11 +88,11 @@ class AliHFEelecbackground : public TObject {
     TList *GetList()  const           { return fList; };
     TList *GetListPostProcess() const { return fListPostProcess; };
     
-    Bool_t SingleTrackCut(AliESDtrack* const trackPart) const;
+    Bool_t SingleTrackCut(const AliESDtrack* const trackPart) const;
     Bool_t ShareCluster(AliESDtrack * const track1,AliESDtrack * const track2); 
     Bool_t PIDTrackCut(AliESDtrack* const trackPart);
     void PairAnalysis(AliESDtrack* const track, AliESDtrack* const trackpart); 
-    void FillOutput(Double_t *results, Double_t *resultsr, Int_t sign); 
+    void FillOutput(const Double_t *results,const Double_t *resultsr, Int_t sign); 
     void PostProcess();
     void Plot() const;
     
@@ -149,8 +146,7 @@ class AliHFEelecbackground : public TObject {
     AliMCEvent*  fMCEvent;           //! MC event             
     Double_t fBz;                    // Magnetic field 
     const AliESDVertex *fkVertex;    //! Primary vertex
-    static const Double_t fgkMe;     //!  Mass of the electron
-    
+    static const Double_t fgkMe= 0.0005109989;     //!  Mass of the electron
     Double_t fPtESD;                 //! pt of tagged electron
     Int_t fIndexTrack;               //! index track
     Int_t fPdg;                      //! pdg code track 
diff --git a/PWG3/hfe/AliHFEemcalPIDqa.cxx b/PWG3/hfe/AliHFEemcalPIDqa.cxx
new file mode 100644 (file)
index 0000000..578f29e
--- /dev/null
@@ -0,0 +1,189 @@
+/**************************************************************************
+* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+*                                                                        *
+* Author: The ALICE Off-line Project.                                    *
+* Contributors are mentioned in the code where appropriate.              *
+*                                                                        *
+* Permission to use, copy, modify and distribute this software and its   *
+* documentation strictly for non-commercial purposes is hereby granted   *
+* without fee, provided that the above copyright notice appears in all   *
+* copies and that both the copyright notice and this permission notice   *
+* appear in the supporting documentation. The authors make no claims     *
+* about the suitability of this software for any purpose. It is          *
+* provided "as is" without express or implied warranty.                  *
+**************************************************************************/
+//
+// Class AliHFEemcalPIDqa
+//
+// Monitoring EMCAL PID in the HFE PID montioring framework. The following
+// quantities are monitored:
+//   TPC Signal distribution 
+// (Always as function of momentum, particle species and centrality 
+// before and after cut)
+// More information about the PID monitoring framework can be found in
+// AliHFEpidQAmanager.cxx and AliHFEdetPIDqa.cxx
+//
+// Author:
+//
+//   Shingo Sakai <ssakai@lbl.gov>
+#include <TClass.h>
+#include <TH2.h>
+#include <THnSparse.h>
+#include <TString.h>
+
+#include "AliLog.h"
+#include "AliPID.h"
+#include "AliVParticle.h"
+#include "AliVTrack.h"
+#include "AliESDtrack.h"
+#include "AliHFEcollection.h"
+#include "AliHFEpid.h"
+#include "AliHFEpidBase.h"
+#include "AliHFEpidQAmanager.h"
+#include "AliHFEpidTPC.h"
+#include "AliHFEpidEMCAL.h"
+#include "AliHFEtools.h"
+#include "AliHFEemcalPIDqa.h"
+
+ClassImp(AliHFEpidEMCAL)
+
+//_________________________________________________________
+AliHFEemcalPIDqa::AliHFEemcalPIDqa():
+    AliHFEdetPIDqa()
+  , fHistos(NULL)
+{
+  //
+  // Dummy constructor
+  //
+}
+
+//_________________________________________________________
+AliHFEemcalPIDqa::AliHFEemcalPIDqa(const char* name):
+    AliHFEdetPIDqa(name, "QA for EMCAL")
+  , fHistos(NULL)
+{
+  //
+  // Default constructor
+  //
+}
+
+//_________________________________________________________
+AliHFEemcalPIDqa::AliHFEemcalPIDqa(const AliHFEemcalPIDqa &o):
+    AliHFEdetPIDqa(o)
+  , fHistos()
+{
+  //
+  // Copy constructor
+  //
+  o.Copy(*this);
+}
+
+//_________________________________________________________
+AliHFEemcalPIDqa &AliHFEemcalPIDqa::operator=(const AliHFEemcalPIDqa &o){
+  //
+  // Do assignment
+  //
+  AliHFEdetPIDqa::operator=(o);
+  if(&o != this) o.Copy(*this);
+  return *this;
+}
+
+//_________________________________________________________
+AliHFEemcalPIDqa::~AliHFEemcalPIDqa(){
+  //
+  // Destructor
+  //
+  if(fHistos) delete fHistos;
+}
+
+//_________________________________________________________
+void AliHFEemcalPIDqa::Copy(TObject &o) const {
+  //
+  // Make copy
+  //
+  AliHFEemcalPIDqa &target = dynamic_cast<AliHFEemcalPIDqa &>(o);
+  if(target.fHistos){
+    delete target.fHistos;
+    target.fHistos = NULL;
+  }
+  if(fHistos) target.fHistos = new AliHFEcollection(*fHistos);
+}
+
+//_________________________________________________________
+Long64_t AliHFEemcalPIDqa::Merge(TCollection *coll){
+  //
+  // Merge with other objects
+  //
+  if(!coll) return 0;
+  if(coll->IsEmpty()) return 1;
+
+  TIter it(coll);
+  AliHFEemcalPIDqa *refQA = NULL;
+  TObject *o = NULL;
+  Long64_t count = 0;
+  TList listHistos;
+  while((o = it())){
+    refQA = dynamic_cast<AliHFEemcalPIDqa *>(o);
+    if(!refQA) continue;
+
+    listHistos.Add(refQA->fHistos);
+    count++; 
+  }
+  fHistos->Merge(&listHistos);
+  return count + 1;
+}
+
+//_________________________________________________________
+void AliHFEemcalPIDqa::Initialize(){
+  //
+  // Define Histograms
+  //
+
+  fHistos = new AliHFEcollection("emcalqahistos", "Collection of EMCAL QA histograms");
+
+  // Make common binning
+  const Int_t kCentralityBins = 11;
+  const Double_t kMinP = 0.;
+  const Double_t kMaxP = 20.;
+  const Double_t kTPCSigMim = 40.;
+  const Double_t kTPCSigMax = 140.;
+
+  // 1st histogram: TPC dEdx with/without EMCAL (p, pT, TPC Signal, Centrality)
+  Int_t nBins[4] = {20, 20, 400, kCentralityBins};
+  Double_t min[4] = {kMinP, kMinP, kTPCSigMim,  0};
+  Double_t max[4] = {kMaxP, kMaxP, kTPCSigMax,  11.};
+  fHistos->CreateTHnSparse("EMCAL_TPCdedx", "EMCAL signal; species; p [GeV/c]; pT [GeV/c] ; TPC signal [a.u.]; Centrality", 4, nBins, min, max);
+  
+}
+
+//_________________________________________________________
+void AliHFEemcalPIDqa::ProcessTrack(const AliHFEpidObject *track,AliHFEdetPIDqa::EStep_t /*step*/){
+  //
+  // Fill TPC histograms
+  //
+  //AliHFEpidObject::AnalysisType_t anatype = track->IsESDanalysis() ? AliHFEpidObject::kESDanalysis : AliHFEpidObject::kAODanalysis;
+  Float_t centrality = track->GetCentrality();
+
+  const AliVTrack *vtrack = dynamic_cast<const AliVTrack *>(track->GetRecTrack());
+  const AliESDtrack *esdtrack = dynamic_cast<const AliESDtrack *>(vtrack);
+
+  Double_t contentSignal[4];
+  contentSignal[0] = track->GetRecTrack()->P();
+  contentSignal[1] = track->GetRecTrack()->Pt();
+  contentSignal[2] = esdtrack->GetTPCsignal(); //?
+  contentSignal[3] = centrality;
+  //printf("ProcessTrack ; Print Content %g; %g; %g; %g \n",contentSignal[0],contentSignal[1],contentSignal[2],contentSignal[3]); 
+  fHistos->Fill("EMCAL_TPCdedx", contentSignal);
+}
+
+//_________________________________________________________
+TH1 *AliHFEemcalPIDqa::GetHistogram(const char *name){
+  // 
+  // Get the histogram
+  //
+  if(!fHistos) return NULL;
+  TObject *histo = fHistos->Get(name);
+  if(!histo->InheritsFrom("TH1")) return NULL;
+  return dynamic_cast<TH1 *>(histo);
+}
+
diff --git a/PWG3/hfe/AliHFEemcalPIDqa.h b/PWG3/hfe/AliHFEemcalPIDqa.h
new file mode 100644 (file)
index 0000000..1b3df4e
--- /dev/null
@@ -0,0 +1,60 @@
+/**************************************************************************
+* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+*                                                                        *
+* Author: The ALICE Off-line Project.                                    *
+* Contributors are mentioned in the code where appropriate.              *
+*                                                                        *
+* Permission to use, copy, modify and distribute this software and its   *
+* documentation strictly for non-commercial purposes is hereby granted   *
+* without fee, provided that the above copyright notice appears in all   *
+* copies and that both the copyright notice and this permission notice   *
+* appear in the supporting documentation. The authors make no claims     *
+* about the suitability of this software for any purpose. It is          *
+* provided "as is" without express or implied warranty.                  *
+**************************************************************************/
+//
+// Class AliHFEemcalPIDqa
+// Monitoring EMCAL PID in the HFE PID montioring framework
+// More information can be found inside the implementation file
+//
+#ifndef ALIHFEEMCALPIDQA_H
+#define ALIHFEEMCALPIDQA_H
+
+#ifndef ALIHFEDETPIDQA_H
+#include "AliHFEdetPIDqa.h"
+#endif
+
+class TH1;
+class TH2;
+class AliHFEcollection;
+class AliHFEpidObject;
+class AliESDtrack;
+class AliAODTrack;
+
+class AliHFEemcalPIDqa : public AliHFEdetPIDqa{
+  public:
+    AliHFEemcalPIDqa();
+    AliHFEemcalPIDqa(const char*name);
+    AliHFEemcalPIDqa(const AliHFEemcalPIDqa &o);
+    AliHFEemcalPIDqa &operator=(const AliHFEemcalPIDqa &o);
+    ~AliHFEemcalPIDqa();
+    void Copy(TObject &o) const;
+    virtual Long64_t Merge(TCollection *col);
+  
+    virtual void Initialize();
+    virtual void ProcessTrack(const AliHFEpidObject *track, AliHFEdetPIDqa::EStep_t step);
+
+    //void HistEnergyMomMatch(double pT, double eop);
+    void HistEnergyMomMatch(const AliHFEpidObject *track, double eop);
+    TH1 *GetHistogram(const char *name); 
+    AliHFEcollection *GetHistoCollection() const { return fHistos; }
+
+  protected:
+    void ProcessESDtrack(const AliESDtrack *track, AliHFEdetPIDqa::EStep_t step, Int_t species);
+    void ProcessAODtrack(const AliAODTrack *track, AliHFEdetPIDqa::EStep_t step, Int_t species);
+  private:
+    AliHFEcollection *fHistos;        // Container for Histograms
+
+    ClassDef(AliHFEemcalPIDqa, 1);
+};
+#endif
index ff24116..ff0e697 100644 (file)
@@ -12,9 +12,6 @@
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */
-
 //
 // Extra cuts implemented by the ALICE Heavy Flavour Electron Group
 // Cuts stored here:
@@ -61,6 +58,7 @@ AliHFEextraCuts::AliHFEextraCuts(const Char_t *name, const Char_t *title):
   fMinTrackletsTRD(0),
   fPixelITS(0),
   fTOFpid(kFALSE),
+  fTOFmismatch(kFALSE),
   fTPCclusterDef(0),
   fTPCclusterRatioDef(0),
   fCheck(kFALSE),
@@ -71,6 +69,7 @@ AliHFEextraCuts::AliHFEextraCuts(const Char_t *name, const Char_t *title):
   // Default Constructor
   //
   memset(fImpactParamCut, 0, sizeof(Float_t) * 4);
+  memset(fIPcutParam, 0, sizeof(Float_t) * 4);
 }
 
 //______________________________________________________
@@ -84,6 +83,7 @@ AliHFEextraCuts::AliHFEextraCuts(const AliHFEextraCuts &c):
   fMinTrackletsTRD(c.fMinTrackletsTRD),
   fPixelITS(c.fPixelITS),
   fTOFpid(c.fTOFpid),
+  fTOFmismatch(c.fTOFmismatch),
   fTPCclusterDef(c.fTPCclusterDef),
   fTPCclusterRatioDef(c.fTPCclusterRatioDef),
   fCheck(c.fCheck),
@@ -95,6 +95,7 @@ AliHFEextraCuts::AliHFEextraCuts(const AliHFEextraCuts &c):
   // Performs a deep copy
   //
   memcpy(fImpactParamCut, c.fImpactParamCut, sizeof(Float_t) * 4);
+  memcpy(fIPcutParam, c.fIPcutParam, sizeof(Float_t) * 4);
   if(IsQAOn()){
     fIsQAOn = kTRUE;
     fQAlist = dynamic_cast<TList *>(c.fQAlist->Clone());
@@ -119,9 +120,11 @@ AliHFEextraCuts &AliHFEextraCuts::operator=(const AliHFEextraCuts &c){
     fTPCclusterDef = c.fTPCclusterDef;
     fTPCclusterRatioDef = c.fTPCclusterRatioDef;
     fTOFpid = c.fTOFpid;
+    fTOFmismatch = c.fTOFmismatch;
     fCheck = c.fCheck;
     fDebugLevel = c.fDebugLevel;
     memcpy(fImpactParamCut, c.fImpactParamCut, sizeof(Float_t) * 4);
+    memcpy(fIPcutParam, c.fIPcutParam, sizeof(Float_t) * 4);
     if(IsQAOn()){
       fIsQAOn = kTRUE;
       fQAlist = dynamic_cast<TList *>(c.fQAlist->Clone());
@@ -186,6 +189,7 @@ Bool_t AliHFEextraCuts::CheckRecCuts(AliVTrack *track){
   Double_t hfeimpactR, hfeimpactnsigmaR;
   Double_t hfeimpactRcut, hfeimpactnsigmaRcut;
   Bool_t tofstep = kTRUE;
+  Bool_t tofmismatchstep = kTRUE;
   GetImpactParameters(track, impactR, impactZ);
   if(TESTBIT(fRequirements, kMinHFEImpactParamR) || TESTBIT(fRequirements, kMinHFEImpactParamNsigmaR)){
     // Protection for PbPb
@@ -289,7 +293,16 @@ Bool_t AliHFEextraCuts::CheckRecCuts(AliVTrack *track){
     if(track->GetStatus() & AliESDtrack::kTOFpid) tofstep = kTRUE;
   
   }
-  if(fRequirements == survivedCut && tofstep){
+
+  if(fTOFmismatch){
+    // cut on TOF mismatch
+    tofmismatchstep = kFALSE;
+    if(!(track->GetStatus() & AliESDtrack::kTOFmismatch)) tofmismatchstep = kTRUE;
+  
+  }
+
+
+  if(fRequirements == survivedCut && tofstep && tofmismatchstep){
     //
     // Track selected
     //
@@ -640,9 +653,7 @@ void AliHFEextraCuts::GetHFEImpactParameterCuts(AliVTrack *track, Double_t &hfei
     AliESDtrack *esdtrack = dynamic_cast<AliESDtrack *>(track);
     if(!esdtrack) return;
     Double_t pt = esdtrack->Pt();      
-    //hfeimpactRcut=0.0064+0.078*exp(-0.56*pt);  // used Carlo's old parameter 
-    hfeimpactRcut=0.011+0.077*exp(-0.65*pt); // used Carlo's new parameter
-    hfeimpactnsigmaRcut=3; // 3 sigma trail cut
+    hfeimpactRcut = fIPcutParam[0]+fIPcutParam[1]*exp(fIPcutParam[2]*pt);  // abs R cut
+    hfeimpactnsigmaRcut = fIPcutParam[3];                                  // sigma cut
   }
 }
-
index 57699b5..d86fd19 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIHFEEXTRACUTS_H
-#define ALIHFEEXTRACUTS_H
-
 /**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */ 
-
 //
 // Extra Cuts from the ALICE HFE Group
 // Container for cuts which are currently not implemented by
 // the Correction Framework
 //
+#ifndef ALIHFEEXTRACUTS_H
+#define ALIHFEEXTRACUTS_H
 
 // #ifndef ALICFCUTBASE_H
 #include "AliCFCutBase.h"
@@ -69,11 +65,11 @@ class AliHFEextraCuts : public AliCFCutBase{
     inline void SetMaxImpactParamR(Double_t impactParam);
     inline void SetMinImpactParamZ(Double_t impactParam);
     inline void SetMaxImpactParamZ(Double_t impactParam);
-    inline void SetMinHFEImpactParamR();
-    inline void SetMinHFEImpactParamNsigmaR();
+    inline void SetMinHFEImpactParamR(Float_t ipcutParam[4], Bool_t issigmacut);
     inline void SetMinTrackletsTRD(Int_t minTracklets);
     inline void SetMinNClustersTPC(Int_t minclusters, ETPCclusterDef_t def);
     void SetTOFPID(Bool_t tofPid) { fTOFpid = tofPid;}
+    void SetTOFMISMATCH(Bool_t tofMismatch) { fTOFmismatch = tofMismatch;}
 
     void SetCheckITSstatus(Bool_t check) { fCheck = check; };
     Bool_t GetCheckITSstatus() const { return fCheck; };
@@ -125,11 +121,13 @@ class AliHFEextraCuts : public AliCFCutBase{
     ULong64_t fCutCorrelation;             // Cut Correlation
     ULong64_t fRequirements;                 // Cut Requirements
     Float_t fImpactParamCut[4];                    // Impact Parmameter Cut
+    Float_t fIPcutParam[4];                    // Parmameter of impact parameter cut parametrization
     UInt_t fMinNClustersTPC;          // Minimum TPC clusters cut
     Float_t fClusterRatioTPC;                // Ratio of findable vs. found clusters in TPC
     UChar_t fMinTrackletsTRD;                // Min. Number of Tracklets inside TRD
     UChar_t fPixelITS;                // Cut on ITS Pixels
     Bool_t  fTOFpid;                  // TOF pid
+    Bool_t  fTOFmismatch;             // TOF mismatch
     UChar_t fTPCclusterDef;           // TPC cluster definition Bitmap
     UChar_t fTPCclusterRatioDef;      // TPC cluster ratio definition Bitmap
 
@@ -178,13 +176,13 @@ void AliHFEextraCuts::SetMaxImpactParamZ(Double_t impactParam){
 }
 
 //__________________________________________________________
-void AliHFEextraCuts::SetMinHFEImpactParamR(){
-  SETBIT(fRequirements, kMinHFEImpactParamR);
-}
-
-//__________________________________________________________
-void AliHFEextraCuts::SetMinHFEImpactParamNsigmaR(){
-  SETBIT(fRequirements, kMinHFEImpactParamNsigmaR);
+void AliHFEextraCuts::SetMinHFEImpactParamR(Float_t ipcutParam[4], Bool_t isSigmacut){
+  if(isSigmacut) SETBIT(fRequirements, kMinHFEImpactParamNsigmaR);
+  else SETBIT(fRequirements, kMinHFEImpactParamR);
+  fIPcutParam[0]=ipcutParam[0];
+  fIPcutParam[1]=ipcutParam[1];
+  fIPcutParam[2]=ipcutParam[2];
+  fIPcutParam[3]=ipcutParam[3];
 }
 
 //__________________________________________________________
diff --git a/PWG3/hfe/AliHFEextraEventCuts.cxx b/PWG3/hfe/AliHFEextraEventCuts.cxx
new file mode 100644 (file)
index 0000000..1e59d4c
--- /dev/null
@@ -0,0 +1,342 @@
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+// Cut on the Event at reconstructed level: for the moment 
+// the requirements on the number of charged tracks and on 
+// the vertex position and resolution are implemented
+// The argument of IsSelected member function (passed object) is cast into 
+// an AliESDEvent. In the future may be modified to use AliVEvent interface
+// and include more cut variables.
+// The class derives from AliCFCutBase
+// Author:S.Arcelli Silvia.Arcelli@cern.ch
+//
+//
+#include "TH1F.h"
+#include "TList.h"
+#include "TBits.h"
+#include "AliLog.h"
+#include "AliESDEvent.h"
+#include "AliESDVertex.h"
+#include "AliHFEextraEventCuts.h"
+ClassImp(AliHFEextraEventCuts) 
+//____________________________________________________________________
+AliHFEextraEventCuts::AliHFEextraEventCuts() : 
+  AliCFCutBase(),
+  fRequireVtxCuts(kFALSE),
+  fVtxZMax(1.e99),
+  fVtxZMin(-1.e99),
+  fVtxNCtrbMin(0),
+  fVtxMixed(0),
+  fBitMap(0x0)
+{
+  //
+  //ctor
+  //
+}
+
+//____________________________________________________________________
+AliHFEextraEventCuts::AliHFEextraEventCuts(Char_t* name, Char_t* title) : 
+  AliCFCutBase(name,title),
+  fRequireVtxCuts(kFALSE),
+  fVtxZMax(1.e99),
+  fVtxZMin(-1.e99),
+  fVtxNCtrbMin(0),
+  fVtxMixed(0),
+  fBitMap(0x0)
+ {
+  //
+  //ctor
+  //
+  fBitMap=new TBits(0);
+  Initialise();
+ }
+
+//____________________________________________________________________
+AliHFEextraEventCuts::AliHFEextraEventCuts(const AliHFEextraEventCuts& c) : 
+  AliCFCutBase(c),
+  fRequireVtxCuts(c.fRequireVtxCuts),
+  fVtxZMax(c.fVtxZMax),
+  fVtxZMin(c.fVtxZMin),
+  fVtxNCtrbMin(c.fVtxNCtrbMin),
+  fVtxMixed(c.fVtxMixed),
+  fBitMap(c.fBitMap)
+{
+  //
+  //copy constructor
+  //
+  for (Int_t i=0; i<c.kNCuts; i++){
+    for (Int_t j=0; j<c.kNStepQA; j++){
+      if(c.fhQA[i][j]) fhQA[i][j] = (TH1F*)c.fhQA[i][j]->Clone();
+    }
+  }
+
+}
+
+//____________________________________________________________________
+AliHFEextraEventCuts::~AliHFEextraEventCuts() {
+  //
+  //dtor
+  //
+
+  for (Int_t i=0; i<kNCuts; i++){
+    for (Int_t j=0; j<kNStepQA; j++){
+      if(fhQA[i][j]) delete fhQA[i][j];
+    }
+  }
+
+  if(fBitMap)delete fBitMap;
+
+}
+//_____________________________________________________________________________
+void AliHFEextraEventCuts::Initialise()
+{
+
+  //
+  //initialization
+  //
+
+  //
+  // sets pointers to histos to zero
+  //
+
+  for(Int_t i=0; i<kNCuts; i++){
+    for(Int_t j =0; j<kNStepQA; j++){
+      fhQA[i][j]=0x0;
+    }
+  }
+}
+
+//____________________________________________________________________
+AliHFEextraEventCuts& AliHFEextraEventCuts::operator=(const AliHFEextraEventCuts& c)
+{
+  //
+  // Assignment operator
+  //
+  if (this != &c) {
+    AliCFCutBase::operator=(c) ;
+    fRequireVtxCuts=c.fRequireVtxCuts;
+    fVtxZMax=c.fVtxZMax;
+    fVtxZMin=c.fVtxZMin;
+    fVtxNCtrbMin=c.fVtxNCtrbMin;
+    fVtxMixed=c.fVtxMixed;
+    fBitMap=c.fBitMap;
+  }
+
+  for (Int_t i=0; i<c.kNCuts; i++){
+    for (Int_t j=0; j<c.kNStepQA; j++){
+      if(c.fhQA[i][j]) fhQA[i][j] = (TH1F*)c.fhQA[i][j]->Clone();
+    }
+  }
+
+
+  return *this ;
+}
+
+//____________________________________________________________________
+Bool_t AliHFEextraEventCuts::IsSelected(TObject* obj) {
+  //
+  //Check if the requested cuts are passed
+  //
+
+
+  SelectionBitMap(obj);
+
+  if (fIsQAOn) FillHistograms(obj,0);
+  Bool_t isSelected = kTRUE;
+
+  for (UInt_t icut=0; icut<fBitMap->GetNbits();icut++)
+       if(!fBitMap->TestBitNumber(icut)) isSelected = kFALSE;
+
+  if (!isSelected) return kFALSE ;
+  if (fIsQAOn) FillHistograms(obj,1);
+  return kTRUE;
+
+}
+//____________________________________________________________________
+void AliHFEextraEventCuts::SelectionBitMap(TObject* obj) {
+  //
+  //cut on the number of charged tracks and on the event vertex.
+  //so far specific to AliESDEvents
+  //
+
+  //Check if the requested cuts are passed and return a bitmap
+  for(Int_t j=0;j<kNCuts;j++)fBitMap->SetBitNumber(j,kFALSE);
+  AliESDEvent* esd = dynamic_cast<AliESDEvent *>(obj);
+  if ( !esd ) return;
+
+  //now start checking the cuts,
+  //first assume the event will be accepted: 
+  for(Int_t j=0;j<kNCuts;j++)fBitMap->SetBitNumber(j,kTRUE);
+
+
+  
+  if(fRequireVtxCuts){
+    const AliESDVertex* vtxESD = 0x0;
+    if      (fVtxMixed) {
+      vtxESD = esd->GetPrimaryVertexTracks() ;
+      if((!vtxESD) || (vtxESD->GetNContributors() <= 0)) {
+       vtxESD = esd->GetPrimaryVertexSPD() ;
+       if((!vtxESD) || (vtxESD->GetNContributors() <= 0)) {
+         for(Int_t j=1;j<kNCuts;j++)fBitMap->SetBitNumber(j,kFALSE); 
+         AliWarning("Cannot get vertex, skipping event");
+         return;
+       }
+      }
+    }
+    else {   
+      vtxESD = esd->GetPrimaryVertexTracks() ;
+    }
+
+    if(!vtxESD){
+      for(Int_t j=1;j<kNCuts;j++)fBitMap->SetBitNumber(j,kFALSE); 
+      AliWarning("Cannot get vertex, skipping event");
+      return;
+    }
+    
+    // Pick up the position and uncertainties
+    vtxESD = esd->GetPrimaryVertex();
+    if(!vtxESD){
+      for(Int_t j=1;j<kNCuts;j++)fBitMap->SetBitNumber(j,kFALSE); 
+      AliWarning("Cannot get vertex, skipping event");
+      return;
+    }
+    Double_t vtxPos[3];
+    vtxPos[0] = vtxESD->GetXv();
+    vtxPos[1] = vtxESD->GetYv();
+    vtxPos[2] = vtxESD->GetZv();
+    
+    Int_t nCtrb = vtxESD->GetNContributors();
+
+    // Apply the cut
+    
+    if (vtxPos[2]>fVtxZMax || vtxPos[2]<fVtxZMin)
+      fBitMap->SetBitNumber(0,kFALSE); 
+    if (nCtrb<fVtxNCtrbMin)
+      fBitMap->SetBitNumber(1,kFALSE);
+
+  }  
+  return;
+}
+
+//_____________________________________________________________________________
+void AliHFEextraEventCuts::FillHistograms(TObject* obj, Bool_t b)
+{
+  //
+  // fill the QA histograms
+  //
+
+  if(!fIsQAOn) return;
+  // cast TObject into VParticle
+  AliESDEvent* esd = dynamic_cast<AliESDEvent *>(obj);
+  if (!esd ) return  ;
+
+  // index = 0: fill histograms before cuts
+  // index = 1: fill histograms after cuts
+  Int_t index = -1;
+  index = ((b) ? 1 : 0);
+
+
+  //look at vertex parameters:
+  const AliESDVertex* vtxESD = 0x0;
+  if      (fVtxMixed) {
+    vtxESD = esd->GetPrimaryVertexTracks() ;
+    if((!vtxESD) || (vtxESD->GetNContributors() <= 0)) {
+      vtxESD = esd->GetPrimaryVertexSPD() ;
+      if((!vtxESD) || (vtxESD->GetNContributors() <= 0)) {
+       return;
+      }
+    }
+  }
+  else {   
+    vtxESD = esd->GetPrimaryVertexTracks() ;
+  }
+  if(!vtxESD)return;
+  // vertex position and uncertainties
+  fhQA[kVtxPosZ] [index]->Fill(vtxESD->GetZv());
+  fhQA[kVtxNCtrb][index]->Fill(vtxESD->GetNContributors());
+  
+}
+
+//____________________________________________________________________
+void AliHFEextraEventCuts::SetHistogramBins(Int_t index, Int_t nbins, Double_t *bins)
+{
+  //
+  //setting x-axis bin limits of QA histogram fhQA[index] 
+  // 
+
+  for(Int_t i=0;i<kNStepQA;i++){
+    if(!fhQA[index][i]){AliWarning("non-existing histogram!");
+    return;
+    }
+    fhQA[index][i]->GetXaxis()->Set(nbins,bins);
+  }
+}
+//____________________________________________________________________
+void AliHFEextraEventCuts::SetHistogramBins(Int_t index, Int_t nbins, Double_t xmin, Double_t xmax)
+{
+  //
+  //setting x-axis bins and range of QA histogram fhQA[index] 
+  // 
+
+  for(Int_t i=0;i<kNStepQA;i++){
+    if(!fhQA[index][i]){AliWarning("non-existing histogram!");
+    return;
+    }
+    fhQA[index][i]->GetXaxis()->Set(nbins,xmin,xmax);
+  }
+}
+
+//_____________________________________________________________________________
+ void AliHFEextraEventCuts::DefineHistograms() {
+  //
+  // histograms for cut variables
+  //
+  Int_t color = 2;
+
+  if(!fIsQAOn) {
+    AliInfo(Form("No QA histos requested, Please first set the QA flag on!"));
+    return;
+  }  
+  
+  // book QA histograms
+
+  Char_t str[5];
+  for (Int_t i=0; i<kNStepQA; i++) {
+    if (i==0) snprintf(str,5," ");
+    else snprintf(str,5,"_cut");
+
+    fhQA[kVtxPosZ][i]  = new  TH1F(Form("%s_Vtx_Pos_Z%s",GetName(),str),               "",200,-50.,50.);
+    fhQA[kVtxNCtrb][i] = new  TH1F(Form("%s_Vtx_N_Ctrb%s",GetName(),str),              "",1000,0.,1000.);
+    fhQA[kVtxPosZ][i]  ->SetXTitle("Vertex Position Z (cm)");
+    fhQA[kVtxNCtrb][i] ->SetXTitle("Number of contributors");
+  }
+
+  for(Int_t i=0; i<kNCuts; i++) fhQA[i][1]->SetLineColor(color);
+
+}
+
+//_____________________________________________________________________________
+void AliHFEextraEventCuts::AddQAHistograms(TList *qaList) {
+  //
+  // saves the histograms in a TList
+  //
+
+  DefineHistograms();
+
+  for (Int_t j=0; j<kNStepQA; j++) {
+    for(Int_t i=0; i<kNCuts; i++)
+       qaList->Add(fhQA[i][j]);
+  }
+}
diff --git a/PWG3/hfe/AliHFEextraEventCuts.h b/PWG3/hfe/AliHFEextraEventCuts.h
new file mode 100644 (file)
index 0000000..96b4689
--- /dev/null
@@ -0,0 +1,82 @@
+#ifndef ALIHFEEXTRAEVENTCUTS_H
+#define ALIHFEEXTRAEVENTCUTS_H
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+// Cut on the Event at reconstructed level: for the moment 
+// just the requirements on the number of charged tracks and on 
+// the vertex position and resolution are implemented
+// The argument of IsSelected member function (passed object) is cast into 
+// an AliESDEvent. In the future may be modified to use AliVEvent interface
+// and include more cut variables.
+// The class derives from AliCFCutBase
+// Author:R.Bailhache
+
+
+#include "AliCFCutBase.h"
+class TH1F;
+class TBits;
+//_____________________________________________________________________________
+class AliHFEextraEventCuts: public AliCFCutBase 
+{
+ public :
+  AliHFEextraEventCuts() ;
+  AliHFEextraEventCuts(Char_t* name, Char_t* title) ;
+  AliHFEextraEventCuts(const AliHFEextraEventCuts& c) ;
+  AliHFEextraEventCuts& operator=(const AliHFEextraEventCuts& c) ;
+  ~AliHFEextraEventCuts();
+  Bool_t IsSelected(TObject* obj);
+  Bool_t IsSelected(TList* /*list*/) {return kTRUE;}
+
+  void SetRequireVtxCuts(Bool_t vtx=kFALSE) {fRequireVtxCuts=vtx;} // cut values setter
+  void SetVertexZCut(Double_t zMin=-1.e99, Double_t zMax=1.e99) { fVtxZMin=zMin; fVtxZMax=zMax;} // cut values setter
+
+  void SetVertexNContributors(Int_t min) {fVtxNCtrbMin=min;}
+  void SetUseMixedVertex() {fVtxMixed=kTRUE ;} //default is vertex from tracks
+  Bool_t   GetRequireVtxCuts() const {return fRequireVtxCuts;} // cut value getter
+  Double_t GetVertexZMax() const {return fVtxZMax;} // cut values getter
+  Double_t GetVertexZMin() const {return fVtxZMin;} // cut values getter
+  
+  // QA histogram setter
+  // please use indices from the enumeration below
+  void SetHistogramBins(Int_t index, Int_t nbins, Double_t *bins);
+  void SetHistogramBins(Int_t index, Int_t nbins, Double_t xmin, Double_t xmax);
+  enum{kVtxPosZ,
+       kVtxNCtrb,
+       kNCuts,
+       kNStepQA=2
+  };
+  
+ protected:
+  void SelectionBitMap(TObject* obj);
+  void AddQAHistograms(TList *qaList) ;
+  void DefineHistograms();             // books histograms 
+  void Initialise();                   // sets everything to 0
+  void FillHistograms(TObject* obj, Bool_t b);
+
+  Bool_t fRequireVtxCuts ; //The type of trigger to be checked
+  Double_t fVtxZMax ; //Z vertex position, maximum value
+  Double_t fVtxZMin ; //Z vertex position, minimum value
+  Int_t    fVtxNCtrbMin; //Min number of contributors to vertex
+  Bool_t   fVtxMixed;  //Flag for use of mixed vertex (primary vertex with track, if not SPD vertex)
+  TBits *fBitMap ; //cut mask
+
+  TH1F* fhQA[kNCuts][kNStepQA];                // QA Histograms
+
+  ClassDef(AliHFEextraEventCuts,3);
+};
+
+#endif
index d91ebdd..8aa8b7e 100644 (file)
 #include <AliMCEvent.h>
 #include <AliGenEventHeader.h>
 #include <AliAODMCParticle.h>
+#include <AliStack.h>
 
 #include "AliHFEmcQA.h"
 #include "AliHFEtools.h"
+#include "AliHFEcollection.h"
 
-const Int_t AliHFEmcQA::fgkGluon=21;
-const Int_t AliHFEmcQA::fgkMaxGener=10;
-const Int_t AliHFEmcQA::fgkMaxIter=100;
-const Int_t AliHFEmcQA::fgkqType = 7;    // number of species waiting for QA done
 
 ClassImp(AliHFEmcQA)
 
@@ -54,6 +52,7 @@ AliHFEmcQA::AliHFEmcQA() :
         ,fMCHeader(NULL)
         ,fMCArray(NULL)
         ,fQAhistos(NULL)
+        ,fMCQACollection(NULL)
         ,fNparents(0) 
 {
         // Default constructor
@@ -76,6 +75,7 @@ AliHFEmcQA::AliHFEmcQA(const AliHFEmcQA&p):
         ,fMCHeader(NULL)
         ,fMCArray(NULL)
         ,fQAhistos(p.fQAhistos)
+        ,fMCQACollection(p.fMCQACollection)
         ,fNparents(p.fNparents) 
 {
         // Copy constructor
@@ -161,8 +161,9 @@ void AliHFEmcQA::CreatDefaultHistograms(TList * const qaList)
   kDspecies[8]="423";
 
   const Double_t kPtbound[2] = {0.1, 20.}; //bin taken for considering inclusive e analysis binning
-  Int_t iBin[1];
+  Int_t iBin[2];
   iBin[0] = 44; // bins in pt
+  iBin[1] = 23; // bins in pt
   Double_t* binEdges[1];
   binEdges[0] =  AliHFEtools::MakeLogarithmicBinning(iBin[0], kPtbound[0], kPtbound[1]);
 
@@ -179,6 +180,32 @@ void AliHFEmcQA::CreatDefaultHistograms(TList * const qaList)
      if(fQAhistos) fQAhistos->Add(fhDLogbin[iDmeson]);
   }
 
+  const Double_t kPtRange[24] = {0.,0.3,0.4,0.5,0.6,0.8,1.,1.2,1.4,1.6,1.8,2.,2.2,2.4,2.6,2.8,3.,3.5,4.,5.,6.,7.,20.,30.}; // to cope with Ana's bin
+
+  fMCQACollection = new AliHFEcollection("TaskMCQA", "MC QA histos for meason pt spectra");
+  fMCQACollection->CreateTH1Farray("pionspectra", "pion yields: MC p_{t} ", iBin[1],kPtRange);
+  fMCQACollection->CreateTH1Farray("etaspectra", "eta yields: MC p_{t} ", iBin[1],kPtRange);
+  fMCQACollection->CreateTH1Farray("omegaspectra", "omega yields: MC p_{t} ", iBin[1],kPtRange);
+  fMCQACollection->CreateTH1Farray("phispectra", "phi yields: MC p_{t} ", iBin[1],kPtRange);
+  fMCQACollection->CreateTH1Farray("etapspectra", "etap yields: MC p_{t} ", iBin[1],kPtRange);
+  fMCQACollection->CreateTH1Farray("rhospectra", "rho yields: MC p_{t} ", iBin[1],kPtRange);
+
+  fMCQACollection->CreateTH1F("pionspectraLog", "pion yields: MC p_{t} ", iBin[0],kPtbound[0], kPtbound[1], 1);
+  fMCQACollection->CreateTH1F("etaspectraLog", "eta yields: MC p_{t} ", iBin[0],kPtbound[0], kPtbound[1], 1);
+  fMCQACollection->CreateTH1F("omegaspectraLog", "omega yields: MC p_{t} ", iBin[0],kPtbound[0], kPtbound[1], 1);
+  fMCQACollection->CreateTH1F("phispectraLog", "phi yields: MC p_{t} ", iBin[0],kPtbound[0], kPtbound[1], 1);
+  fMCQACollection->CreateTH1F("etapspectraLog", "etap yields: MC p_{t} ", iBin[0],kPtbound[0], kPtbound[1], 1);
+  fMCQACollection->CreateTH1F("rhospectraLog", "rho yields: MC p_{t} ", iBin[0],kPtbound[0], kPtbound[1], 1);
+
+  fMCQACollection->CreateTH1F("piondaughters", "pion yields: MC p_{t} ", iBin[0],kPtbound[0], kPtbound[1], 1);
+  fMCQACollection->CreateTH1F("etadaughters", "eta yields: MC p_{t} ", iBin[0],kPtbound[0], kPtbound[1], 1);
+  fMCQACollection->CreateTH1F("omegadaughters", "omega yields: MC p_{t} ", iBin[0],kPtbound[0], kPtbound[1], 1);
+  fMCQACollection->CreateTH1F("phidaughters", "phi yields: MC p_{t} ", iBin[0],kPtbound[0], kPtbound[1], 1);
+  fMCQACollection->CreateTH1F("etapdaughters", "etap yields: MC p_{t} ", iBin[0],kPtbound[0], kPtbound[1], 1);
+  fMCQACollection->CreateTH1F("rhodaughters", "rho yields: MC p_{t} ", iBin[0],kPtbound[0], kPtbound[1], 1);
+
+  fQAhistos->Add(fMCQACollection->GetList());
+
 }
   
 //__________________________________________
@@ -221,7 +248,13 @@ void AliHFEmcQA::CreateHistograms(const Int_t kquark, Int_t icut, TString hnopt)
   iBin[0] = 44; // bins in pt
   Double_t* binEdges[1];
   binEdges[0] =  AliHFEtools::MakeLogarithmicBinning(iBin[0], kPtbound[0], kPtbound[1]);
-  
+
+
+  Double_t xcorrbin[201];
+  for (int icorrbin = 0; icorrbin< 201; icorrbin++){
+    xcorrbin[icorrbin]=icorrbin*0.1;
+  }
+
   TString hname; 
   if(kquark == kOthers){
     for (Int_t iqType = 0; iqType < 4; iqType++ ){
@@ -242,8 +275,9 @@ void AliHFEmcQA::CreateHistograms(const Int_t kquark, Int_t icut, TString hnopt)
      hname = hnopt+"PdgCode_"+kqTypeLabel[iqType];
      fHist[iq][iqType][icut].fPdgCode = new TH1F(hname,hname,20001,-10000.5,10000.5);
      hname = hnopt+"Pt_"+kqTypeLabel[iqType];
-     //fHist[iq][iqType][icut].fPt = new TH1F(hname,hname+";p_{T} (GeV/c)",iBin[0],binEdges[0]);
-     fHist[iq][iqType][icut].fPt = new TH1F(hname,hname+";p_{T} (GeV/c)",60,0.25,30.25); // mj to compare with FONLL
+     fHist[iq][iqType][icut].fPt = new TH1F(hname,hname+";p_{T} (GeV/c)",iBin[0],binEdges[0]);
+     //fHist[iq][iqType][icut].fPt = new TH1F(hname,hname+";p_{T} (GeV/c)",60,0.,30.); // mj to compare with FONLL
+     //fHist[iq][iqType][icut].fPt = new TH1F(hname,hname+";p_{T} (GeV/c)",60,0.25,30.25); // mj to compare with FONLL
      hname = hnopt+"Y_"+kqTypeLabel[iqType];
      fHist[iq][iqType][icut].fY = new TH1F(hname,hname,150,-7.5,7.5);
      hname = hnopt+"Eta_"+kqTypeLabel[iqType];
@@ -261,7 +295,17 @@ void AliHFEmcQA::CreateHistograms(const Int_t kquark, Int_t icut, TString hnopt)
   hname = hnopt+"ePtRatio_"+kqTypeLabel[kQuark];
   fHistComm[iq][icut].fePtRatio = new TH2F(hname,hname+";p_{T} (GeV/c);momentum fraction",200,0,20,100,0,1);
   hname = hnopt+"PtCorr_"+kqTypeLabel[kQuark];
-  fHistComm[iq][icut].fPtCorr = new TH2F(hname,hname+";p_{T} (GeV/c);p_{T} (GeV/c)",200,0,20,200,0,20);
+  fHistComm[iq][icut].fPtCorr = new TH2F(hname,hname+";D p_{T} (GeV/c);e p_{T} (GeV/c)",200,xcorrbin,44,binEdges[0]);
+  //fHistComm[iq][icut].fPtCorr = new TH2F(hname,hname+";D p_{T} (GeV/c);e p_{T} (GeV/c)",200,0,20,200,0,20);
+  hname = hnopt+"PtCorrDp_"+kqTypeLabel[kQuark];
+  fHistComm[iq][icut].fPtCorrDp= new TH2F(hname,hname+";D p_{T} (GeV/c);e p_{T} (GeV/c)",200,xcorrbin,44,binEdges[0]);
+  //fHistComm[iq][icut].fPtCorrDp= new TH2F(hname,hname+";D p_{T} (GeV/c);e p_{T} (GeV/c)",200,0,20,200,0,20);
+  hname = hnopt+"PtCorrD0_"+kqTypeLabel[kQuark];
+  fHistComm[iq][icut].fPtCorrD0 = new TH2F(hname,hname+";D p_{T} (GeV/c);e p_{T} (GeV/c)",200,xcorrbin,44,binEdges[0]);
+  //fHistComm[iq][icut].fPtCorrD0 = new TH2F(hname,hname+";D p_{T} (GeV/c);e p_{T} (GeV/c)",200,0,20,200,0,20);
+  hname = hnopt+"PtCorrDrest_"+kqTypeLabel[kQuark];
+  fHistComm[iq][icut].fPtCorrDrest = new TH2F(hname,hname+";D p_{T} (GeV/c);e p_{T} (GeV/c)",200,xcorrbin,44,binEdges[0]);
+  //fHistComm[iq][icut].fPtCorrDrest = new TH2F(hname,hname+";D p_{T} (GeV/c);e p_{T} (GeV/c)",200,0,20,200,0,20);
   hname = hnopt+"DePtRatio_"+kqTypeLabel[kQuark];
   fHistComm[iq][icut].fDePtRatio = new TH2F(hname,hname+";p_{T} (GeV/c);momentum fraction",100,0,20,100,0,1);
   hname = hnopt+"eDistance_"+kqTypeLabel[kQuark];
@@ -300,6 +344,122 @@ void AliHFEmcQA::Init()
 
 }
 
+void AliHFEmcQA::GetMesonKine() 
+{
+  //
+  // get meson pt spectra
+  //
+
+  AliVParticle *mctrack2 = NULL;
+  AliMCParticle *mctrack0 = NULL;
+  AliVParticle *mctrackdaugt= NULL;
+  AliMCParticle *mctrackd= NULL;
+  Int_t id1=0, id2=0;
+
+  for(Int_t imc = 0; imc <fMCEvent->GetNumberOfPrimaries(); imc++){
+     if(!(mctrack2 = fMCEvent->GetTrack(imc))) continue;
+     TParticle* mcpart0 = fMCEvent->Stack()->Particle(imc);
+     if(!mcpart0) continue;
+     mctrack0 = dynamic_cast<AliMCParticle *>(mctrack2);
+     if(abs(mctrack0->PdgCode()) == 111) // pi0 
+       {
+          if(TMath::Abs(AliHFEtools::GetRapidity(mcpart0))<0.8) {
+            fMCQACollection->Fill("pionspectra",mctrack0->Pt());
+            fMCQACollection->Fill("pionspectraLog",mctrack0->Pt());
+          }
+          id1=mctrack0->GetFirstDaughter();
+          id2=mctrack0->GetLastDaughter();
+          if(!((id2-id1)==2)) continue;
+          for(int idx=id1; idx<=id2; idx++){
+            if(!(mctrackdaugt = fMCEvent->GetTrack(idx))) continue;
+            mctrackd = dynamic_cast<AliMCParticle *>(mctrackdaugt);
+            if(abs(mctrackd->PdgCode()) == 11 && TMath::Abs(mctrackd->Eta())<0.8)
+             fMCQACollection->Fill("piondaughters",mctrackd->Pt());
+          }
+       }
+     else if(abs(mctrack0->PdgCode()) == 221) // eta 
+       {
+          if(TMath::Abs(AliHFEtools::GetRapidity(mcpart0))<0.8) {
+            fMCQACollection->Fill("etaspectra",mctrack0->Pt());
+            fMCQACollection->Fill("etaspectraLog",mctrack0->Pt());
+          } 
+          id1=mctrack0->GetFirstDaughter();
+          id2=mctrack0->GetLastDaughter();
+          if(!((id2-id1)==2||(id2-id1)==3)) continue;
+          for(int idx=id1; idx<=id2; idx++){
+            if(!(mctrackdaugt = fMCEvent->GetTrack(idx))) continue;
+            mctrackd = dynamic_cast<AliMCParticle *>(mctrackdaugt);
+            if(abs(mctrackd->PdgCode()) == 11 && TMath::Abs(mctrackd->Eta())<0.8)
+             fMCQACollection->Fill("etadaughters",mctrackd->Pt());
+          }
+       }
+     else if(abs(mctrack0->PdgCode()) == 223) // omega
+       {
+          if(TMath::Abs(AliHFEtools::GetRapidity(mcpart0))<0.8) {
+            fMCQACollection->Fill("omegaspectra",mctrack0->Pt());
+            fMCQACollection->Fill("omegaspectraLog",mctrack0->Pt());
+          }
+          id1=mctrack0->GetFirstDaughter();
+          id2=mctrack0->GetLastDaughter();
+          if(!((id2-id1)==1||(id2-id1)==2)) continue;
+          for(int idx=id1; idx<=id2; idx++){
+            if(!(mctrackdaugt = fMCEvent->GetTrack(idx))) continue;
+            mctrackd = dynamic_cast<AliMCParticle *>(mctrackdaugt);
+            if(abs(mctrackd->PdgCode()) == 11 && TMath::Abs(mctrackd->Eta())<0.8)
+             fMCQACollection->Fill("omegadaughters",mctrackd->Pt());
+          }
+       }
+     else if(abs(mctrack0->PdgCode()) == 333) // phi 
+       {
+          if(TMath::Abs(AliHFEtools::GetRapidity(mcpart0))<0.8) {
+            fMCQACollection->Fill("phispectra",mctrack0->Pt());
+            fMCQACollection->Fill("phispectraLog",mctrack0->Pt());
+          } 
+          id1=mctrack0->GetFirstDaughter();
+          id2=mctrack0->GetLastDaughter();
+          if(!((id2-id1)==1)) continue;
+          for(int idx=id1; idx<=id2; idx++){
+            if(!(mctrackdaugt = fMCEvent->GetTrack(idx))) continue;
+            mctrackd = dynamic_cast<AliMCParticle *>(mctrackdaugt);
+            if(abs(mctrackd->PdgCode()) == 11 && TMath::Abs(mctrackd->Eta())<0.8)
+             fMCQACollection->Fill("phidaughters",mctrackd->Pt());
+          }
+       }
+     else if(abs(mctrack0->PdgCode()) == 331) // eta prime
+       {
+          if(TMath::Abs(AliHFEtools::GetRapidity(mcpart0))<0.8) {
+            fMCQACollection->Fill("etapspectra",mctrack0->Pt());
+            fMCQACollection->Fill("etapspectraLog",mctrack0->Pt());
+          }
+          id1=mctrack0->GetFirstDaughter();
+          id2=mctrack0->GetLastDaughter();
+          if(!((id2-id1)==2||(id2-id1)==3)) continue;
+          for(int idx=id1; idx<=id2; idx++){
+            if(!(mctrackdaugt = fMCEvent->GetTrack(idx))) continue;
+            mctrackd = dynamic_cast<AliMCParticle *>(mctrackdaugt);
+            if(abs(mctrackd->PdgCode()) == 11 && TMath::Abs(mctrackd->Eta())<0.8)
+             fMCQACollection->Fill("etapdaughters",mctrackd->Pt());
+          }
+       }
+     else if(abs(mctrack0->PdgCode()) == 113) // rho
+       {
+          if(TMath::Abs(AliHFEtools::GetRapidity(mcpart0))<0.8) {
+            fMCQACollection->Fill("rhospectra",mctrack0->Pt());
+            fMCQACollection->Fill("rhospectraLog",mctrack0->Pt());
+          }
+          id1=mctrack0->GetFirstDaughter();
+          id2=mctrack0->GetLastDaughter();
+          if(!((id2-id1)==1)) continue;
+          for(int idx=id1; idx<=id2; idx++){
+            if(!(mctrackdaugt = fMCEvent->GetTrack(idx))) continue;
+            mctrackd = dynamic_cast<AliMCParticle *>(mctrackdaugt);
+            if(abs(mctrackd->PdgCode()) == 11 && TMath::Abs(mctrackd->Eta())<0.8)
+             fMCQACollection->Fill("rhodaughters",mctrackd->Pt());
+          }
+       }
+     }
+
+}
 //__________________________________________
 void AliHFEmcQA::GetQuarkKine(TParticle *part, Int_t iTrack, const Int_t kquark) 
 {
@@ -737,6 +897,9 @@ void AliHFEmcQA::GetDecayedKine(TParticle* mcpart, const Int_t kquark, Int_t kde
               // ratio between pT of electron and pT of mother B or direct D hadron 
               if(partMotherCopy->Pt()) fHistComm[iq][icut].fePtRatio->Fill(partMotherCopy->Pt(),mcpart->Pt()/partMotherCopy->Pt());
               fHistComm[iq][icut].fPtCorr->Fill(partMotherCopy->Pt(),mcpart->Pt());
+              if(TMath::Abs(partMotherCopy->GetPdgCode())==411) fHistComm[iq][icut].fPtCorrDp->Fill(partMotherCopy->Pt(),mcpart->Pt());
+              else if(TMath::Abs(partMotherCopy->GetPdgCode())==421) fHistComm[iq][icut].fPtCorrD0->Fill(partMotherCopy->Pt(),mcpart->Pt());
+              else fHistComm[iq][icut].fPtCorrDrest->Fill(partMotherCopy->Pt(),mcpart->Pt());
 
               // distance between electron production point and primary vertex
               fHistComm[iq][icut].feDistance->Fill(partMotherCopy->Pt(),decayLxy);
@@ -953,7 +1116,7 @@ void AliHFEmcQA::ReportStrangeness(Int_t &motherID, Int_t &mothertype, Int_t &mo
 }
 
 //__________________________________________
-Int_t AliHFEmcQA::GetSource(AliAODMCParticle * const mcpart)
+Int_t AliHFEmcQA::GetSource(const AliAODMCParticle * const mcpart)
 {        
   // decay particle's origin 
 
@@ -1035,7 +1198,7 @@ Int_t AliHFEmcQA::GetSource(AliAODMCParticle * const mcpart)
 }
 
 //__________________________________________
-Int_t AliHFEmcQA::GetSource(TParticle * const mcpart)
+Int_t AliHFEmcQA::GetSource(const TParticle * const mcpart)
 {
   // decay particle's origin 
 
@@ -1141,8 +1304,10 @@ Int_t AliHFEmcQA::GetElecSource(TParticle * const mcpart)
   }
 
   AliMCParticle *mctrack = NULL;
+  Int_t tmpMomLabel=0;
   if(!(mctrack = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(TMath::Abs(iLabel))))) return -1; 
   TParticle *partMother = mctrack->Particle();
+  TParticle *partMotherCopy = mctrack->Particle();
   Int_t maPdgcode = partMother->GetPdgCode();
 
    // if the mother is charmed hadron  
@@ -1191,9 +1356,40 @@ Int_t AliHFEmcQA::GetElecSource(TParticle * const mcpart)
         }
      }
    } // end of if
-   else if ( abs(maPdgcode) == 22 ) {
-     origin = kGamma;
+   else if ( abs(maPdgcode) == 22 ) { //conversion
+
+     tmpMomLabel = partMotherCopy->GetFirstMother();
+     if(!(mctrack = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(TMath::Abs(tmpMomLabel))))) return -1;
+     partMother = mctrack->Particle();
+     maPdgcode = partMother->GetPdgCode();
+     if ( abs(maPdgcode) == 111 ) {
+       origin = kGammaPi0;
+       return origin;
+     } 
+     else if ( abs(maPdgcode) == 221 ) {
+       origin = kGammaEta;
+       return origin;
+     } 
+     else if ( abs(maPdgcode) == 223 ) {
+       origin = kGammaOmega;
+       return origin;
+     } 
+     else if ( abs(maPdgcode) == 333 ) {
+       origin = kGammaPhi;
+       return origin;
+     }
+     else if ( abs(maPdgcode) == 331 ) {
+       origin = kGammaEtaPrime;
+       return origin; 
+     }
+     else if ( abs(maPdgcode) == 113 ) {
+       origin = kGammaRho0;
+       return origin;
+     }
+     else origin = kElse;
+     //origin = kGamma; // finer category above
      return origin;
+
    } // end of if
    else if ( abs(maPdgcode) == 111 ) {
      origin = kPi0;
@@ -1244,6 +1440,9 @@ void AliHFEmcQA::AliHistsComm::FillList(TList *l) const {
   if(fProcessID) l->Add(fProcessID);
   if(fePtRatio) l->Add(fePtRatio);
   if(fPtCorr) l->Add(fPtCorr);
+  if(fPtCorrDp) l->Add(fPtCorrDp);
+  if(fPtCorrD0) l->Add(fPtCorrD0);
+  if(fPtCorrDrest) l->Add(fPtCorrDrest);
   if(fDePtRatio) l->Add(fDePtRatio);
   if(feDistance) l->Add(feDistance);
   if(fDeDistance) l->Add(fDeDistance);
index 71330a1..1a4e5fa 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIHFEMCQA_H
-#define ALIHFEMCQA_H
-
 /**************************************************************************
  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
  *                                                                        *
@@ -15,9 +12,6 @@
  * about the suitability of this software for any purpose. It is          *
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
-
-/* $Id$ */ 
-
 //
 // QA class of Heavy Flavor quark and fragmeted/decayed particles
 // -Check kinematics of Heavy Quarks/hadrons, and decayed leptons
@@ -29,6 +23,9 @@
 //    Number of produced hadron of given pdg code
 //
 
+#ifndef ALIHFEMCQA_H
+#define ALIHFEMCQA_H
+
 #ifndef ROOT_TObject
 //#include <TObject.h>
 #endif
@@ -41,6 +38,7 @@ class TString;
 class AliMCEvent;
 class AliGenEventHeader;
 class AliAODMCParticle;
+class AliHFEcollection;
 
 //________________________________________________________________
 class AliHFEmcQA: public TObject {
@@ -48,7 +46,7 @@ class AliHFEmcQA: public TObject {
   public: 
     enum heavyType {kCharm=4, kBeauty=5, kOthers=6, kElectronPDG=11};
     enum qType {kQuark, kantiQuark, kHadron, keHadron, kDeHadron, kElectron, kElectron2nd};
-    enum SourceType {kDirectCharm=1, kDirectBeauty=2, kBeautyCharm=3, kGamma=4, kPi0=5, kElse=6, kMisID=7, kEta=8, kOmega=9, kPhi=10, kEtaPrime=11, kRho0=12};
+    enum SourceType {kDirectCharm=1, kDirectBeauty=2, kBeautyCharm=3, kGamma=4, kPi0=5, kElse=6, kMisID=7, kEta=8, kOmega=9, kPhi=10, kEtaPrime=11, kRho0=12, kGammaPi0=13, kGammaEta=14, kGammaOmega=15, kGammaPhi=16, kGammaEtaPrime=17, kGammaRho0=18};
     enum ProcessType {
       kPairCreationFromq,  kPairCreationFromg,  kFlavourExitation,  kGluonSplitting, kInitialPartonShower, kLightQuarkShower
     };
@@ -72,10 +70,11 @@ class AliHFEmcQA: public TObject {
     void GetHadronKine(TParticle *part, const Int_t kquark); // get heavy hadron kinematics distribution
     void GetDecayedKine(TParticle *part, const Int_t kquark, const Int_t kdecayed, Int_t icut); // get decay electron kinematics distribution
                void GetDecayedKine(AliAODMCParticle *mcpart, const Int_t kquark, Int_t kdecayed, Int_t icut); // get decay electron kinematics for AOD 
+    void GetMesonKine(); // get meson and its decay electron pt spectra
     void EndOfEventAna(const Int_t kquark); // run analysis which should be done at the end of the event loop
-               Int_t GetSource(TParticle * const mcpart); // return source id 
+               Int_t GetSource(const TParticle * const mcpart); // return source id 
                Int_t GetElecSource(TParticle * const mcpart); // return electron source id 
-               Int_t GetSource(AliAODMCParticle * const mcpart); // return electron source id for AOD
+               Int_t GetSource(const AliAODMCParticle * const mcpart); // return electron source id for AOD
 
   protected:
     void IdentifyMother(Int_t motherlabel, Int_t &motherpdg, Int_t &grandmotherlabel); // 
@@ -88,10 +87,10 @@ class AliHFEmcQA: public TObject {
     AliGenEventHeader* fMCHeader; // mcheader pointer
     TClonesArray *fMCArray; // mc array pointer
 
-    static const Int_t fgkGluon; // gluon pdg code
-    static const Int_t fgkMaxGener; // ancester level wanted to be checked 
-    static const Int_t fgkMaxIter; // number of iteration to find out matching particle 
-    static const Int_t fgkqType; // number of particle type to be checked
+    static const Int_t fgkGluon=21; // gluon pdg code
+    static const Int_t fgkMaxGener=10; // ancester level wanted to be checked 
+    static const Int_t fgkMaxIter=100; // number of iteration to find out matching particle 
+    static const Int_t fgkqType=7; // number of particle type to be checked
 
     struct AliHists{
       TH1F *fPdgCode; // histogram to store particle pdg code
@@ -127,6 +126,9 @@ class AliHFEmcQA: public TObject {
       TH1F *fProcessID; // histogram to store process id 
       TH2F *fePtRatio; // fraction of electron pT from D or B hadron
       TH2F *fPtCorr; // pt correlation between e and direct D or B 
+      TH2F *fPtCorrDp; // pt correlation between e and direct D+
+      TH2F *fPtCorrD0; // pt correlation between e and direct D0
+      TH2F *fPtCorrDrest; // pt correlation between e and direct D rest
       TH2F *fDePtRatio; // fraction of D electron pT from B hadron 
       TH2F *feDistance; // distance between electron production point to mother particle 
       TH2F *fDeDistance; // distance between D electron production point to mother particle
@@ -136,6 +138,9 @@ class AliHFEmcQA: public TObject {
                          , fProcessID()
                          , fePtRatio()
                          , fPtCorr()
+                         , fPtCorrDp()
+                         , fPtCorrD0()
+                         , fPtCorrDrest()
                          , fDePtRatio()
                          , feDistance()
                          , fDeDistance()
@@ -147,6 +152,9 @@ class AliHFEmcQA: public TObject {
                          , fProcessID(p.fProcessID)
                          , fePtRatio(p.fePtRatio)
                          , fPtCorr(p.fPtCorr)
+                         , fPtCorrDp(p.fPtCorrDp)
+                         , fPtCorrD0(p.fPtCorrD0)
+                         , fPtCorrDrest(p.fPtCorrDrest)
                          , fDePtRatio(p.fDePtRatio)
                          , feDistance(p.feDistance)
                          , fDeDistance(p.fDeDistance)
@@ -167,12 +175,12 @@ class AliHFEmcQA: public TObject {
     TH1F *fhDLogbin[9]; // D meson pt w diff binning
 
     TList *fQAhistos;           // Container for QA histos
+    AliHFEcollection *fMCQACollection;      //! Tasks own QA collection
     TParticle *fHeavyQuark[50]; //! store pointer of heavy flavour quark 
     Int_t fIsHeavy[2]; // count of heavy flavour
     Int_t fNparents; // number of heavy hadrons to be considered
     Int_t fParentSelect[2][7]; // heavy hadron species
 
-
   ClassDef(AliHFEmcQA,1);
 };
 
index 4a83b41..c2d6c0f 100644 (file)
@@ -12,9 +12,6 @@
  * about the suitability of this software for any purpose. It is          *
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
-
-/* $Id$ */
-
 //
 //  Container class to store pair characteristics
 //  for secondary vertex analysis
index b3df5a0..abae1c3 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIHFEPAIRS_H
-#define ALIHFEPAIRS_H
-
 /**************************************************************************
  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
  *                                                                        *
  * about the suitability of this software for any purpose. It is          *
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
-
-/* $Id$ */ 
-
 //
 //  Container class to store pair characteristics
 //  for secondary vertex analysis
 //  from example, qusi-invariant mass, signed Lxy are stored
 //
 
+#ifndef ALIHFEPAIRS_H
+#define ALIHFEPAIRS_H
+
 #ifndef ROOT_TObject
 #include <TObject.h>
 #endif
index 5c87b30..006d159 100644 (file)
@@ -12,9 +12,6 @@
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */
-
 //
 // PID Steering Class 
 // Interface to the user task
 
 #include "AliHFEcontainer.h"
 #include "AliHFEpid.h"
-#include "AliHFEpidBase.h"
 #include "AliHFEpidQAmanager.h"
 #include "AliHFEpidITS.h"
 #include "AliHFEpidTPC.h"
 #include "AliHFEpidTRD.h"
 #include "AliHFEpidTOF.h"
+#include "AliHFEpidEMCAL.h"
 #include "AliHFEpidMC.h"
 #include "AliHFEvarManager.h"
 
@@ -100,6 +97,7 @@ AliHFEpid::AliHFEpid(const Char_t *name):
   fDetectorPID[kTPCpid] = new AliHFEpidTPC("TPCPID");
   fDetectorPID[kTRDpid] = new AliHFEpidTRD("TRDPID");
   fDetectorPID[kTOFpid] = new AliHFEpidTOF("TOFPID");
+  fDetectorPID[kEMCALpid] = new AliHFEpidEMCAL("EMCALPID");
 
 }
 
@@ -309,7 +307,7 @@ void AliHFEpid::ConfigureTPCrejectionSimple(){
 }
 
 //____________________________________________________________
-void AliHFEpid::ConfigureTPCrejection(const char *lowerCutParam, Double_t *params){
+void AliHFEpid::ConfigureTPCrejection(const char *lowerCutParam, Double_t * const params, Float_t upperTPCCut, Float_t TOFCut){
   //
   // Combined TPC-TOF PID
   // if no function parameterizaion is given, then the default one (exponential) is chosen
@@ -317,30 +315,47 @@ void AliHFEpid::ConfigureTPCrejection(const char *lowerCutParam, Double_t *param
   if(HasMCData()) AliInfo("Configuring TPC for MC\n");
   AliHFEpidTPC *tpcpid = dynamic_cast<AliHFEpidTPC *>(fDetectorPID[kTPCpid]);
   AliHFEpidTOF *tofpid = dynamic_cast<AliHFEpidTOF *>(fDetectorPID[kTOFpid]);
-  if(tofpid) tofpid->SetTOFnSigma(3);
+  if(tofpid) tofpid->SetTOFnSigma(TOFCut);
 
   //TF1 *upperCut = new TF1("upperCut", "[0] * TMath::Exp([1]*x)", 0, 20);
   TF1 *upperCut = new TF1("upperCut", "[0]", 0, 20); // Use constant upper cut
   TF1 *lowerCut = new TF1("lowerCut", lowerCutParam == NULL ? "[0] * TMath::Exp([1]*x) + [2]": lowerCutParam, 0, 20);
-  upperCut->SetParameter(0, 3.);
+
+  upperCut->SetParameter(0, upperTPCCut); // pp
+
+//  upperCut->SetParameter(0, 3.5); //PbPb
+//  printf("upper %f \n",upperCut->GetParameter(0));
   //upperCut->SetParameter(0, 2.7);
   //upperCut->SetParameter(1, -0.4357);
   if(params){
     for(Int_t ipar = 0; ipar < lowerCut->GetNpar(); ipar++) lowerCut->SetParameter(ipar, params[ipar]);
   } else {
     // Set default parameterization
-    if(HasMCData()) lowerCut->SetParameter(0, -2.5);
-    else lowerCut->SetParameter(0, -3.71769);
+      if(HasMCData()) lowerCut->SetParameter(0, -2.5);
+      else lowerCut->SetParameter(0, -4.03);  //pp
+//      else lowerCut->SetParameter(0, -3.83);  //PbPb
+  
+     
+    //else lowerCut->SetParameter(0, -3.71769);
     //else lowerCut->SetParameter(0, -3.7);
 
-    lowerCut->SetParameter(1, -0.40263);
+    lowerCut->SetParameter(1, -0.22); // pp
+//     lowerCut->SetParameter(1,-0.36 ); // PbPb
+    //lowerCut->SetParameter(1, -0.40263);
     //lowerCut->SetParameter(1, -0.8);
-
+    
     if(HasMCData()) lowerCut->SetParameter(2, -2.2);
-    else lowerCut->SetParameter(2, 0.267857);
+    else lowerCut->SetParameter(2, 0.92); //pp
+//     else lowerCut->SetParameter(2, 0.27); //PbPb
+   // else lowerCut->SetParameter(2, 0.92); //pp
+//     printf("lower0 %f \n",lowerCut->GetParameter(0));
+//     printf("lower1 %f \n",lowerCut->GetParameter(1));
+//     printf("lower2 %f \n",lowerCut->GetParameter(2));
+    //else lowerCut->SetParameter(2, 0.267857);
     //else lowerCut->SetParameter(2, -0.35);
   }
-  
+
+
   if(tpcpid){
     tpcpid->SetTPCnSigma(2);
     tpcpid->SetUpperSigmaCut(upperCut);
@@ -372,7 +387,7 @@ void AliHFEpid::PrintStatus() const {
   printf("===============================================\n");
   printf("PID Detectors: \n");
   Int_t npid = 0;
-  TString detectors[kNdetectorPID] = {"MC", "ESD", "ITS", "TPC", "TRD", "TOF"};
+  TString detectors[kNdetectorPID] = {"MC", "ESD", "ITS", "TPC", "TRD", "TOF", "EMCAL"};
   for(Int_t idet = 0; idet < kNdetectorPID; idet++){
     if(IsDetectorOn(idet)){
       printf("\t%s\n", detectors[idet].Data());
index 3d49f9f..1edfeb2 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIHFEPID_H
-#define ALIHFEPID_H
-
 /**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */ 
-
 //
 // Steering class for electron identification
 // Combines detector PID objects
 // For more information please check the implementation file
 //
+#ifndef ALIHFEPID_H
+#define ALIHFEPID_H
+
 #ifndef ROOT_TNamed
 #include <TNamed.h>
 #endif
@@ -36,8 +33,6 @@
 class AliAODpidUtil;
 class AliESDpid;
 class AliHFEcontainer;
-class AliHFEpidBase;
-class AliHFEpidQAmanager;
 class AliHFEvarManager;
 class AliVParticle;
 class AliMCParticle;
@@ -89,7 +84,7 @@ class AliHFEpid : public TNamed{
     //-----Configure PID detectors with predefined stettings------
     void ConfigureTPCasymmetric(Double_t pmin = 0.1, Double_t pmax = 20., Double_t sigmamin = -0.2, Double_t sigmamax = 5.);
     void ConfigureTPCrejectionSimple();
-    void ConfigureTPCrejection(const char *lowerCutParam = NULL, Double_t *params = NULL);
+    void ConfigureTPCrejection(const char *lowerCutParam = NULL, Double_t * const params = NULL, Float_t upperTPCCut=3.0, Float_t TOFCut=3.0);
     void ConfigureTPCstrategyParis();
     //------------------------------------------------------------
 
index a1f495b..6ba2e4b 100644 (file)
@@ -12,9 +12,6 @@
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */
-
 //
 // Abstract PID base class for Detector PID classes 
 // Supplies detector PID classes with basic informations (i.e. Debug 
index 0cac537..27c36d0 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIHFEPIDBASE_H
-#define ALIHFEPIDBASE_H
 /**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */ 
-
 //
 // Base Class for Detector PID Objects
 // For more information see the implementation file
 //
-
+#ifndef ALIHFEPIDBASE_H
+#define ALIHFEPIDBASE_H
  #ifndef ROOT_TNamed
  #include <TNamed.h>
  #endif
diff --git a/PWG3/hfe/AliHFEpidEMCAL.cxx b/PWG3/hfe/AliHFEpidEMCAL.cxx
new file mode 100644 (file)
index 0000000..48bbfc8
--- /dev/null
@@ -0,0 +1,222 @@
+/**************************************************************************
+* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+*                                                                        *
+* Author: The ALICE Off-line Project.                                    *
+* Contributors are mentioned in the code where appropriate.              *
+*                                                                        *
+* Permission to use, copy, modify and distribute this software and its   *
+* documentation strictly for non-commercial purposes is hereby granted   *
+* without fee, provided that the above copyright notice appears in all   *
+* copies and that both the copyright notice and this permission notice   *
+* appear in the supporting documentation. The authors make no claims     *
+* about the suitability of this software for any purpose. It is          *
+* provided "as is" without express or implied warranty.                  *
+**************************************************************************/
+//
+// Class for EMCAL PID
+// Implements the abstract base class AliHFEpidBase
+// IsInitialized() does the PID decision with energy and 
+// momentum matching (e/p) 
+// 
+// Authors:
+//  Shingo Sakai 
+//   
+//
+//
+#include <TMath.h>
+#include "AliESDInputHandler.h"
+#include "AliAODpidUtil.h"
+#include "AliAODTrack.h"
+#include "AliESDpid.h"
+
+#include "AliHFEdetPIDqa.h"
+//#include "AliHFEpidEMCAL.h"
+#include "AliHFEpidQAmanager.h"
+
+//#include "AliEMCALRecoUtils.h"
+//#include "AliEMCALGeometry.h"
+#include "AliVCluster.h"
+#include "AliVCaloCells.h"
+#include "AliVEvent.h"
+#include "AliLog.h"
+#include "AliEMCALPIDUtils.h"
+#include "AliPID.h"
+#include "AliESDEvent.h"
+#include "AliESDtrack.h"
+//#include "AliEMCALTrack.h"
+//#include "AliEMCALTracker.h"
+#include "AliHFEpidEMCAL.h"
+
+ClassImp(AliHFEpidEMCAL)
+
+//___________________________________________________________________
+AliHFEpidEMCAL::AliHFEpidEMCAL():
+  AliHFEpidBase()
+  , fPID(NULL)
+  , feopMim(0.8)
+  , feopMax(1.4)
+{
+  //
+  // Constructor
+  //
+} 
+
+//___________________________________________________________________
+AliHFEpidEMCAL::AliHFEpidEMCAL(const Char_t *name):
+  AliHFEpidBase(name)
+  , fPID(NULL)
+  , feopMim(0.8)
+  , feopMax(1.4)
+{
+  //
+  // Constructor
+  //
+}
+
+//___________________________________________________________________
+AliHFEpidEMCAL::AliHFEpidEMCAL(const AliHFEpidEMCAL &c):
+  AliHFEpidBase("")
+  , fPID(NULL)
+  , feopMim(0.8)
+  , feopMax(1.4)
+{  
+  // 
+  // Copy operator
+  //
+
+  c.Copy(*this);
+}
+//___________________________________________________________________
+AliHFEpidEMCAL &AliHFEpidEMCAL::operator=(const AliHFEpidEMCAL &ref){
+  //
+  // Assignment operator
+  //
+
+  if(this != &ref){
+    ref.Copy(*this);
+  }
+
+  return *this;
+}
+//___________________________________________________________________
+AliHFEpidEMCAL::~AliHFEpidEMCAL(){
+  //
+  // Destructor
+  //
+  if(fPID) delete fPID;
+}
+//___________________________________________________________________
+void AliHFEpidEMCAL::Copy(TObject &ref) const {
+  //
+  // Performs the copying of the object
+  //
+  AliHFEpidEMCAL &target = dynamic_cast<AliHFEpidEMCAL &>(ref);
+
+  target.fPID = fPID;          
+  target.feopMax = feopMax;
+  target.feopMim = feopMim;
+
+  AliHFEpidBase::Copy(ref);
+}
+//___________________________________________________________________
+Bool_t AliHFEpidEMCAL::InitializePID(){
+  //
+  // InitializePID: EMCAL experts have to implement code here
+  //
+  return kTRUE;
+}
+
+//___________________________________________________________________
+Int_t AliHFEpidEMCAL::IsSelected(const AliHFEpidObject *track, AliHFEpidQAmanager */*pidqa*/) const
+{ //Function to a return a code indicating whether or not an electron candidate is selected
+  //
+  //
+  if((!fESDpid && track->IsESDanalysis()) || (!fAODpid && track->IsAODanalysis())) return 0;
+  AliDebug(2, "PID object available");
+  // EMCal not fESDpid  (s.s Feb. 11)
+
+  /*
+  AliHFEpidObject::AnalysisType_t anaType = track->IsESDanalysis() ? AliHFEpidObject::kESDanalysis : AliHFEpidObject::kAODanalysis;
+  if(!((dynamic_cast<const AliVTrack *>(track->GetRecTrack()))->GetStatus() & AliESDtrack::kEMCALpid)) return 0;
+  AliDebug(2, "Track Has EMCAL PID");
+  */
+  //if(pidqa) pidqa->ProcessTrack(track, AliHFEpid::kEMCALpid, AliHFEdetPIDqa::kBeforePID);
+  // not QA for EMCal, will be added (s.s Feb. 11)
+
+  Double_t eop = 0.;//MomentumEnergyMatch(track->GetRecTrack()); // get eop (What is GetRecTrack ?)
+  AliDebug(2, Form("Energy - Momentum Matching e/p : %f", eop));
+  Int_t pdg = 0;
+  if(eop>feopMim && eop<feopMax){
+    pdg = 11;
+    //if(pidqa) pidqa->ProcessTrack(track, AliHFEpid::kEMCALpid, AliHFEdetPIDqa::kAfterPID);
+  }
+  else
+  {
+   pdg = 211; // EMCal doesn't separate pi,k.p by e/p. return pion code as same as TRD
+  } 
+
+    printf("eID %g ; %d \n",eop,pdg);  
+
+  return pdg;
+}
+/*
+Double_t AliHFEpidEMCAL::MomentumEnergyMatch(const AliVParticle *track) const
+{ // Returns e/p if an electron is matched
+
+  Float_t  clsPos[3];
+  Double_t trkPos[3];
+  Double_t matchclsE = 9999.9;
+
+  const AliESDtrack *esdtrack = dynamic_cast<const AliESDtrack *>(track);
+  AliESDEvent *evt = esdtrack->GetESDEvent();
+  Double_t  magF = evt->GetMagneticField();
+  Double_t magSign = 1.0;
+  if(magF<0)magSign = -1.0;
+  //printf("magF ; %g ; %g \n", magF,magSign);
+  if (!TGeoGlobalMagField::Instance()->GetField()) {
+         printf("Loading field map...\n");
+         //AliMagF* field = new AliMagF("Maps","Maps", 1., 1., AliMagF::k5kG);
+         AliMagF* field = new AliMagF("Maps","Maps", magSign, magSign, AliMagF::k5kG); // for 10d
+         TGeoGlobalMagField::Instance()->SetField(field);
+                   }
+
+  AliEMCALTrack *emctrack = new AliEMCALTrack(*esdtrack);
+  Double_t fieldB[3]; 
+  emctrack->GetBxByBz(fieldB);
+  //printf("%g %g %g \n", fieldB[0], fieldB[1], fieldB[2]);
+
+  for(Int_t icl=0; icl<evt->GetNumberOfCaloClusters(); icl++)
+   {
+
+   AliVCluster *cluster = (AliVCluster*) evt->GetCaloCluster(icl);
+   if(!cluster->IsEMCAL()) continue;
+
+   cluster->GetPosition(clsPos);
+   if(!emctrack->PropagateToGlobal(clsPos[0],clsPos[1],clsPos[2],0.,0.) )  continue;
+   emctrack->GetXYZ(trkPos);
+
+   TVector3 clsPosVec(clsPos[0],clsPos[1],clsPos[2]);
+   TVector3 trkPosVec(trkPos[0],trkPos[1],trkPos[2]);
+
+   Double_t delEmcphi = clsPosVec.Phi()-trkPosVec.Phi();  // track cluster matching
+   Double_t delEmceta = clsPosVec.Eta()-trkPosVec.Eta();  // track cluster matching
+
+   double rmatch = sqrt(pow(delEmcphi,2)+pow(delEmceta,2));
+
+   if(rmatch<0.02)
+      {
+       matchclsE = cluster->E();
+      }
+  }
+   delete emctrack;
+
+   double feop = -9999.9;
+   if(matchclsE<9999) feop = matchclsE/esdtrack->P();
+
+   //   if(feop!=-9999.9)printf("%f\n",feop) ; 
+   return feop;
+
+}
+*/
+
diff --git a/PWG3/hfe/AliHFEpidEMCAL.h b/PWG3/hfe/AliHFEpidEMCAL.h
new file mode 100644 (file)
index 0000000..a792438
--- /dev/null
@@ -0,0 +1,55 @@
+#ifndef ALIHFEPIDEMCAL_H
+#define ALIHFEPIDEMCAL_H
+
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice   */   
+
+//
+// Class for EMCAL PID
+// electron selection with energy-momnetum matching (e/p)
+// For more information please check the implementation file
+//
+#ifndef ALIHFEPIDBASE_H
+#include "AliHFEpidBase.h"
+#endif
+
+class AliVParticle;
+class AliPID;
+
+class AliHFEpidQAmanager;
+//class AliEMCALGeoUtils;
+//class AliEMCALGeometry;
+//class AliEMCALRecoUtils;
+/*
+class AliEMCALGeoUtils;
+class AliEMCALGeometry;
+#include "AliEMCALGeoParams.h"
+class AliEMCALRecoUtils;
+class AliEMCALPIDUtils;
+*/
+
+
+class AliHFEpidEMCAL : public AliHFEpidBase{
+  public:
+    AliHFEpidEMCAL();
+    AliHFEpidEMCAL(const Char_t *name);
+    virtual ~AliHFEpidEMCAL();
+    AliHFEpidEMCAL(const AliHFEpidEMCAL &c);
+    AliHFEpidEMCAL &operator=(const AliHFEpidEMCAL &c);
+  
+    virtual Bool_t    InitializePID();
+    virtual Int_t     IsSelected(const AliHFEpidObject *track, AliHFEpidQAmanager *piqa) const;
+      
+    //Double_t MomentumEnergyMatch(const AliVParticle *track) const;
+
+  protected:
+    void Copy(TObject &ref) const;
+  private:
+    AliPID        *fPID;           //! PID Object
+    Float_t    feopMim;         // EMCAL eop mim. cut
+    Float_t    feopMax;         // EMCAL eop max. cut
+
+    ClassDef(AliHFEpidEMCAL, 1)
+};
+
+#endif
index af7c185..660ad63 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef ALIHFEPIDESD_H
 #define ALIHFEPIDESD_H
 
-/* $Id$ */ 
-
 #ifndef ALIHFEPIDBASE_H
 #include "AliHFEpidBase.h"
 #endif
index e1a3785..968f209 100644 (file)
@@ -12,9 +12,6 @@
  * about the suitability of this software for any purpose. It is          *
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
-
-/* $Id$ */
-
 //
 // ITS PID class
 // checks ITS PID based on ITS dE/dx truncated mean
index c5b47f5..d858533 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIHFEPIDITS_H
-#define ALIHFEPIDITS_H
-
 /**************************************************************************
  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
  *                                                                        *
  * about the suitability of this software for any purpose. It is          *
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
-
-/* $Id$ */ 
-
 //
 // PID development class for ITS
 // does proton rejection via dE/dx
 // For more information see implementation file
+#ifndef ALIHFEPIDITS_H
+#define ALIHFEPIDITS_H
 
 #ifndef ALIHFEPIDBASE_H
 #include "AliHFEpidBase.h"
index fd88152..9d61ee4 100644 (file)
@@ -12,9 +12,6 @@
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */
-
 //
 // Class for TRD PID
 // Implements the abstract base class AliHFEpidBase
index cd71a8f..6087228 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIHFEPIDMC_H
-#define ALIHFEPIDMC_H
-
 /**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */ 
-
 //
 // Detector PID Class for Monte Carlo PID
 // Returns PDG code of a particle
 // For more information see the impelmentation file
 //
+#ifndef ALIHFEPIDMC_H
+#define ALIHFEPIDMC_H
 
  #ifndef ALIHFEPIDBASE_H
  #include "AliHFEpidBase.h"
index 54ca9cc..412ea4c 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIHFEPIDQA_H
-#define ALIHFEPIDQA_H
-
 /**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */ 
-
 //
 // Class for PID QA
 // Several studies done on clean samples of electrons, pions and kaons
 // coming from V0 PID
 // More information can be found in the implementation file
 //
+#ifndef ALIHFEPIDQA_H
+#define ALIHFEPIDQA_H
+
 #ifndef ROOT_TObject
 #include <TObject.h>
 #endif
index 6a7a015..52c2019 100644 (file)
@@ -12,9 +12,6 @@
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */
-
 //
 // Class AliHFEpidQAmanager
 // Does steering of the PID QA. The PID QA manager is initialized according
@@ -39,6 +36,7 @@
 #include "AliHFEtpcPIDqa.h"
 #include "AliHFEtrdPIDqaV1.h"
 #include "AliHFEtofPIDqa.h"
+#include "AliHFEemcalPIDqa.h"  //s.s
 #include "AliHFEpidQAmanager.h"
 
 ClassImp(AliHFEpidQAmanager)
@@ -136,6 +134,9 @@ void AliHFEpidQAmanager::CreateDetPIDqa(AliHFEpid::EDETtype_t idet){
     case AliHFEpid::kTOFpid: 
           fDetPIDqa[idet] = new AliHFEtofPIDqa("TOFQA"); 
           break;
+    case AliHFEpid::kEMCALpid: //s.s (name) 
+          fDetPIDqa[idet] = new AliHFEemcalPIDqa("EMCALQA"); // s.s 
+          break;  //s.s
     default:
           break;
   };
index 49a867b..ba53e7c 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIHFEPIDQAMANAGER_H
-#define ALIHFEPIDQAMANAGER_H
-
 /**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */ 
-
 //
 // Class AliHFEpidQAmanager
 // Steering PID QA
 // More information can be found inside the implementation file
 //
+#ifndef ALIHFEPIDQAMANAGER_H
+#define ALIHFEPIDQAMANAGER_H
+
 #ifndef ROOT_TObject
 #include <TObject.h>
 #endif
index cccc5a9..f165ce0 100644 (file)
@@ -12,9 +12,6 @@
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */
-
 //
 // Class for TOF PID
 // Implements the abstract base class AliHFEpidBase
index 7a4a1eb..5f8b5df 100644 (file)
@@ -4,8 +4,6 @@
 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
  * See cxx source for full Copyright notice   */   
 
-/* $Id$ */ 
-
 //
 // Class for TOF PID
 // Rejects protons and kaons at the TPC dE/dx line crossings
@@ -31,7 +29,7 @@ class AliHFEpidTOF : public AliHFEpidBase{
     virtual Bool_t    InitializePID();
     virtual Int_t     IsSelected(const AliHFEpidObject *track, AliHFEpidQAmanager *piqa) const;
   
-    void SetTOFnSigma(Short_t nSigma) { fNsigmaTOF = nSigma; };
+    void SetTOFnSigma(Float_t nSigma) { fNsigmaTOF = nSigma; };
     Double_t NumberOfSigmas(const AliVParticle *track, AliPID::EParticleType species, AliHFEpidObject::AnalysisType_t anaType) const;
     Double_t GetTOFsignal(const AliVParticle *track, AliHFEpidObject::AnalysisType_t anatype) const;
     Double_t GetTime0(AliHFEpidObject::AnalysisType_t anatype) const;
@@ -42,7 +40,7 @@ class AliHFEpidTOF : public AliHFEpidBase{
   private:
     AliPID        *fPID;           //! PID Object
 
-    Short_t    fNsigmaTOF;         // TOF sigma band
+    Float_t    fNsigmaTOF;         // TOF sigma band
 
     ClassDef(AliHFEpidTOF, 1)
 };
index a28d997..326613a 100644 (file)
@@ -12,9 +12,6 @@
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */
-
 //
 // Class for TPC PID
 // Implements the abstract base class AliHFEpidBase
index 4709d67..e7bbe84 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIHFEPIDTPC_H
-#define ALIHFEPIDTPC_H
-
 /**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */ 
-
 //
 // Class for TPC PID
 // Does electron selection based on dE/dx
 // For more information please check the implementation file
 //
+#ifndef ALIHFEPIDTPC_H
+#define ALIHFEPIDTPC_H
+
 #ifndef ALIHFEPIDBASE_H
 #include "AliHFEpidBase.h"
 #endif
@@ -62,7 +59,7 @@ class AliHFEpidTPC : public AliHFEpidBase{
     void SetUpperSigmaCut(TF1 * const model) { fUpperSigmaCut = model; }
     void SetLowerSigmaCut(TF1 * const model) { fLowerSigmaCut = model; }
 
-    Double_t NumberOfSigmas(const AliVParticle *track, AliPID::EParticleType species, AliHFEpidObject::AnalysisType_t) const;
+    Double_t NumberOfSigmas(const AliVParticle *track, AliPID::EParticleType species, AliHFEpidObject::AnalysisType_t anatype) const;
     Double_t GetP(const AliVParticle *track, AliHFEpidObject::AnalysisType_t anaType) const;
 
   protected:
index 128987b..e102d13 100644 (file)
@@ -12,9 +12,6 @@
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */
-
 //
 // Class for TRD PID
 // Implements the abstract base class AliHFEpidbase 
@@ -45,8 +42,6 @@
 
 ClassImp(AliHFEpidTRD)
 
-const Double_t AliHFEpidTRD::fgkVerySmall = 1e-12;
-
 //___________________________________________________________________
 AliHFEpidTRD::AliHFEpidTRD() :
     AliHFEpidBase()
@@ -262,6 +257,19 @@ void AliHFEpidTRD::InitParameters1DLQ(){
 }
 
 //___________________________________________________________________
+void AliHFEpidTRD::RenormalizeElPi(const Double_t * const likein, Double_t * const likeout) const {
+  //
+  // Renormalize likelihoods for electrons and pions neglecting the 
+  // likelihoods for protons, kaons and muons
+  //
+  memset(likeout, 0, sizeof(Double_t) * AliPID::kSPECIES);
+  Double_t norm = likein[AliPID::kElectron] + likein[AliPID::kPion];
+  if(norm == 0.) norm = 1.;   // Safety
+  likeout[AliPID::kElectron] = likein[AliPID::kElectron] / norm;
+  likeout[AliPID::kPion] = likein[AliPID::kPion] / norm;
+}
+
+//___________________________________________________________________
 void AliHFEpidTRD::GetParameters(Double_t electronEff, Double_t *parameters) const {
   //
   // return parameter set for the given efficiency bin
@@ -283,7 +291,10 @@ Double_t AliHFEpidTRD::GetElectronLikelihood(const AliVParticle *track, AliHFEpi
     const AliAODTrack *aodtrack = dynamic_cast<const AliAODTrack *>(track);
     if(aodtrack)fAODpid->MakeTRDPID(const_cast<AliAODTrack *>(aodtrack), pidProbs);
   }
-  return pidProbs[AliPID::kElectron];
+  if(!IsRenormalizeElPi()) return pidProbs[AliPID::kElectron];
+  Double_t probsNew[AliPID::kSPECIES];
+  RenormalizeElPi(pidProbs, probsNew);
+  return probsNew[AliPID::kElectron];
 }
 
 //___________________________________________________________________
index b3c64e6..8043bcf 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIHFEPIDTRD_H
-#define ALIHFEPIDTRD_H
-
 /**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */ 
-
 //
 // TRD PID Class
 // Does PID either on a x% electron efficiency basis or on dE/dx
 // For more information please check the implementation file
 //
+#ifndef ALIHFEPIDTRD_H
+#define ALIHFEPIDTRD_H
+
  #ifndef ALIHFEPIDBASE_H
  #include "AliHFEpidBase.h"
  #endif
@@ -66,7 +63,9 @@ class AliHFEpidTRD : public AliHFEpidBase{
     Double_t GetTRDSignalV2(const AliESDtrack *track, Float_t trucation = 0.7) const;
 
     Bool_t IsCalculateTRDSignals() const { return TestBit(kTRDsignals); }
+    Bool_t IsRenormalizeElPi() const { return TestBit(kTRDrenormalize); }
     void SetPIDMethod(PIDMethodTRD_t method) { fPIDMethod = method; };
+    void SetRenormalizeElPi(Bool_t doRenorm = kTRUE) { if(doRenorm) SetBit(kTRDrenormalize, kTRUE); else SetBit(kTRDrenormalize, kFALSE);}
     void SetElectronEfficiency(Double_t electronEfficiency) { fElectronEfficiency = electronEfficiency; }
     void SetThresholdParameters(Double_t electronEff, Double_t *params);
     void SetMinP(Double_t p) { fMinP = p; }
@@ -80,7 +79,8 @@ class AliHFEpidTRD : public AliHFEpidBase{
   protected:
     enum{
       kTRDsignals = BIT(16),
-      kTRDdefaultThresholds = BIT(17)
+      kTRDdefaultThresholds = BIT(17),
+      kTRDrenormalize = BIT(18)
     };
     void Copy(TObject &ref) const;
     void InitParameters();
@@ -88,14 +88,15 @@ class AliHFEpidTRD : public AliHFEpidBase{
     void GetParameters(Double_t electronEff, Double_t *parameters) const;
     void SetUseDefaultParameters(Bool_t useDefault = kTRUE) { SetBit(kTRDdefaultThresholds, useDefault); }
     Bool_t UseDefaultParameters() const { return TestBit(kTRDdefaultThresholds); }
+    void RenormalizeElPi(const Double_t * const likein, Double_t * const likeout) const;
 
   private:
-    static const Double_t fgkVerySmall;                       // Check for 0
+    static const Double_t fgkVerySmall = 1e-12;             // Check for 0
     Double_t fMinP;                                         // Minimum momentum above which TRD PID is applied
     Double_t fElectronEfficiency;                           // Cut on electron efficiency
     PIDMethodTRD_t fPIDMethod;                              // PID Method: 2D Likelihood or Neural Network
     Double_t fThreshParams[kThreshParams];                  // Threshold parametrisation
   ClassDef(AliHFEpidTRD, 1)     // TRD electron ID class
 };
-
 #endif
+
index d536e69..2806b36 100644 (file)
@@ -12,9 +12,6 @@
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */
-
 //
 // Post analysis code
 // Drawing nice pictures containing
@@ -247,7 +244,7 @@ void AliHFEpostAnalysis::DrawEfficiency(){
   effReconstructibleP->SetStats(kFALSE);
   cEff->cd(1);
   effReconstructibleP->Draw("e");
-  effCalc->CalculateEfficiency(AliHFEcuts::kStepMCGeneratedZOutNoPileUp, AliHFEcuts::kStepMCGenerated);
+  effCalc->CalculateEfficiency(AliHFEcuts::kStepMCGeneratedZOutNoPileUpCentralityFine, AliHFEcuts::kStepMCGenerated);
   TH1 *effSignal = effCalc->Project(0);
   effSignal->SetName("effSignal");
   effSignal->SetTitle("Efficiency of Signal Electrons");
index 7d723bb..dae9ecf 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIHFEPOSTANALYSIS_H
-#define ALIHFEPOSTANALYSIS_H
-
 /**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */ 
-
 //
 // Post analysis class
 // Creating results and draw pictures
 // Called in AliAnalysisTaskHFE::Terminate or in a macro
 //
+#ifndef ALIHFEPOSTANALYSIS_H
+#define ALIHFEPOSTANALYSIS_H
+
 #ifndef ROOT_THnSparse
 #include <THnSparse.h>
 #endif
index 88992b5..086f95a 100644 (file)
@@ -12,9 +12,6 @@
  * about the suitability of this software for any purpose. It is          *
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
-
-/* $Id$ */
-
 //
 // QA class of primary vertex study for Heavy Flavor electrons
 // this has functionality to reject electrons from primary vertex
@@ -304,7 +301,7 @@ void AliHFEpriVtx::FillNprimVtxContributor() const
 }
 
 //_______________________________________________________________________________________________
-Double_t AliHFEpriVtx::GetDistanceFromRecalVertexXY(AliESDtrack * const ESDelectron) 
+Double_t AliHFEpriVtx::GetDistanceFromRecalVertexXY(const AliESDtrack * const ESDelectron) 
 {
         //
         // return recalculated DCA after removing input track from the primary vertex
@@ -380,7 +377,7 @@ void AliHFEpriVtx::RecalcPrimvtx(Int_t nkftrk, const Int_t * const trkid, const
 
 
 //_______________________________________________________________________________________________
-void AliHFEpriVtx::RecalcPrimvtx(AliESDtrack * const ESDelectron)
+void AliHFEpriVtx::RecalcPrimvtx(const AliESDtrack * const ESDelectron)
 {
         //
         // recalculate primary vertex after removing the input track
index 49b62d3..aea1704 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIHFEPRIVTX_H
-#define ALIHFEPRIVTX_H
-
 /**************************************************************************
  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
  *                                                                        *
  * about the suitability of this software for any purpose. It is          *
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
-
-/* $Id$ */ 
-
 //
 // QA class of primary vertex study for Heavy Flavor electrons
 // this has functionality to reject electrons from primary vertex
 // and check primary vertex characteristics
 //
 
+#ifndef ALIHFEPRIVTX_H
+#define ALIHFEPRIVTX_H
+
 #ifndef ROOT_TObject
 //#include <TObject.h>
 #endif
@@ -55,12 +52,12 @@ class AliHFEpriVtx : public TObject {
                 void CountPriVxtElecContributor(AliESDtrack *ESDelectron, Int_t sourcePart, Int_t recpid, Double_t recprob); 
                 void FillNprimVtxContributor() const;
                 void RecalcPrimvtx(Int_t nkftrk, const Int_t * const, const AliKFParticle * const); //recalculate primary vertex after removing given tracks
-                void RecalcPrimvtx(AliESDtrack * const ESDelectron); //recalculate primary vertex after removing given track
+                void RecalcPrimvtx(const AliESDtrack * const ESDelectron); //recalculate primary vertex after removing given track
                 void GetRecalcPrimvtx(Double_t privtx[3]) const {
                     privtx[0]=fPVxRe; privtx[1]=fPVyRe; privtx[2]=fPVzRe;
                 }
                 void GetNPriVxtContributor();
-                Double_t GetDistanceFromRecalVertexXY(AliESDtrack * const ESDelectron);
+                Double_t GetDistanceFromRecalVertexXY(const AliESDtrack * const ESDelectron);
                            Int_t GetNsectrk2prim() const {return fNsectrk2prim;}; 
                 Int_t GetMCPID(AliESDtrack const *track); // return mc pid
 
index 2b33d37..dd97f48 100644 (file)
@@ -12,9 +12,6 @@
  * about the suitability of this software for any purpose. It is          *
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
-
-/* $Id$ */
-
 //
 // Secondary vertexing construction Class
 //  Construct secondary vertex from Beauty hadron with electron and
@@ -208,7 +205,7 @@ void AliHFEsecVtx::Init()
   fFilter->MakeCutStepPrimary();
 } 
 
-void AliHFEsecVtx::Process(AliVTrack *signalTrack){ 
+Bool_t AliHFEsecVtx::Process(AliVTrack *signalTrack){ 
   //
   // Run Process
   //
@@ -219,9 +216,11 @@ void AliHFEsecVtx::Process(AliVTrack *signalTrack){
 
   if(!track){
     AliDebug(1, "no esd track pointer, return\n");
-    return;
+    return kFALSE;
   }
 
+  Bool_t bTagged = kFALSE;
+
   FillHistos(0,track); // wo any cuts
 
   InitHFEpairs();
@@ -258,10 +257,15 @@ void AliHFEsecVtx::Process(AliVTrack *signalTrack){
   }
 
   // fill histos for raw spectra
-  if(HFEsecvtxs()->GetEntriesFast()) FillHistos(3,track); //after secvtx cut
+  if(HFEsecvtxs()->GetEntriesFast()) {
+    FillHistos(3,track); //after secvtx cut
+    bTagged = kTRUE;
+  }
     
   DeleteHFEpairs();
   DeleteHFEsecvtxs();
+
+  return bTagged;
 }
 
 //_______________________________________________________________________________________________
@@ -759,7 +763,7 @@ void AliHFEsecVtx::Fill3TrkSECVTX(AliVTrack* track, Int_t ipair, Int_t jpair)
 }
 
 //_______________________________________________________________________________________________
-void AliHFEsecVtx::Fill2TrkSECVTX(AliVTrack* track, AliHFEpairs *pair)
+void AliHFEsecVtx::Fill2TrkSECVTX(AliVTrack* track, const AliHFEpairs *pair)
 {
   //
   // fill 2 tracks' secondary vertex properties
@@ -1464,7 +1468,7 @@ Int_t AliHFEsecVtx::GetMCPDG(const AliVTrack *track)
 }
 
 //______________________________________________________________________________
-void AliHFEsecVtx::GetESDPID(AliESDtrack *track, Int_t &recpid, Double_t &recprob) 
+void AliHFEsecVtx::GetESDPID(const AliESDtrack *track, Int_t &recpid, Double_t &recprob) 
 {
   //
   // calculate likehood for esd pid
@@ -1712,7 +1716,8 @@ void AliHFEsecVtx::FillHistos(Int_t step, const AliESDtrack *track){
       //if(!(dynamic_cast<TH1F *>(fSecVtxList->At(step+2)))) return;
       (static_cast<TH1F *>(fSecVtxList->At(step+2)))->Fill(mcpart->Pt()); //beauty
     }
-    else if(esource==4) {
+    else if(esource>12 && esource<19) {
+    //else if(esource==4) {
       //if(!(dynamic_cast<TH1F *>(fSecVtxList->At(step+3)))) return;
       (static_cast<TH1F *>(fSecVtxList->At(step+3)))->Fill(mcpart->Pt()); //conversion
     }
index 7375c4f..efe8a5f 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIHFESECVTX_H
-#define ALIHFESECVTX_H
-
 /**************************************************************************
  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
  *                                                                        *
  * about the suitability of this software for any purpose. It is          *
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
-
-/* $Id$ */ 
-
 //
 //  Secondary vertexing construction Class
 //  Construct secondary vertex from Beauty hadron with electron and
 //  hadrons, then apply selection criteria
 //
 
+#ifndef ALIHFESECVTX_H
+#define ALIHFESECVTX_H
+
 #ifndef ROOT_TObject
 //#include <TObject.h>
 #endif
@@ -58,7 +55,7 @@ class AliHFEsecVtx : public TObject {
 
     void CreateHistograms(TList * const qaList);
 
-    void Process(AliVTrack *track);
+    Bool_t Process(AliVTrack *track);
 
     Bool_t HasMCData() const { return TestBit(kHasMCData); };
     Bool_t IsAODanalysis() const { return TestBit(kAODanalysis); };
@@ -82,7 +79,7 @@ class AliHFEsecVtx : public TObject {
     Int_t GetPairCode(const AliVTrack* const track1, const AliVTrack* const track2); // return corresponding pair code to pdg code
     Int_t GetElectronSource(Int_t mclabel); // return origin of the electron
     Int_t GetPDG(AliVTrack *track);     // return pdg 
-               void GetESDPID(AliESDtrack *track, Int_t &recpid, Double_t &recprob); //return esd pid likelihood
+    void GetESDPID(const AliESDtrack *track, Int_t &recpid, Double_t &recprob); //return esd pid likelihood
     void GetPrimaryCondition();
     void RecalcPrimvtx(Int_t nkftrk, const Int_t * const, const AliKFParticle * const); //recalculate primary vertex
 
@@ -113,7 +110,7 @@ class AliHFEsecVtx : public TObject {
 
     void Fill4TrkSECVTX(AliVTrack* track, Int_t ipair, Int_t jpair, Int_t kpair);
     void Fill3TrkSECVTX(AliVTrack* track, Int_t ipair, Int_t jpair);
-    void Fill2TrkSECVTX(AliVTrack* track, AliHFEpairs *pair);
+    void Fill2TrkSECVTX(AliVTrack* track, const AliHFEpairs *pair);
 
   private:
     enum{
index 5167ee4..66a5a8a 100644 (file)
@@ -12,9 +12,6 @@
  * about the suitability of this software for any purpose. It is          *
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
-
-/* $Id$ */
-
 //
 //  Secondary vertexing container to store secondary vertex characteristics of 
 //  2 or 3 particle sec vertex
index 1a8eb56..9815b66 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIHFESECVTXS_H
-#define ALIHFESECVTXS_H
-
 /**************************************************************************
  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
  *                                                                        *
  * about the suitability of this software for any purpose. It is          *
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
-
-/* $Id$ */ 
-
 //
 //  Secondary vertexing container to store secondary vertex characteristics of 
 //  2 or 3 particle sec vertex
 //  from example, qusi-invariant mass, signed Lxy are stored
 //
 
+#ifndef ALIHFESECVTXS_H
+#define ALIHFESECVTXS_H
+
 #ifndef ROOT_TObject
 #include <TObject.h>
 #endif
index 2615c7a..2080ca5 100644 (file)
@@ -12,9 +12,6 @@
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */
-
 //
 // Signal cuts
 // Checks whether a particle (reconstructed or MC) is coming from MC Signal
@@ -153,16 +150,31 @@ Bool_t AliHFEsignalCuts::IsBeautyElectron(const TObject * const o) const {
 //____________________________________________________________
 Bool_t AliHFEsignalCuts::IsGammaElectron(const TObject * const o) const {
   //
-  // Check for MC if the electron is coming from Gamma
+  // Check for MC if the electron is coming from Gamma  
   //
   if(!dynamic_cast<const AliVParticle *>(o)) return kFALSE;
   Int_t esources = GetElecSource(dynamic_cast<const AliVParticle *>(o));
-  if(esources == AliHFEmcQA::kGamma)  // 4: conversion electrons
+  if(esources >= AliHFEmcQA::kGammaPi0 && esources <= AliHFEmcQA::kGammaRho0 )  // 4: conversion electrons
+  //if(esources == AliHFEmcQA::kGammaPi0 || esources == AliHFEmcQA::kGammaEta || esources == AliHFEmcQA::kGammaOmega || esources == AliHFEmcQA::kGammaPhi || esources == AliHFEmcQA::kGammaEtaPrime || esources == AliHFEmcQA::kGammaRho0 )  // 4: conversion electrons
     return kTRUE;
   else
     return kFALSE;
 }
 
+//____________________________________________________________
+Bool_t AliHFEsignalCuts::IsNonHFElectron(const TObject * const o) const {
+  //
+  // Check for MC if the electron is coming from NonHFE except for conversion
+  //
+  if(!dynamic_cast<const AliVParticle *>(o)) return kFALSE;
+  Int_t esources = GetElecSource(dynamic_cast<const AliVParticle *>(o));  
+  if(esources == AliHFEmcQA:: kPi0 || esources == AliHFEmcQA::kEta || esources == AliHFEmcQA::kOmega || esources == AliHFEmcQA::kPhi || esources == AliHFEmcQA::kEtaPrime || esources == AliHFEmcQA::kRho0)  // 4: conversion electrons
+    return kTRUE;
+  else
+    return kFALSE;
+}
+//____________________________________________________________
+
 /*
 //____________________________________________________________
 Bool_t AliHFEsignalCuts::IsCharmElectron(const TObject * const o) const {
index c3d2650..0e30f65 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIHFESIGNALCUTS_H
-#define ALIHFESIGNALCUTS_H
-
 /**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */ 
-
 //
 // Signal cuts
 // Checks whether a particle (reconstructed or MC) is coming from MC Signal
 // For more information see implementation file
 //
+#ifndef ALIHFESIGNALCUTS_H
+#define ALIHFESIGNALCUTS_H
+
 #ifndef ALIANALYSISCUTS_H
 #include "AliAnalysisCuts.h"
 #endif
@@ -46,6 +43,7 @@ class AliHFEsignalCuts : public AliAnalysisCuts{
     Bool_t IsCharmElectron(const TObject * const o) const;
     Bool_t IsBeautyElectron(const TObject * const o) const;
     Bool_t IsGammaElectron(const TObject * const o) const;
+    Bool_t IsNonHFElectron(const TObject * const o) const;
 
     //void SetMCEvent(AliMCEvent *mc) { fMC = mc; }
     void SetMCEvent(AliMCEvent *mc);
index c97b945..6e468fd 100644 (file)
@@ -12,9 +12,6 @@
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */
-
 //
 // Class for spectrum correction
 // Subtraction of hadronic background, Unfolding of the data and
@@ -44,6 +41,7 @@
 #include <TFile.h>
 #include <TPad.h>
 #include <TH2D.h>
+#include <TF1.h>
 
 #include "AliPID.h"
 #include "AliCFContainer.h"
@@ -56,6 +54,7 @@
 #include "AliHFEspectrum.h"
 #include "AliHFEcuts.h"
 #include "AliHFEcontainer.h"
+#include "AliHFEtools.h"
 
 ClassImp(AliHFEspectrum)
 
@@ -66,10 +65,19 @@ AliHFEspectrum::AliHFEspectrum(const char *name):
   fTemporaryObjects(NULL),
   fCorrelation(NULL),
   fBackground(NULL),
+  fEfficiencyFunction(NULL),
+  fWeightCharm(NULL),
   fInclusiveSpectrum(kTRUE),
   fDumpToFile(kFALSE),
+  fUnSetCorrelatedErrors(kTRUE),
+  fIPanaHadronBgSubtract(kFALSE),
+  fIPanaCharmBgSubtract(kFALSE),
+  fIPanaConversionBgSubtract(kFALSE),
+  fIPanaNonHFEBgSubtract(kFALSE),
+  fNonHFEbgMethod2(kFALSE),
   fNbDimensions(1),
-  fNEvents(0),
+  fNMCEvents(0),
+  fNMCbgEvents(0),
   fStepMC(-1),
   fStepTrue(-1),
   fStepData(-1),
@@ -77,11 +85,21 @@ AliHFEspectrum::AliHFEspectrum(const char *name):
   fStepAfterCutsV0(-1),
   fStepGuessedUnfolding(-1),
   fNumberOfIterations(5),
+  fChargeChoosen(-1),
+  fNCentralityBinAtTheEnd(0),
+  fHadronEffbyIPcut(NULL),
+  fBeamType(0),
   fDebugLevel(0)
 {
   //
   // Default constructor
   //
+
+  for(Int_t k = 0; k < 20; k++){
+    fNEvents[k] = 0;
+    fLowBoundaryCentralityBinAtTheEnd[k] = 0;
+    fHighBoundaryCentralityBinAtTheEnd[k] = 0;
+  }
 }
 
 //____________________________________________________________
@@ -96,7 +114,7 @@ AliHFEspectrum::~AliHFEspectrum(){
   }
 }
 //____________________________________________________________
-Bool_t AliHFEspectrum::Init(const AliHFEcontainer *datahfecontainer, const AliHFEcontainer *mchfecontainer, const AliHFEcontainer *v0hfecontainer){
+Bool_t AliHFEspectrum::Init(const AliHFEcontainer *datahfecontainer, const AliHFEcontainer *mchfecontainer, const AliHFEcontainer *v0hfecontainer, const AliHFEcontainer *bghfecontainer){
   //
   // Init what we need for the correction:
   //
@@ -108,32 +126,80 @@ Bool_t AliHFEspectrum::Init(const AliHFEcontainer *datahfecontainer, const AliHF
   // If no inclusive spectrum, then take only efficiency map for beauty electron
   // and the appropriate correlation matrix
   //
+    Int_t kNdim;
+    if(fBeamType==0) kNdim=3;
+    if(fBeamType==1) kNdim=4;
+
+    Int_t dims[kNdim];
+    // Get the requested format
+    if(fBeamType==0)
+    {
+        // pp analysis
+       switch(fNbDimensions){
+       case 1:   dims[0] = 0;
+       break;
+       case 2:   for(Int_t i = 0; i < 2; i++) dims[i] = i;
+       break;
+       case 3:   for(Int_t i = 0; i < 3; i++) dims[i] = i;
+       break;
+       default:
+           AliError("Container with this number of dimensions not foreseen (yet)");
+           return kFALSE;
+       };
+    }
+
+    if(fBeamType==1)
+    {
+        // PbPb analysis; centrality as first dimension
+      Int_t nbDimensions = fNbDimensions;
+      fNbDimensions = fNbDimensions + 1;
+       switch(nbDimensions){
+       case 1:
+           dims[0] = 5;
+            dims[1] = 0;
+       break;
+       case 2:
+           dims[0] = 5;
+           for(Int_t i = 0; i < 2; i++) dims[(i+1)] = i;
+       break;
+            dims[0] = 5;
+       case 3:   for(Int_t i = 0; i < 3; i++) dims[(i+1)] = i;
+       break;
+       default:
+           AliError("Container with this number of dimensions not foreseen (yet)");
+           return kFALSE;
+       };
+    }
+
+
 
-  // Get the requested format
-  Int_t dims[3];
-  switch(fNbDimensions){
-  case 1:   dims[0] = 0;
-    break;
-  case 2:   for(Int_t i = 0; i < 2; i++) dims[i] = i;
-    break;
-  case 3:   for(Int_t i = 0; i < 3; i++) dims[i] = i;
-    break;
-  default:
-    AliError("Container with this number of dimensions not foreseen (yet)");
-    return kFALSE;
-  };
-  
   // Data container: raw spectrum + hadron contamination  
-  AliCFContainer *datacontainer = datahfecontainer->GetCFContainer("recTrackContReco");
+  AliCFContainer *datacontainer = 0x0; 
+  if(fInclusiveSpectrum) {
+    datacontainer = datahfecontainer->GetCFContainer("recTrackContReco");
+  }
+  else{
+    datacontainer = datahfecontainer->MakeMergedCFContainer("sumreco","sumreco","recTrackContReco:recTrackContDEReco");
+  }
   AliCFContainer *contaminationcontainer = datahfecontainer->GetCFContainer("hadronicBackground");
   if((!datacontainer) || (!contaminationcontainer)) return kFALSE;
 
-  AliCFContainer *datacontainerD = GetSlicedContainer(datacontainer, fNbDimensions, dims);
-  AliCFContainer *contaminationcontainerD = GetSlicedContainer(contaminationcontainer, fNbDimensions, dims);
+  AliCFContainer *datacontainerD = GetSlicedContainer(datacontainer, fNbDimensions, dims, -1, fChargeChoosen);
+  AliCFContainer *contaminationcontainerD = GetSlicedContainer(contaminationcontainer, fNbDimensions, dims, -1, fChargeChoosen);
   if((!datacontainerD) || (!contaminationcontainerD)) return kFALSE;
+
   SetContainer(datacontainerD,AliHFEspectrum::kDataContainer);
   SetContainer(contaminationcontainerD,AliHFEspectrum::kBackgroundData);
 
+  if(bghfecontainer){
+    // set nonHFE backgrounds using temporary stored in hadronicBackground, will be replaced with proper container
+    AliCFContainer *bgcontainer = bghfecontainer->GetCFContainer("hadronicBackground");
+    if(!bgcontainer) return kFALSE;
+    AliCFContainer *bgcontainerD = GetSlicedContainer(bgcontainer, fNbDimensions, dims, -1, fChargeChoosen);
+    if(!bgcontainerD) return kFALSE;
+    SetContainer(bgcontainerD,AliHFEspectrum::kNonHFEBackgroundData);
+  }
+
   // MC container: ESD/MC efficiency maps + MC/MC efficiency maps 
   AliCFContainer *mccontaineresd = 0x0;
   AliCFContainer *mccontainermc = 0x0;
@@ -149,20 +215,35 @@ Bool_t AliHFEspectrum::Init(const AliHFEcontainer *datahfecontainer, const AliHF
 
   Int_t source = -1;
   if(!fInclusiveSpectrum) source = 1;
-  AliCFContainer *mccontaineresdD = GetSlicedContainer(mccontaineresd, fNbDimensions, dims, source);
-  AliCFContainer *mccontainermcD = GetSlicedContainer(mccontainermc, fNbDimensions, dims, source);
+  AliCFContainer *mccontaineresdD = GetSlicedContainer(mccontaineresd, fNbDimensions, dims, source, fChargeChoosen);
+  AliCFContainer *mccontainermcD = GetSlicedContainer(mccontainermc, fNbDimensions, dims, source, fChargeChoosen);
   if((!mccontaineresdD) || (!mccontainermcD)) return kFALSE;
   SetContainer(mccontainermcD,AliHFEspectrum::kMCContainerMC);
   SetContainer(mccontaineresdD,AliHFEspectrum::kMCContainerESD);
 
+  // set charm, nonHFE container to estimate BG
+  if(!fInclusiveSpectrum){
+   source = 0; //charm
+   mccontainermcD = GetSlicedContainer(mccontainermc, fNbDimensions, dims, source, fChargeChoosen);
+   SetContainer(mccontainermcD,AliHFEspectrum::kMCContainerCharmMC);
+   source = 2; //conversion
+   mccontainermcD = GetSlicedContainer(mccontainermc, fNbDimensions, dims, source, fChargeChoosen);
+   SetContainer(mccontainermcD,AliHFEspectrum::kMCContainerConversionMC);
+   source = 3; //non HFE except for the conversion
+   mccontainermcD = GetSlicedContainer(mccontainermc, fNbDimensions, dims, source, fChargeChoosen);
+   SetContainer(mccontainermcD,AliHFEspectrum::kMCContainerNonHFEMC);
+  }
+
   // MC container: correlation matrix
   THnSparseF *mccorrelation = 0x0;
   if(fInclusiveSpectrum) {
     if((fStepMC==(AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kStepHFEcutsTRD + 2))) mccorrelation = mchfecontainer->GetCorrelationMatrix("correlationstepafterPID");
-    if((fStepMC==(AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kStepHFEcutsTRD + 1))) mccorrelation = mchfecontainer->GetCorrelationMatrix("correlationstepafterTOF");
+    if((fStepMC==(AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kStepHFEcutsTRD + 1))) mccorrelation = mchfecontainer->GetCorrelationMatrix("correlationstepafterPID");
     if((fStepMC==(AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kStepHFEcutsTRD))) mccorrelation = mchfecontainer->GetCorrelationMatrix("correlationstepbeforePID");
+    if((fStepMC==(AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kStepHFEcutsTRD - 1))) mccorrelation = mchfecontainer->GetCorrelationMatrix("correlationstepbeforePID");
   }
-  else mccorrelation = mchfecontainer->GetCorrelationMatrix("correlationstepafterDE");
+  else mccorrelation = mchfecontainer->GetCorrelationMatrix("correlationstepafterPID"); // we confirmed that we get same result by using it instead of correlationstepafterDE
+  //else mccorrelation = mchfecontainer->GetCorrelationMatrix("correlationstepafterDE");
   if(!mccorrelation) return kFALSE;
   THnSparseF *mccorrelationD = GetSlicedCorrelation(mccorrelation, fNbDimensions, dims);
   if(!mccorrelationD) {
@@ -208,6 +289,18 @@ Bool_t AliHFEspectrum::Init(const AliHFEcontainer *datahfecontainer, const AliHF
     ccontaminationspectrum->cd(3);
     contaminationspectrum2detaphi->Draw("colz");
 
+    TCanvas * ccorrelation = new TCanvas("ccorrelation","ccorrelation",1000,700);
+    ccorrelation->cd(1);
+    if(mccorrelationD) {
+      if(fBeamType==0){
+       TH2D * ptcorrelation = (TH2D *) mccorrelationD->Projection(fNbDimensions,0);
+       ptcorrelation->Draw("colz");
+      }
+      if(fBeamType==1){
+       TH2D * ptcorrelation = (TH2D *) mccorrelationD->Projection(fNbDimensions+1,1);
+       ptcorrelation->Draw("colz");
+      }
+    }
   }
 
 
@@ -216,6 +309,7 @@ Bool_t AliHFEspectrum::Init(const AliHFEcontainer *datahfecontainer, const AliHF
   
 }
 
+
 //____________________________________________________________
 Bool_t AliHFEspectrum::Correct(Bool_t subtractcontamination){
   //
@@ -230,6 +324,326 @@ Bool_t AliHFEspectrum::Correct(Bool_t subtractcontamination){
   gStyle->SetPadLeftMargin(0.13);
   gStyle->SetPadRightMargin(0.13);
 
+  printf("Steps are: stepdata %d, stepMC %d, steptrue %d, stepV0after %d, stepV0before %d\n",fStepData,fStepMC,fStepTrue,fStepAfterCutsV0,fStepBeforeCutsV0);
+
+  ///////////////////////////
+  // Check initialization
+  ///////////////////////////
+
+  if((!GetContainer(kDataContainer)) || (!GetContainer(kMCContainerMC)) || (!GetContainer(kMCContainerESD))){
+    AliInfo("You have to init before");
+    return kFALSE;
+  }
+  
+  if((fStepTrue == -1) && (fStepMC == -1) && (fStepData == -1)) {
+    AliInfo("You have to set the steps before: SetMCTruthStep, SetMCEffStep, SetStepToCorrect");
+    return kFALSE;
+  }
+  SetNumberOfIteration(10);
+  SetStepGuessedUnfolding(AliHFEcuts::kStepRecKineITSTPC + AliHFEcuts::kNcutStepsMCTrack);
+    
+  AliCFDataGrid *dataGridAfterFirstSteps = 0x0;
+  //////////////////////////////////
+  // Subtract hadron background
+  /////////////////////////////////
+  AliCFDataGrid *dataspectrumaftersubstraction = 0x0;
+  if(subtractcontamination) {
+    dataspectrumaftersubstraction = SubtractBackground(kTRUE);
+    dataGridAfterFirstSteps = dataspectrumaftersubstraction;
+  }
+
+  ////////////////////////////////////////////////
+  // Correct for TPC efficiency from V0
+  ///////////////////////////////////////////////
+  AliCFDataGrid *dataspectrumafterV0efficiencycorrection = 0x0;
+  AliCFContainer *dataContainerV0 = GetContainer(kDataContainerV0);
+  if(dataContainerV0){
+    dataspectrumafterV0efficiencycorrection = CorrectV0Efficiency(dataspectrumaftersubstraction);
+    dataGridAfterFirstSteps = dataspectrumafterV0efficiencycorrection;  
+  }
+
+  //////////////////////////////////////////////////////////////////////////////
+  // Correct for efficiency parametrized (if TPC efficiency is parametrized)
+  /////////////////////////////////////////////////////////////////////////////
+  AliCFDataGrid *dataspectrumafterefficiencyparametrizedcorrection = 0x0;
+  if(fEfficiencyFunction){
+    dataspectrumafterefficiencyparametrizedcorrection = CorrectParametrizedEfficiency(dataGridAfterFirstSteps);
+    dataGridAfterFirstSteps = dataspectrumafterefficiencyparametrizedcorrection;  
+  }
+    
+  ///////////////
+  // Unfold
+  //////////////
+  TList *listunfolded = Unfold(dataGridAfterFirstSteps);
+  if(!listunfolded){
+    printf("Unfolded failed\n");
+    return kFALSE;
+  }
+  THnSparse *correctedspectrum = (THnSparse *) listunfolded->At(0);
+  THnSparse *residualspectrum = (THnSparse *) listunfolded->At(1);
+  if(!correctedspectrum){
+    AliError("No corrected spectrum\n");
+    return kFALSE;
+  }
+  if(!residualspectrum){
+    AliError("No residul spectrum\n");
+    return kFALSE;
+  }   
+  
+  /////////////////////
+  // Simply correct
+  ////////////////////
+  AliCFDataGrid *alltogetherCorrection = CorrectForEfficiency(dataGridAfterFirstSteps);
+  
+
+  //////////
+  // Plot
+  //////////
+  if(fDebugLevel > 0.0) {
+
+   
+   
+
+    Int_t ptpr;
+    if(fBeamType==0) ptpr=0;
+    if(fBeamType==1) ptpr=1;
+  
+    TCanvas * ccorrected = new TCanvas("corrected","corrected",1000,700);
+    ccorrected->Divide(2,1);
+    ccorrected->cd(1);
+    gPad->SetLogy();
+    TGraphErrors* correctedspectrumD = Normalize(correctedspectrum);
+    correctedspectrumD->SetTitle("");
+    correctedspectrumD->GetYaxis()->SetTitleOffset(1.5);
+    correctedspectrumD->GetYaxis()->SetRangeUser(0.000000001,1.0);
+    correctedspectrumD->SetMarkerStyle(26);
+    correctedspectrumD->SetMarkerColor(kBlue);
+    correctedspectrumD->SetLineColor(kBlue);
+    correctedspectrumD->Draw("AP");
+    TGraphErrors* alltogetherspectrumD = Normalize(alltogetherCorrection);
+    alltogetherspectrumD->SetTitle("");
+    alltogetherspectrumD->GetYaxis()->SetTitleOffset(1.5);
+    alltogetherspectrumD->GetYaxis()->SetRangeUser(0.000000001,1.0);
+    alltogetherspectrumD->SetMarkerStyle(25);
+    alltogetherspectrumD->SetMarkerColor(kBlack);
+    alltogetherspectrumD->SetLineColor(kBlack);
+    alltogetherspectrumD->Draw("P");
+    TLegend *legcorrected = new TLegend(0.4,0.6,0.89,0.89);
+    legcorrected->AddEntry(correctedspectrumD,"Corrected","p");
+    legcorrected->AddEntry(alltogetherspectrumD,"Alltogether","p");
+    legcorrected->Draw("same");
+    ccorrected->cd(2);
+    TH1D *correctedTH1D = correctedspectrum->Projection(ptpr);
+    TH1D *alltogetherTH1D = (TH1D *) alltogetherCorrection->Project(ptpr);
+    TH1D* ratiocorrected = (TH1D*)correctedTH1D->Clone();
+    ratiocorrected->SetName("ratiocorrected");
+    ratiocorrected->SetTitle("");
+    ratiocorrected->GetYaxis()->SetTitle("Unfolded/DirectCorrected");
+    ratiocorrected->GetXaxis()->SetTitle("p_{T} [GeV/c]");
+    ratiocorrected->Divide(correctedTH1D,alltogetherTH1D,1,1);
+    ratiocorrected->SetStats(0);
+    ratiocorrected->Draw();
+
+    TH1D **unfoldingspectrac = new TH1D*[fNCentralityBinAtTheEnd];
+    TGraphErrors **unfoldingspectracn = new TGraphErrors*[fNCentralityBinAtTheEnd];
+    TH1D **correctedspectrac = new TH1D*[fNCentralityBinAtTheEnd];
+    TGraphErrors **correctedspectracn = new TGraphErrors*[fNCentralityBinAtTheEnd];
+
+    
+
+    if(fBeamType==1) {
+
+      TCanvas * ccorrected_allspectra = new TCanvas("correctedallspectra","correctedallspectra",1000,700);
+      ccorrected_allspectra->Divide(2,1);
+      TLegend *legtotal = new TLegend(0.4,0.6,0.89,0.89);
+      TLegend *legtotalg = new TLegend(0.4,0.6,0.89,0.89);
+      
+      THnSparseF* sparsesu = (THnSparseF *) correctedspectrum;
+      TAxis *cenaxisa = sparsesu->GetAxis(0);
+      THnSparseF* sparsed = (THnSparseF *) alltogetherCorrection->GetGrid();
+      TAxis *cenaxisb = sparsed->GetAxis(0);
+      Int_t nbbin = cenaxisb->GetNbins();
+      Int_t stylee[20] = {20,21,22,23,24,25,26,27,28,30,4,5,7,29,29,29,29,29,29,29};
+      Int_t colorr[20] = {2,3,4,5,6,7,8,9,46,38,29,30,31,32,33,34,35,37,38,20};
+      for(Int_t binc = 0; binc < fNCentralityBinAtTheEnd; binc++){
+       TString titlee("corrected_centrality_bin_");
+       titlee += "[";
+       titlee += fLowBoundaryCentralityBinAtTheEnd[binc];
+       titlee += "_";
+       titlee += fHighBoundaryCentralityBinAtTheEnd[binc];
+       titlee += "[";
+       TString titleec("corrected_check_projection_bin_");
+       titleec += "[";
+       titleec += fLowBoundaryCentralityBinAtTheEnd[binc];
+       titleec += "_";
+       titleec += fHighBoundaryCentralityBinAtTheEnd[binc];
+       titleec += "[";
+       TString titleenameunotnormalized("Unfolded_Notnormalized_centrality_bin_");
+       titleenameunotnormalized += "[";
+       titleenameunotnormalized += fLowBoundaryCentralityBinAtTheEnd[binc];
+       titleenameunotnormalized += "_";
+       titleenameunotnormalized += fHighBoundaryCentralityBinAtTheEnd[binc];
+       titleenameunotnormalized += "[";
+               TString titleenameunormalized("Unfolded_normalized_centrality_bin_");
+       titleenameunormalized += "[";
+       titleenameunormalized += fLowBoundaryCentralityBinAtTheEnd[binc];
+       titleenameunormalized += "_";
+       titleenameunormalized += fHighBoundaryCentralityBinAtTheEnd[binc];      
+       titleenameunormalized += "[";
+       TString titleenamednotnormalized("Dirrectcorrected_Notnormalized_centrality_bin_");
+       titleenamednotnormalized += "[";
+       titleenamednotnormalized += fLowBoundaryCentralityBinAtTheEnd[binc];
+       titleenamednotnormalized += "_";
+       titleenamednotnormalized += fHighBoundaryCentralityBinAtTheEnd[binc];
+       titleenamednotnormalized += "[";
+       TString titleenamednormalized("Dirrectedcorrected_normalized_centrality_bin_");
+       titleenamednormalized += "[";
+       titleenamednormalized += fLowBoundaryCentralityBinAtTheEnd[binc];
+       titleenamednormalized += "_";
+       titleenamednormalized += fHighBoundaryCentralityBinAtTheEnd[binc];      
+       titleenamednormalized += "[";
+       Int_t nbEvents = 0;
+       for(Int_t k = fLowBoundaryCentralityBinAtTheEnd[binc]; k < fHighBoundaryCentralityBinAtTheEnd[binc]; k++) {
+         //printf("Number of events %d in the bin %d added!!!\n",fNEvents[k],k);
+         nbEvents += fNEvents[k];
+       }
+       //Double_t lowedgega = cenaxisa->GetBinLowEdge(fLowBoundaryCentralityBinAtTheEnd[binc]+1);
+       //Double_t upedgega = cenaxisa->GetBinUpEdge(fHighBoundaryCentralityBinAtTheEnd[binc]);
+       //printf("Bin Low edge %f, up edge %f for a\n",lowedgega,upedgega);
+       //Double_t lowedgegb = cenaxisb->GetBinLowEdge(fLowBoundaryCentralityBinAtTheEnd[binc]+1);
+       //Double_t upedgegb = cenaxisb->GetBinUpEdge(fHighBoundaryCentralityBinAtTheEnd[binc]);
+       //printf("Bin Low edge %f, up edge %f for b\n",lowedgegb,upedgegb);
+       cenaxisa->SetRange(fLowBoundaryCentralityBinAtTheEnd[binc]+1,fHighBoundaryCentralityBinAtTheEnd[binc]);
+       cenaxisb->SetRange(fLowBoundaryCentralityBinAtTheEnd[binc]+1,fHighBoundaryCentralityBinAtTheEnd[binc]);
+       TCanvas * ccorrectedcheck = new TCanvas((const char*) titleec,(const char*) titleec,1000,700);
+       ccorrectedcheck->cd(1);
+       TH1D *aftersuc = (TH1D *) sparsesu->Projection(0);
+       TH1D *aftersdc = (TH1D *) sparsed->Projection(0);
+       aftersuc->Draw();
+       aftersdc->Draw("same");
+       TCanvas * ccorrectede = new TCanvas((const char*) titlee,(const char*) titlee,1000,700);
+       ccorrectede->Divide(2,1);
+       ccorrectede->cd(1);
+       gPad->SetLogy();
+       TH1D *aftersu = (TH1D *) sparsesu->Projection(1);
+       CorrectFromTheWidth(aftersu);
+       aftersu->SetName((const char*)titleenameunotnormalized);
+       unfoldingspectrac[binc] = aftersu;
+       ccorrectede->cd(1);
+               TGraphErrors* aftersun = NormalizeTH1N(aftersu,nbEvents);
+       aftersun->SetTitle("");
+       aftersun->GetYaxis()->SetTitleOffset(1.5);
+       aftersun->GetYaxis()->SetRangeUser(0.000000001,1.0);
+       aftersun->SetMarkerStyle(26);
+       aftersun->SetMarkerColor(kBlue);
+       aftersun->SetLineColor(kBlue);
+       aftersun->Draw("AP");
+       aftersun->SetName((const char*)titleenameunormalized);
+       unfoldingspectracn[binc] = aftersun;
+       ccorrectede->cd(1);
+       TH1D *aftersd = (TH1D *) sparsed->Projection(1);
+       CorrectFromTheWidth(aftersd);
+       aftersd->SetName((const char*)titleenamednotnormalized);
+       correctedspectrac[binc] = aftersd;
+       ccorrectede->cd(1);
+       TGraphErrors* aftersdn = NormalizeTH1N(aftersd,nbEvents);
+       aftersdn->SetTitle("");
+       aftersdn->GetYaxis()->SetTitleOffset(1.5);
+       aftersdn->GetYaxis()->SetRangeUser(0.000000001,1.0);
+       aftersdn->SetMarkerStyle(25);
+       aftersdn->SetMarkerColor(kBlack);
+       aftersdn->SetLineColor(kBlack);
+       aftersdn->Draw("P");
+       aftersdn->SetName((const char*)titleenamednormalized);
+       correctedspectracn[binc] = aftersdn;
+       TLegend *legcorrectedud = new TLegend(0.4,0.6,0.89,0.89);
+       legcorrectedud->AddEntry(aftersun,"Corrected","p");
+       legcorrectedud->AddEntry(aftersdn,"Alltogether","p");
+       legcorrectedud->Draw("same");
+       ccorrected_allspectra->cd(1);
+       gPad->SetLogy();
+       TH1D *aftersunn = (TH1D *) aftersun->Clone();
+       aftersunn->SetMarkerStyle(stylee[binc]);
+       aftersunn->SetMarkerColor(colorr[binc]);
+       if(binc==0) aftersunn->Draw("AP");
+       else aftersunn->Draw("P");
+       legtotal->AddEntry(aftersunn,(const char*) titlee,"p");
+       ccorrected_allspectra->cd(2);
+       gPad->SetLogy();
+       TH1D *aftersdnn = (TH1D *) aftersdn->Clone();
+       aftersdnn->SetMarkerStyle(stylee[binc]);
+       aftersdnn->SetMarkerColor(colorr[binc]);
+       if(binc==0) aftersdnn->Draw("AP");
+       else aftersdnn->Draw("P");
+       legtotalg->AddEntry(aftersdnn,(const char*) titlee,"p");
+       ccorrectede->cd(2);
+       TH1D* ratiocorrectedbinc = (TH1D*)aftersu->Clone();
+       TString titleee("ratiocorrected_bin_");
+       titleee += binc;
+       ratiocorrectedbinc->SetName((const char*) titleee);
+       ratiocorrectedbinc->SetTitle("");
+       ratiocorrectedbinc->GetYaxis()->SetTitle("Unfolded/DirectCorrected");
+       ratiocorrectedbinc->GetXaxis()->SetTitle("p_{T} [GeV/c]");
+       ratiocorrectedbinc->Divide(aftersu,aftersd,1,1);
+       ratiocorrectedbinc->SetStats(0);
+       ratiocorrectedbinc->Draw();
+      }
+
+      ccorrected_allspectra->cd(1);
+      legtotal->Draw("same");
+      ccorrected_allspectra->cd(2);
+      legtotalg->Draw("same");
+      
+      cenaxisa->SetRange(0,nbbin);
+      cenaxisb->SetRange(0,nbbin);
+
+    }
+
+    // Dump to file if needed
+    if(fDumpToFile) {
+      TFile *out = new TFile("finalSpectrum.root","recreate");
+      correctedspectrumD->SetName("UnfoldingCorrectedSpectrum");
+      correctedspectrumD->Write();
+      alltogetherspectrumD->SetName("AlltogetherSpectrum");
+      alltogetherspectrumD->Write();
+      ratiocorrected->SetName("RatioUnfoldingAlltogetherSpectrum");
+      ratiocorrected->Write();
+      correctedspectrum->SetName("UnfoldingCorrectedNotNormalizedSpectrum");
+      correctedspectrum->Write();
+      alltogetherCorrection->SetName("AlltogetherCorrectedNotNormalizedSpectrum");
+      alltogetherCorrection->Write();
+      for(Int_t binc = 0; binc < fNCentralityBinAtTheEnd; binc++){
+       unfoldingspectrac[binc]->Write();
+       unfoldingspectracn[binc]->Write();
+       correctedspectrac[binc]->Write();
+       correctedspectracn[binc]->Write();
+      }
+      out->Close(); delete out;
+    }
+
+  }
+
+
+  
+
+  return kTRUE;
+}
+
+//____________________________________________________________
+Bool_t AliHFEspectrum::CorrectBeauty(Bool_t subtractcontamination){
+  //
+  // Correct the spectrum for efficiency and unfolding for beauty analysis
+  // with both method and compare
+  //
+  
+  gStyle->SetPalette(1);
+  gStyle->SetOptStat(1111);
+  gStyle->SetPadBorderMode(0);
+  gStyle->SetCanvasColor(10);
+  gStyle->SetPadLeftMargin(0.13);
+  gStyle->SetPadRightMargin(0.13);
+
   ///////////////////////////
   // Check initialization
   ///////////////////////////
@@ -244,7 +658,7 @@ Bool_t AliHFEspectrum::Correct(Bool_t subtractcontamination){
     return kFALSE;
   }
  
-  SetNumberOfIteration(50);
+  SetNumberOfIteration(10);
   SetStepGuessedUnfolding(AliHFEcuts::kStepRecKineITSTPC + AliHFEcuts::kNcutStepsMCTrack);
     
   AliCFDataGrid *dataGridAfterFirstSteps = 0x0;
@@ -257,6 +671,11 @@ Bool_t AliHFEspectrum::Correct(Bool_t subtractcontamination){
     dataGridAfterFirstSteps = dataspectrumaftersubstraction;
   }
 
+  /////////////////////////////////////////////////////////////////////////////////////////
+  // Correct for IP efficiency for beauty electrons after subtracting all the backgrounds
+  /////////////////////////////////////////////////////////////////////////////////////////
+
+
   ////////////////////////////////////////////////
   // Correct for TPC efficiency from V0
   ///////////////////////////////////////////////
@@ -364,6 +783,7 @@ Bool_t AliHFEspectrum::Correct(Bool_t subtractcontamination){
 
   return kTRUE;
 }
+
 //____________________________________________________________
 AliCFDataGrid* AliHFEspectrum::SubtractBackground(Bool_t setBackground){
   //
@@ -376,6 +796,7 @@ AliCFDataGrid* AliHFEspectrum::SubtractBackground(Bool_t setBackground){
     AliError("Data Container not available");
     return NULL;
   }
+  printf("Step data: %d\n",fStepData);
   AliCFDataGrid *spectrumSubtracted = new AliCFDataGrid("spectrumSubtracted", "Data Grid for spectrum after Background subtraction", *dataContainer,fStepData);
 
   AliCFDataGrid *dataspectrumbeforesubstraction = (AliCFDataGrid *) ((AliCFDataGrid *)GetSpectrum(GetContainer(kDataContainer),fStepData))->Clone();
@@ -388,12 +809,46 @@ AliCFDataGrid* AliHFEspectrum::SubtractBackground(Bool_t setBackground){
     return NULL;
   }
  
-  Int_t stepbackground = 1;
-  if(!fInclusiveSpectrum) stepbackground = 2;
+  Int_t stepbackground = 1; // 2 for !fInclusiveSpectrum analysis(old method)
   AliCFDataGrid *backgroundGrid = new AliCFDataGrid("ContaminationGrid","ContaminationGrid",*backgroundContainer,stepbackground);
 
-  // Subtract
-  spectrumSubtracted->Add(backgroundGrid,-1.0);
+  if(!fInclusiveSpectrum){
+    //Background subtraction for IP analysis
+    if(fIPanaHadronBgSubtract){
+      // Hadron background
+      printf("Hadron background for IP analysis subtracted!\n");
+      Int_t* bins=new Int_t[1];
+      TH1D* htemp  = (TH1D *) fHadronEffbyIPcut->Projection(0);
+      bins[0]=htemp->GetNbinsX();
+      AliCFDataGrid *hbgContainer = new AliCFDataGrid("hbgContainer","hadron bg after IP cut",1,bins);
+      hbgContainer->SetGrid(fHadronEffbyIPcut);
+      backgroundGrid->Multiply(hbgContainer,1);
+      spectrumSubtracted->Add(backgroundGrid,-1.0);
+    }
+    if(fIPanaCharmBgSubtract){
+      // Charm background
+      printf("Charm background for IP analysis subtracted!\n");
+      AliCFDataGrid *charmbgContainer = (AliCFDataGrid *) GetCharmBackground();
+      spectrumSubtracted->Add(charmbgContainer,-1.0);
+    }
+    if(fIPanaConversionBgSubtract){
+      // Conversion background
+      AliCFDataGrid *conversionbgContainer = (AliCFDataGrid *) GetConversionBackground();
+      spectrumSubtracted->Add(conversionbgContainer,-1.0);
+      printf("Conversion background subtraction is preliminary!\n");
+    }
+    if(fIPanaNonHFEBgSubtract){
+      // NonHFE background
+      AliCFDataGrid *nonHFEbgContainer = (AliCFDataGrid *) GetNonHFEBackground();
+      spectrumSubtracted->Add(nonHFEbgContainer,-1.0);
+      printf("Non HFE background subtraction is preliminary!\n");
+    }
+  }
+  else{
+    // Subtract 
+    spectrumSubtracted->Add(backgroundGrid,-1.0);
+  }
+
   if(setBackground){
     if(fBackground) delete fBackground;
     fBackground = backgroundGrid;
@@ -401,13 +856,17 @@ AliCFDataGrid* AliHFEspectrum::SubtractBackground(Bool_t setBackground){
 
 
   if(fDebugLevel > 0) {
+
+    Int_t ptpr;
+    if(fBeamType==0) ptpr=0;
+    if(fBeamType==1) ptpr=1;
     
     TCanvas * cbackgroundsubtraction = new TCanvas("backgroundsubtraction","backgroundsubtraction",1000,700);
     cbackgroundsubtraction->Divide(3,1);
     cbackgroundsubtraction->cd(1);
     gPad->SetLogy();
-    TH1D *measuredTH1Daftersubstraction = (TH1D *) spectrumSubtracted->Project(0);
-    TH1D *measuredTH1Dbeforesubstraction = (TH1D *) dataspectrumbeforesubstraction->Project(0);
+    TH1D *measuredTH1Daftersubstraction = (TH1D *) spectrumSubtracted->Project(ptpr);
+    TH1D *measuredTH1Dbeforesubstraction = (TH1D *) dataspectrumbeforesubstraction->Project(ptpr);
     CorrectFromTheWidth(measuredTH1Daftersubstraction);
     CorrectFromTheWidth(measuredTH1Dbeforesubstraction);
     measuredTH1Daftersubstraction->SetStats(0);
@@ -437,15 +896,19 @@ AliCFDataGrid* AliHFEspectrum::SubtractBackground(Bool_t setBackground){
     ratiomeasuredcontamination->SetTitle("");
     ratiomeasuredcontamination->GetYaxis()->SetTitle("(with contamination - without contamination) / with contamination");
     ratiomeasuredcontamination->GetXaxis()->SetTitle("p_{T} [GeV/c]");
+    ratiomeasuredcontamination->Sumw2();
     ratiomeasuredcontamination->Add(measuredTH1Daftersubstraction,-1.0);
     ratiomeasuredcontamination->Divide(measuredTH1Dbeforesubstraction);
     ratiomeasuredcontamination->SetStats(0);
     ratiomeasuredcontamination->SetMarkerStyle(26);
     ratiomeasuredcontamination->SetMarkerColor(kBlack);
     ratiomeasuredcontamination->SetLineColor(kBlack);
-    ratiomeasuredcontamination->Draw();
+    for(Int_t k=0; k < ratiomeasuredcontamination->GetNbinsX(); k++){
+      ratiomeasuredcontamination->SetBinError(k+1,0.0);
+    }
+    ratiomeasuredcontamination->Draw("P");
     cbackgroundsubtraction->cd(3);
-    TH1D *measuredTH1background = (TH1D *) backgroundGrid->Project(0);
+    TH1D *measuredTH1background = (TH1D *) backgroundGrid->Project(ptpr);
     CorrectFromTheWidth(measuredTH1background);
     measuredTH1background->SetStats(0);
     measuredTH1background->SetTitle("");
@@ -455,12 +918,383 @@ AliCFDataGrid* AliHFEspectrum::SubtractBackground(Bool_t setBackground){
     measuredTH1background->SetMarkerColor(kBlack);
     measuredTH1background->SetLineColor(kBlack);
     measuredTH1background->Draw();
+
+    if(fBeamType==1) {
+
+      TCanvas * cbackgrounde = new TCanvas("BackgroundSubtraction_allspectra","BackgroundSubtraction_allspectra",1000,700);
+      cbackgrounde->Divide(2,1);
+      TLegend *legtotal = new TLegend(0.4,0.6,0.89,0.89);
+      TLegend *legtotalg = new TLegend(0.4,0.6,0.89,0.89);
+     
+      THnSparseF* sparsesubtracted = (THnSparseF *) spectrumSubtracted->GetGrid();
+      TAxis *cenaxisa = sparsesubtracted->GetAxis(0);
+      THnSparseF* sparsebefore = (THnSparseF *) dataspectrumbeforesubstraction->GetGrid();
+      TAxis *cenaxisb = sparsebefore->GetAxis(0);
+      Int_t nbbin = cenaxisb->GetNbins();
+      Int_t stylee[20] = {20,21,22,23,24,25,26,27,28,30,4,5,7,29,29,29,29,29,29,29};
+      Int_t colorr[20] = {2,3,4,5,6,7,8,9,46,38,29,30,31,32,33,34,35,37,38,20};
+      for(Int_t binc = 0; binc < nbbin; binc++){
+       TString titlee("BackgroundSubtraction_centrality_bin_");
+       titlee += binc;
+       TCanvas * cbackground = new TCanvas((const char*) titlee,(const char*) titlee,1000,700);
+       cbackground->Divide(2,1);
+       cbackground->cd(1);
+       gPad->SetLogy();
+       cenaxisa->SetRange(binc+1,binc+1);
+       cenaxisb->SetRange(binc+1,binc+1);
+       TH1D *aftersubstraction = (TH1D *) sparsesubtracted->Projection(1);
+       TH1D *beforesubstraction = (TH1D *) sparsebefore->Projection(1);
+       CorrectFromTheWidth(aftersubstraction);
+       CorrectFromTheWidth(beforesubstraction);
+       aftersubstraction->SetStats(0);
+       aftersubstraction->SetTitle((const char*)titlee);
+       aftersubstraction->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
+       aftersubstraction->GetXaxis()->SetTitle("p_{T} [GeV/c]");
+       aftersubstraction->SetMarkerStyle(25);
+       aftersubstraction->SetMarkerColor(kBlack);
+       aftersubstraction->SetLineColor(kBlack);
+       beforesubstraction->SetStats(0);
+       beforesubstraction->SetTitle((const char*)titlee);
+       beforesubstraction->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
+       beforesubstraction->GetXaxis()->SetTitle("p_{T} [GeV/c]");
+       beforesubstraction->SetMarkerStyle(24);
+       beforesubstraction->SetMarkerColor(kBlue);
+       beforesubstraction->SetLineColor(kBlue);
+       aftersubstraction->Draw();
+       beforesubstraction->Draw("same");
+       TLegend *lega = new TLegend(0.4,0.6,0.89,0.89);
+       lega->AddEntry(beforesubstraction,"With hadron contamination","p");
+       lega->AddEntry(aftersubstraction,"Without hadron contamination ","p");
+       lega->Draw("same");
+       cbackgrounde->cd(1);
+       gPad->SetLogy();
+       TH1D *aftersubtractionn = (TH1D *) aftersubstraction->Clone();
+       aftersubtractionn->SetMarkerStyle(stylee[binc]);
+       aftersubtractionn->SetMarkerColor(colorr[binc]);
+       if(binc==0) aftersubtractionn->Draw();
+       else aftersubtractionn->Draw("same");
+       legtotal->AddEntry(aftersubtractionn,(const char*) titlee,"p");
+       cbackgrounde->cd(2);
+       gPad->SetLogy();
+       TH1D *aftersubtractionng = (TH1D *) aftersubstraction->Clone();
+       aftersubtractionng->SetMarkerStyle(stylee[binc]);
+       aftersubtractionng->SetMarkerColor(colorr[binc]);
+       if(fNEvents[binc] > 0.0) aftersubtractionng->Scale(1/(Double_t)fNEvents[binc]);
+       if(binc==0) aftersubtractionng->Draw();
+       else aftersubtractionng->Draw("same");
+       legtotalg->AddEntry(aftersubtractionng,(const char*) titlee,"p");
+       cbackground->cd(2);
+       TH1D* ratiocontamination = (TH1D*)beforesubstraction->Clone();
+       ratiocontamination->SetName("ratiocontamination");
+       ratiocontamination->SetTitle((const char*)titlee);
+       ratiocontamination->GetYaxis()->SetTitle("(with contamination - without contamination) / with contamination");
+       ratiocontamination->GetXaxis()->SetTitle("p_{T} [GeV/c]");
+       ratiocontamination->Add(aftersubstraction,-1.0);
+       ratiocontamination->Divide(beforesubstraction);
+       Int_t totalbin = ratiocontamination->GetXaxis()->GetNbins();
+       for(Int_t nbinpt = 0; nbinpt < totalbin; nbinpt++) {
+         ratiocontamination->SetBinError(nbinpt+1,0.0);
+       }
+       ratiocontamination->SetStats(0);
+       ratiocontamination->SetMarkerStyle(26);
+       ratiocontamination->SetMarkerColor(kBlack);
+       ratiocontamination->SetLineColor(kBlack);
+       ratiocontamination->Draw("P");
+       
+      }
+     
+      cbackgrounde->cd(1);
+      legtotal->Draw("same");
+      cbackgrounde->cd(2);
+      legtotalg->Draw("same");
+
+      cenaxisa->SetRange(0,nbbin);
+      cenaxisb->SetRange(0,nbbin);
+      
+    }
+   
        
   }
   
 
   return spectrumSubtracted;
 }
+
+//____________________________________________________________
+AliCFDataGrid* AliHFEspectrum::GetCharmBackground(){
+  //
+  // calculate charm background
+  //
+
+  Double_t evtnorm=0;
+  if(fNMCEvents) evtnorm= double(fNEvents[0])/double(fNMCEvents);
+
+  AliCFContainer *mcContainer = GetContainer(kMCContainerCharmMC);
+  if(!mcContainer){
+    AliError("MC Container not available");
+    return NULL;
+  }
+
+  if(!fCorrelation){
+    AliError("No Correlation map available");
+    return NULL;
+  }
+
+  Int_t nDim = 1;
+  AliCFDataGrid *charmBackgroundGrid= 0x0;
+  charmBackgroundGrid = new AliCFDataGrid("charmBackgroundGrid","charmBackgroundGrid",*mcContainer, fStepMC+2);
+  TH1D *tmphisto = (TH1D *) charmBackgroundGrid->Project(0);
+  Int_t* bins=new Int_t[1];
+  bins[0]=tmphisto->GetNbinsX();
+  AliCFDataGrid *weightedCharmContainer = new AliCFDataGrid("weightedCharmContainer","weightedCharmContainer",1,bins);
+  weightedCharmContainer->SetGrid(GetWeights());
+  charmBackgroundGrid->Multiply(weightedCharmContainer,evtnorm);
+
+  // Efficiency (set efficiency to 1 for only folding) 
+  AliCFEffGrid* efficiencyD = new AliCFEffGrid("efficiency","",*mcContainer);
+  efficiencyD->CalculateEfficiency(0,0);
+
+  // Folding 
+  AliCFUnfolding folding("unfolding","",nDim,fCorrelation,efficiencyD->GetGrid(),charmBackgroundGrid->GetGrid(),charmBackgroundGrid->GetGrid());
+  folding.SetMaxNumberOfIterations(1);
+  folding.Unfold();
+
+  // Results
+  THnSparse* result1= folding.GetEstMeasured(); // folded spectra
+  THnSparse* result=(THnSparse*)result1->Clone();
+  charmBackgroundGrid->SetGrid(result);
+
+  return charmBackgroundGrid;
+}
+
+//____________________________________________________________
+AliCFDataGrid* AliHFEspectrum::GetConversionBackground(){
+  //
+  // calculate conversion background
+  //
+
+  Double_t evtnorm[1];
+  if(fNMCbgEvents) evtnorm[0]= double(fNEvents[0])/double(fNMCbgEvents);
+  printf("check event!!! %lf \n",evtnorm[0]);
+
+  // Background Estimate
+  AliCFContainer *backgroundContainer = GetContainer(kNonHFEBackgroundData);
+  if(!backgroundContainer){
+    AliError("MC background container not found");
+    return NULL;
+  }
+
+  Int_t stepbackground = 2;
+  AliCFDataGrid *backgroundGrid = new AliCFDataGrid("ConversionBgGrid","ConversionBgGrid",*backgroundContainer,stepbackground);
+  backgroundGrid->Scale(evtnorm);
+
+  new TCanvas;
+  TH1D *histodraw111 = (TH1D *) backgroundGrid->Project(0);
+  CorrectFromTheWidth(histodraw111);
+  histodraw111->SetMarkerStyle(20);
+  histodraw111->SetLineColor(4);
+  histodraw111->SetMarkerColor(4);
+  histodraw111->Draw("p");
+
+
+  return backgroundGrid;
+}
+
+
+//____________________________________________________________
+AliCFDataGrid* AliHFEspectrum::GetNonHFEBackground(){
+  //
+  // calculate non HFE background
+  //
+
+  if(fNonHFEbgMethod2){
+    Double_t evtnorm=0;
+    if(fNMCEvents) evtnorm= double(fNEvents[0])/double(fNMCEvents);
+
+    AliCFContainer *mcContainer = GetContainer(kMCContainerNonHFEMC);
+    if(!mcContainer){
+      AliError("MC Container not available");
+      return NULL;
+    }
+
+    if(!fCorrelation){
+      AliError("No Correlation map available");
+      return NULL;
+    }
+
+    Int_t nDim = 1;
+    AliCFDataGrid *nonHFEBackgroundGrid= 0x0;
+    nonHFEBackgroundGrid = new AliCFDataGrid("nonHFEBackgroundGrid","nonHFEBackgroundGrid",*mcContainer, fStepMC+2);
+    TH1D *tmphisto = (TH1D *) nonHFEBackgroundGrid->Project(0);
+    Int_t* bins=new Int_t[1];
+    bins[0]=tmphisto->GetNbinsX();
+    AliCFDataGrid *weightedNonHFEContainer = new AliCFDataGrid("weightedNonHFEContainer","weightedNonHFEContainer",1,bins);
+    weightedNonHFEContainer->SetGrid(GetWeights()); // we have to use different weithing function
+    nonHFEBackgroundGrid->Multiply(weightedNonHFEContainer,evtnorm);
+
+    // Efficiency (set efficiency to 1 for only folding) 
+    AliCFEffGrid* efficiencyD = new AliCFEffGrid("efficiency","",*mcContainer);
+    efficiencyD->CalculateEfficiency(0,0);
+
+    // Folding 
+    AliCFUnfolding folding("unfolding","",nDim,fCorrelation,efficiencyD->GetGrid(),nonHFEBackgroundGrid->GetGrid(),nonHFEBackgroundGrid->GetGrid());
+    folding.SetMaxNumberOfIterations(1);
+    folding.Unfold();
+
+    // Results
+    THnSparse* result1= folding.GetEstMeasured(); // folded spectra
+    THnSparse* result=(THnSparse*)result1->Clone();
+    nonHFEBackgroundGrid->SetGrid(result);
+
+    return nonHFEBackgroundGrid;
+  }
+  else{
+    Double_t evtnorm[1];
+    if(fNMCbgEvents) evtnorm[0]= double(fNEvents[0])/double(fNMCbgEvents);
+
+    // Background Estimate
+    AliCFContainer *backgroundContainer = GetContainer(kNonHFEBackgroundData);
+    if(!backgroundContainer){
+      AliError("MC background container not found");
+      return NULL;
+    }
+
+    Int_t stepbackground = 3;
+    AliCFDataGrid *backgroundGrid = new AliCFDataGrid("NonHFEBgGrid","NonHFEBgGrid",*backgroundContainer,stepbackground);
+    backgroundGrid->Scale(evtnorm);
+
+    new TCanvas;
+    TH1D *histodraw222 = (TH1D *) backgroundGrid->Project(0);
+    CorrectFromTheWidth(histodraw222);
+    histodraw222->SetMarkerStyle(20);
+    histodraw222->SetLineColor(4);
+    histodraw222->SetMarkerColor(4);
+    histodraw222->Draw("p");
+
+    return backgroundGrid;
+  }
+
+}
+
+//____________________________________________________________
+AliCFDataGrid *AliHFEspectrum::CorrectParametrizedEfficiency(AliCFDataGrid* const bgsubpectrum){
+  
+  //
+  // Apply TPC pid efficiency correction from parametrisation
+  //
+
+  // Data in the right format
+  AliCFDataGrid *dataGrid = 0x0;  
+  if(bgsubpectrum) {
+    dataGrid = bgsubpectrum;
+  }
+  else {
+    
+    AliCFContainer *dataContainer = GetContainer(kDataContainer);
+    if(!dataContainer){
+      AliError("Data Container not available");
+      return NULL;
+    }
+
+    dataGrid = new AliCFDataGrid("dataGrid","dataGrid",*dataContainer, fStepData);
+  } 
+
+  AliCFDataGrid *result = (AliCFDataGrid *) dataGrid->Clone();
+  result->SetName("ParametrizedEfficiencyBefore");
+  THnSparse *h = result->GetGrid();
+  Int_t nbdimensions = h->GetNdimensions();
+  //printf("CorrectParametrizedEfficiency::We have dimensions %d\n",nbdimensions);
+
+  AliCFContainer *dataContainer = GetContainer(kDataContainer);
+  if(!dataContainer){
+    AliError("Data Container not available");
+    return NULL;
+  }
+  AliCFContainer *dataContainerbis = (AliCFContainer *) dataContainer->Clone();
+  dataContainerbis->Add(dataContainerbis,-1.0);
+
+
+  Int_t* coord = new Int_t[nbdimensions];
+  memset(coord, 0, sizeof(Int_t) * nbdimensions);
+  Double_t* points = new Double_t[nbdimensions];
+
+
+  ULong64_t nEntries = h->GetNbins();
+  for (ULong64_t i = 0; i < nEntries; ++i) {
+    
+    Double_t value = h->GetBinContent(i, coord);
+    //Double_t valuecontainer = dataContainerbis->GetBinContent(coord,fStepData);
+    //printf("Value %f, and valuecontainer %f\n",value,valuecontainer);
+    
+    // Get the bin co-ordinates given an coord
+    for (Int_t j = 0; j < nbdimensions; ++j)
+      points[j] = h->GetAxis(j)->GetBinCenter(coord[j]);
+
+    if (!fEfficiencyFunction->IsInside(points))
+         continue;
+    TF1::RejectPoint(kFALSE);
+
+    // Evaulate function at points
+    Double_t valueEfficiency = fEfficiencyFunction->EvalPar(points, NULL);
+    //printf("Value efficiency is %f\n",valueEfficiency);
+
+    if(valueEfficiency > 0.0) {
+      h->SetBinContent(coord,value/valueEfficiency);
+      dataContainerbis->SetBinContent(coord,fStepData,value/valueEfficiency);
+    }
+    Double_t error = h->GetBinError(i);
+    h->SetBinError(coord,error/valueEfficiency);
+    dataContainerbis->SetBinError(coord,fStepData,error/valueEfficiency);
+
+   
+  } 
+
+  AliCFDataGrid *resultt = new AliCFDataGrid("spectrumEfficiencyParametrized", "Data Grid for spectrum after Efficiency parametrized", *dataContainerbis,fStepData);
+
+  if(fDebugLevel > 0) {
+    
+    TCanvas * cEfficiencyParametrized = new TCanvas("EfficiencyParametrized","EfficiencyParametrized",1000,700);
+    cEfficiencyParametrized->Divide(2,1);
+    cEfficiencyParametrized->cd(1);
+    TH1D *afterE = (TH1D *) resultt->Project(0);
+    TH1D *beforeE = (TH1D *) dataGrid->Project(0);
+    CorrectFromTheWidth(afterE);
+    CorrectFromTheWidth(beforeE);
+    afterE->SetStats(0);
+    afterE->SetTitle("");
+    afterE->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
+    afterE->GetXaxis()->SetTitle("p_{T} [GeV/c]");
+    afterE->SetMarkerStyle(25);
+    afterE->SetMarkerColor(kBlack);
+    afterE->SetLineColor(kBlack);
+    beforeE->SetStats(0);
+    beforeE->SetTitle("");
+    beforeE->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
+    beforeE->GetXaxis()->SetTitle("p_{T} [GeV/c]");
+    beforeE->SetMarkerStyle(24);
+    beforeE->SetMarkerColor(kBlue);
+    beforeE->SetLineColor(kBlue);
+    gPad->SetLogy();
+    afterE->Draw();
+    beforeE->Draw("same");
+    TLegend *legefficiencyparametrized = new TLegend(0.4,0.6,0.89,0.89);
+    legefficiencyparametrized->AddEntry(beforeE,"Before Efficiency correction","p");
+    legefficiencyparametrized->AddEntry(afterE,"After Efficiency correction","p");
+    legefficiencyparametrized->Draw("same");
+    cEfficiencyParametrized->cd(2);
+    fEfficiencyFunction->Draw();
+    //cEfficiencyParametrized->cd(3);
+    //TH1D *ratioefficiency = (TH1D *) beforeE->Clone();
+    //ratioefficiency->Divide(afterE);
+    //ratioefficiency->Draw();
+
+
+  }
+
+  
+  return resultt;
+
+}
 //____________________________________________________________
 AliCFDataGrid *AliHFEspectrum::CorrectV0Efficiency(AliCFDataGrid* const bgsubpectrum){
   
@@ -499,12 +1333,16 @@ AliCFDataGrid *AliHFEspectrum::CorrectV0Efficiency(AliCFDataGrid* const bgsubpec
   result->ApplyEffCorrection(*efficiencyD);
 
   if(fDebugLevel > 0) {
+
+    Int_t ptpr;
+    if(fBeamType==0) ptpr=0;
+    if(fBeamType==1) ptpr=1;
     
     TCanvas * cV0Efficiency = new TCanvas("V0Efficiency","V0Efficiency",1000,700);
     cV0Efficiency->Divide(2,1);
     cV0Efficiency->cd(1);
-    TH1D *afterE = (TH1D *) result->Project(0);
-    TH1D *beforeE = (TH1D *) dataGrid->Project(0);
+    TH1D *afterE = (TH1D *) result->Project(ptpr);
+    TH1D *beforeE = (TH1D *) dataGrid->Project(ptpr);
     afterE->SetStats(0);
     afterE->SetTitle("");
     afterE->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
@@ -526,12 +1364,98 @@ AliCFDataGrid *AliHFEspectrum::CorrectV0Efficiency(AliCFDataGrid* const bgsubpec
     legV0efficiency->AddEntry(afterE,"After Efficiency correction","p");
     legV0efficiency->Draw("same");
     cV0Efficiency->cd(2);
-    TH1D* efficiencyDproj = (TH1D *) efficiencyD->Project(0);
+    TH1D* efficiencyDproj = (TH1D *) efficiencyD->Project(ptpr);
     efficiencyDproj->SetTitle("");
     efficiencyDproj->SetStats(0);
     efficiencyDproj->SetMarkerStyle(25);
     efficiencyDproj->Draw();
 
+    if(fBeamType==1) {
+
+      TCanvas * cV0Efficiencye = new TCanvas("V0Efficiency_allspectra","V0Efficiency_allspectra",1000,700);
+      cV0Efficiencye->Divide(2,1);
+      TLegend *legtotal = new TLegend(0.4,0.6,0.89,0.89);
+      TLegend *legtotalg = new TLegend(0.4,0.6,0.89,0.89);
+     
+      THnSparseF* sparseafter = (THnSparseF *) result->GetGrid();
+      TAxis *cenaxisa = sparseafter->GetAxis(0);
+      THnSparseF* sparsebefore = (THnSparseF *) dataGrid->GetGrid();
+      TAxis *cenaxisb = sparsebefore->GetAxis(0);
+      THnSparseF* efficiencya = (THnSparseF *) efficiencyD->GetGrid();
+      TAxis *cenaxisc = efficiencya->GetAxis(0);
+      Int_t nbbin = cenaxisb->GetNbins();
+      Int_t stylee[20] = {20,21,22,23,24,25,26,27,28,30,4,5,7,29,29,29,29,29,29,29};
+      Int_t colorr[20] = {2,3,4,5,6,7,8,9,46,38,29,30,31,32,33,34,35,37,38,20};
+      for(Int_t binc = 0; binc < nbbin; binc++){
+       TString titlee("V0Efficiency_centrality_bin_");
+       titlee += binc;
+       TCanvas * ccV0Efficiency = new TCanvas((const char*) titlee,(const char*) titlee,1000,700);
+       ccV0Efficiency->Divide(2,1);
+       ccV0Efficiency->cd(1);
+       gPad->SetLogy();
+       cenaxisa->SetRange(binc+1,binc+1);
+       cenaxisb->SetRange(binc+1,binc+1);
+       cenaxisc->SetRange(binc+1,binc+1);
+       TH1D *aftere = (TH1D *) sparseafter->Projection(1);
+       TH1D *beforee = (TH1D *) sparsebefore->Projection(1);
+       CorrectFromTheWidth(aftere);
+       CorrectFromTheWidth(beforee);
+       aftere->SetStats(0);
+       aftere->SetTitle((const char*)titlee);
+       aftere->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
+       aftere->GetXaxis()->SetTitle("p_{T} [GeV/c]");
+       aftere->SetMarkerStyle(25);
+       aftere->SetMarkerColor(kBlack);
+       aftere->SetLineColor(kBlack);
+       beforee->SetStats(0);
+       beforee->SetTitle((const char*)titlee);
+       beforee->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
+       beforee->GetXaxis()->SetTitle("p_{T} [GeV/c]");
+       beforee->SetMarkerStyle(24);
+       beforee->SetMarkerColor(kBlue);
+       beforee->SetLineColor(kBlue);
+       aftere->Draw();
+       beforee->Draw("same");
+       TLegend *lega = new TLegend(0.4,0.6,0.89,0.89);
+       lega->AddEntry(beforee,"Before correction","p");
+       lega->AddEntry(aftere,"After correction","p");
+       lega->Draw("same");
+       cV0Efficiencye->cd(1);
+       gPad->SetLogy();
+       TH1D *afteree = (TH1D *) aftere->Clone();
+       afteree->SetMarkerStyle(stylee[binc]);
+       afteree->SetMarkerColor(colorr[binc]);
+       if(binc==0) afteree->Draw();
+       else afteree->Draw("same");
+       legtotal->AddEntry(afteree,(const char*) titlee,"p");
+       cV0Efficiencye->cd(2);
+       gPad->SetLogy();
+       TH1D *aftereeu = (TH1D *) aftere->Clone();
+       aftereeu->SetMarkerStyle(stylee[binc]);
+       aftereeu->SetMarkerColor(colorr[binc]);
+       if(fNEvents[binc] > 0.0) aftereeu->Scale(1/(Double_t)fNEvents[binc]);
+       if(binc==0) aftereeu->Draw();
+       else aftereeu->Draw("same");
+       legtotalg->AddEntry(aftereeu,(const char*) titlee,"p");
+       ccV0Efficiency->cd(2);
+       TH1D* efficiencyDDproj = (TH1D *) efficiencya->Projection(1);
+       efficiencyDDproj->SetTitle("");
+       efficiencyDDproj->SetStats(0);
+       efficiencyDDproj->SetMarkerStyle(25);
+       efficiencyDDproj->Draw();
+               
+      }
+     
+      cV0Efficiencye->cd(1);
+      legtotal->Draw("same");
+      cV0Efficiencye->cd(2);
+      legtotalg->Draw("same");
+
+      cenaxisa->SetRange(0,nbbin);
+      cenaxisb->SetRange(0,nbbin);
+      cenaxisc->SetRange(0,nbbin);
+      
+    }
 
   }
 
@@ -584,6 +1508,8 @@ TList *AliHFEspectrum::Unfold(AliCFDataGrid* const bgsubpectrum){
   // Unfold 
   
   AliCFUnfolding unfolding("unfolding","",fNbDimensions,fCorrelation,efficiencyD->GetGrid(),dataGrid->GetGrid(),guessedTHnSparse);
+  //unfolding.SetUseCorrelatedErrors();
+  if(fUnSetCorrelatedErrors) unfolding.UnsetCorrelatedErrors();
   unfolding.SetMaxNumberOfIterations(fNumberOfIterations);
   unfolding.UseSmoothing();
   unfolding.Unfold();
@@ -597,6 +1523,10 @@ TList *AliHFEspectrum::Unfold(AliCFDataGrid* const bgsubpectrum){
   listofresults->AddAt((THnSparse*)residual->Clone(),1);
 
   if(fDebugLevel > 0) {
+
+    Int_t ptpr;
+    if(fBeamType==0) ptpr=0;
+    if(fBeamType==1) ptpr=1;
     
     TCanvas * cresidual = new TCanvas("residual","residual",1000,700);
     cresidual->Divide(2,1);
@@ -629,8 +1559,8 @@ TList *AliHFEspectrum::Unfold(AliCFDataGrid* const bgsubpectrum){
     legres->AddEntry(measuredspectrumD,"Measured","p");
     legres->Draw("same");
     cresidual->cd(2);
-    TH1D *residualTH1D = residual->Projection(0);
-    TH1D *measuredTH1D = (TH1D *) dataGridBis->Project(0);
+    TH1D *residualTH1D = residual->Projection(ptpr);
+    TH1D *measuredTH1D = (TH1D *) dataGridBis->Project(ptpr);
     TH1D* ratioresidual = (TH1D*)residualTH1D->Clone();
     ratioresidual->SetName("ratioresidual");
     ratioresidual->SetTitle("");
@@ -684,6 +1614,10 @@ AliCFDataGrid *AliHFEspectrum::CorrectForEfficiency(AliCFDataGrid* const bgsubpe
   result->ApplyEffCorrection(*efficiencyD);
 
   if(fDebugLevel > 0) {
+
+    Int_t ptpr;
+    if(fBeamType==0) ptpr=0;
+    if(fBeamType==1) ptpr=1;
     
     printf("Step MC: %d\n",fStepMC);
     printf("Step tracking: %d\n",AliHFEcuts::kStepHFEcutsTRD + AliHFEcuts::kNcutStepsMCTrack);
@@ -696,22 +1630,22 @@ AliCFDataGrid *AliHFEspectrum::CorrectForEfficiency(AliCFDataGrid* const bgsubpe
     
     TCanvas * cefficiency = new TCanvas("efficiency","efficiency",1000,700);
     cefficiency->cd(1);
-    TH1D* efficiencymcPIDD = (TH1D *) efficiencymcPID->Project(0);
+    TH1D* efficiencymcPIDD = (TH1D *) efficiencymcPID->Project(ptpr);
     efficiencymcPIDD->SetTitle("");
     efficiencymcPIDD->SetStats(0);
     efficiencymcPIDD->SetMarkerStyle(25);
     efficiencymcPIDD->Draw();
-    TH1D* efficiencymctrackinggeoD = (TH1D *) efficiencymctrackinggeo->Project(0);
+    TH1D* efficiencymctrackinggeoD = (TH1D *) efficiencymctrackinggeo->Project(ptpr);
     efficiencymctrackinggeoD->SetTitle("");
     efficiencymctrackinggeoD->SetStats(0);
     efficiencymctrackinggeoD->SetMarkerStyle(26);
     efficiencymctrackinggeoD->Draw("same");
-    TH1D* efficiencymcallD = (TH1D *) efficiencymcall->Project(0);
+    TH1D* efficiencymcallD = (TH1D *) efficiencymcall->Project(ptpr);
     efficiencymcallD->SetTitle("");
     efficiencymcallD->SetStats(0);
     efficiencymcallD->SetMarkerStyle(27);
     efficiencymcallD->Draw("same");
-    TH1D* efficiencyesdallD = (TH1D *) efficiencyesdall->Project(0);
+    TH1D* efficiencyesdallD = (TH1D *) efficiencyesdall->Project(ptpr);
     efficiencyesdallD->SetTitle("");
     efficiencyesdallD->SetStats(0);
     efficiencyesdallD->SetMarkerStyle(24);
@@ -722,6 +1656,73 @@ AliCFDataGrid *AliHFEspectrum::CorrectForEfficiency(AliCFDataGrid* const bgsubpe
     legeff->AddEntry(efficiencymcallD,"Overall efficiency","p");
     legeff->AddEntry(efficiencyesdallD,"Overall efficiency ESD","p");
     legeff->Draw("same");
+
+    if(fBeamType==1) {
+
+      THnSparseF* sparseafter = (THnSparseF *) result->GetGrid();
+      TAxis *cenaxisa = sparseafter->GetAxis(0);
+      THnSparseF* sparsebefore = (THnSparseF *) dataGrid->GetGrid();
+      TAxis *cenaxisb = sparsebefore->GetAxis(0);
+      THnSparseF* efficiencya = (THnSparseF *) efficiencyD->GetGrid();
+      TAxis *cenaxisc = efficiencya->GetAxis(0);
+      //Int_t nbbin = cenaxisb->GetNbins();
+      //Int_t stylee[20] = {20,21,22,23,24,25,26,27,28,30,4,5,7,29,29,29,29,29,29,29};
+      //Int_t colorr[20] = {2,3,4,5,6,7,8,9,46,38,29,30,31,32,33,34,35,37,38,20};
+      for(Int_t binc = 0; binc < fNCentralityBinAtTheEnd; binc++){
+       TString titlee("Efficiency_centrality_bin_");
+       titlee += fLowBoundaryCentralityBinAtTheEnd[binc];
+       titlee += "_";
+       titlee += fHighBoundaryCentralityBinAtTheEnd[binc];
+       TCanvas * cefficiencye = new TCanvas((const char*) titlee,(const char*) titlee,1000,700);
+       cefficiencye->Divide(2,1);
+       cefficiencye->cd(1);
+       gPad->SetLogy();
+       cenaxisa->SetRange(fLowBoundaryCentralityBinAtTheEnd[binc]+1,fHighBoundaryCentralityBinAtTheEnd[binc]);
+       cenaxisb->SetRange(fLowBoundaryCentralityBinAtTheEnd[binc]+1,fHighBoundaryCentralityBinAtTheEnd[binc]);
+       TH1D *afterefficiency = (TH1D *) sparseafter->Projection(ptpr);
+       TH1D *beforeefficiency = (TH1D *) sparsebefore->Projection(ptpr);
+       CorrectFromTheWidth(afterefficiency);
+       CorrectFromTheWidth(beforeefficiency);
+       afterefficiency->SetStats(0);
+       afterefficiency->SetTitle((const char*)titlee);
+       afterefficiency->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
+       afterefficiency->GetXaxis()->SetTitle("p_{T} [GeV/c]");
+       afterefficiency->SetMarkerStyle(25);
+       afterefficiency->SetMarkerColor(kBlack);
+       afterefficiency->SetLineColor(kBlack);
+       beforeefficiency->SetStats(0);
+       beforeefficiency->SetTitle((const char*)titlee);
+       beforeefficiency->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
+       beforeefficiency->GetXaxis()->SetTitle("p_{T} [GeV/c]");
+       beforeefficiency->SetMarkerStyle(24);
+       beforeefficiency->SetMarkerColor(kBlue);
+       beforeefficiency->SetLineColor(kBlue);
+       afterefficiency->Draw();
+       beforeefficiency->Draw("same");
+       TLegend *lega = new TLegend(0.4,0.6,0.89,0.89);
+       lega->AddEntry(beforeefficiency,"Before efficiency correction","p");
+       lega->AddEntry(afterefficiency,"After efficiency correction","p");
+       lega->Draw("same");
+       cefficiencye->cd(2);
+       cenaxisc->SetRange(fLowBoundaryCentralityBinAtTheEnd[binc]+1,fLowBoundaryCentralityBinAtTheEnd[binc]+1);
+       TH1D* efficiencyDDproj = (TH1D *) efficiencya->Projection(ptpr);
+       efficiencyDDproj->SetTitle("");
+       efficiencyDDproj->SetStats(0);
+       efficiencyDDproj->SetMarkerStyle(25);
+       efficiencyDDproj->SetMarkerColor(2);
+       efficiencyDDproj->Draw();
+       cenaxisc->SetRange(fHighBoundaryCentralityBinAtTheEnd[binc],fHighBoundaryCentralityBinAtTheEnd[binc]);
+       TH1D* efficiencyDDproja = (TH1D *) efficiencya->Projection(ptpr);
+       efficiencyDDproja->SetTitle("");
+       efficiencyDDproja->SetStats(0);
+       efficiencyDDproja->SetMarkerStyle(26);
+       efficiencyDDproja->SetMarkerColor(4);
+       efficiencyDDproja->Draw("same");
+       
+      }
+    }
+
+
   }
   
   return result;
@@ -729,17 +1730,21 @@ AliCFDataGrid *AliHFEspectrum::CorrectForEfficiency(AliCFDataGrid* const bgsubpe
 }
 
 //__________________________________________________________________________________
-TGraphErrors *AliHFEspectrum::Normalize(THnSparse * const spectrum) const {
+TGraphErrors *AliHFEspectrum::Normalize(THnSparse * const spectrum,Int_t i) const {
   //
   // Normalize the spectrum to 1/(2*Pi*p_{T})*dN/dp_{T} (GeV/c)^{-2}
   // Give the final pt spectrum to be compared
   //
  
-  if(fNEvents > 0) {
+  if(fNEvents[i] > 0) {
+
+    Int_t ptpr;
+    if(fBeamType==0) ptpr=0;
+    if(fBeamType==1) ptpr=1;
     
-    TH1D* projection = spectrum->Projection(0);
+    TH1D* projection = spectrum->Projection(ptpr);
     CorrectFromTheWidth(projection);
-    TGraphErrors *graphError = NormalizeTH1(projection);
+    TGraphErrors *graphError = NormalizeTH1(projection,i);
     return graphError;
   
   }
@@ -749,16 +1754,20 @@ TGraphErrors *AliHFEspectrum::Normalize(THnSparse * const spectrum) const {
 
 }
 //__________________________________________________________________________________
-TGraphErrors *AliHFEspectrum::Normalize(AliCFDataGrid * const spectrum) const {
+TGraphErrors *AliHFEspectrum::Normalize(AliCFDataGrid * const spectrum,Int_t i) const {
   //
   // Normalize the spectrum to 1/(2*Pi*p_{T})*dN/dp_{T} (GeV/c)^{-2}
   // Give the final pt spectrum to be compared
   //
-  if(fNEvents > 0) {
+  if(fNEvents[i] > 0) {
 
-    TH1D* projection = (TH1D *) spectrum->Project(0);
+    Int_t ptpr;
+    if(fBeamType==0) ptpr=0;
+    if(fBeamType==1) ptpr=1;
+    
+    TH1D* projection = (TH1D *) spectrum->Project(ptpr);
     CorrectFromTheWidth(projection);
-    TGraphErrors *graphError = NormalizeTH1(projection);
+    TGraphErrors *graphError = NormalizeTH1(projection,i);
     return graphError;
     
   }
@@ -768,12 +1777,55 @@ TGraphErrors *AliHFEspectrum::Normalize(AliCFDataGrid * const spectrum) const {
 
 }
 //__________________________________________________________________________________
-TGraphErrors *AliHFEspectrum::NormalizeTH1(TH1 *input) const {
+TGraphErrors *AliHFEspectrum::NormalizeTH1(TH1 *input,Int_t i) const {
+  //
+  // Normalize the spectrum to 1/(2*Pi*p_{T})*dN/dp_{T} (GeV/c)^{-2}
+  // Give the final pt spectrum to be compared
+  //
+  if(fNEvents[i] > 0) {
+
+    TGraphErrors *spectrumNormalized = new TGraphErrors(input->GetNbinsX());
+    Double_t p = 0, dp = 0; Int_t point = 1;
+    Double_t n = 0, dN = 0;
+    Double_t nCorr = 0, dNcorr = 0;
+    Double_t errdN = 0, errdp = 0;
+    for(Int_t ibin = input->GetXaxis()->GetFirst(); ibin <= input->GetXaxis()->GetLast(); ibin++){
+      point = ibin - input->GetXaxis()->GetFirst();
+      p = input->GetXaxis()->GetBinCenter(ibin);
+      dp = input->GetXaxis()->GetBinWidth(ibin)/2.;
+      n = input->GetBinContent(ibin);
+      dN = input->GetBinError(ibin);
+
+      // New point
+      nCorr = 0.5 * 1/1.6 * 1./(Double_t)(fNEvents[i]) * 1/(2. * TMath::Pi() * p) * n;
+      errdN = 1./(2. * TMath::Pi() * p);
+      errdp = 1./(2. * TMath::Pi() * p*p) * n;
+      dNcorr = 0.5 * 1/1.6 * 1./(Double_t)(fNEvents[i]) * TMath::Sqrt(errdN * errdN * dN *dN + errdp *errdp * dp *dp);
+      
+      spectrumNormalized->SetPoint(point, p, nCorr);
+      spectrumNormalized->SetPointError(point, dp, dNcorr);
+    }
+    spectrumNormalized->GetXaxis()->SetTitle("p_{T} [GeV/c]");
+    spectrumNormalized->GetYaxis()->SetTitle("#frac{1}{2 #pi p_{T}} #frac{dN}{dp_{T}} / [GeV/c]^{-2}");
+    spectrumNormalized->SetMarkerStyle(22);
+    spectrumNormalized->SetMarkerColor(kBlue);
+    spectrumNormalized->SetLineColor(kBlue);
+    
+    return spectrumNormalized;
+    
+  }
+
+  return 0x0;
+  
+
+}
+//__________________________________________________________________________________
+TGraphErrors *AliHFEspectrum::NormalizeTH1N(TH1 *input,Int_t normalization) const {
   //
   // Normalize the spectrum to 1/(2*Pi*p_{T})*dN/dp_{T} (GeV/c)^{-2}
   // Give the final pt spectrum to be compared
   //
-  if(fNEvents > 0) {
+  if(normalization > 0) {
 
     TGraphErrors *spectrumNormalized = new TGraphErrors(input->GetNbinsX());
     Double_t p = 0, dp = 0; Int_t point = 1;
@@ -788,10 +1840,10 @@ TGraphErrors *AliHFEspectrum::NormalizeTH1(TH1 *input) const {
       dN = input->GetBinError(ibin);
 
       // New point
-      nCorr = 0.5 * 1/1.6 * 1./(Double_t)(fNEvents) * 1/(2. * TMath::Pi() * p) * n;
+      nCorr = 0.5 * 1/1.6 * 1./(Double_t)(normalization) * 1/(2. * TMath::Pi() * p) * n;
       errdN = 1./(2. * TMath::Pi() * p);
       errdp = 1./(2. * TMath::Pi() * p*p) * n;
-      dNcorr = 0.5 * 1/1.6 * 1./(Double_t)(fNEvents) * TMath::Sqrt(errdN * errdN * dN *dN + errdp *errdp * dp *dp);
+      dNcorr = 0.5 * 1/1.6 * 1./(Double_t)(normalization) * TMath::Sqrt(errdN * errdN * dN *dN + errdp *errdp * dp *dp);
       
       spectrumNormalized->SetPoint(point, p, nCorr);
       spectrumNormalized->SetPointError(point, dp, dNcorr);
@@ -828,9 +1880,13 @@ AliCFContainer *AliHFEspectrum::GetContainer(AliHFEspectrum::CFContainer_t type)
   return dynamic_cast<AliCFContainer *>(fCFContainers->At(type));
 }
 //____________________________________________________________
-AliCFContainer *AliHFEspectrum::GetSlicedContainer(AliCFContainer *container, Int_t nDim, Int_t *dimensions,Int_t source) {
+AliCFContainer *AliHFEspectrum::GetSlicedContainer(AliCFContainer *container, Int_t nDim, Int_t *dimensions,Int_t source,Int_t positivenegative) {
   //
   // Slice bin for a given source of electron
+  // nDim is the number of dimension the corrections are done
+  // dimensions are the definition of the dimensions
+  // source is if we want to keep only one MC source (-1 means we don't cut on the MC source)
+  // positivenegative if we want to keep positive (1) or negative (0) or both (-1)
   //
   
   Double_t *varMin = new Double_t[container->GetNVar()],
@@ -841,14 +1897,23 @@ AliCFContainer *AliHFEspectrum::GetSlicedContainer(AliCFContainer *container, In
     
     binLimits = new Double_t[container->GetNBins(ivar)+1];
     container->GetBinLimits(ivar,binLimits);
-    if((ivar == 4) && ((source>= 0) && (source<container->GetNBins(ivar)))) {
-      varMin[ivar] = binLimits[source];
-      varMax[ivar] = binLimits[source];
+    varMin[ivar] = binLimits[0];
+    varMax[ivar] = binLimits[container->GetNBins(ivar)];
+    // source
+    if(ivar == 4){
+      if((source>= 0) && (source<container->GetNBins(ivar))) {
+       varMin[ivar] = binLimits[source];
+       varMax[ivar] = binLimits[source];
+      }     
     }
-    else {
-      varMin[ivar] = binLimits[0];
-      varMax[ivar] = binLimits[container->GetNBins(ivar)];
+    // charge
+    if(ivar == 3) {
+      if((positivenegative>= 0) && (positivenegative<container->GetNBins(ivar))) {
+       varMin[ivar] = binLimits[positivenegative];
+       varMax[ivar] = binLimits[positivenegative];
+      }
     }
+    
 
     delete[] binLimits;
   }
@@ -868,19 +1933,19 @@ THnSparseF *AliHFEspectrum::GetSlicedCorrelation(THnSparseF *correlationmatrix,
   //
 
   Int_t ndimensions = correlationmatrix->GetNdimensions();
-  printf("Number of dimension %d correlation map\n",ndimensions);
+  //printf("Number of dimension %d correlation map\n",ndimensions);
   if(ndimensions < (2*nDim)) {
     AliError("Problem in the dimensions");
     return NULL;
   }
   Int_t ndimensionsContainer = (Int_t) ndimensions/2;
-  printf("Number of dimension %d container\n",ndimensionsContainer);
+  //printf("Number of dimension %d container\n",ndimensionsContainer);
 
   Int_t *dim = new Int_t[nDim*2];
   for(Int_t iter=0; iter < nDim; iter++){
     dim[iter] = dimensions[iter];
     dim[iter+nDim] = ndimensionsContainer + dimensions[iter];
-    printf("For iter %d: %d and iter+nDim %d: %d\n",iter,dimensions[iter],iter+nDim,ndimensionsContainer + dimensions[iter]);
+    //printf("For iter %d: %d and iter+nDim %d: %d\n",iter,dimensions[iter],iter+nDim,ndimensionsContainer + dimensions[iter]);
   }
     
   THnSparseF *k = (THnSparseF *) correlationmatrix->Projection(nDim*2,dim);
@@ -934,12 +1999,12 @@ void AliHFEspectrum::ClearObject(TObject *o){
   }
 }
 //_________________________________________________________________________
-TObject* AliHFEspectrum::GetSpectrum(AliCFContainer * const c, Int_t step) {
+TObject* AliHFEspectrum::GetSpectrum(const AliCFContainer * const c, Int_t step) {
   AliCFDataGrid* data = new AliCFDataGrid("data","",*c, step);
   return data;
 }
 //_________________________________________________________________________
-TObject* AliHFEspectrum::GetEfficiency(AliCFContainer * const c, Int_t step, Int_t step0){
+TObject* AliHFEspectrum::GetEfficiency(const AliCFContainer * const c, Int_t step, Int_t step0){
   // 
   // Create efficiency grid and calculate efficiency
   // of step to step0
@@ -951,3 +2016,38 @@ TObject* AliHFEspectrum::GetEfficiency(AliCFContainer * const c, Int_t step, Int
   eff->CalculateEfficiency(step,step0);
   return eff;
 }
+
+//____________________________________________________________________________
+THnSparse* AliHFEspectrum::GetWeights(){
+  
+  //
+  // Measured D->e based weighting factors
+  //
+
+  const Int_t nDim=1;
+  Int_t nBin[nDim] = {44};
+  const Double_t kPtbound[2] = {0.1, 20.};
+
+  Double_t* binEdges[nDim];
+  binEdges[0] =  AliHFEtools::MakeLogarithmicBinning(nBin[0], kPtbound[0], kPtbound[1]);
+
+  fWeightCharm = new THnSparseF("weightHisto", "weiting factor; pt[GeV/c]", nDim, nBin);
+  for(Int_t idim = 0; idim < nDim; idim++)
+     fWeightCharm->SetBinEdges(idim, binEdges[idim]);
+  /* //fit  
+  Double_t weight[44]={ 2.20939,2.1742,2.13569,2.09369,2.04806,1.99869,1.94552,1.88854,1.82782,1.76349,1.69577,1.62497,1.55149,1.4758,1.39848,1.32016,1.24153,1.16328,1.08615,1.01081,0.937916,0.868033,0.801642,0.739117,0.680724,0.626621,0.576859,0.5314,0.490125,0.452854,0.419361,0.389388,0.362661,0.338898,0.317822,0.299165,0.282674,0.268115,0.255271,0.243946,0.233964,0.225166,0.217413,0.210578};*/
+  //points
+  Double_t weight[44]={ 0.443336,0.437069,0.424299,0.41365,0.410649,0.385012,0.364252,0.360181,0.347073,0.354445,0.369578,0.358253,0.381115,0.412863,0.451792,0.47061,0.544857,0.566261,0.656843,0.669739,0.725247,0.779511,0.750385,0.777815,0.673391,0.694613,0.598251,0.513847,0.45729,0.468098,0.379422,0.358718,0.403793,0.392902,0.349981,0.27205,0.302447,0.279313,0.258986,0.14738,0.414487,0.0552302,0.0184101,0};
+  Double_t pt[44]={0.106398,0.120014,0.135371,0.152694,0.172234,0.194274,0.219135,0.247177,0.278807,0.314485,0.354729,0.400122,0.451324,0.509078,0.574223,0.647704,0.730589,0.824079,0.929534,1.04848,1.18265,1.33399,1.5047,1.69725,1.91444,2.15943,2.43576,2.74745,3.09904,3.49561,3.94293,4.44749,5.01662,5.65858,6.38268,7.19945,8.12074,9.15992,10.3321,11.6542,13.1456,14.8278,16.7252,18.8655};
+  Double_t dataE[1];
+  for(int i=0; i<44; i++){
+    dataE[0]=pt[i];
+    fWeightCharm->Fill(dataE,weight[i]);
+  }
+  Int_t* ibins[nDim];
+  for(Int_t ivar = 0; ivar < nDim; ivar++)
+    ibins[ivar] = new Int_t[nBin[ivar] + 1];
+  fWeightCharm->SetBinError(ibins[0],0);
+
+  return fWeightCharm;
+}
index 0afc2d2..71705fd 100644 (file)
@@ -1,7 +1,4 @@
-#ifndef ALIHFESPECTRUM_H
-#define ALIHFESPECTRUM_H
-
-/**************************************************************************
+        /**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */ 
-
 //
 // Class for spectrum correction
 // Subtraction of hadronic background, Unfolding of the data and
 // Renormalization done here
 // For more information see the implementation file
 //
+#ifndef ALIHFESPECTRUM_H
+#define ALIHFESPECTRUM_H
+
 #ifndef ROOT_TNamed
 #include <TNamed.h>
 #endif
@@ -31,6 +28,7 @@
 class TGraphErrors;
 class TObject;
 class TH1;
+class TF1;
 class TList;
 class AliCFContainer;
 class AliHFEcontainer;
@@ -44,36 +42,57 @@ class AliHFEspectrum : public TNamed{
       kBackgroundData = 1,
       kMCContainerMC = 2,
       kMCContainerESD = 3,
-      kDataContainerV0 = 4
+      kDataContainerV0 = 4,
+      kNonHFEBackgroundData = 5, 
+      kMCContainerCharmMC = 6,
+      kMCContainerConversionMC = 7,
+      kMCContainerNonHFEMC = 8
     };
    
     AliHFEspectrum(const char* name);
     ~AliHFEspectrum();
     
 
-    Bool_t Init(const AliHFEcontainer *datahfecontainer, const AliHFEcontainer *mchfecontainer, const AliHFEcontainer *v0hfecontainer=0x0);
+    Bool_t Init(const AliHFEcontainer *datahfecontainer, const AliHFEcontainer *mchfecontainer, const AliHFEcontainer *v0hfecontainer=0x0, const AliHFEcontainer *bghfecontainer=0x0);
     Bool_t Correct(Bool_t subtractcontamination=kTRUE);
+    Bool_t CorrectBeauty(Bool_t subtractcontamination=kTRUE);
    
     AliCFDataGrid *SubtractBackground(Bool_t setBackground = kFALSE);
     
     AliCFDataGrid *CorrectV0Efficiency(AliCFDataGrid* const bgsubpectrum = 0x0);
+    AliCFDataGrid *CorrectParametrizedEfficiency(AliCFDataGrid* const bgsubpectrum = 0x0);
    
     TList *Unfold(AliCFDataGrid* const bgsubpectrum = 0x0);
     AliCFDataGrid *CorrectForEfficiency(AliCFDataGrid* const bgsubpectrum = 0x0);
    
-    TGraphErrors *Normalize(THnSparse * const spectrum) const;
-    TGraphErrors *Normalize(AliCFDataGrid * const spectrum) const;
+    TGraphErrors *Normalize(THnSparse * const spectrum,Int_t i = 0) const;
+    TGraphErrors *Normalize(AliCFDataGrid * const spectrum,Int_t i = 0) const;
+    TGraphErrors *NormalizeTH1N(TH1 *input,Int_t normalization) const;
+    void CorrectFromTheWidth(TH1D *h1) const;
     
     void SetCorrelation(THnSparseF * const correlation) {fCorrelation = correlation; };
     void SetContainer(AliCFContainer *cont, AliHFEspectrum::CFContainer_t type);
+    void SetEfficiencyFunction(TF1 *efficiencyFunction) { fEfficiencyFunction = efficiencyFunction; };
+    void SetPbPbAnalysis(Bool_t isPbPb = kFALSE) { fBeamType=(Char_t) isPbPb; };
     
-    void SetNumberOfEvents(Int_t nEvents) { fNEvents = nEvents; }
+    void SetNumberOfEvents(Int_t nEvents,Int_t i = 0) { fNEvents[i] = nEvents; };
+    void SetNumberOfMCEvents(Int_t nEvents) { fNMCEvents = nEvents; };
+    void SetNumberOfMC2Events(Int_t nEvents) { fNMCbgEvents = nEvents; }; 
     void SetMCEffStep(Int_t step) { fStepMC = step; };
     void SetMCTruthStep(Int_t step) { fStepTrue = step; };
     void SetStepToCorrect(Int_t step) { fStepData = step; };
     void SetStepBeforeCutsV0(Int_t step) { fStepBeforeCutsV0 = step; };
     void SetStepAfterCutsV0(Int_t step) { fStepAfterCutsV0 = step; };
     void SetNbDimensions(Int_t nbDimensions) { fNbDimensions = nbDimensions; };
+    void SetChargeChoosen(Int_t chargechoosen) {fChargeChoosen = chargechoosen; };
+    void SetUnSetCorrelatedErrors(Bool_t unsetcorrelatederrors) {fUnSetCorrelatedErrors = unsetcorrelatederrors;};
+
+    void SetNCentralityBinAtTheEnd(Int_t nCentralityBinAtTheEnd) {fNCentralityBinAtTheEnd = nCentralityBinAtTheEnd; };
+    void SetLowHighBoundaryCentralityBinAtTheEnd(Int_t low, Int_t high, Int_t i) { fLowBoundaryCentralityBinAtTheEnd[i] = low; fHighBoundaryCentralityBinAtTheEnd[i] = high;};
+
+    void SetBeautyAnalysis() { fInclusiveSpectrum = kFALSE; };
+    void SetHadronEffbyIPcut(THnSparseF* hsHadronEffbyIPcut) { fHadronEffbyIPcut = hsHadronEffbyIPcut;};
+    void SetNonHFEBackground2ndMethod() { fNonHFEbgMethod2 = kTRUE; };
 
     void SetStepGuessedUnfolding(Int_t stepGuessedUnfolding) { fStepGuessedUnfolding = stepGuessedUnfolding; };
     void SetNumberOfIteration(Int_t numberOfIteration) { fNumberOfIterations = numberOfIteration; };
@@ -82,19 +101,28 @@ class AliHFEspectrum : public TNamed{
   
     void SetDebugLevel(Int_t debugLevel) { fDebugLevel = debugLevel; };
 
+    AliCFDataGrid* GetCharmBackground();
+    AliCFDataGrid* GetConversionBackground();
+    AliCFDataGrid* GetNonHFEBackground();
+    THnSparse* GetWeights();
+
+    void EnableIPanaHadronBgSubtract() { fIPanaHadronBgSubtract = kTRUE; };
+    void EnableIPanaCharmBgSubtract() { fIPanaCharmBgSubtract = kTRUE; };
+    void EnableIPanaConversionBgSubtract() { fIPanaConversionBgSubtract = kTRUE; };
+    void EnableIPanaNonHFEBgSubtract() { fIPanaNonHFEBgSubtract = kTRUE; };
+
   protected:
        
     AliCFContainer *GetContainer(AliHFEspectrum::CFContainer_t contt);
-    AliCFContainer *GetSlicedContainer(AliCFContainer *cont, Int_t ndim, Int_t *dimensions,Int_t source=-1);
+    AliCFContainer *GetSlicedContainer(AliCFContainer *cont, Int_t ndim, Int_t *dimensions,Int_t source=-1,Int_t positivenegative=-1);
     THnSparseF *GetSlicedCorrelation(THnSparseF *correlationmatrix,Int_t nDim, Int_t *dimensions) const;
-    TObject* GetSpectrum(AliCFContainer * const c, Int_t step);
-    TObject* GetEfficiency(AliCFContainer * const c, Int_t step, Int_t step0);
+    TObject* GetSpectrum(const AliCFContainer * const c, Int_t step);
+    TObject* GetEfficiency(const AliCFContainer * const c, Int_t step, Int_t step0);
  
     void AddTemporaryObject(TObject *cont);
     void ClearObject(TObject *o);
     
-    void CorrectFromTheWidth(TH1D *h1) const;
-    TGraphErrors *NormalizeTH1(TH1 *input) const;
+    TGraphErrors *NormalizeTH1(TH1 *input,Int_t i = 0) const;
 
 
   private:
@@ -105,12 +133,25 @@ class AliHFEspectrum : public TNamed{
     TList *fTemporaryObjects;     // Emulate garbage collection
     THnSparseF *fCorrelation;     // Correlation Matrices
     AliCFDataGrid *fBackground;   // Background Grid
+    TF1 *fEfficiencyFunction;     // Efficiency Function
+
+    THnSparseF *fWeightCharm;     // Weight for charm bg
 
     Bool_t fInclusiveSpectrum;     // Inclusive Spectrum
     Bool_t fDumpToFile;           // Write Result in a file
 
+    Bool_t fUnSetCorrelatedErrors;    // Unset correlated errors
+
+    Bool_t fIPanaHadronBgSubtract;     // Hadron background subtraction
+    Bool_t fIPanaCharmBgSubtract;      // Charm background subtraction 
+    Bool_t fIPanaConversionBgSubtract; // Conversion background subtraction
+    Bool_t fIPanaNonHFEBgSubtract;     // nonHFE except for conversion background subtraction
+    Bool_t fNonHFEbgMethod2;           // switch for 2nd method to subtract non HFE background
+
     Int_t fNbDimensions;          // Number of dimensions for the correction
-    Int_t fNEvents;               // Number of Events
+    Int_t fNEvents[20];           // Number of Events
+    Int_t fNMCEvents;             // Number of MC Events
+    Int_t fNMCbgEvents;           // Number of BG MC Events
     Int_t fStepMC;                // MC step (for unfolding)
     Int_t fStepTrue;              // MC step of the final spectrum
     Int_t fStepData;              // Data Step (various applications)
@@ -118,6 +159,15 @@ class AliHFEspectrum : public TNamed{
     Int_t fStepAfterCutsV0;       // After cuts V0
     Int_t fStepGuessedUnfolding;  // Step for first guessed unfolding
     Int_t fNumberOfIterations;    // Number of iterations
+    Int_t fChargeChoosen;         // Select positive or negative electrons
+
+    Int_t fNCentralityBinAtTheEnd; // Number of centrality class at the end
+    Int_t fLowBoundaryCentralityBinAtTheEnd[20];  // Boundary of the bins
+    Int_t fHighBoundaryCentralityBinAtTheEnd[20];  // Boundary of the bins
+
+    THnSparseF *fHadronEffbyIPcut;// container for hadron efficiency by IP cut
+    Char_t fBeamType;              // beamtype; default -1; pp =0; PbPb=1
+
 
     Int_t fDebugLevel;            // Debug Level
 
index 09c47da..a0eaa43 100644 (file)
@@ -12,9 +12,6 @@
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */
-
 //
 // Class AliHFEtaggedTrackAnalysis
 // Analyses tracks with an apriori PID information (i.e. using the daugther
 #include "AliHFEvarManager.h"
 
 ClassImp(AliHFEtaggedTrackAnalysis)
-
 //____________________________________________________________
 AliHFEtaggedTrackAnalysis::AliHFEtaggedTrackAnalysis():
-    TObject()
+    TNamed()
+  , fVarManager(NULL)
+  , fContainer(NULL)
+  , fPID(NULL)
+  , fPIDqa(NULL)
+  , fCuts(NULL)
+  , fCFM(NULL)
+  , fQAhistos(NULL)
+  , fCentralityF(0.)
+  , fClean(kFALSE)
+  , fMagneticField(0.0)
+  , fVariablesTRD(kFALSE)
+{
+  //
+  // Dummy constructor
+  //
+}
+
+//____________________________________________________________
+AliHFEtaggedTrackAnalysis::AliHFEtaggedTrackAnalysis(const char *name):
+    TNamed(name, "")
   , fVarManager(NULL)
   , fContainer(NULL)
   , fPID(NULL)
@@ -55,6 +71,7 @@ AliHFEtaggedTrackAnalysis::AliHFEtaggedTrackAnalysis():
   , fCuts(NULL)
   , fCFM(NULL)
   , fQAhistos(NULL)
+  , fCentralityF(0.)
   , fClean(kFALSE)
   , fMagneticField(0.0)
   , fVariablesTRD(kFALSE)
@@ -63,11 +80,11 @@ AliHFEtaggedTrackAnalysis::AliHFEtaggedTrackAnalysis():
   // Default constructor
   //
   fVarManager = new AliHFEvarManager("taggedTrackVarManager");
-  fVarManager->AddVariable("pt");
-  fVarManager->AddVariable("eta");
-  fVarManager->AddVariable("phi");
-  fVarManager->AddVariable("charge");
-  fVarManager->AddVariable("species");
+  //fVarManager->AddVariable("pt");
+  //fVarManager->AddVariable("eta");
+  //fVarManager->AddVariable("phi");
+  //fVarManager->AddVariable("charge");
+  //fVarManager->AddVariable("species");
   fPIDqa = new AliHFEpidQAmanager;
   fCFM = new AliCFManager;
   SetBit(kIsOwner, kTRUE);
@@ -75,7 +92,7 @@ AliHFEtaggedTrackAnalysis::AliHFEtaggedTrackAnalysis():
 
 //____________________________________________________________
 AliHFEtaggedTrackAnalysis::AliHFEtaggedTrackAnalysis(const AliHFEtaggedTrackAnalysis &ref):
-    TObject(ref)
+    TNamed(ref)
   , fVarManager(ref.fVarManager)
   , fContainer(NULL)
   , fPID(ref.fPID)
@@ -83,6 +100,7 @@ AliHFEtaggedTrackAnalysis::AliHFEtaggedTrackAnalysis(const AliHFEtaggedTrackAnal
   , fCuts(ref.fCuts)
   , fCFM(ref.fCFM)
   , fQAhistos(ref.fQAhistos)
+  , fCentralityF(ref.fCentralityF)
   , fClean(ref.fClean)
   , fMagneticField(ref.fMagneticField)
   , fVariablesTRD(ref.fVariablesTRD)
@@ -101,6 +119,7 @@ AliHFEtaggedTrackAnalysis &AliHFEtaggedTrackAnalysis::operator=(const AliHFEtagg
   //
   // Assignment operator
   //
+  TNamed::operator=(ref);
   if(&ref != this){
     fVarManager = ref.fVarManager;
     fPID = ref.fPID;
@@ -108,6 +127,7 @@ AliHFEtaggedTrackAnalysis &AliHFEtaggedTrackAnalysis::operator=(const AliHFEtagg
     fCuts = ref.fCuts;
     fCFM = ref.fCFM;
     fQAhistos = ref.fQAhistos;
+    fCentralityF = ref.fCentralityF;
     fClean = ref.fClean;
     fMagneticField = ref.fMagneticField;
     fVariablesTRD = ref.fVariablesTRD;
@@ -175,7 +195,7 @@ void AliHFEtaggedTrackAnalysis::ProcessTrack(AliVParticle *track, Int_t abinitio
   // Filter tracks tagged by V0 PID class
   //
   //
-  fVarManager->NewTrack(track, NULL, 0., abinitioPID, kTRUE);
+  fVarManager->NewTrack(track, NULL, fCentralityF, abinitioPID, kTRUE);
 
 
 
@@ -186,8 +206,8 @@ void AliHFEtaggedTrackAnalysis::ProcessTrack(AliVParticle *track, Int_t abinitio
       
       const AliExternalTrackParam *trueparam = NULL;
       if(esdtrackc->GetOuterParam()) {
-             trueparam = esdtrackc->GetOuterParam();
-             fVarManager->NewTrack((AliVParticle *)trueparam, NULL, 0., abinitioPID, kTRUE);
+       trueparam = esdtrackc->GetOuterParam();
+       fVarManager->NewTrack((AliVParticle *)trueparam, NULL, fCentralityF, abinitioPID, kTRUE);
       }
       else return;
     }
@@ -251,6 +271,7 @@ void AliHFEtaggedTrackAnalysis::ProcessTrack(AliVParticle *track, Int_t abinitio
      hfetrack.SetAnalysisType(AliHFEpidObject::kESDanalysis);
      hfetrack.SetRecTrack(track);
      hfetrack.SetAbInitioPID(abinitioPID);
+     hfetrack.SetCentrality(fCentralityF);
      fPID->SetVarManager(fVarManager);
      fPID->IsSelected(&hfetrack, fContainer, "taggedTrackContainer", fPIDqa);
    }
index f91c9b9..bcd394b 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIHFETAGGEDTRACKANALYSIS_H
-#define ALIHFETAGGEDTRACKANALYSIS_H
-
 /**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */ 
-
 //
 // Class AliHFEtaggedTrackAnalysis
 // Analyses tracks with an apriori PID information (i.e. using the daugther
 // tracks from well-identified decays of neutral charged particles).
 // More information can be found inside the implementation file.
 //
-#ifndef ROOT_TObject
-#include <TObject.h>
+#ifndef ALIHFETAGGEDTRACKANALYSIS_H
+#define ALIHFETAGGEDTRACKANALYSIS_H
+
+#ifndef ROOT_TNamed
+#include <TNamed.h>
 #endif
 
 class AliHFEcollection;
@@ -35,9 +32,10 @@ class AliHFEpid;
 class AliHFEpidQAmanager;
 class AliHFEvarManager;
 
-class AliHFEtaggedTrackAnalysis : public TObject{
+class AliHFEtaggedTrackAnalysis : public TNamed{
   public:
     AliHFEtaggedTrackAnalysis();
+    AliHFEtaggedTrackAnalysis(const char *name);
     AliHFEtaggedTrackAnalysis(const AliHFEtaggedTrackAnalysis &ref);
     AliHFEtaggedTrackAnalysis &operator=(const AliHFEtaggedTrackAnalysis &ref);
     ~AliHFEtaggedTrackAnalysis();
@@ -52,9 +50,11 @@ class AliHFEtaggedTrackAnalysis : public TObject{
     AliHFEcollection * GetQAcollection() const { return fQAhistos; }
     Bool_t  GetClean() const { return fClean; }; 
     Double_t GetMagneticField() const { return fMagneticField; };
+    AliHFEvarManager *GetVarManager() const { return fVarManager; }
 
     void SetCuts(AliHFEcuts *cuts);
     void SetPID(AliHFEpid *pid);
+    void SetCentrality(Float_t centrality) { fCentralityF = centrality; };
     void SetClean(Bool_t clean) { fClean = clean; };
     void SetMagneticField(Double_t magneticField) { fMagneticField = magneticField; };
     void SetVariablesTRD(Bool_t variablesTRD) { fVariablesTRD = variablesTRD; };
@@ -71,9 +71,10 @@ class AliHFEtaggedTrackAnalysis : public TObject{
     AliHFEcuts          *fCuts;         // Single track cuts
     AliCFManager        *fCFM;          // CF Manager used for the track filtering
     AliHFEcollection    *fQAhistos;     // QA histos
+    Float_t              fCentralityF;  // Centrality
     Bool_t               fClean;        // Clean
-    Double_t            fMagneticField; // Magnetic field
-    Bool_t              fVariablesTRD;  //  Use phi angle at the first plane of the TRD 
+    Double_t             fMagneticField; // Magnetic field
+    Bool_t               fVariablesTRD;  //  Use phi angle at the first plane of the TRD 
     
   ClassDef(AliHFEtaggedTrackAnalysis, 0)
 };
index 15ce789..6bb9c80 100644 (file)
@@ -12,9 +12,6 @@
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */
-
 //
 // Class AliHFEtofPIDqa
 //
@@ -148,6 +145,7 @@ void AliHFEtofPIDqa::Initialize(){
   // Make common binning
   const Int_t kPIDbins = AliPID::kSPECIES + 1;
   const Int_t kSteps = 2;
+  const Int_t kCentralityBins = 11;
   const Double_t kMinPID = -1;
   const Double_t kMinP = 0.;
   const Double_t kMaxPID = (Double_t)AliPID::kSPECIES;
@@ -157,16 +155,16 @@ void AliHFEtofPIDqa::Initialize(){
   Int_t kSigmaBins = fQAmanager->HasHighResolutionHistos() ? 1400 : 240;
 
   // 1st histogram: TOF sigmas: (species, p nsigma, step)
-  Int_t nBinsSigma[4] = {kPIDbins, kPbins, kSigmaBins, kSteps};
-  Double_t minSigma[4] = {kMinPID, kMinP, -12., 0};
-  Double_t maxSigma[4] = {kMaxPID, kMaxP, 12., 2.};
-  fHistos->CreateTHnSparse("tofnSigma", "TOF signal; species; p [GeV/c]; TOF signal [a.u.]; Selection Step", 4, nBinsSigma, minSigma, maxSigma);
+  Int_t nBinsSigma[5] = {kPIDbins, kPbins, kSigmaBins, kSteps, kCentralityBins};
+  Double_t minSigma[5] = {kMinPID, kMinP, -12., 0, 0};
+  Double_t maxSigma[5] = {kMaxPID, kMaxP, 12., 2., 11.};
+  fHistos->CreateTHnSparse("tofnSigma", "TOF signal; species; p [GeV/c]; TOF signal [a.u.]; Selection Step; Centrality", 5, nBinsSigma, minSigma, maxSigma);
 
   // 2nd histogram: TOF time - pion hypothesis (TOF Time Resolution Monitor)
   fHistos->CreateTH2F("tofTimeRes", "Difference between measured and expected time for Pions; p [GeV/c]; #Deltat [ps]", 100, 0.1, 10, 100, -200, 200); 
   
   // 3rd histogram: TPC sigmas to the electron line: (species, p nsigma, step - only filled if apriori PID information available)
-  fHistos->CreateTHnSparse("tofMonitorTPC", "TPC signal; species; p [GeV/c]; TPC signal [a.u.]; Selection Step", 4, nBinsSigma, minSigma, maxSigma);
+  fHistos->CreateTHnSparse("tofMonitorTPC", "TPC signal; species; p [GeV/c]; TPC signal [a.u.]; Selection Step; Centrality", 5, nBinsSigma, minSigma, maxSigma);
 }
 
 //_________________________________________________________
@@ -175,6 +173,7 @@ void AliHFEtofPIDqa::ProcessTrack(const AliHFEpidObject *track, AliHFEdetPIDqa::
   // Fill TPC histograms
   //
   AliHFEpidObject::AnalysisType_t anatype = track->IsESDanalysis() ? AliHFEpidObject::kESDanalysis : AliHFEpidObject::kAODanalysis;
+  Float_t centrality = track->GetCentrality();
   Int_t species = track->GetAbInitioPID();
   if(species >= AliPID::kSPECIES) species = -1;
 
@@ -182,11 +181,12 @@ void AliHFEtofPIDqa::ProcessTrack(const AliHFEpidObject *track, AliHFEdetPIDqa::
   AliHFEpidTOF *tofpid= dynamic_cast<AliHFEpidTOF *>(fQAmanager->GetDetectorPID(AliHFEpid::kTOFpid));
   AliHFEpidTPC *tpcpid= dynamic_cast<AliHFEpidTPC *>(fQAmanager->GetDetectorPID(AliHFEpid::kTPCpid));
   
-  Double_t contentSignal[4];
+  Double_t contentSignal[5];
   contentSignal[0] = species;
   contentSignal[1] = track->GetRecTrack()->P();
   contentSignal[2] = tofpid ? tofpid->NumberOfSigmas(track->GetRecTrack(), AliPID::kElectron, anatype): 0.;
   contentSignal[3] = step;
+  contentSignal[4] = centrality;
   fHistos->Fill("tofnSigma", contentSignal);
   if(tofpid){
     Double_t timeTof = tofpid->GetTOFsignal(track->GetRecTrack(), anatype);
index 3a97ff2..ff2b7db 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIHFETOFPIDQA_H
-#define ALIHFETOFPIDQA_H
-
 /**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */ 
-
 //
 // Class AliHFEtofPIDqa
 // Monitoring TPC PID in the HFE PID montioring framework
 // More information can be found inside the implementation file
 //
+#ifndef ALIHFETOFPIDQA_H
+#define ALIHFETOFPIDQA_H
+
 #ifndef ALIHFEDETPIDQA_H
 #include "AliHFEdetPIDqa.h"
 #endif
index f390cde..ef85a5c 100644 (file)
@@ -12,9 +12,6 @@
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */
-
 //
 // Toolkit containing various usefull things
 // Usable everywhere in the hfe software package
index b4c8478..d73380d 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIHFETOOLS_H
-#define ALIHFETOOLS_H
-
 /**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */ 
-
 //
 // Toolkit containing various usefull things
 // Usable everywhere in the hfe software package
 // For more information see the cxx file
 //
+#ifndef ALIHFETOOLS_H
+#define ALIHFETOOLS_H
+
 #include <TObject.h>
 
 class TParticle;
@@ -49,6 +46,8 @@ class AliHFEtools : public TObject{
     static void SetLogLevel(Int_t loglevel) { fgLogLevel = loglevel ;}
 
   private:
+      AliHFEtools(const AliHFEtools &);
+      AliHFEtools &operator=(const AliHFEtools &);
       static AliESDpid *fgDefaultPID;           // Default PID object
       static AliAODpidUtil *fgDefaultPIDaod;    // Default PID object
       static Int_t fgLogLevel;                  // Log Level
index 85fbdd7..a2af7ba 100644 (file)
@@ -143,15 +143,15 @@ void AliHFEtpcPIDqa::Browse(TBrowser *b){
       b->Add(fHistos, fHistos->GetName());
 
       // Make Projections of the dE/dx Spectra and add them to a new Folder
-      TString specnames[4] = {"All", "Electrons", "Pions", "Protons"};
-      Int_t specind[4] = {-1, AliPID::kElectron, AliPID::kPion, AliPID::kProton};
+      TString specnames[AliPID::kSPECIES+1] = {"All", "Electrons", "Muon", "Pions", "Kaon", "Protons"};
+      Int_t specind[AliPID::kSPECIES+1] = {-1, AliPID::kElectron, AliPID::kMuon, AliPID::kPion, AliPID::kKaon, AliPID::kProton};
       TList *listdEdx = new TList;
       listdEdx->SetOwner();
       TList *listNsigma = new TList;
       listNsigma->SetOwner();
 
       TH2 *hptr = NULL; 
-      for(Int_t ispec = 0; ispec < 4; ispec++){
+      for(Int_t ispec = 0; ispec < AliPID::kSPECIES+1; ispec++){
         for(Int_t istep = 0; istep < 2; istep++){
           hptr = MakeSpectrumdEdx(static_cast<AliHFEdetPIDqa::EStep_t>(istep), specind[ispec]);
           hptr->SetName(Form("hTPCdEdx%s%s", specnames[ispec].Data(), istep == 0 ? "Before" : "After"));
index c6d31af..dc30940 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIHFETPCPIDQA_H
-#define ALIHFETPCPIDQA_H
-
 /**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */ 
-
 //
 // Class AliHFEtpcPIDqa
 // Monitoring TPC PID in the HFE PID montioring framework
 // More information can be found inside the implementation file
 //
+#ifndef ALIHFETPCPIDQA_H
+#define ALIHFETPCPIDQA_H
+
 #ifndef ALIHFEDETPIDQA_H
 #include "AliHFEdetPIDqa.h"
 #endif
index d43ae92..7a9e1b4 100644 (file)
@@ -12,9 +12,6 @@
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */
-
 //
 // Track filter class 
 // Apply cut steps to all tracks in one event and returns a list of
 ClassImp(AliHFEtrackFilter)
 
 //__________________________________________________________________
+AliHFEtrackFilter::AliHFEtrackFilter() :
+  TNamed(),
+  fFilteredTracks(NULL),
+  fCutSteps(NULL),
+  fEfficiencyContainers(NULL),
+  fMC(NULL),
+  fMCsignal(NULL),
+  fPtBins(0),
+  fEtaBins(0),
+  fPhiBins(0),
+  fPtBinning(NULL),
+  fEtaBinning(NULL),
+  fPhiBinning(NULL)
+{
+  //
+  // Dummy Constructor
+  //
+}
+
+//__________________________________________________________________
 AliHFEtrackFilter::AliHFEtrackFilter(const Char_t *name) :
   TNamed(name, ""),
   fFilteredTracks(NULL),
@@ -232,7 +249,7 @@ void AliHFEtrackFilter::InitCF(AliHFEcontainer *cont){
 }
 
 //__________________________________________________________________
-void AliHFEtrackFilter::FilterTracks(AliESDEvent * const event){
+void AliHFEtrackFilter::FilterTracks(const AliESDEvent * const event){
   //
   // Perform track filtering
   // Check each cut step one by one and select tracks which pass
index 453b010..0017d7d 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef ALIHFETRACKFILTER_H
-#define ALIHFETRACKFILTER_H
-
 /**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
-
-/* $Id$ */ 
-
 //
 // Track filter class 
 // Apply cut steps to all tracks in one event and returns a list of
 // filtered tracks
 //
+#ifndef ALIHFETRACKFILTER_H
+#define ALIHFETRACKFILTER_H
+
 #ifndef ROOT_TNamed
 #include <TNamed.h>
 #endif
@@ -39,6 +36,7 @@ class AliMCEvent;
 
 class AliHFEtrackFilter : public TNamed{
   public:
+    AliHFEtrackFilter();
     AliHFEtrackFilter(const Char_t *name);
     AliHFEtrackFilter(const AliHFEtrackFilter &o);
     AliHFEtrackFilter &operator=(const AliHFEtrackFilter &o);
@@ -51,7 +49,7 @@ class AliHFEtrackFilter : public TNamed{
     void SetRecEvent(AliVEvent *rec);
     AliHFEcutStep *GetCutStep(Int_t istep);
     AliHFEcutStep *GetCutStep(const Char_t *name);
-    void FilterTracks(AliESDEvent *const esd);
+   &nbs