- Added classes and macros for TPC PID calibration
[u/mrichter/AliRoot.git] / PWGPP / TPC / AliTPCcalibResidualPID.h
1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 *                                                                        *
4 * Author: Yvonne Pachmayer <pachmay@physi.uni-heidelberg.de>             *
5 * Contributors are mentioned in the code where appropriate.              *
6 *                                                                        *
7 * Permission to use, copy, modify and distribute this software and its   *
8 * documentation strictly for non-commercial purposes is hereby granted   *
9 * without fee, provided that the above copyright notice appears in all   *
10 * copies and that both the copyright notice and this permission notice   *
11 * appear in the supporting documentation. The authors make no claims     *
12 * about the suitability of this software for any purpose. It is          *
13 * provided "as is" without express or implied warranty.                  *
14 **************************************************************************/
15 //
16 // The task:
17 // stores TPC PID quantities in a THnSparse
18 //
19 //  Author:
20 //  Yvonne Pachmayer <pachmay@physi.uni-heidelberg.de>
21 //
22
23 #ifndef ALITPCCALIBRESIDUALPID_H
24 #define ALITPCCALIBRESIDUALPID_H
25 #include "AliAnalysisTaskSE.h"
26
27 #include <TTreeStream.h>
28 #include "AliInputEventHandler.h"
29
30 class TArrayF;
31 template <class X>
32 class THnSparseT;
33 typedef class THnSparseT<TArrayF> THnSparseF;
34 class TFile;
35 class TGraphErrors;
36 class AliESDEvent;
37 class AliMCEvent;
38 class AliESDtrackCuts;
39 class AliESDpid;
40 class AliESD;
41 class AliAnalysisTask;
42 class AliESDInputHandler;
43 class AliESDv0KineCuts;
44 class AliAnalysisManager;
45 class AliCentrality;
46 class TTree;
47 class TSystem;
48 class TStyle;
49 class TROOT;
50 class Riostream;
51 class TChain;
52 class TH2;
53 class TF1;
54 class TH1;
55 class TObjArray;
56
57
58 class AliTPCcalibResidualPID : public AliAnalysisTaskSE {
59  public:
60   enum FitType { kAleph = 0, kLund = 1, kSaturatedLund = 2, kAlephWithAdditionalParam = 3 };
61   AliTPCcalibResidualPID();
62   AliTPCcalibResidualPID(const char *name);
63   virtual ~AliTPCcalibResidualPID();
64   virtual void   UserCreateOutputObjects();
65   virtual void   UserExec(Option_t *);
66   virtual void   Process(AliESDEvent *const esdEvent=0, AliMCEvent *const mcEvent=0);
67   virtual void   Terminate(const Option_t*);
68   Int_t          CompareFloat(Float_t f1=1, Float_t f2=0) const;
69   //setter
70   virtual void   SetESDtrackCuts(AliESDtrackCuts * trackCuts){fESDtrackCuts = trackCuts;};
71   virtual void   SetESDtrackCutsV0(AliESDtrackCuts * trackCutsV0){fESDtrackCutsV0 = trackCutsV0;};
72   virtual void   SetProduceTPCsignalTHnSparse(Int_t producetpcsignal){fProduceTPCSignalSparse = producetpcsignal;};
73   virtual void   SetProducePIDqa(Int_t produceGlobal){fProduceGlobal = produceGlobal;};
74   virtual void   SetProduceAllPadsPID(Int_t produceAllpadTypes){fProduceAllPadTypes = produceAllpadTypes;};
75   virtual void   SetProduceShortPadsPID(Int_t produceShortpads){fProduceShortPads = produceShortpads;};
76   virtual void   SetProduceMediumPadsPID(Int_t produceMediumpads){fProduceMediumPads = produceMediumpads;};
77   virtual void   SetProduceLongPadsPID(Int_t produceLongpads){fProduceLongPads = produceLongpads;};
78   virtual void   SetProduceOrocPID(Int_t produceOroc){fProduceOroc = produceOroc;};
79   
80   virtual Bool_t GetVertexIsOk(AliVEvent* event) const;
81   
82   virtual Bool_t GetUseTPCCutMIGeo() const { return fUseTPCCutMIGeo; };
83   virtual void SetUseTPCCutMIGeo(Bool_t newValue) { fUseTPCCutMIGeo = newValue; };
84   
85   virtual Bool_t GetIsPbpOrpPb() const { return fIsPbpOrpPb; };
86   virtual void SetIsPbpOrpPb(Bool_t newValue) { fIsPbpOrpPb = newValue; };
87   
88   Double_t GetZvtxCutEvent() const { return fZvtxCutEvent; };
89   virtual void SetZvtxCutEvent(Double_t newValue) { fZvtxCutEvent = newValue; };
90   
91   Bool_t GetCorrectdEdxEtaDependence() const { return fCorrectdEdxEtaDependence; };
92   virtual void SetCorrectdEdxEtaDependence(Bool_t flag) { fCorrectdEdxEtaDependence = flag; };
93   
94   Bool_t GetCorrectdEdxMultiplicityDependence() const { return fCorrectdEdxMultiplicityDependence; };
95   virtual void SetCorrectdEdxMultiplicityDependence(Bool_t flag) { fCorrectdEdxMultiplicityDependence = flag; };
96   
97   virtual Char_t GetV0tag(Int_t trackIndex) const;
98
99   Bool_t GetUseMCinfo() const { return fUseMCinfo; };
100   virtual void SetUseMCinfo(Bool_t flag) { fUseMCinfo = flag; };
101   
102   virtual Int_t GetV0motherIndex(Int_t trackIndex) const;
103   virtual Int_t GetV0motherPDG(Int_t trackIndex) const;
104   
105   //
106   // static functions for postprocessing
107   //
108   static Double_t* ExtractResidualPID(THnSparseF * histPidQA,
109                                       const Bool_t useV0s = kTRUE,
110                                       const Char_t * outFile = "out.root",
111                                       const Char_t * type    = "MC",
112                                       const Char_t * period  = "LHC10H8",
113                                       const Char_t * pass    = "PASS1",
114                                       const Char_t * system  = "PBPB",
115                                       const Double_t * initialParameters = 0x0,
116                                       const Char_t * dedxtype= "",
117                                       FitType = kSaturatedLund);
118   static  TObjArray * GetResidualGraphs(THnSparseF * histPidQA, const Char_t * system, const Bool_t useV0s);
119   static  TObjArray * GetResidualGraphsMC(THnSparseF * histPidQA, const Char_t * system);
120   static  TObjArray * GetSeparation(THnSparseF * histPidQA, Int_t kParticle1, Int_t kParticle2);
121   static  TObjArray * GetResponseFunctions(TF1* parametrisation, TObjArray* inputGraphs, const Char_t * type, const Char_t * period, const Char_t * pass, const Char_t * system, const Char_t * dedxtype);
122   static  TF1*        FitBB(TObjArray* inputGraphs, Bool_t isMC, Bool_t isPPb, const Bool_t useV0s,
123                             const Double_t * initialParameters = 0x0, FitType = kSaturatedLund);
124   static Int_t MergeGraphErrors(TGraphErrors* mergedGraph, TCollection* li);
125   
126   static Double_t GetCutGeo() { return fgCutGeo; };
127   static Double_t GetCutNcr() { return fgCutNcr; };
128   static Double_t GetCutNcl() { return fgCutNcl; };
129   
130   static void SetCutGeo(Double_t value) { fgCutGeo = value; };
131   static void SetCutNcr(Double_t value) { fgCutNcr = value; };
132   static void SetCutNcl(Double_t value) { fgCutNcl = value; };
133   
134   static Bool_t TPCCutMIGeo(const AliVTrack* track, const AliVEvent* evt, TTreeStream* streamer = 0x0);
135   static Bool_t TPCCutMIGeo(const AliVTrack* track, const AliInputEventHandler* evtHandler, TTreeStream* streamer = 0x0)
136     { if (!evtHandler) return kFALSE; return TPCCutMIGeo(track, evtHandler->GetEvent(), streamer); };
137
138   protected:
139   static Double_t fgCutGeo;  // Cut variable for TPCCutMIGeo concerning geometry
140   static Double_t fgCutNcr;  // Cut variable for TPCCutMIGeo concerning num crossed rows
141   static Double_t fgCutNcl;  // Cut variable for TPCCutMIGeo concerning num clusters
142   
143   private:
144   static Double_t Lund(Double_t* xx, Double_t* par);
145   static Double_t SaturatedLund(Double_t* xx, Double_t* par);
146   
147   void  BinLogAxis(const THnSparseF *h, Int_t axisNumber);
148   enum {kElectron=0, kPion, kKaon, kProton} kParticle ;
149
150   static void FitSlicesY(TH2 *hist, Double_t heightFractionForRange, Int_t cutThreshold, TString fitOption, TObjArray *arr);
151
152   void FillV0PIDlist(AliESDEvent* esdEvent = 0x0);
153   void ClearV0PIDlist();
154
155   //
156   //
157   AliESDEvent *fESD;                   //! ESD object
158   AliMCEvent  *fMC;                    //! MC object
159   TObjArray * fOutputContainer;        //! output data container
160   AliESDtrackCuts * fESDtrackCuts;     // basic cut variables for all non-V0 tracks
161   AliESDtrackCuts * fESDtrackCutsV0;   // basic cut variables for all V0 tracks
162   AliESDpid * fESDpid;                 //! PID handling
163   //
164   
165   Bool_t fUseTPCCutMIGeo;   // Use geometrical cut for TPC 
166   
167   Bool_t fUseMCinfo;         // Use MC info, if available
168   
169   Bool_t fIsPbpOrpPb;      // Pbp/pPb collision or something else?
170   Double_t fZvtxCutEvent;  // Vertex z cut for the event (cm)
171   
172   AliESDv0KineCuts *fV0KineCuts;       //! ESD V0 kine cuts
173   Int_t fNumTagsStored;     // Number of entries of fV0tags
174   Char_t* fV0tags;         //! Pointer to array with tags for identified particles from V0 decays
175   Int_t* fV0motherIndex;   //! Pointer to array with index of the mother V0
176   Int_t* fV0motherPDG;     //! Pointer to array with pdg of the mother V0
177
178   Bool_t fProduceAllPadTypes, fProduceGlobal, fProduceShortPads, fProduceMediumPads, fProduceLongPads,fProduceOroc;
179   THnSparseF * fHistPidQA;             //! histogram for the QA of the PID
180   THnSparseF * fHistPidQAshort;        //! histogram for the QA of the PID short pads
181   THnSparseF * fHistPidQAmedium;       //! histogram for the QA of the PID med pads
182   THnSparseF * fHistPidQAlong;         //! histogram for the QA of the PID long pads
183   THnSparseF * fHistPidQAoroc;         //! histogram for the QA of the PID full oroc
184   //
185   Bool_t fProduceTPCSignalSparse;      //for setter
186   Bool_t fCorrectdEdxEtaDependence;    // Correct eta dependence for fHistPidQA (NOTE: Not done for the pad-specific THnSparses)
187   Bool_t fCorrectdEdxMultiplicityDependence; // Correct multiplicity dependence for fHistPidQA (NOTE: Not done for the pad-specific THnSparses)
188   THnSparseF * fThnspTpc;              //! thnsparse containing the data
189   //
190   //
191   
192   // QA histos
193   TObjArray* fQAList;           //! Array with QA histos
194   TH1F* fhInvMassGamma;         //! Histogram with inv. mass of gamma
195   TH1F* fhInvMassK0s;           //! Histogram with inv. mass of K0s
196   TH1F* fhInvMassLambda;        //! Histogram with inv. mass of lambda
197   TH1F* fhInvMassAntiLambda;    //! Histogram with inv. mass of anti-lambda
198   
199   TH2F* fhArmenterosAll;        //! Histogram with armenteros plot for all V0s
200   TH2F* fhArmenterosGamma;      //! Histogram with armenteros plot for gamma
201   TH2F* fhArmenterosK0s;        //! Histogram with armenteros plot for K0s
202   TH2F* fhArmenterosLambda;     //! Histogram with armenteros plot for lambda
203   TH2F* fhArmenterosAntiLambda; //! Histogram with armenteros plot for anti-lambda
204   
205   // QA histos for shared clusters
206   THnSparseF* fHistSharedClusQAV0Pi;  //! Histogram with shared clusters QA for V0 pi
207   THnSparseF* fHistSharedClusQAV0Pr;  //! Histogram with shared clusters QA for V0 pr
208   THnSparseF* fHistSharedClusQAV0El;  //! Histogram with shared clusters QA for V0 el
209   
210   AliTPCcalibResidualPID(const AliTPCcalibResidualPID&); // not implemented
211   AliTPCcalibResidualPID& operator=(const AliTPCcalibResidualPID&); // not implemented
212   
213   ClassDef(AliTPCcalibResidualPID, 4); 
214 };
215 #endif