ROOT logo
#ifndef ALIANALYSISTASKITSALIGNQA
#define ALIANALYSISTASKITSALIGNQA

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

//*************************************************************************
// Class AliAnalysiTaskITSAlignQA
// AliAnalysisTaskSE to extract from ESD + ESDfriends 
// the track-to-point residuals and dE/dx vs, time for SDD modules
//
// Author: F. Prino, prino@to.infn.it
//*************************************************************************

class TList;
class TH1F;
class TH2F;
class TProfile;
class TTree;
class TString;
class AliESDEvent;
class AliESDfriend;
class AliITSTPArrayFit;
class AliTrackPointArray;
class AliITSSumTP;

#include "AliAnalysisTaskSE.h"

class AliAnalysisTaskITSAlignQA : public AliAnalysisTaskSE {

 public:
  enum {kEvAll=0,kEvCnt,kEvVtx,kEvPlp,kNTracks,kNEvStatBins,  kEvAcc=kEvPlp};
  AliAnalysisTaskITSAlignQA();
  virtual ~AliAnalysisTaskITSAlignQA();

  virtual void   UserExec(Option_t *option);
  virtual void   UserCreateOutputObjects();
  virtual void   Terminate(Option_t *option);

  void SetDoFillTPTree(Bool_t opt){
    fDoFillTPTree=opt;
    if (fDoFillTPTree) DefineOutput(2,TTree::Class());
  }
  void SetDoSPDResiduals(Bool_t opt){
    fDoSPDResiduals=opt;
  }
  void SetDoSDDResiduals(Bool_t opt){
    fDoSDDResiduals=opt;
  }
  void SetDoSSDResiduals(Bool_t opt){
    fDoSSDResiduals=opt;
  }
  void SetDoSDDdEdxCalib(Bool_t opt){
    fDoSDDdEdxCalib=opt;
  }
  void SetDoSDDVDriftCalib(Bool_t opt){
    fDoSDDVDriftCalib=opt;
  }
  void SetDoSDDDriftTime(Bool_t opt){
    fDoSDDDriftTime=opt;
  }
  void SetDoAllResiduals(){
    fDoSPDResiduals=kTRUE;
    fDoSDDResiduals=kTRUE;
    fDoSSDResiduals=kTRUE;
  }
  void SetDoAll(){
    SetDoAllResiduals();
    fDoSDDdEdxCalib=kTRUE;    
  }
  void SetUseITSstandaloneTracks(Bool_t use){
    fUseITSsaTracks=use;
  }
  void SetLoadGeometryFromOCDB(Bool_t opt){
    fLoadGeometry=opt;
  }

  void SetMinITSPoints(Int_t minp=3){
    fMinITSpts=minp;
  }
  void SetMinTPCPoints(Int_t minp=70){
    fMinTPCpts=minp;
  }
  void SetMinPt(Float_t minpt=1.0){
    fMinPt=minpt;
  }
  void SetUseTPCMomentum(Bool_t v=kTRUE)    { fUseTPCMomentum = v;}
  //
  void SetMinVtxContributors(Int_t n=5)     { fMinVtxContributors = n; }
  void SetUseVertex(Bool_t v=kTRUE)         { fUseVertex = v; }
  void SetUseVertexForZOnly(Bool_t v=kTRUE) { fUseVertexForZOnly = v; } // Use the vertex for SDD Z residuals only
  void SetRemovePileupWithSPD(Bool_t opt=kTRUE) { fRemovePileupWithSPD = opt; }
  void SetMinMaxMult(Double_t mn=0,Double_t mx=1e9) {fMinMult=mn; fMaxMult=mx;} 
  void SetCutDCA(double xy, double z) {fCutDCAXY = xy; fCutDCAZ = z;}

  void SetOCDBInfo(UInt_t runNb, const char *location) {
    fRunNb=runNb; 
    fOCDBLocation=location;
  }

  Bool_t   GetUseTPCMomentum()                    const {return fUseTPCMomentum;}
  Bool_t   AcceptTrack(const AliESDtrack * track, const AliESDVertex* vtx=0);
  Bool_t   AcceptVertex(const AliESDVertex * vtx, const AliESDVertex * vtxSPD);
  Bool_t   AcceptCentrality(const AliESDEvent *esd) const;
  void     CreateSPDHistos();
  void     CreateSDDHistos();
  void     CreateSSDHistos();

  void     FitAndFillSPD(Int_t iLayer, const AliTrackPointArray *array, Int_t npts, AliESDtrack * track);
  void     FitAndFillSDDrphi(const AliTrackPointArray *array, Int_t npts, AliESDtrack * track);
  void     FitAndFillSDDz(Int_t iLayer, const AliTrackPointArray *array, Int_t npts, AliESDtrack * track);
  void     FitAndFillSSD(Int_t iLayer, const AliTrackPointArray *array, Int_t npts, AliESDtrack * track);
  void     SetPtBinLimits(Int_t nBins, Double_t* xbins){
    fNPtBins=nBins;
    if(nBins>kMaxPtBins) fNPtBins=kMaxPtBins;
    for(Int_t iBin=0; iBin<=fNPtBins; iBin++) fPtBinLimits[iBin]=xbins[iBin];
  }
  void     LoadGeometryFromOCDB();
  AliTrackPointArray* PrepareTrack(const AliTrackPointArray* inp, const AliESDVertex* vtx=0);
  void                PrepareVertexConstraint(const AliESDVertex* vtx, AliTrackPoint &point);
  //
  void    CreateUserInfo();
  void    CopyUserInfo();
 private:
  AliAnalysisTaskITSAlignQA(const AliAnalysisTaskITSAlignQA &source);
  AliAnalysisTaskITSAlignQA& operator=(const AliAnalysisTaskITSAlignQA &source);
  
