ROOT logo
#ifndef ALIANALYSISTASKCOMBINHF_H
#define ALIANALYSISTASKCOMBINHF_H

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

/* $Id: $ */

//*************************************************************************
// Class AliAnalysisTaskCombinHF
// AliAnalysisTaskSE to build D meson candidates by combining tracks
//  background is computed LS and track rotations is
// Authors: F. Prino, A. Rossi
/////////////////////////////////////////////////////////////

#include <TH1F.h>
#include <TH3F.h>
#include <TObjString.h>
#include <THnSparse.h>
#include "AliAnalysisTaskSE.h"
#include "AliAODTrack.h"
#include "AliNormalizationCounter.h"
#include "AliRDHFCuts.h"

class AliAnalysisTaskCombinHF : public AliAnalysisTaskSE
{
public:
  
  AliAnalysisTaskCombinHF();
  AliAnalysisTaskCombinHF(Int_t meson, AliRDHFCuts* analysiscuts);
  virtual ~AliAnalysisTaskCombinHF();
  
  virtual void UserCreateOutputObjects();
  virtual void Init(){};
  virtual void LocalInit() {Init();}
  virtual void UserExec(Option_t *option);
  virtual void Terminate(Option_t *option);
  virtual void FinishTaskOutput();
  
  void SetReadMC(Bool_t read){fReadMC=read;}

  void SetEventMixingWithCuts(Double_t maxDeltaVz, Double_t maxDeltaMult){
    fDoEventMixing=2; fMaxzVertDistForMix=maxDeltaVz; fMaxMultDiffForMix=maxDeltaMult;
  }
  void SetEventMixingWithPools(){fDoEventMixing=1;}
  void SetEventMixingOff(){fDoEventMixing=0;}
  void SetNumberOfEventsForMixing(Int_t minn){fNumberOfEventsForMixing=minn;}

  void ConfigureZVertPools(Int_t nPools, Double_t*  zVertLimits);
  void ConfigureMultiplicityPools(Int_t nPools, Double_t*  multLimits);
  void SelectPromptD(){fPromptFeeddown=kPrompt;}
  void SelectFeeddownD(){fPromptFeeddown=kFeeddown;}
  void SelectPromptAndFeeddownD(){fPromptFeeddown=kBoth;}
  void SetGoUpToQuark(Bool_t opt){fGoUpToQuark=opt;}
  void SetKeepNegIDtracks(Bool_t nid){fKeepNegID=nid;}//set it to kTRUE only if you know what you are doing
  void SetTrackCuts(AliESDtrackCuts* cuts){
    if(fTrackCutsAll) delete fTrackCutsAll;
    fTrackCutsAll=new AliESDtrackCuts(*cuts);
  }
  void SetPionTrackCuts(AliESDtrackCuts* cuts){
    if(fTrackCutsPion) delete fTrackCutsPion;
    fTrackCutsPion=new AliESDtrackCuts(*cuts);
  }
  void SetKaonTrackCuts(AliESDtrackCuts* cuts){
    if(fTrackCutsKaon) delete fTrackCutsKaon;
    fTrackCutsKaon=new AliESDtrackCuts(*cuts);
  }
  void SetPIDHF(AliAODPidHF* pid){
    if(fPidHF) delete fPidHF;
    fPidHF=new AliAODPidHF(*pid);
  }
  void SetRDHFCuts(AliRDHFCuts* cuts){
    fAnalysisCuts=cuts;
  }
  void SetFilterMask(UInt_t mask=16){fFilterMask=mask;}
  void SetAnalysisLevel(Int_t level){fFullAnalysis=level;}
  void ConfigureRotation(Int_t n, Double_t phimin, Double_t phimax){
    fNRotations=n;
    fMinAngleForRot=phimin;
    fMaxAngleForRot=phimax;
  }
  void SetMassWindow(Double_t minMass, Double_t maxMass){fMinMass=minMass; fMaxMass=maxMass;}
  void SetMaxPt(Double_t maxPt){fMaxPt=maxPt;}
  void SetPtBinWidth(Double_t binw){fPtBinWidth=binw;}
  void SetEtaAccCut(Double_t etacut){fEtaAccCut=etacut;}
  void SetPtAccCut(Double_t ptcut){fPtAccCut=ptcut;}
  void SetMultiplicityRange(Double_t mmin=-0.5, Double_t mmax=199.5){
    fMinMultiplicity=mmin;
    fMaxMultiplicity=mmax;
  }

