ROOT logo
/**************************************************************************
 * Copyright(c) 1998-2009, 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.                  *
 **************************************************************************/

//////////////////////////////////////////////////////
// Basic QA task to monitor the observables related to
// flow and balance function analysis. It is intended
// for both pp and PbPb data.
//
// Mainteiners:
//   Carlos Perez (cperez@cern.ch)
//   Alis Rodriguez (alisrm@nikhef.nl)
//////////////////////////////////////////////////////

#include "TChain.h"
#include "TList.h"
#include "TH2D.h"

#include "AliAnalysisTaskSE.h"
#include "AliAnalysisManager.h"

#include "AliCentrality.h"

#include "AliESDEvent.h"
#include "AliESDInputHandler.h"
#include "AliESDVZERO.h"
#include "AliESDVertex.h"
#include "AliESDtrack.h"
#include "AliESDtrackCuts.h"

#include "AliGlobalFBFqa.h"

ClassImp(AliGlobalFBFqa)

// C O N S T R U C T O R =======================================================
AliGlobalFBFqa::AliGlobalFBFqa() :
  AliAnalysisTaskSE(), fDebugger(kFALSE), fOutputList(NULL), fEvents(NULL),
  fPhiRinVZERO(NULL), fPhiEtaTPC50(NULL), fPhiEtaITSSA(NULL), 
  fPsiCenVZERO(NULL), fPsiCenTPC50(NULL), fPsiCenITSSA(NULL) {
  // default constructor
  if(fDebugger) printf("AliGlobalFBFqa:: Default Constructor\n");
}
// C O N S T R U C T O R =======================================================
AliGlobalFBFqa::AliGlobalFBFqa(const char *name) :
  AliAnalysisTaskSE(name), fDebugger(kFALSE), fOutputList(NULL), fEvents(NULL),
  fPhiRinVZERO(NULL), fPhiEtaTPC50(NULL), fPhiEtaITSSA(NULL), 
  fPsiCenVZERO(NULL), fPsiCenTPC50(NULL), fPsiCenITSSA(NULL) {
  // named constructor
  if(fDebugger) printf("AliGlobalFBFqa:: Named Constructor\n");
  DefineInput( 0,TChain::Class());
  DefineOutput(1,TList::Class());
}
// D E S T R U C T O R =========================================================
AliGlobalFBFqa::~AliGlobalFBFqa() {
  // destructor
  if(fDebugger) printf("AliGlobalFBFqa:: Destructor\n");
  if(fOutputList) delete fOutputList;
}
// U S E R   C R E A T E   O U T P U T   O B J E C T S =========================
void AliGlobalFBFqa::UserCreateOutputObjects() {
  // user create output object
  if(fDebugger) printf("AliGlobalFBFqa:: UserCreateOutputObjects\n");
  fOutputList = new TList();
  fOutputList->SetOwner();
  // number of events
  TList *tQAEvents = new TList();
  tQAEvents->SetName("Events");
  tQAEvents->SetOwner();
    fEvents = new TH2D("Events","Events;TRK;V0M", 20,0,100, 20,0,100);
    tQAEvents->Add(fEvents);
  fOutputList->Add(tQAEvents);
  TList *tQAPhaseSpace = new TList();
  tQAPhaseSpace->SetOwner();
  tQAPhaseSpace->SetName("PhaseSpace");
    fPhiRinVZERO = new TH2D("PhiRinVZERO","PhiRinVZERO;#phi (rad);Ring Number",60,0,TMath::Pi(),8,0,8);
    tQAPhaseSpace->Add(fPhiRinVZERO);
    fPhiEtaTPC50 = new TH2D("PhiEtaTPC50","PhiEtaTPC50;#phi (rad);#eta",60,0,TMath::Pi(),16,-1.6,1.6);
    tQAPhaseSpace->Add(fPhiEtaTPC50);
    fPhiEtaITSSA = new TH2D("PhiEtaITSSA","PhiEtaITSSA;#phi (rad);#eta",60,0,TMath::Pi(),20,-2,2);
    tQAPhaseSpace->Add(fPhiEtaITSSA);
  fOutputList->Add(tQAPhaseSpace);
  TList *tQAEventPlane = new TList();
  tQAEventPlane->SetOwner();
  tQAEventPlane->SetName("EventPlane");
    fPsiCenVZERO = new TH2D("PsiCenVZERO","PsiCenVZERO;#phi (rad);Centrality TRK",60,0,TMath::Pi(),20,0,100);
    tQAEventPlane->Add(fPsiCenVZERO);
    fPsiCenTPC50 = new TH2D("PsiTPCCen50","PsiCenTPC50;#phi (rad);Centrality V0M",60,0,TMath::Pi(),20,0,100);
    tQAEventPlane->Add(fPsiCenTPC50);
    fPsiCenITSSA = new TH2D("PsiCenITSSA","PsiCenITSSA;#phi (rad);Centrality V0M",60,0,TMath::Pi(),20,0,100);
    tQAEventPlane->Add(fPsiCenITSSA);
  fOutputList->Add(tQAEventPlane);
  //
  PostData(1,fOutputList);
}
// U S E R   E X E C ===========================================================
void AliGlobalFBFqa::UserExec(Option_t *) {
  // user exec
  if(fDebugger) printf("AliGlobalFBFqa:: UserExec\n");
  AliESDEvent *myESD = dynamic_cast<AliESDEvent*>(InputEvent());
  if(!myESD) {
    if(fDebugger) printf("AliGlobalFBFqa:: UserExec ESDEvent not found\n");
    return;
  }
  AliESDVZERO *myVZero = myESD->GetVZEROData();
  if(!myVZero) {
    if(fDebugger) printf("AliGlobalFBFqa:: UserExec VZERO not found\n");
    return;
  }
  AliESDVertex *myVertex = (AliESDVertex*) myESD->GetPrimaryVertex();
  if(!myVertex) {
    if(fDebugger) printf("AliGlobalFBFqa:: UserExec Vertex not found\n");
    return;
  }
  if(myVertex->GetNContributors() < 2) {
    if(fDebugger) printf("AliGlobalFBFqa:: UserExec poor vertex\n");
    return;
  }
  Double_t ccTRK=-1, ccV0M=-1;
  AliCentrality *myCentrality = myESD->GetCentrality();
  if(myCentrality) {
    ccTRK = myCentrality->GetCentralityPercentileUnchecked("TRK");
    ccV0M = myCentrality->GetCentralityPercentileUnchecked("V0M");
  } else
    if(fDebugger) printf("AliGlobalFBFqa:: UserExec no centrality object\n");
  //============================================================================
  if(fDebugger) 
    printf("AliGlobalFBFqa:: UserExec cc says %.1f and %.1f\n", ccTRK,ccV0M);
  fEvents->Fill( ccTRK, ccV0M );
  Double_t dPhi, dEta;
  Double_t cosTPC=0, sinTPC=0;
  Double_t cosITS=0, sinITS=0;
  Double_t cosVZE=0, sinVZE=0;
  // Global tracks QA
  if( (ccV0M>5)&&(ccV0M<90) ) { // cutting out edges of multiplicity
    Int_t nTracks = myESD->GetNumberOfTracks();
    AliESDtrack *track;
    AliESDtrackCuts *myTPC=CutsTPC50Generic();
    AliESDtrackCuts *myITS=CutsITSSAGeneric();
    for(Int_t i=0; i!=nTracks; ++i) {
      track = (AliESDtrack*) myESD->GetTrack( i );
      dPhi = track->Phi();
      dEta = track->Eta();
      if( myTPC->IsSelected(track) ) { // TPC50
        cosTPC += TMath::Cos(2*dPhi);
        sinTPC += TMath::Sin(2*dPhi);
        fPhiEtaTPC50->Fill( dPhi, dEta );
      }
      if( myITS->IsSelected(track) ) { // ITSSA
        cosITS += TMath::Cos(2*dPhi);
        sinITS += TMath::Sin(2*dPhi);
        fPhiEtaITSSA->Fill( dPhi, dEta );
      }
    }
    double dPsiTPC = 0.5*TMath::ATan2( sinTPC, cosTPC ) + TMath::PiOver2();
    double dPsiITS = 0.5*TMath::ATan2( sinITS, cosITS ) + TMath::PiOver2();
    fPsiCenTPC50->Fill( dPsiTPC, ccV0M );
    fPsiCenITSSA->Fill( dPsiITS, ccV0M );
  }
  // VZERO QA
  if( (ccTRK>5)&&(ccTRK<90) ) { // cutting out edges of multiplicity
    for(int i=0;i!=64;++i) {
      dPhi = TMath::Pi()*(i%8)/4;
      dEta = i/8;
      cosVZE += myVZero->GetMultiplicity(i)*TMath::Cos(2*dPhi);
      sinVZE += myVZero->GetMultiplicity(i)*TMath::Sin(2*dPhi);
      fPhiRinVZERO->Fill( dPhi, dEta );
    }
    double dPsiVZE = 0.5*TMath::ATan2( sinVZE, cosVZE ) + TMath::PiOver2();
    fPsiCenVZERO->Fill( dPsiVZE, ccTRK );
  }
  PostData(1,fOutputList);
  return;
}

AliESDtrackCuts* AliGlobalFBFqa::CutsITSSAGeneric() {
  AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
  esdTrackCuts->SetRequireITSStandAlone(kTRUE);
  esdTrackCuts->SetRequireITSPureStandAlone(kFALSE);
  esdTrackCuts->SetRequireITSRefit(kTRUE); 
  esdTrackCuts->SetMinNClustersITS(4);
  esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
  esdTrackCuts->SetMaxChi2PerClusterITS(2.5);
  // 7*(0.0033+0.0045/pt^1.3)
  esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0231+0.0315/pt^1.3");
  esdTrackCuts->SetRequireITSPid(kTRUE);
  esdTrackCuts->SetMaxNOfMissingITSPoints(1);
  return esdTrackCuts;
}

AliESDtrackCuts* AliGlobalFBFqa::CutsTPC50Generic() {
  AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
  esdTrackCuts->SetMinNClustersTPC(50);
  esdTrackCuts->SetMaxChi2PerClusterTPC(4);
  esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
  esdTrackCuts->SetMaxDCAToVertexZ(3.2);
  esdTrackCuts->SetMaxDCAToVertexXY(2.4);
  esdTrackCuts->SetDCAToVertex2D(kTRUE);
  return esdTrackCuts;
}

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