ROOT logo
#ifndef ALIANALYSISTASKSECHARMFRACTION_H
#define ALIANALYSISTASKSECHARMFRACTION_H

/* Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
 * See cxx source for full Copyright notice                               */

//*************************************************************************
// Class AliAnalysisTaskSECharmFraction
// AliAnalysisTask for the extraction of the fraction of prompt charm
// using the charm hadron impact parameter to the primary vertex
//
//
// Author: Andrea Rossi andrea.rossi@pd.infn.it
//*************************************************************************

class TH1F;
class TH2F;
class TF1;
class AliAODDEvent;
class AliAODMCHeader;
class AliAODRecoDecayHF2Prong;
class AliAODRecoDecayHF;
class AliAODMCParticle;
class AliAnalysisVertexingHF;
class AliRDHFCutsD0toKpi;
class AliNormalizationCounter;
class AliVertexingHFUtils;

#include "AliAnalysisTaskSE.h"

class AliAnalysisTaskSECharmFraction : public AliAnalysisTaskSE {
 public:
  AliAnalysisTaskSECharmFraction();
  AliAnalysisTaskSECharmFraction(const char *name);
  AliAnalysisTaskSECharmFraction(const char *name,AliRDHFCutsD0toKpi *cutsA,AliRDHFCutsD0toKpi *cutsB);

  virtual ~AliAnalysisTaskSECharmFraction(); 

  // Implementation of interface methods
  virtual void UserCreateOutputObjects();
  virtual void Init();
  virtual void LocalInit() {Init();}
  virtual void UserExec(Option_t *option);
  virtual void Terminate(Option_t *option);  
  void SetReadMC(Bool_t readMC=kTRUE){fReadMC=readMC;}
  void SetSplitMassD0D0bar(Bool_t splitD0D0bar=kTRUE){fsplitMassD0D0bar=splitD0D0bar;}
  Bool_t GetIsSplitMassD0D0bar(){return fsplitMassD0D0bar;}
  void SetUsePID(Bool_t pid){fusePID=pid;}
  void SetAnalyzeLikeSign(Bool_t likesign=kFALSE){fLikeSign=likesign;}
  void SetNMaxTrForVtx(const Int_t ntrMaxforVtx){fNtrMaxforVtx=ntrMaxforVtx;}
  Int_t GetNMaxTrForVtx(){return fNtrMaxforVtx;}
  void SetPtBins(Int_t nbins,const Float_t *ptbins);
  void SetSignalInvMassCut(const Double_t signalInvMassCut=0.027){fsignalInvMassCut=signalInvMassCut;}
  void SetLargeInvMassCut(const Double_t largeInvMassCut=2.){flargeInvMassCut=largeInvMassCut;}
  void SetSideBandInvMassCut(const Double_t sidebandInvMassCut=0.054){// default value ~ 2x3 times inv mass resol.: a factor 2 is applied w.r.t. 3sigma, should be safe enough to exclude most of the reflections 
    fsidebandInvMassCut=sidebandInvMassCut;  
  }
  void SetSideBandInvMassWindow(const Double_t sidebandInvMassWindow=0.108){//~ 6 times inv. mass resol.
    fsidebandInvMassWindow=sidebandInvMassWindow;
  }  
  void SetAcceptanceCut(const Double_t eta=0.8,const Double_t nITSpoints=5.,const Double_t nSPDpoints=2.){fAcceptanceCuts[0]=eta;fAcceptanceCuts[1]=nITSpoints;fAcceptanceCuts[2]=nSPDpoints;}
  void SetStandardMassSelection();
  Int_t SetStandardCuts();
  void CheckInvMassD0(AliAODRecoDecayHF2Prong *d,Double_t &invMassD0,Double_t &invMassD0bar,Bool_t &isPeakD0,Bool_t &isPeakD0bar,Bool_t &isSideBandD0,Bool_t &isSideBandD0bar);
  void SetAnalysisLevel(Int_t level){fFastAnalysis=level;}
  void SetCheckBitD0flag(Bool_t checkfl){fcheckD0Bit=checkfl;}
  Bool_t GetCheckBitD0flag(){return fcheckD0Bit;}
  Int_t GetAnalysisLevel(){return fFastAnalysis;}
  Int_t CheckOrigin(const TClonesArray* arrayMC, const AliAODMCParticle *mcPartCandidate)const;
  AliAODRecoDecayHF *GetD0toKPiSignalType(const AliAODRecoDecayHF2Prong *d,TClonesArray *arrayMC,Int_t &signaltype,Double_t &massMumTrue,Double_t *primaryVtx,Int_t &isD0D0bar);
  AliAODRecoDecayHF *GetD0toKPiSignalTypeObsolete(const AliAODRecoDecayHF2Prong *d,TClonesArray *arrayMC,Int_t &signaltype,Double_t &massMumTrue,Double_t *primaryVtx);
  AliAODRecoDecayHF* ConstructFakeTrueSecVtx(const AliAODMCParticle *b1,const AliAODMCParticle *b2,const AliAODMCParticle *mum,Double_t *primaryVtxTrue);
  void SetUseMC(Bool_t useMC){fUseMC=useMC;}
  Bool_t SpecialSelD0(AliAODRecoDecayHF2Prong *d,Int_t &nusedforVtx);
  Bool_t FillAziList(AliAODEvent *aod,Double_t azilist[30000],Int_t trkIDlist[30000],Int_t &nprim)const;
  void FillAziHistos(AliAODRecoDecayHF2Prong *d,TList *&list,Int_t ptbin,Double_t azilist[30000],Int_t trkIDlist[30000],Int_t nprim,Int_t okD0,Int_t okD0bar,Bool_t isPeakD0,Bool_t isPeakD0bar,Bool_t isSideBandD0,Bool_t isSideBandD0bar)const;

