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

//#####################################################
//#                                                   # 
//#             Class AliDielectron                   #
//#         Main Class for e+e- analysis              #
//#                                                   #
//#  by WooJin J. Park, GSI / W.J.Park@gsi.de         #
//#     Ionut C. Arsene, GSI / I.C.Arsene@gsi.de      #
//#     Magnus Mager, CERN / Magnus.Mager@cern.ch     #
//#     Jens Wiechula, Uni HD / Jens.Wiechula@cern.ch #
//#                                                   #
//#####################################################


#include <TNamed.h>
#include <TObjArray.h>
#include <THnBase.h>
#include <TSpline.h>

#include <AliAnalysisFilter.h>
#include <AliKFParticle.h>

#include "AliDielectronHistos.h"
#include "AliDielectronHF.h"
#include "AliDielectronCutQA.h"

class AliEventplane;
class AliVEvent;
class AliMCEvent;
class THashList;
class AliDielectronCF;
class AliDielectronDebugTree;
class AliDielectronTrackRotator;
class AliDielectronPair;
class AliDielectronSignalMC;
class AliDielectronMixingHandler;

//________________________________________________________________
class AliDielectron : public TNamed {

  friend class AliDielectronMixingHandler; //mixing as friend class

public:
  enum EPairType { kEv1PP=0, kEv1PM, kEv1MM,
      kEv1PEv2P, kEv1MEv2P, kEv2PP,
      kEv1PEv2M, kEv1MEv2M, kEv2PM,
      kEv2MM, kEv1PMRot };
  enum ELegType  { kEv1P, kEv1M, kEv2P, kEv2M };
  
  AliDielectron();
  AliDielectron(const char* name, const char* title);
  virtual ~AliDielectron();

  void Init();

  void Process(/*AliVEvent *ev1, */TObjArray *arr);
  Bool_t Process(AliVEvent *ev1, AliVEvent *ev2=0);

  const AliAnalysisFilter& GetEventFilter() const { return fEventFilter; }
  const AliAnalysisFilter& GetTrackFilter() const { return fTrackFilter; }
  const AliAnalysisFilter& GetPairFilter()  const { return fPairFilter;  }

  AliAnalysisFilter& GetEventFilter()       { return fEventFilter;       }
  AliAnalysisFilter& GetTrackFilter()       { return fTrackFilter;       }
  AliAnalysisFilter& GetPairFilter()        { return fPairFilter;        }
  AliAnalysisFilter& GetPairPreFilter()     { return fPairPreFilter;     }
  AliAnalysisFilter& GetPairPreFilterLegs() { return fPairPreFilterLegs; }
  AliAnalysisFilter& GetEventPlanePreFilter(){ return fEventPlanePreFilter; }
  AliAnalysisFilter& GetEventPlanePOIPreFilter(){ return fEventPlanePOIPreFilter; }

  void  SetMotherPdg( Int_t pdgMother ) { fPdgMother=pdgMother; }
  void  SetLegPdg(Int_t pdgLeg1, Int_t pdgLeg2) { fPdgLeg1=pdgLeg1; fPdgLeg2=pdgLeg2; }
  Int_t GetMotherPdg() const { return fPdgMother; }
  Int_t GetLeg1Pdg()   const { return fPdgLeg1;   }
  Int_t GetLeg2Pdg()   const { return fPdgLeg2;   }

  void SetCutQA(Bool_t qa=kTRUE) { fCutQA=qa; }
  void SetNoPairing(Bool_t noPairing=kTRUE) { fNoPairing=noPairing; }
  void SetProcessLS(Bool_t doLS=kTRUE) { fProcessLS=doLS; }
  void SetUseKF(Bool_t useKF=kTRUE) { fUseKF=useKF; }
  const TObjArray* GetTrackArray(Int_t i) const {return (i>=0&&i<4)?&fTracks[i]:0;}
  const TObjArray* GetPairArray(Int_t i)  const {return (i>=0&&i<11)?
      static_cast<TObjArray*>(fPairCandidates->UncheckedAt(i)):0;}