  enum {kNSPDmods = 240};
  enum {kNSDDmods = 260};
  enum {kNSSDmods = 1698};
  enum {kMaxPtBins = 12};
  enum {kVtxSensVID=14371};    // dummy VID for "vertex" point

  TList* fOutput;              //! Histos with residuals
  TH1F*  fHistNEvents;         //! histo with N of events  
  TH1F*  fHistPtAccept;        //! histo of pt distribution of accepted tracks 

  TH2F*  fHistSPDResidX[kNSPDmods];       //! histos of SPD residuals along Xloc vs. Pt
  TH2F*  fHistSPDResidZ[kNSPDmods];       //! histos of SPD residuals along Zloc vs. Pt
  TH2F*  fHistSDDResidX[kNSDDmods];       //! histos of SDD residuals along Xloc vs. Pt
  TH2F*  fHistSDDResidZ[kNSDDmods];       //! histos of SDD residuals along Zloc vs. Pt
  TH2F*  fHistSSDResidX[kNSSDmods];       //! histos of SSD residuals along Xloc vs. Pt
  TH2F*  fHistSSDResidZ[kNSSDmods];       //! histos of SSD residuals along Zloc vs. Pt

  TH2F*  fHistSDDResidXvsX[kNSDDmods];    //! histos of SDD residuals along Xloc vs. Xloc
  TH2F*  fHistSDDResidXvsZ[kNSDDmods];    //! histos of SDD residuals along Xloc vs. Zloc
  TH2F*  fHistSDDResidZvsX[kNSDDmods];    //! histos of SDD residuals along Zloc vs. Xloc
  TH2F*  fHistSDDResidZvsZ[kNSDDmods];    //! histos of SDD residuals along Zloc vs. Zloc
  TH2F*  fHistSDDdEdxvsDrTime[kNSDDmods]; //! histos of SDD dE/dx vs. drift time
  TH1F*  fHistSDDDrTimeAll[kNSDDmods];    //! histos of SDD drift time (all clusters)
  TH1F*  fHistSDDDrTimeExtra[kNSDDmods];  //! histos of SDD drift time (extra clusters)
  TH1F*  fHistSDDDrTimeAttac[kNSDDmods];  //! histos of SDD drift time (attached clusters)
  //
  // RS
  TProfile* fHProfSDDResidXvsXD[kNSDDmods][2]; // ! profile histos of SDD residuals along Xloc vs. Drift distance, each side separately
  TProfile* fHProfSDDDrTimevsXD[kNSDDmods][2]; // ! profile histos of SDD drift time vs. Drift distance, each side separately
  TProfile* fHProfSDDResidXvsZ[kNSDDmods][2];  // ! profile histos of SDD residuals along Xloc vs. Z (anode), each side separately
  TProfile* fHProfSDDDrTimevsZ[kNSDDmods][2];  // ! profile histos of SDD drift time vs. Z (anode), each side separately
  //
  Bool_t   fDoSPDResiduals;   // Flag to enable histos of SPD residuals
  Bool_t   fDoSDDResiduals;   // Flag to enable histos of SDD residuals
  Bool_t   fDoSSDResiduals;   // Flag to enable histos of SSD residuals
  Bool_t   fDoSDDdEdxCalib;   // Flag to enable histos for SDD dE/dx calibration
  Bool_t   fDoSDDVDriftCalib; // Flag to enable histos for SDD VDrift calibration
  Bool_t   fDoSDDDriftTime;   // Flag to enable histos for SDD Drift times
  Bool_t   fDoFillTPTree;     // Flag to enable tree with trackpoints
  Bool_t   fUseITSsaTracks;   // Flag for using standalone ITS tracks
  Bool_t   fLoadGeometry;     // Flag to control the loading of geometry from OCDB
  Bool_t   fUseVertex;        // Use the vertex as an extra point
  Bool_t   fUseVertexForZOnly; // Use the vertex for SDD Z residuals only
  Bool_t   fUseTPCMomentum;   // for the curv. constraint use TPC momentum rather than global
  Int_t    fMinVtxContributors; // min N contributors to accept vertex if fUseVertex is on
  Bool_t   fRemovePileupWithSPD; // Use/not use pileup rejection with SPD
  Int_t    fMinITSpts;        // Minimum number of ITS points per track
  Int_t    fMinTPCpts;        // Minimum number of TPC points per track
  Float_t  fMinPt;            // Minimum pt to accept tracks
  Int_t    fNPtBins;          // number of pt bins
  Double_t fMinMult;          // min centrality cut
  Double_t fMaxMult;          // max centrality cut
  Double_t fPtBinLimits[kMaxPtBins+1];  // limits of Pt bins
  Double_t fCutDCAXY;        // apply rough XY DCA cut in case of vtx constraint, in terms of standard deviations
  Double_t fCutDCAZ;         // apply rough Z  DCA cut in case of vtx constraint  in terms of standard deviations
  AliITSTPArrayFit* fFitter;  // Track Point fitter
  AliITSSumTP* fITSSumTP;     // !TracPoints summary objects
  TTree*   fTPTree;           // !output tree for trackpoints
  Int_t fRunNb;               // Run number
  TString fOCDBLocation;      // OCDB location
  ClassDef(AliAnalysisTaskITSAlignQA,6);
};


#endif


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