  AliAODVertex* GetPrimaryVtxSkipped(AliAODEvent *aodev,AliAODRecoDecayHF2Prong *d);
  void SetRejecCandidateMCUpgrade(Bool_t selection){fselectForUpgrade=selection;}
  void SetSkipEventSelection(Bool_t skip){fskipEventSelection=skip;}
  void SetMaxZvtxForSkipEventSelection(Double_t zmax){fZvtxUpgr=zmax;}
  void SetPtWeightsFromDataPbPb276overLHC12a17a();
  /* ######### THE FOLLOWING IS FOR FURTHER IMPLEMENATION ############
     Int_t GetPtBin(Double_t pt)const;
     void SetD0Cuts(Int_t ptbin,Double_t &*d0cutsLoose,Double_t &*d0cutsTight);
     
     //  void InvMassSelection();
     
     void SetCheckMC(Bool_t checkMC){fcheckMC=checkMC;}
     void SetCheckMC_D0(Bool_t check_D0){fcheckMCD0=check_D0;}
     void SetCheckMC_2prongs(Bool_t check2prongs){fcheckMC2prongs=check2prongs;}
     void SetCheckMC_prompt(Bool_t checkprompt){fcheckMCprompt=checkprompt;}
     void SetCheckMC_fromB(Bool_t checkfromB){fcheckMCfromB=checkfromB;}
     void SetCheckMC_fromDstar(Bool_t skipD0star){fSkipD0star=skipD0star;}
     void SetUseCuts(Bool_t usecuts){fD0usecuts=usecuts;}
     void SetSideBands(Double_t sideband){fSideBands=sideband;}
     void SetStudyPureBackground(Bool_t back){fStudyPureBackground=back;}
  */
  AliRDHFCutsD0toKpi* GetLooseCut(){
    return fCutsLoose;
  }
  AliRDHFCutsD0toKpi* GetTightCut(){
    return fCutsTight;
  }
  /* void SetCutFunction(Int_t (*setcuts)(AliAnalysisTaskSECharmFraction*,Double_t,Double_t)){
     fSetCuts=setcuts;
     fStandCuts=kFALSE;
     }
  */
  //  Int_t SetCuts(AliAnalysisTaskSECharmFraction *alchfr,Double_t pt,Double_t invMassCut);
  