  TObjArray** GetPairArraysPointer() { return &fPairCandidates; }
  void SetPairArraysPointer( TObjArray *arr) { fPairCandidates=arr; }
  void SetHistogramArray(AliDielectronHF * const histoarray) { fHistoArray=histoarray; }
  const TObjArray * GetHistogramArray() const { return fHistoArray?fHistoArray->GetHistArray():0x0; }
  const TObjArray * GetQAHistArray() const { return fQAmonitor?fQAmonitor->GetQAHistArray():0x0; }

  void SetHistogramManager(AliDielectronHistos * const histos) { fHistos=histos; }
  AliDielectronHistos* GetHistoManager() const { return fHistos; }
  const THashList * GetHistogramList() const { return fHistos?fHistos->GetHistogramList():0x0; }

  Bool_t HasCandidates() const { return GetPairArray(1)?GetPairArray(1)->GetEntriesFast()>0:0; }
  Bool_t HasCandidatesLikeSign() const {
    return (GetPairArray(0)&&GetPairArray(2)) ? (GetPairArray(0)->GetEntriesFast()>0 || GetPairArray(2)->GetEntriesFast()>0) : 0;
  }
  
  Bool_t HasCandidatesTR() const {return GetPairArray(10)?GetPairArray(10)->GetEntriesFast()>0:0;} 
  void SetCFManagerPair(AliDielectronCF * const cf) { fCfManagerPair=cf; }
  AliDielectronCF* GetCFManagerPair() const { return fCfManagerPair; }

  void SetPreFilterEventPlane(Bool_t setValue=kTRUE){fPreFilterEventPlane=setValue;};
  void SetLikeSignSubEvents(Bool_t setValue=kTRUE){fLikeSignSubEvents=setValue;};
  void SetPreFilterUnlikeOnly(Bool_t setValue=kTRUE){fPreFilterUnlikeOnly=setValue;};
  void SetPreFilterAllSigns(Bool_t setValue=kTRUE){fPreFilterAllSigns=setValue;};

  void SetTrackRotator(AliDielectronTrackRotator * const rot) { fTrackRotator=rot; }
  AliDielectronTrackRotator* GetTrackRotator() const { return fTrackRotator; }

  void SetMixingHandler(AliDielectronMixingHandler *mix) { fMixing=mix; }
  AliDielectronMixingHandler* GetMixingHandler() const { return fMixing; }

  void SetHasMC(Bool_t hasMC) { fHasMC = hasMC; }
  Bool_t GetHasMC() const     { return fHasMC;  }

  void SetStoreRotatedPairs(Bool_t storeTR) {fStoreRotatedPairs = storeTR;}
  void SetDontClearArrays(Bool_t dontClearArrays=kTRUE) { fDontClearArrays=dontClearArrays; }
  Bool_t DontClearArrays() const { return fDontClearArrays; }

  void AddSignalMC(AliDielectronSignalMC* signal);  

  void SetDebugTree(AliDielectronDebugTree * const tree) { fDebugTree=tree; }

  const TObjArray* GetMCSignals() const { return fSignalsMC; }
  static const char* TrackClassName(Int_t i) { return (i>=0&&i<4)?fgkTrackClassNames[i]:""; }
  static const char* PairClassName(Int_t i)  { return (i>=0&&i<11)?fgkPairClassNames[i]:""; }

  void SetEstimatorFilename(const Char_t* filename) {fEstimatorFilename = filename;}
  void SetTRDcorrectionFilename(const Char_t* filename) {fTRDpidCorrectionFilename = filename;}
  void SetVZEROCalibrationFilename(const Char_t* filename) {fVZEROCalibrationFilename = filename;}
  void SetVZERORecenteringFilename(const Char_t* filename) {fVZERORecenteringFilename = filename;}
  void SetZDCRecenteringFilename(const Char_t* filename) {fZDCRecenteringFilename = filename;}
  void InitLegEffMap(TString filename)  { fLegEffMap=InitEffMap(filename)  ;}
  void InitPairEffMap(TString filename) { fPairEffMap=InitEffMap(filename) ;}