  void SetPIDstrategy(Int_t strat){fPIDstrategy=strat;}
  void SetMaxPforIDPion(Double_t maxpIdPion){fmaxPforIDPion=maxpIdPion;}
  void SetMaxPforIDKaon(Double_t maxpIdKaon){fmaxPforIDKaon=maxpIdKaon;}
  void SetPIDselCaseZero(Int_t strat){fPIDselCaseZero=strat;}
  void SetBayesThres(Double_t thresKaon, Double_t thresPion){
    fBayesThresKaon=thresKaon;
    fBayesThresPion=thresPion;
  }
  
  Bool_t IsTrackSelected(AliAODTrack* track);
  Bool_t IsKaon(AliAODTrack* track);
  Bool_t IsPion(AliAODTrack* track);
  Bool_t SelectAODTrack(AliAODTrack *track, AliESDtrackCuts *cuts);
  
  Bool_t FillHistos(Int_t pdgD,Int_t nProngs, AliAODRecoDecay* tmpRD, Double_t* px, Double_t* py, Double_t* pz, UInt_t *pdgdau, TClonesArray *arrayMC, Int_t* dgLabels);
  void FillLSHistos(Int_t pdgD,Int_t nProngs, AliAODRecoDecay* tmpRD, Double_t* px, Double_t* py, Double_t* pz, UInt_t *pdgdau, Int_t charge);
  void FillMEHistos(Int_t pdgD,Int_t nProngs, AliAODRecoDecay* tmpRD, Double_t* px, Double_t* py, Double_t* pz, UInt_t *pdgdau);
  void FillMEHistosLS(Int_t pdgD,Int_t nProngs, AliAODRecoDecay* tmpRD, Double_t* px, Double_t* py, Double_t* pz, UInt_t *pdgdau, Int_t charge);
  void FillGenHistos(TClonesArray* arrayMC);
  Bool_t CheckAcceptance(TClonesArray* arrayMC, Int_t nProng, Int_t *labDau); 
  Int_t GetPoolIndex(Double_t zvert, Double_t mult);
  void ResetPool(Int_t poolIndex);
  void DoMixingWithPools(Int_t poolIndex);
  void DoMixingWithCuts();
  Bool_t CanBeMixed(Double_t zv1, Double_t zv2, Double_t mult1, Double_t mult2);
  enum EMesonSpecies {kDzero, kDplus, kDstar, kDs};
  enum EPrompFd {kNone,kPrompt,kFeeddown,kBoth};
  enum EPIDstrategy {knSigma, kBayesianMaxProb, kBayesianThres};
  
private:
  
  AliAnalysisTaskCombinHF(const AliAnalysisTaskCombinHF &source);
  AliAnalysisTaskCombinHF& operator=(const AliAnalysisTaskCombinHF& source);
  
  TList   *fOutput; //! list send on output slot 0
  TH1F *fHistNEvents;         //!hist. for No. of events
  TH1F *fHistTrackStatus;     //!hist. of status of tracks
  TH1F *fHistCheckOrigin;     //!hist. of origin (c/b) of D meson
  TH1F *fHistCheckOriginSel;  //!hist. of origin (c/b) of D meson
  TH1F *fHistCheckDecChan;    //!hist. of decay channel of D meson
  TH1F *fHistCheckDecChanAcc; //!hist. of decay channel of D meson in acc.
  TH3F *fPtVsYVsMultGen;        //! hist. of Y vs. Pt vs. Mult generated (all D)
  TH3F *fPtVsYVsMultGenLargeAcc; //! hist. of Y vs. Pt vs. Mult generated (|y|<0.9)
  TH3F *fPtVsYVsMultGenLimAcc;  //! hist. of Y vs. Pt vs. Mult generated (|y|<0.5)
  TH3F *fPtVsYVsMultGenAcc;     //! hist. of Y vs. Pt vs. Mult generated (D in acc)
  TH3F *fPtVsYVsMultReco;       //! hist. of Y vs. Pt vs. Mult generated (Reco D)
  TH3F *fMassVsPtVsY;     //! hist. of Y vs. Pt vs. Mass (all cand)
  TH3F *fMassVsPtVsYRot;   //! hist. of Y vs. Pt vs. Mass (rotations)
  TH3F *fMassVsPtVsYLSpp;  //! hist. of Y vs. Pt vs. Mass (like sign ++)
  TH3F *fMassVsPtVsYLSmm;  //! hist. of Y vs. Pt vs. Mass (like sign --)
  TH3F *fMassVsPtVsYSig;   //! hist. of Y vs. Pt vs. Mass (signal)
  TH3F *fMassVsPtVsYRefl;  //! hist. of Y vs. Pt vs. Mass (reflections)
  TH3F *fMassVsPtVsYBkg;   //! hist. of Y vs. Pt vs. Mass (background)
  TH1F *fNSelected;        //! hist. of n. of selected D+
  TH1F *fNormRotated;      //! hist. rotated/selected D+
  TH1F *fDeltaMass;        //! hist. mass difference after rotations
  THnSparse *fDeltaMassFullAnalysis; //! hist. mass difference after rotations with more details
  TH3F *fMassVsPtVsYME;   //! hist. of Y vs. Pt vs. Mass (mixedevents)
  TH3F *fMassVsPtVsYMELSpp;   //! hist. of Y vs. Pt vs. Mass (mixedevents)
  TH3F *fMassVsPtVsYMELSmm;   //! hist. of Y vs. Pt vs. Mass (mixedevents)
  TH2F* fEventsPerPool;   //! hist with number of events per pool  
  TH2F* fMixingsPerPool;    //! hist with number of mixings per pool  
  UInt_t fFilterMask; // FilterMask
  AliESDtrackCuts* fTrackCutsAll; // track selection
  AliESDtrackCuts* fTrackCutsPion; // pion track selection
  AliESDtrackCuts* fTrackCutsKaon; // kaon track selection
  AliAODPidHF* fPidHF; // PID configuration
  AliRDHFCuts *fAnalysisCuts; // Cuts for candidates
  
