ROOT logo
/**************************************************************************
* 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.                  *
**************************************************************************/
//
// QA class for TRD PID
// Evaluate TRD PID using well identified reference tracks
// For more information see implementation file
//
#ifndef ALIHFETRDPIDQA_H
#define ALIHFETRDPIDQA_H

#ifndef ROOT_TNamed
#include <TNamed.h>
#endif

#ifndef ROOT_THnSparse
#include <THnSparse.h>
#endif

#ifndef ROOT_TH2
#include <TH2.h>
#endif

#ifndef ALIHFECOLLECTION_H
#include "AliHFEcollection.h"
#endif

class TArrayD;
class TBrowser;
class TCollection;
class TF1;
class TGraph;
class TGraphErrors;
class TH1;
//class TH2;
class TList;
class TObjArray;

class AliAODTrack;
class AliESDtrack;
class AliVTrack;
class AliHFEpidTRD;

class AliHFEtrdPIDqa : public TNamed{
  public:
    AliHFEtrdPIDqa();
    AliHFEtrdPIDqa(const Char_t *name);
    AliHFEtrdPIDqa(const AliHFEtrdPIDqa &ref);
    AliHFEtrdPIDqa &operator=(const AliHFEtrdPIDqa &ref);
    virtual void Copy(TObject &o) const;
    virtual Long64_t Merge(TCollection *coll);
    virtual ~AliHFEtrdPIDqa();
   
    virtual void Browse(TBrowser *b);
    virtual Bool_t IsFolder() const { return kTRUE; }

    void ProcessTracks(const TObjArray * const  l, Int_t species);
    void ProcessTrack(const AliVTrack *const track, Int_t species);

    void Init();
    void FinishAnalysis(Int_t fCentrality = -1, Bool_t isGreaterEqual = kFALSE);
    void ShowMessages() { fShowMessage = kTRUE; }
    void SetTotalChargeInSlice0() { fTotalChargeInSlice0 = kTRUE; }
    void SetCentralityBin(Int_t centrality) { fCentralityBin = centrality; };
    void StoreResults(const Char_t *filename = "HFEtrdPIDqa.root");
    void SaveThresholdParameters(const Char_t * filename = "TRD.Thresholds.root", Double_t lowerLimit = 0.5, Double_t upperLimit = 3.5, Int_t fCentrality = -1);

    TGraphErrors *GetPionEfficiency(Int_t ntracklets, Int_t eleffpercent, Int_t centrality = -1);
    TGraphErrors *GetProtonEfficiency(Int_t ntracklets, Int_t eleffpercent, Int_t centrality = -1);
    TGraph *GetThreshold(Int_t ntracklets, Int_t eleffpercent, Int_t centrality = -1);

    void DrawTracklet(Int_t tracklet, Double_t pmin = -1., Double_t pmax = -1., Int_t centrality = -1, Bool_t doFit = kFALSE);
    //void DrawTrackletsame(Int_t tracklet, Double_t pmin = -1., Double_t pmax = -1., Bool_t doFit = kFALSE);
    void ClearLists();

    Double_t EvalPionEfficiency(Int_t ntls, Int_t eEff, Double_t p, Int_t centrality = -1);
    Double_t EvalProtonEfficiency(Int_t ntls, Int_t eEff, Double_t p, Int_t centrality = -1);
    Double_t EvalThreshold(Int_t ntls, Int_t eEff, Double_t p, Int_t centrality = -1);

    Double_t CalculateIntegratedPionEfficiency(UInt_t nTracklets, Double_t electronEff, Double_t pmin, Double_t pmax, Int_t icentrality =-1, Double_t *error = NULL);