  void SetCentroidCorrFunction(TF1 *fun, UInt_t varx, UInt_t vary=0, UInt_t varz=0);
  void SetWidthCorrFunction(TF1 *fun, UInt_t varx, UInt_t vary=0, UInt_t varz=0);
  void SetCentroidCorrFunction(TH1 *fun, UInt_t varx, UInt_t vary=0, UInt_t varz=0);
  void SetWidthCorrFunction(TH1 *fun, UInt_t varx, UInt_t vary=0, UInt_t varz=0);

  void SaveDebugTree();
  Bool_t DoEventProcess() const { return fEventProcess; }
  void SetEventProcess(Bool_t setValue=kTRUE) { fEventProcess=setValue; }
  void  FillHistogramsFromPairArray(Bool_t pairInfoOnly=kFALSE);

private:

  Bool_t fCutQA;                    // monitor cuts
  AliDielectronCutQA *fQAmonitor;   // monitoring of cuts
  TH1 *fPostPIDCntrdCorr;   // post pid correction object for centroids
  TH1 *fPostPIDWdthCorr;    // post pid correction object for widths
  TObject *fLegEffMap;      // single electron efficiency map
  TObject *fPairEffMap;      // pair efficiency map
  AliAnalysisFilter fEventFilter;    // Event cuts
  AliAnalysisFilter fTrackFilter;    // leg cuts
  AliAnalysisFilter fPairPreFilter;  // pair prefilter cuts
  AliAnalysisFilter fPairPreFilterLegs; // Leg filter after the pair prefilter cuts
  AliAnalysisFilter fPairFilter;     // pair cuts
  AliAnalysisFilter fEventPlanePreFilter;  // event plane prefilter cuts  
  AliAnalysisFilter fEventPlanePOIPreFilter;  // PoI cuts in the event plane prefilter  

  Int_t fPdgMother;     // pdg code of mother tracks
  Int_t fPdgLeg1;       // pdg code leg1
  Int_t fPdgLeg2;       // pdg code leg2

  TObjArray* fSignalsMC;      // array of AliDielectronSignalMC

  Bool_t fNoPairing;    // if to skip pairing, can be used for track QA only
  Bool_t fProcessLS; // do the like-sign pairing (default kTRUE)
  Bool_t fUseKF;    // if to skip pairing, can be used for track QA only

  AliDielectronHF *fHistoArray;   // Histogram framework
  AliDielectronHistos *fHistos;   // Histogram manager
                                  //  Streaming and merging should be handled
                                  //  by the analysis framework
  TBits *fUsedVars;               // used variables

  TObjArray fTracks[4];           //! Selected track candidates
                                  //  0: Event1, positive particles
                                  //  1: Event1, negative particles
                                  //  2: Event2, positive particles
                                  //  3: Event2, negative particles

  TObjArray *fPairCandidates;     //! Pair candidate arrays
                                  //TODO: better way to store it? TClonesArray?

  AliDielectronCF *fCfManagerPair;//Correction Framework Manager for the Pair
  AliDielectronTrackRotator *fTrackRotator; //Track rotator
  AliDielectronDebugTree *fDebugTree;  // Debug tree output
  AliDielectronMixingHandler *fMixing; // handler for event mixing

  Bool_t fPreFilterEventPlane;  //Filter for the Eventplane determination in TPC
  Bool_t fLikeSignSubEvents;    //Option for dividing into subevents, sub1 ++ sub2 --
  Bool_t fPreFilterUnlikeOnly;  //Apply PreFilter either in +- or to ++/--/+- individually
  Bool_t fPreFilterAllSigns;    //Apply PreFilter find in  ++/--/+- and remove from all
  Bool_t fHasMC;                //If we run with MC, at the moment only needed in AOD
  Bool_t fStoreRotatedPairs;    //It the rotated pairs should be stored in the pair array
  Bool_t fDontClearArrays;      //Don't clear the arrays at the end of the Process function, needed for external use of pair and tracks
  Bool_t fEventProcess;         //Process event (or pair array)