  Double_t fMinMass; // minimum value of invariant mass
  Double_t fMaxMass; // maximum value of invariant mass
  Double_t fMaxPt;   // maximum pT value for inv. mass histograms
  Double_t fPtBinWidth; // width of pt bin (GeV/c)
  Double_t fEtaAccCut; // eta limits for acceptance step
  Double_t fPtAccCut; // pt limits for acceptance step
  
  Int_t fNRotations; // number of rotations
  Double_t fMinAngleForRot; // minimum angle for track rotation
  Double_t fMaxAngleForRot; // maximum angle for track rotation
  Double_t fMinAngleForRot3; // minimum angle for track rotation (3rd prong)
  Double_t fMaxAngleForRot3; // maximum angle for track rotation (3rd prong)
  
  AliNormalizationCounter *fCounter;//!Counter for normalization
  
  Int_t fMeson;          // mesonSpecies (see enum)
  Bool_t  fReadMC;       //  flag for access to MC
  Int_t fPromptFeeddown; // flag to select prompt (1), feeddown (2) or all (3)
  Bool_t fGoUpToQuark;   // flag for definition of c,b origin
  Int_t fFullAnalysis;   // flag to set analysis level (0 is the fastest)
  
  Int_t    fPIDstrategy;     // knSigma, kBayesianMaxProb, kBayesianThres
  Double_t fmaxPforIDPion; // flag for upper p limit for id band for pion
  Double_t fmaxPforIDKaon; // flag for upper p limit for id band for kaon
  Bool_t   fKeepNegID;    // flag to keep also track with negative ID (default kFALSE, change it only if you know what you are doing)
  Int_t    fPIDselCaseZero;  // flag to change PID strategy
  Double_t fBayesThresKaon;  // threshold for kaon identification via Bayesian PID
  Double_t fBayesThresPion;  // threshold for pion identification via Bayesian PID

  Int_t fDoEventMixing; // flag for event mixing
  Int_t  fNumberOfEventsForMixing; // maximum number of events to be used in event mixing
  Double_t fMaxzVertDistForMix; // cut on zvertex distance for event mixing with cuts
  Double_t fMaxMultDiffForMix; // cut on multiplicity difference for event mixing with cuts
  Int_t fNzVertPools; // number of pools in z vertex for event mixing
  Int_t fNzVertPoolsLimSize; // number of pools in z vertex for event mixing +1
  Double_t* fzVertPoolLims; //[fNzVertPoolsLimSize] limits of the pools in zVertex
  Int_t fNMultPools; // number of pools in multiplicity for event mixing
  Int_t fNMultPoolsLimSize; // number of pools in multiplicity for event mixing +1
  Double_t* fMultPoolLims; //[fNMultPoolsLimSize] limits of the pools in multiplicity
  Int_t  fNOfPools; // number of pools
  TTree** fEventBuffer;   //! structure for event mixing
  TObjString* fEventInfo;  // unique event Id for event mixing checks
  Double_t fVtxZ;         // zVertex
  Double_t fMultiplicity; // multiplicity
  Double_t fMinMultiplicity;  // lower limit for multiplcities in MC histos
  Double_t fMaxMultiplicity; // upper limit for multiplcities in MC histos
  TObjArray* fKaonTracks; // array of kaon-compatible tracks (TLorentzVectors)
  TObjArray* fPionTracks; // array of pion-compatible tracks (TLorentzVectors)  
  ClassDef(AliAnalysisTaskCombinHF,10); // D0D+ task from AOD tracks
};

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