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

//-----------------------------------------------------------------
//         AliAnalysisTaskContMC class
//-----------------------------------------------------------------

#include "TChain.h"
#include "TTree.h"
#include "TLegend.h"
#include "TH1F.h"
#include "TH2F.h"
#include "TH3F.h"
#include "TCanvas.h"
#include "AliAnalysisTask.h"
#include "AliAnalysisManager.h"
#include "AliVTrack.h"
#include "AliAODMCParticle.h"
#include "AliVParticle.h"
#include "AliAODEvent.h"
#include "AliAODInputHandler.h"
#include "AliAnalysisTaskContMC.h"
#include "AliAnalysisTaskESDfilter.h"
#include "AliAnalysisDataContainer.h"
#include "AliHelperPID.h"
#include "AliCentrality.h"
#include "TProof.h"
#include "AliPID.h"
#include "AliVEvent.h"
#include "AliPIDResponse.h"
#include "AliStack.h"
#include <TMCProcess.h>

#include <iostream>

using namespace std;

ClassImp(AliAnalysisTaskContMC) 

//________________________________________________________________________
AliAnalysisTaskContMC::AliAnalysisTaskContMC(const char *name) : AliAnalysisTaskSE(name), fAOD(0), fNSigmaPID(0), fIsMC(0), fOutput(0), fHistID(0)
{
  // Default constructor
  

  DefineInput(0, TChain::Class());
  //DefineOutput(1, AliHelperPID::Class());
  DefineOutput(1, TList::Class());
  
}
//________________________________________________________________________
//________________________________________________________________________
void AliAnalysisTaskContMC::UserCreateOutputObjects()
{
  Printf("\n\n\n\n\n\n In CreateOutput Object:");
  
  //create output objects
  Printf("NSigma: %.1f",fNSigmaPID->GetNSigmaCut());
  Printf("IsMC: %d",fNSigmaPID->GetisMC());
  fOutput = new TList();
  fOutput->SetOwner();
  fOutput->SetName("list");
  
  fHistID = new TH3F("fHistID","fHistID",6,-1.5,4.5,4,-1.5,2.5,38,0.2,4);
  fOutput->Add(fHistID);
  
  if(!fNSigmaPID)AliFatal("PID object should be set in the steering macro");
  fOutput->Add(fNSigmaPID);
  
  //PostData(1, fNSigmaPID  );
  PostData(1, fOutput  );
  
}

//________________________________________________________________________
void AliAnalysisTaskContMC::UserExec(Option_t *)
{
  const Int_t npart=4;
  const Int_t pdgcode[npart+2]={-1,211,321,2212,11,13};
  const Int_t partid[npart+2]={-1,0,1,2,3,4};
  // main event loop
  fAOD = dynamic_cast<AliAODEvent*>(fInputEvent);
  if (!fAOD) {
    AliWarning("ERROR: AliAODEvent not available \n");
    return;
  }
  
  if (strcmp(fAOD->ClassName(), "AliAODEvent"))
    {
      AliFatal("Not processing AODs");
    }
  //MC Loop
  TClonesArray *arrayMC = 0;
  Printf("fIsMC: %d",fIsMC);
  if (fIsMC)
    {
      arrayMC = (TClonesArray*) fAOD->GetList()->FindObject(AliAODMCParticle::StdBranchName());
      if (!arrayMC) {
	AliFatal("Error: MC particles branch not found!\n");
      }
    }
  Double_t centrality = 0;

  AliCentrality *centralityObj = ((AliVAODHeader*)fAOD->GetHeader())->GetCentralityP();
  if (centralityObj)
    {
      centrality = centralityObj->GetCentralityPercentileUnchecked("V0M");
      AliInfo(Form("Centrality is %f", centrality));
    }
  else
    {
      Printf("WARNING: Centrality object is 0");
      centrality = -1;
    }
  if (centrality < 0)
    return;
  

  //vertex selection
  Int_t nVertex = ((AliAODEvent*)fAOD)->GetNumberOfVertices();
  if( nVertex > 0 ) { 
    AliAODVertex* vertex = (AliAODVertex*)((AliAODEvent*)fAOD)->GetPrimaryVertex();
    //Int_t nTracksPrim = vertex->GetNContributors();
    Double_t zVertex = vertex->GetZ();
    //10 cm cut
    if(TMath::Abs(zVertex)>10) return;
    //AliInfo(Form(" Vertex in = %f with %d particles by  %s data ...",zVertex,nTracksPrim,vertex->GetName()));
    // Reject TPC only vertex
    TString name(vertex->GetName());
    if (name.CompareTo("PrimaryVertex") && name.CompareTo("SPDVertex"))return;
  }  

  //Int_t count=0;  
  //track loop
  for (Int_t iTracks = 0; iTracks < fAOD->GetNumberOfTracks(); iTracks++) {
    AliAODTrack* track = dynamic_cast<AliAODTrack*>(fAOD->GetTrack(iTracks));
    if(!track) AliFatal("Not a standard AOD");
    if(!(track->TestFilterBit(32)))continue;
    if (TMath::Abs(track->Eta()) > .8 || track->Pt() < .2) continue;
    
    Int_t pdg=-999;
    Int_t isph=-999;
    if (fIsMC && arrayMC) {
      AliAODMCParticle *partMC = (AliAODMCParticle*) arrayMC->At(TMath::Abs(track->GetLabel()));
      if (!partMC) { 
	AliError("Cannot get MC particle");
	continue; 
      }
      pdg=TMath::Abs(partMC->GetPdgCode());
      isph=partMC->IsPhysicalPrimary();
    }
    if(!isph)continue;
    //step 1, TOF Matching
    UInt_t status;
    status=track->GetStatus();
    if((status&AliVTrack::kTOFout)==0 || (status&AliVTrack::kTIME)==0)continue;
    
    //step 2, combined PID
    Int_t IDTPCTOF=fNSigmaPID->GetParticleSpecies(track,1);
    if(IDTPCTOF==999)IDTPCTOF=-1;
    Int_t IDMC=-1;
    for(Int_t ipart=0;ipart<npart+2;ipart++)if(TMath::Abs(pdg)==pdgcode[ipart])IDMC=partid[ipart];  
    fHistID->Fill(IDMC,IDTPCTOF,track->Pt());
  } // end loop on tracks
  
  PostData(1,fOutput);
  
}

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