  void FillTrackArrays(AliVEvent * const ev, Int_t eventNr=0);
  void EventPlanePreFilter(Int_t arr1, Int_t arr2, TObjArray arrTracks1, TObjArray arrTracks2, const AliVEvent *ev);
  void PairPreFilter(Int_t arr1, Int_t arr2, TObjArray &arrTracks1, TObjArray &arrTracks2);
  void FillPairArrays(Int_t arr1, Int_t arr2);
  void FillPairArrayTR();
  
  Int_t GetPairIndex(Int_t arr1, Int_t arr2) const {return arr1>=arr2?arr1*(arr1+1)/2+arr2:arr2*(arr2+1)/2+arr1;}

  void InitPairCandidateArrays();
  void ClearArrays();
  
  TObjArray* PairArray(Int_t i);
  TObject* InitEffMap(TString filename);
  
  static const char* fgkTrackClassNames[4];   //Names for track arrays
  static const char* fgkPairClassNames[11];   //Names for pair arrays

  TString fEstimatorFilename;                // name for the pp multiplicity estimators filename
  TString fTRDpidCorrectionFilename;         // name for the file containing the single particle TRD pid corrections
  TString fVZEROCalibrationFilename;         // file containing VZERO channel-by-channel calibration
  TString fVZERORecenteringFilename;         // file containing VZERO Q-vector recentering averages
  TString fZDCRecenteringFilename;         // file containing ZDCQ-vector recentering averages

  void ProcessMC(AliVEvent *ev1);
  
  void  FillHistograms(const AliVEvent *ev, Bool_t pairInfoOnly=kFALSE);
  void  FillMCHistograms(const AliVEvent *ev);
  void  FillMCHistograms(Int_t label1, Int_t label2, Int_t nSignal);
  void  FillHistogramsMC(const AliMCEvent *ev,  AliVEvent *ev1);
  void  FillHistogramsPair(AliDielectronPair *pair,Bool_t fromPreFilter=kFALSE);
  void  FillHistogramsTracks(TObjArray **tracks);

  void  FillDebugTree();

  AliDielectron(const AliDielectron &c);
  AliDielectron &operator=(const AliDielectron &c);
  
  ClassDef(AliDielectron,12);
};

inline void AliDielectron::InitPairCandidateArrays()
{
  //
  // initialise all pair candidate arrays
  //
  fPairCandidates->SetOwner();
  for (Int_t i=0;i<11;++i){
    TObjArray *arr=new TObjArray;
    fPairCandidates->AddAt(arr,i);
    arr->SetOwner();
  }
}

inline TObjArray* AliDielectron::PairArray(Int_t i)
{
  //
  // for internal use only: unchecked return of track array for fast access
  //
  return static_cast<TObjArray*>(fPairCandidates->UncheckedAt(i));
}

inline void AliDielectron::ClearArrays()
{
  //
  // Reset the Arrays
  //
  for (Int_t i=0;i<4;++i){
    fTracks[i].Clear();
  }
  for (Int_t i=0;i<11;++i){
    if (PairArray(i)) PairArray(i)->Delete();
  }
}