 private:
  Bool_t FillHistos(AliAODRecoDecayHF2Prong *d,TList *&list,Int_t ptbin,Int_t okD0,Int_t okD0bar,Double_t invMassD0,Double_t invMassD0bar,Bool_t isPeakD0,Bool_t isPeakD0bar,Bool_t isSideBandD0,Bool_t isSideBandD0bar,Double_t massmumtrue,AliAODRecoDecayHF *aodDMC,Double_t *vtxTrue,Int_t isD0D0barMC);
  void FillHistoMCproperties(TClonesArray *arrayMC);

  AliRDHFCutsD0toKpi *fCutsLoose;        // Loose cuts object
  AliRDHFCutsD0toKpi *fCutsTight;      // Vertexer heavy flavour
  Int_t fFastAnalysis;                  // Level of analysis speed: default is 1, switch it to 2 to fill the THnSparse
  Bool_t  fReadMC;                          // Flag To switch on/off access to MC 
  Bool_t fcheckD0Bit;                       // Flag to check the D0 bit flag
  Bool_t  fsplitMassD0D0bar;                // Flag to use two shistos for D0 and D0bar invariant masses
  Bool_t  fLikeSign;                        // Flag to analyse Like Sign array
  Bool_t  fusePID;                          // Flag to use PID
  Double_t    fmD0PDG;                      //  MC D0 mass
  Int_t        fnbins;                      // Number of pt bins
  Float_t *fptbins;                        //[fnbins] ptbins 
  Int_t fNtrMaxforVtx;                      // N Max acceptable tracks used for vertex (0,1,2)
  Double_t fptAll;                          //!Sum of pt of the reco tracks
  Double_t fptAllSq;                        //!Sum of the square of the pt of the reco tracks
  Double_t fptMax[3];                       //!Three largest track pt in the event
  Double_t fAcceptanceCuts[3];                // array with acceptance cuts
  Double_t fsignalInvMassCut;               // invariant mass cut to define signal region
  Double_t flargeInvMassCut;                // invariant mass cut to accept all inv mass window
  Double_t fsidebandInvMassCut;             // invariant mass cut to define side band region lower limit
  Double_t fsidebandInvMassWindow;          // invariant mass cut to define side band region width
  Bool_t fUseMC;                            // flag to use or not MC info
  Bool_t fCleanCandOwnVtx;                  // flag to switch on/off cleaning of the candidate own vtx
  TH1F *fNentries;                          //!histo for #AOD analysed, container 1
  TH1F *fSignalType;                        //!histo for the type of MC signal , container 2
  TH1F *fSignalTypeLsCuts;                 //!histo for the type of MC signal with loose cuts , container 3
  TH1F *fSignalTypeTghCuts;                //!histo for the type of MC signal with tight cuts, container 4
  AliNormalizationCounter *fCounter;        //!counter for the normalization 
  TList *flistMCproperties;               //!TLists for MC properties of D0 w.r.t. B mesons and c quarks cntainer 5
  TList *flistNoCutsSignal;               //!TList for signal (D prompt) with nocuts, container 6
  TList *flistNoCutsBack;               //!TList for background with nocuts, container 7
  TList *flistNoCutsFromB;               //!TList for D from B or D from Dstar from Bwith nocuts, container 8
  TList *flistNoCutsFromDstar;               //!TList for D from Dstar with nocuts, container 9
  TList *flistNoCutsOther;               //!TList for others with nocuts, container 10
  TList *flistLsCutsSignal;               //!TList for signal (D prompt) with loose cuts, container 11
  TList *flistLsCutsBack;               //!TList for background with loose cuts, container 12
  TList *flistLsCutsFromB;               //!TList for D from B or D from Dstar from B with loose cuts, container 13
  TList *flistLsCutsFromDstar;               //!TList for D from Dstar with loose cuts, container 14
  TList *flistLsCutsOther;               //!TList for others with loose cuts, container 15
  TList *flistTghCutsSignal;               //!TList for signal (D prompt) with tight cuts, container 16
  TList *flistTghCutsBack;               //!TList for backgrnd with tight cuts, container 17
  TList *flistTghCutsFromB;               //!TList for D from B or D from Dstar from Bwith tight cuts, container 18
  TList *flistTghCutsFromDstar;               //!TList for D from Dstar Dstar with tight cuts, container 19
  TList *flistTghCutsOther;               //!TList for others with tight cuts, container 20
  AliVertexingHFUtils *fVertUtil;         // vertexing HF Util
  Bool_t fselectForUpgrade;               // switch to reject candidates from HIJING and not Pythia for upgrade studies
  Bool_t fskipEventSelection;               // switch to skip event selection (for upgrade studies)
  Double_t fZvtxUpgr;                       // cut value on max zvtx used ONLY if fskipEventSelection is kTRUE
  TF1 *fWeightPt;                           // function with pt weights used only for MC histos for reflections and signal mass shape
  /*  Bool_t       fD0usecuts;            // Switch on the use of the cuts             TO BE IMPLEMENTED 
      Bool_t       fcheckMC;              //  Switch on MC check: minimum check is same mother  TO BE IMPLEMENTED
      Bool_t       fcheckMCD0;           //  check the mother is a D0                  TO BE IMPLEMENTED
      Bool_t       fcheckMC2prongs;         //  check the decay is in two prongs       TO BE IMPLEMENTED  
      Bool_t       fcheckMCprompt;       //  check the D0 comes from a c quark         TO BE IMPLEMENTED
      Bool_t       fcheckMCfromB;        //  check the D0 comes from a b quark         TO BE IMPLEMENTED
      Bool_t       fSkipD0star;           // skip if D0 comes from a D*                TO BE IMPLEMENTED
      Bool_t  fStudyd0fromBTrue;         // Flag for analyze true impact par of D0 from B       TO BE IMPLEMENTED 
      Bool_t  fStudyPureBackground;      // Flag to study the background (reverse the selection on the signal)     TO BE IMPLEMENTED 
      Double_t  fSideBands;                //Side bands selection (see cxx)            TO BE IMPLEMENTED
  */ 
  AliAnalysisTaskSECharmFraction(const AliAnalysisTaskSECharmFraction&); // not implemented
  AliAnalysisTaskSECharmFraction& operator=(const AliAnalysisTaskSECharmFraction&); // not implemented
  
