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.                  *
 **************************************************************************/

#include <TCanvas.h>
#include <TChain.h>
#include <TF1.h>
#include <TFile.h> 
#include <TH1F.h>
#include <TH2F.h>
#include <TLegend.h> 
#include <TROOT.h>
#include <TVector3.h> 

#include <AliESDEvent.h> 
#include <AliLog.h>
#include <AliPID.h>

#include <AliAnalysisTask.h>    //qa()
#include <AliAnalysisManager.h> //qa()
#include <TBenchmark.h>         //qa()
#include <TProof.h>             //qa()

class AliHMPIDQaEsd : public AliAnalysisTask {

public:
           AliHMPIDQaEsd() ;
  virtual ~AliHMPIDQaEsd() ;
   
  virtual void Exec(Option_t * opt = "") ;
  virtual void ConnectInputData(Option_t *);
  virtual void CreateOutputObjects();
  virtual void Terminate(Option_t * opt = "");

private:
  TTree   * fChain ;            //!pointer to the analyzed TTree or TChain
  AliESDEvent  * fESD ;              //! Declaration of leave types

  TObjArray * fOutputContainer; //output data container

  ClassDef(AliHMPIDQaEsd,0); // 
};



//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
AliHMPIDQaEsd::AliHMPIDQaEsd():AliAnalysisTask("HmpidQaTask",""), fChain(0), fESD(0)
{
// Constructor.
  DefineInput (0,TChain::Class());           // Input slot #0 works with an Ntuple  
  DefineOutput(0,TObjArray::Class()) ;   // Output slot #0 writes into a TH1 container
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
AliHMPIDQaEsd::~AliHMPIDQaEsd()
{
  // dtor
  fOutputContainer->Clear() ;   delete fOutputContainer ; 
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void AliHMPIDQaEsd::ConnectInputData(const Option_t*)
{
//Virtual from AliAnalysisTask invoked by AliAnalysisTask::CheckNotify() which in turn invoked by AliAnalysisDataContainer::SetData()
  fChain = dynamic_cast<TChain *>(GetInputData(0)) ;
  if (!fChain) {AliError(Form("Input 0 for %s not found\n", GetName())); return;}
  
  // One should first check if the branch address was taken by some other task
  char ** address = (char **)GetBranchAddress(0, "ESD");
  if (address) {
    fESD = (AliESDEvent*)(*address);
  } else {
    fESD = new AliESDEvent();
    fESD->ReadFromTree(fChain);                                                                   //clm: new ESD access works for local, need to test it for PROOF!
    //SetBranchAddress(0, "esdTree", &fESD);
    //fChain->SetBranchStatus("*", 1);
    //fChain->SetBranchStatus("fTracks.*", 1);
  }
}//ConnectInputData()
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void AliHMPIDQaEsd::CreateOutputObjects()
{  
 

  // create output container
  fOutputContainer = new TObjArray(9) ;  fOutputContainer->SetName(GetName()) ; 

  fOutputContainer->AddAt(new TH2F("CkovP" , "#theta_{c}, [rad];P, [GeV]"   , 150,   0,  7  ,100, 0, 1)  ,      0) ; 
  fOutputContainer->AddAt(new TH2F("SigP"  ,"#sigma_{#theta_c} [mrad];[GeV]", 150,   0,  7  ,100, 0, 1)  ,      1) ; 
  fOutputContainer->AddAt(new TH2F("MipXY" ,"mip position"                  , 260,   0,130  ,252, 0,126) ,      2) ; 
  fOutputContainer->AddAt(new TH2F("DifXY" ,"diff"                          , 200, -10, 10  ,200,-10,10) ,      3) ; 
  fOutputContainer->AddAt(new TH1F("PidE" ,"PID: e yellow #mu magenta"  ,100,0,1)                        ,      4) ; 
  fOutputContainer->AddAt(new TH1F("PidMu","pid of #mu"                 ,100,0,1)                        ,      5) ; 
  fOutputContainer->AddAt(new TH1F("PidPi","PID: #pi red K green p blue",100,0,1)                        ,      6) ; 
  fOutputContainer->AddAt(new TH1F("PidK" ,"pid of K"                   ,100,0,1)                        ,      7) ; 
  fOutputContainer->AddAt(new TH1F("PidP" ,"pid of p"                   ,100,0,1)                        ,      8) ; 
  //options for drawing

}//CreateOutputObjects()
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void AliHMPIDQaEsd::Exec(Option_t *) 
{
// Virtual from TTask. 
// Invoked by AliAnalysisManager::StartAnalysis()->AliAnalysisManager::ExecAnalysis()->TTask::ExecuteTask() in case of mgr->StartAnalysis("local")
// Invoked by AliAnalysisSelector::Process()->AliAnalysisManager::ExecAnalysis()->TTask::ExecuteTask() in case of mgr->StartAnalysis("local")
    
  fChain->GetReadEntry() ;
  
  if (!fESD) {
    AliError("fESD is not connected to the input!") ; 
    return ; 
  }
  
  for(Int_t iTrk = 0 ; iTrk < fESD->GetNumberOfTracks() ; iTrk++){
    AliESDtrack *pTrk = fESD->GetTrack(iTrk) ;

    ((TH2F*)fOutputContainer->At(0))->Fill( pTrk->GetP(), pTrk->GetHMPIDsignal() ) ; 
    ((TH2F*)fOutputContainer->At(1))->Fill( pTrk->GetP(), TMath::Sqrt(pTrk->GetHMPIDchi2()) ) ;
     
     Float_t xm,ym; Int_t q,np;  pTrk->GetHMPIDmip(xm,ym,q,np);                       //mip info
     ((TH2F*)fOutputContainer->At(2))->Fill(xm,ym);
     Float_t xRad,yRad,th,ph;        pTrk->GetHMPIDtrk(xRad,yRad,th,ph);              //track info at the middle of the radiator
     Float_t xPc = xRad+9.25*TMath::Tan(th)*TMath::Cos(ph); // temporar: linear extrapol (B=0!)
     Float_t yPc = yRad+9.25*TMath::Tan(th)*TMath::Sin(ph); // temporar:          "
     ((TH2F*)fOutputContainer->At(3))->Fill(xm-xPc,ym-yPc); //track info 
     
    Double_t pid[5] ;      pTrk->GetHMPIDpid(pid) ; 
    for(Int_t i = 0 ; i < 5 ; i++)       ((TH1F*)fOutputContainer->At(4+i))->Fill(pid[i]) ;
  }//tracks loop 
       
  PostData(0,fOutputContainer);
}//Exec()
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void AliHMPIDQaEsd::Terminate(Option_t *)
{
//Virual from Processing when the event loop is ended
  TObjArray *out=(TObjArray*)GetOutputData(0);
  
  TH2F *hAngP    = (TH2F*)out->At(0);
  TH2F *hErrP    = (TH2F*)out->At(1);
  TH2F *hMipXY   = (TH2F*)out->At(2);
  TH2F *hDifXY   = (TH2F*)out->At(3);
  TH1F *hProE    = (TH1F*)out->At(4);
  TH1F *hProMu   = (TH1F*)out->At(5);
  TH1F *hProPi   = (TH1F*)out->At(6);
  TH1F *hProK    = (TH1F*)out->At(7);
  TH1F *hProP    = (TH1F*)out->At(8);
  
  hProE ->SetLineColor(kYellow);
  hProMu->SetLineColor(kMagenta);
  hProPi->SetLineColor(kRed);
  hProK ->SetLineColor(kGreen);
  hProP ->SetLineColor(kBlue);
  
  Float_t n = 1.292 ; //mean freon ref idx 
  AliPID dummy ;      //just to initialize AliPID to get the correct particle masses
  TF1* funPi = new TF1("RiPiTheo", "acos(sqrt(x*x+[0]*[0])/(x*[1]))", 1.2, 7); funPi->SetLineWidth(1);   funPi->SetParameter(1,n) ; 

                                                funPi->SetLineColor(kRed);     funPi->SetParameter(0,AliPID::ParticleMass(AliPID::kPion));    
  TF1* funK=static_cast<TF1*>(funPi->Clone()) ; funK ->SetLineColor(kGreen) ;   funK->SetParameter(0,AliPID::ParticleMass(AliPID::kKaon)) ; 
  TF1* funP=static_cast<TF1*>(funPi->Clone()) ; funP ->SetLineColor(kBlue) ;    funP->SetParameter(0,AliPID::ParticleMass(AliPID::kProton)) ; 

  TCanvas * can = new TCanvas("HmpidCanvas","HMPID ESD Test"); can->SetFillColor(10) ;   can->SetHighLightColor(10) ;   can->Divide(3,2) ;

  can->cd(1);hAngP->Draw();funPi->Draw("same");funK->Draw("same");funP->Draw("same"); can->cd(2);hMipXY->Draw();  can->cd(3);hProE->Draw();hProMu->Draw("same");  
  can->cd(4);hErrP->Draw();                                                           can->cd(5);hDifXY->Draw();  can->cd(6);hProPi->Draw();hProK->Draw("same");hProP->Draw("same");
}//Terminate()
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void qa(Int_t mode=0)
{
  
  /*
  AliAODHandler* aodHandler   = new AliAODHandler();
    mgr->SetEventHandler(aodHandler);
  */
  
  gBenchmark->Start("HMPID QA");
  
  TChain* chain =new TChain("esdTree");  
  AliAnalysisManager *mgr=new AliAnalysisManager("FunnyName");                                                   //clm: 
  //AliAODHandler* aodHandler   = new AliAODHandler();
  //mgr->SetEventHandler(aodHandler);
    
  AliAnalysisTask *qa=new AliHMPIDQaEsd();
  qa->ConnectInput (0,mgr->CreateContainer("EsdChain",TChain::Class()   ,AliAnalysisManager::kInputContainer));
  qa->ConnectOutput(0,mgr->CreateContainer("HistLst",TObjArray::Class(),AliAnalysisManager::kOutputContainer));
    
  mgr->AddTask(qa);
  if(!mgr->InitAnalysis()) return;
  mgr->PrintStatus();
  
  switch(mode){
    case 0:   chain->Add("AliESDs.root");
              mgr->StartAnalysis("local",chain);  
              break;
              
    case 1:   if(TProof::Open("proof://hmpid@lxb6046.cern.ch")==0x0) return; 
              gProof->UploadPackage("ESD.par"); gProof->EnablePackage("ESD");
              gProof->UploadPackage("ANALYSIS.par"); gProof->EnablePackage("ANALYSIS");                
              mgr->StartAnalysis("proof",chain);  
              break;
              
    case 2:   mgr->StartAnalysis("grid" ,chain);  
              break;
  }
  gBenchmark->Show("HMPID QA");
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

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