#endif
 AliDielectron.h:1
 AliDielectron.h:2
 AliDielectron.h:3
 AliDielectron.h:4
 AliDielectron.h:5
 AliDielectron.h:6
 AliDielectron.h:7
 AliDielectron.h:8
 AliDielectron.h:9
 AliDielectron.h:10
 AliDielectron.h:11
 AliDielectron.h:12
 AliDielectron.h:13
 AliDielectron.h:14
 AliDielectron.h:15
 AliDielectron.h:16
 AliDielectron.h:17
 AliDielectron.h:18
 AliDielectron.h:19
 AliDielectron.h:20
 AliDielectron.h:21
 AliDielectron.h:22
 AliDielectron.h:23
 AliDielectron.h:24
 AliDielectron.h:25
 AliDielectron.h:26
 AliDielectron.h:27
 AliDielectron.h:28
 AliDielectron.h:29
 AliDielectron.h:30
 AliDielectron.h:31
 AliDielectron.h:32
 AliDielectron.h:33
 AliDielectron.h:34
 AliDielectron.h:35
 AliDielectron.h:36
 AliDielectron.h:37
 AliDielectron.h:38
 AliDielectron.h:39
 AliDielectron.h:40
 AliDielectron.h:41
 AliDielectron.h:42
 AliDielectron.h:43
 AliDielectron.h:44
 AliDielectron.h:45
 AliDielectron.h:46
 AliDielectron.h:47
 AliDielectron.h:48
 AliDielectron.h:49
 AliDielectron.h:50
 AliDielectron.h:51
 AliDielectron.h:52
 AliDielectron.h:53
 AliDielectron.h:54
 AliDielectron.h:55
 AliDielectron.h:56
 AliDielectron.h:57
 AliDielectron.h:58
 AliDielectron.h:59
 AliDielectron.h:60
 AliDielectron.h:61
 AliDielectron.h:62
 AliDielectron.h:63
 AliDielectron.h:64
 AliDielectron.h:65
 AliDielectron.h:66
 AliDielectron.h:67
 AliDielectron.h:68
 AliDielectron.h:69
 AliDielectron.h:70
 AliDielectron.h:71
 AliDielectron.h:72
 AliDielectron.h:73
 AliDielectron.h:74
 AliDielectron.h:75
 AliDielectron.h:76
 AliDielectron.h:77
 AliDielectron.h:78
 AliDielectron.h:79
 AliDielectron.h:80
 AliDielectron.h:81
 AliDielectron.h:82
 AliDielectron.h:83
 AliDielectron.h:84
 AliDielectron.h:85
 AliDielectron.h:86
 AliDielectron.h:87
 AliDielectron.h:88
 AliDielectron.h:89
 AliDielectron.h:90
 AliDielectron.h:91
 AliDielectron.h:92
 AliDielectron.h:93
 AliDielectron.h:94
 AliDielectron.h:95
 AliDielectron.h:96
 AliDielectron.h:97
 AliDielectron.h:98
 AliDielectron.h:99
 AliDielectron.h:100
 AliDielectron.h:101
 AliDielectron.h:102
 AliDielectron.h:103
 AliDielectron.h:104
 AliDielectron.h:105
 AliDielectron.h:106
 AliDielectron.h:107
 AliDielectron.h:108
 AliDielectron.h:109
 AliDielectron.h:110
 AliDielectron.h:111
 AliDielectron.h:112
 AliDielectron.h:113
 AliDielectron.h:114
 AliDielectron.h:115
 AliDielectron.h:116
 AliDielectron.h:117
 AliDielectron.h:118
 AliDielectron.h:119
 AliDielectron.h:120
 AliDielectron.h:121
 AliDielectron.h:122
 AliDielectron.h:123
 AliDielectron.h:124
 AliDielectron.h:125
 AliDielectron.h:126
 AliDielectron.h:127
 AliDielectron.h:128
 AliDielectron.h:129
 AliDielectron.h:130
 AliDielectron.h:131
 AliDielectron.h:132
 AliDielectron.h:133
 AliDielectron.h:134
 AliDielectron.h:135
 AliDielectron.h:136
 AliDielectron.h:137
 AliDielectron.h:138
 AliDielectron.h:139
 AliDielectron.h:140
 AliDielectron.h:141
 AliDielectron.h:142
 AliDielectron.h:143
 AliDielectron.h:144
 AliDielectron.h:145
 AliDielectron.h:146
 AliDielectron.h:147
 AliDielectron.h:148
 AliDielectron.h:149
 AliDielectron.h:150
 AliDielectron.h:151
 AliDielectron.h:152
 AliDielectron.h:153
 AliDielectron.h:154
 AliDielectron.h:155
 AliDielectron.h:156
 AliDielectron.h:157
 AliDielectron.h:158
 AliDielectron.h:159
 AliDielectron.h:160
 AliDielectron.h:161
 AliDielectron.h:162
 AliDielectron.h:163
 AliDielectron.h:164
 AliDielectron.h:165
 AliDielectron.h:166
 AliDielectron.h:167
 AliDielectron.h:168
 AliDielectron.h:169
 AliDielectron.h:170
 AliDielectron.h:171
 AliDielectron.h:172
 AliDielectron.h:173
 AliDielectron.h:174
 AliDielectron.h:175
 AliDielectron.h:176
 AliDielectron.h:177
 AliDielectron.h:178
 AliDielectron.h:179
 AliDielectron.h:180
 AliDielectron.h:181
 AliDielectron.h:182
 AliDielectron.h:183
 AliDielectron.h:184
 AliDielectron.h:185
 AliDielectron.h:186
 AliDielectron.h:187
 AliDielectron.h:188
 AliDielectron.h:189
 AliDielectron.h:190
 AliDielectron.h:191
 AliDielectron.h:192
 AliDielectron.h:193
 AliDielectron.h:194
 AliDielectron.h:195
 AliDielectron.h:196
 AliDielectron.h:197
 AliDielectron.h:198
 AliDielectron.h:199
 AliDielectron.h:200
 AliDielectron.h:201
 AliDielectron.h:202
 AliDielectron.h:203
 AliDielectron.h:204
 AliDielectron.h:205
 AliDielectron.h:206
 AliDielectron.h:207
 AliDielectron.h:208
 AliDielectron.h:209
 AliDielectron.h:210
 AliDielectron.h:211
 AliDielectron.h:212
 AliDielectron.h:213
 AliDielectron.h:214
 AliDielectron.h:215
 AliDielectron.h:216
 AliDielectron.h:217
 AliDielectron.h:218
 AliDielectron.h:219
 AliDielectron.h:220
 AliDielectron.h:221
 AliDielectron.h:222
 AliDielectron.h:223
 AliDielectron.h:224
 AliDielectron.h:225
 AliDielectron.h:226
 AliDielectron.h:227
 AliDielectron.h:228
 AliDielectron.h:229
 AliDielectron.h:230
 AliDielectron.h:231
 AliDielectron.h:232
 AliDielectron.h:233
 AliDielectron.h:234
 AliDielectron.h:235
 AliDielectron.h:236
 AliDielectron.h:237
 AliDielectron.h:238
 AliDielectron.h:239
 AliDielectron.h:240
 AliDielectron.h:241
 AliDielectron.h:242
 AliDielectron.h:243
 AliDielectron.h:244
 AliDielectron.h:245
 AliDielectron.h:246
 AliDielectron.h:247
 AliDielectron.h:248
 AliDielectron.h:249
 AliDielectron.h:250
 AliDielectron.h:251
 AliDielectron.h:252
 AliDielectron.h:253
 AliDielectron.h:254
 AliDielectron.h:255
 AliDielectron.h:256
 AliDielectron.h:257
 AliDielectron.h:258
 AliDielectron.h:259
 AliDielectron.h:260
 AliDielectron.h:261
 AliDielectron.h:262
 AliDielectron.h:263
 AliDielectron.h:264
 AliDielectron.h:265
 AliDielectron.h:266
 AliDielectron.h:267
 AliDielectron.h:268
 AliDielectron.h:269
 AliDielectron.h:270
 AliDielectron.h:271
 AliDielectron.h:272
 AliDielectron.h:273
 AliDielectron.h:274
 AliDielectron.h:275
 AliDielectron.h:276
 AliDielectron.h:277
 AliDielectron.h:278
 AliDielectron.h:279
 AliDielectron.h:280
 AliDielectron.h:281