  ClassDef(AliAnalysisTaskSECharmFraction,5); // analysis task for prompt charm fraction
};

#endif
 AliAnalysisTaskSECharmFraction.h:1
 AliAnalysisTaskSECharmFraction.h:2
 AliAnalysisTaskSECharmFraction.h:3
 AliAnalysisTaskSECharmFraction.h:4
 AliAnalysisTaskSECharmFraction.h:5
 AliAnalysisTaskSECharmFraction.h:6
 AliAnalysisTaskSECharmFraction.h:7
 AliAnalysisTaskSECharmFraction.h:8
 AliAnalysisTaskSECharmFraction.h:9
 AliAnalysisTaskSECharmFraction.h:10
 AliAnalysisTaskSECharmFraction.h:11
 AliAnalysisTaskSECharmFraction.h:12
 AliAnalysisTaskSECharmFraction.h:13
 AliAnalysisTaskSECharmFraction.h:14
 AliAnalysisTaskSECharmFraction.h:15
 AliAnalysisTaskSECharmFraction.h:16
 AliAnalysisTaskSECharmFraction.h:17
 AliAnalysisTaskSECharmFraction.h:18
 AliAnalysisTaskSECharmFraction.h:19
 AliAnalysisTaskSECharmFraction.h:20
 AliAnalysisTaskSECharmFraction.h:21
 AliAnalysisTaskSECharmFraction.h:22
 AliAnalysisTaskSECharmFraction.h:23
 AliAnalysisTaskSECharmFraction.h:24
 AliAnalysisTaskSECharmFraction.h:25
 AliAnalysisTaskSECharmFraction.h:26
 AliAnalysisTaskSECharmFraction.h:27
 AliAnalysisTaskSECharmFraction.h:28
 AliAnalysisTaskSECharmFraction.h:29
 AliAnalysisTaskSECharmFraction.h:30
 AliAnalysisTaskSECharmFraction.h:31
 AliAnalysisTaskSECharmFraction.h:32
 AliAnalysisTaskSECharmFraction.h:33
 AliAnalysisTaskSECharmFraction.h:34
 AliAnalysisTaskSECharmFraction.h:35
 AliAnalysisTaskSECharmFraction.h:36
 AliAnalysisTaskSECharmFraction.h:37
 AliAnalysisTaskSECharmFraction.h:38
 AliAnalysisTaskSECharmFraction.h:39
 AliAnalysisTaskSECharmFraction.h:40
 AliAnalysisTaskSECharmFraction.h:41
 AliAnalysisTaskSECharmFraction.h:42
 AliAnalysisTaskSECharmFraction.h:43
 AliAnalysisTaskSECharmFraction.h:44
 AliAnalysisTaskSECharmFraction.h:45
 AliAnalysisTaskSECharmFraction.h:46
 AliAnalysisTaskSECharmFraction.h:47
 AliAnalysisTaskSECharmFraction.h:48
 AliAnalysisTaskSECharmFraction.h:49
 AliAnalysisTaskSECharmFraction.h:50
 AliAnalysisTaskSECharmFraction.h:51
 AliAnalysisTaskSECharmFraction.h:52
 AliAnalysisTaskSECharmFraction.h:53
 AliAnalysisTaskSECharmFraction.h:54
 AliAnalysisTaskSECharmFraction.h:55
 AliAnalysisTaskSECharmFraction.h:56
 AliAnalysisTaskSECharmFraction.h:57
 AliAnalysisTaskSECharmFraction.h:58
 AliAnalysisTaskSECharmFraction.h:59
 AliAnalysisTaskSECharmFraction.h:60
 AliAnalysisTaskSECharmFraction.h:61
 AliAnalysisTaskSECharmFraction.h:62
 AliAnalysisTaskSECharmFraction.h:63
 AliAnalysisTaskSECharmFraction.h:64
 AliAnalysisTaskSECharmFraction.h:65
 AliAnalysisTaskSECharmFraction.h:66
 AliAnalysisTaskSECharmFraction.h:67
 AliAnalysisTaskSECharmFraction.h:68
 AliAnalysisTaskSECharmFraction.h:69
 AliAnalysisTaskSECharmFraction.h:70
 AliAnalysisTaskSECharmFraction.h:71
 AliAnalysisTaskSECharmFraction.h:72
 AliAnalysisTaskSECharmFraction.h:73
 AliAnalysisTaskSECharmFraction.h:74
 AliAnalysisTaskSECharmFraction.h:75
 AliAnalysisTaskSECharmFraction.h:76
 AliAnalysisTaskSECharmFraction.h:77
 AliAnalysisTaskSECharmFraction.h:78
 AliAnalysisTaskSECharmFraction.h:79
 AliAnalysisTaskSECharmFraction.h:80
 AliAnalysisTaskSECharmFraction.h:81
 AliAnalysisTaskSECharmFraction.h:82
 AliAnalysisTaskSECharmFraction.h:83
 AliAnalysisTaskSECharmFraction.h:84
 AliAnalysisTaskSECharmFraction.h:85
 AliAnalysisTaskSECharmFraction.h:86
 AliAnalysisTaskSECharmFraction.h:87
 AliAnalysisTaskSECharmFraction.h:88
 AliAnalysisTaskSECharmFraction.h:89
 AliAnalysisTaskSECharmFraction.h:90
 AliAnalysisTaskSECharmFraction.h:91
 AliAnalysisTaskSECharmFraction.h:92
 AliAnalysisTaskSECharmFraction.h:93
 AliAnalysisTaskSECharmFraction.h:94
 AliAnalysisTaskSECharmFraction.h:95
 AliAnalysisTaskSECharmFraction.h:96
 AliAnalysisTaskSECharmFraction.h:97
 AliAnalysisTaskSECharmFraction.h:98
 AliAnalysisTaskSECharmFraction.h:99
 AliAnalysisTaskSECharmFraction.h:100
 AliAnalysisTaskSECharmFraction.h:101
 AliAnalysisTaskSECharmFraction.h:102
 AliAnalysisTaskSECharmFraction.h:103
 AliAnalysisTaskSECharmFraction.h:104
 AliAnalysisTaskSECharmFraction.h:105
 AliAnalysisTaskSECharmFraction.h:106
 AliAnalysisTaskSECharmFraction.h:107
 AliAnalysisTaskSECharmFraction.h:108
 AliAnalysisTaskSECharmFraction.h:109
 AliAnalysisTaskSECharmFraction.h:110
 AliAnalysisTaskSECharmFraction.h:111
 AliAnalysisTaskSECharmFraction.h:112
 AliAnalysisTaskSECharmFraction.h:113
 AliAnalysisTaskSECharmFraction.h:114
 AliAnalysisTaskSECharmFraction.h:115
 AliAnalysisTaskSECharmFraction.h:116
 AliAnalysisTaskSECharmFraction.h:117
 AliAnalysisTaskSECharmFraction.h:118
 AliAnalysisTaskSECharmFraction.h:119
 AliAnalysisTaskSECharmFraction.h:120
 AliAnalysisTaskSECharmFraction.h:121
 AliAnalysisTaskSECharmFraction.h:122
 AliAnalysisTaskSECharmFraction.h:123
 AliAnalysisTaskSECharmFraction.h:124
 AliAnalysisTaskSECharmFraction.h:125
 AliAnalysisTaskSECharmFraction.h:126
 AliAnalysisTaskSECharmFraction.h:127
 AliAnalysisTaskSECharmFraction.h:128
 AliAnalysisTaskSECharmFraction.h:129
 AliAnalysisTaskSECharmFraction.h:130
 AliAnalysisTaskSECharmFraction.h:131
 AliAnalysisTaskSECharmFraction.h:132
 AliAnalysisTaskSECharmFraction.h:133
 AliAnalysisTaskSECharmFraction.h:134
 AliAnalysisTaskSECharmFraction.h:135
 AliAnalysisTaskSECharmFraction.h:136
 AliAnalysisTaskSECharmFraction.h:137
 AliAnalysisTaskSECharmFraction.h:138
 AliAnalysisTaskSECharmFraction.h:139
 AliAnalysisTaskSECharmFraction.h:140
 AliAnalysisTaskSECharmFraction.h:141
 AliAnalysisTaskSECharmFraction.h:142
 AliAnalysisTaskSECharmFraction.h:143
 AliAnalysisTaskSECharmFraction.h:144
 AliAnalysisTaskSECharmFraction.h:145
 AliAnalysisTaskSECharmFraction.h:146
 AliAnalysisTaskSECharmFraction.h:147
 AliAnalysisTaskSECharmFraction.h:148
 AliAnalysisTaskSECharmFraction.h:149
 AliAnalysisTaskSECharmFraction.h:150
 AliAnalysisTaskSECharmFraction.h:151
 AliAnalysisTaskSECharmFraction.h:152
 AliAnalysisTaskSECharmFraction.h:153
 AliAnalysisTaskSECharmFraction.h:154
 AliAnalysisTaskSECharmFraction.h:155
 AliAnalysisTaskSECharmFraction.h:156
 AliAnalysisTaskSECharmFraction.h:157
 AliAnalysisTaskSECharmFraction.h:158
 AliAnalysisTaskSECharmFraction.h:159
 AliAnalysisTaskSECharmFraction.h:160
 AliAnalysisTaskSECharmFraction.h:161
 AliAnalysisTaskSECharmFraction.h:162
 AliAnalysisTaskSECharmFraction.h:163
 AliAnalysisTaskSECharmFraction.h:164
 AliAnalysisTaskSECharmFraction.h:165
 AliAnalysisTaskSECharmFraction.h:166
 AliAnalysisTaskSECharmFraction.h:167
 AliAnalysisTaskSECharmFraction.h:168
 AliAnalysisTaskSECharmFraction.h:169
 AliAnalysisTaskSECharmFraction.h:170
 AliAnalysisTaskSECharmFraction.h:171
 AliAnalysisTaskSECharmFraction.h:172
 AliAnalysisTaskSECharmFraction.h:173
 AliAnalysisTaskSECharmFraction.h:174
 AliAnalysisTaskSECharmFraction.h:175
 AliAnalysisTaskSECharmFraction.h:176
 AliAnalysisTaskSECharmFraction.h:177
 AliAnalysisTaskSECharmFraction.h:178
 AliAnalysisTaskSECharmFraction.h:179
 AliAnalysisTaskSECharmFraction.h:180
 AliAnalysisTaskSECharmFraction.h:181