    //---------------------------------------------------
    // Getters for Histograms
    THnSparseF *GetLikelihoodHistogram() const { return fHistos ? dynamic_cast<THnSparseF *>(fHistos->Get("fLikeTRD")) : NULL; }
    THnSparseF *GetQAHistogram() const { return fHistos ? dynamic_cast<THnSparseF *>(fHistos->Get("fQAtrack")) : NULL; }
    THnSparseF *GetdEdxHistogram() const { return fHistos ? dynamic_cast<THnSparseF *>(fHistos->Get("fQAdEdx")) : NULL; }
    THnSparseF *GetHistoTruncMean() const { return fHistos ? dynamic_cast<THnSparseF *>(fHistos->Get("fTRDtruncMean")) : NULL; }
    TH2 *GetSliceChargePions(Bool_t pions = kTRUE) const { 
      const Char_t * species = pions ? "Pions" : "Electrons";
      return fHistos ? dynamic_cast<TH2 *>(fHistos->Get(Form("fTRDslices%s", species))) : NULL; 
    }
    AliHFEcollection *GetHistos() const { return fHistos; }
    //---------------------------------------------------
  protected:
    // Description of the containers we use to store basic information
    // we access in the Post Processing. For all containers we have a 
    // common part containing species, momentum and number of tracklets,
    // and a specific part. For both containers we define the number of 
    // variables too
    enum QuantitiesCommon_t{
      kSpecies = 0,
      kP = 1,
      kNTracklets = 2,
      kQuantitiesCommon = 3
    };
    enum QuantitiesLike_t{
      kElectronLike = 3,
      kNClustersLike = 4,
      kCentralityBinLike = 5,
      kQuantitiesLike = 6
    };
    enum QuantitiesQAtrack_t{
      kNonZeroTrackletCharge = 3,
      kNClusters = 4,
      kCentralityBinQA = 5,
      kQuantitiesQA = 6
    };
    enum QuantitiesdEdx_t{
      kNclusters = 3,
      kNonZeroSlices = 4,
      kdEdx = 5,
      kCentralityBindEdx = 6,
      kQuantitiesdEdx = 7
    };
    enum QuantitiesTruncMean_t{
      kTPCdEdx = 3,
      kTRDdEdxMethod1 = 4,
      kTRDdEdxMethod2 = 5,
      kCentralityBinTruncMean = 6,
      kQuantitiesTruncMean = 7
    };

    void ProcessTrackESD(const AliESDtrack * const track, Int_t species);
    void ProcessTrackAOD(const AliAODTrack * const track, Int_t species);

    void FillTRDLikelihoods(const AliESDtrack * const track, Int_t species);
    void FillTRDQAplots(const AliESDtrack *const track, Int_t species);

    void AnalyseNTracklets(Int_t nTracklets, Int_t fCentrality = -1, Bool_t isGreaterEqual = kFALSE);
    Double_t CalculateHadronEfficiency(const TH1 * const hadron, const TH1 *const electron, Double_t eff, Int_t &threshbin, Double_t &error);
    Double_t EstimateThresholdError(const TH1 * const electron, Int_t threshbin);
    TF1 *MakeThresholds(TGraph *input, Double_t lowerLimit, Double_t upperLimit);

    void CreateLikelihoodHistogram();
    void CreateQAHistogram();
    void CreatedEdxHistogram();
    void CreateHistoTruncatedMean();

  private:
    enum{
      kNElectronEffs = 6
    };
    static const Double_t fgkElectronEff[kNElectronEffs];       // Electron efficiency bins
    static const Int_t    fgkNBinsCommon[kQuantitiesCommon];    // Number of bins for common quantities
    static const Double_t fgkMinBinCommon[kQuantitiesCommon];   // Bin Limits for common quantities (lower limit)
    static const Double_t fgkMaxBinCommon[kQuantitiesCommon];   // Bin Limits for common quantities (upper limit)
    AliHFEpidTRD *fTRDpid;        // HFE PID for TRD
    AliHFEcollection *fHistos;    // Histogram collection

    // List for Histograms:
    TList *fPionEfficiencies;     //! List for Pion efficiencies
    TList *fProtonEfficiencies;   //! List for Proton efficiencies
    TList *fKaonEfficiencies;     //! List for Kaon efficiencies

    TList *fThresholds;           //! List for Threshold Graphs

    Bool_t fShowMessage;          // Display debug messages
    Bool_t fTotalChargeInSlice0;  // Flag for Foreward/Backward compatibility in TRD total charge calculation

    Int_t  fCentralityBin;         // Centrality Bin

  ClassDef(AliHFEtrdPIDqa, 3)     // QA class for TRD PID 
};
#endif

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