#include <TList.h>
#include <TChain.h>
#include <TObjArray.h>
#include <AliAnalysisManager.h>
#include <AliInputEventHandler.h>
#include <AliAnalysisUtils.h>
#include <AliAODTrack.h>
#include <AliAODEvent.h>
#include <AliJCard.h>
#include "AliJXtHistos.h"
#include "AliXtAnalysis.h"
ClassImp(AliXtAnalysis)
AliXtAnalysis::AliXtAnalysis()
: AliAnalysisTaskSE(),
fOutputList(0x0),
fAnaUtils(0x0),
fCard(0x0),
fHistDir(0x0),
fHistos(0x0),
fhEvents(0x0),
fChargedList(0x0),
fIsolatedChargedList(0x0),
fCentBin(-1),
fZBin(-1),
fZVert(999999.),
fevt(0),
fDebugMode(0)
{
}
AliXtAnalysis::AliXtAnalysis(const char *name, const char * cardname)
: AliAnalysisTaskSE(name),
fOutputList(0x0),
fAnaUtils(0x0),
fCard(0x0),
fHistDir(0x0),
fHistos(0x0),
fhEvents(0x0),
fChargedList(0x0),
fIsolatedChargedList(0x0),
fCentBin(-1),
fZBin(-1),
fZVert(999999.),
fevt(0),
fDebugMode(0)
{
fCard = new AliJCard(cardname);
cout << "debug: card created to address " << fCard << endl;
fCard->PrintOut();
fAnaUtils = new AliAnalysisUtils();
fAnaUtils->SetUseOutOfBunchPileUp( kTRUE );
fAnaUtils->SetUseSPDCutInMultBins( kTRUE);
DefineInput(0, TChain::Class());
DefineOutput(1, TList::Class());
DefineOutput(2, TDirectory::Class());
}
AliXtAnalysis::AliXtAnalysis(const AliXtAnalysis& a)
: AliAnalysisTaskSE(a.GetName()),
fOutputList(a.fOutputList),
fAnaUtils(a.fAnaUtils),
fCard(a.fCard),
fHistDir(a.fHistDir),
fHistos(a.fHistos),
fhEvents(a.fhEvents),
fChargedList(a.fChargedList),
fIsolatedChargedList(a.fIsolatedChargedList),
fCentBin(-1),
fZBin(-1),
fZVert(999999.),
fevt(0),
fDebugMode(0)
{
fhEvents = (TH1D*) a.fhEvents->Clone(a.fhEvents->GetName());
}
AliXtAnalysis& AliXtAnalysis::operator = (const AliXtAnalysis& ap){
this->~AliXtAnalysis();
new(this) AliXtAnalysis(ap);
return *this;
}
AliXtAnalysis::~AliXtAnalysis() {
delete fOutputList;
delete [] fAnaUtils;
delete [] fhEvents;
delete fHistos;
delete fCard;
delete fChargedList;
delete fIsolatedChargedList;
}
void AliXtAnalysis::UserCreateOutputObjects(){
cout<<"\n=============== CARD =============="<<endl;
fCard->PrintOut();
cout<<"===================================\n"<<endl;
fhEvents = new TH1D("hEvents","events passing cuts", 11, -0.5, 10.5 );
fhEvents->SetXTitle( "0 - all, 1 - pileup, 2 - kMB selected, 3 - has vertex, 4 - good vertex, 5 - MB + good vertex, 6 - MB + good vertex + centrality" );
fhEvents->Sumw2();
fOutputList = new TList();
fOutputList->SetOwner(kTRUE);
fOutputList->Add(fhEvents);
fChargedList = new TObjArray;
fChargedList->SetOwner(kTRUE);
fIsolatedChargedList = new TObjArray;
PostData(1, fOutputList);
bool orignalTH1AdddirectoryStatus=TH1::AddDirectoryStatus();
TH1::AddDirectory(kTRUE);
if( !orignalTH1AdddirectoryStatus ) cout<<"DEBUG : TH1::AddDirectory is turned on"<<endl;
fHistDir=gDirectory;
fHistos = new AliJXtHistos(fCard);
fHistos->CreateXtHistos();
PostData(2, fHistDir);
TH1::AddDirectory( orignalTH1AdddirectoryStatus );
cout<<"DEBUG : TH1::AddDirectory get orignal Value = "<<( orignalTH1AdddirectoryStatus?"True":"False" )<<endl;
fevt = 0;
}
void AliXtAnalysis::UserExec(Option_t *) {
fevt++;
if(fevt % 10000 == 0) cout << "Number of event scanned = "<< fevt << endl;
Int_t filterBit = AliAODTrack::kTrkGlobal;
AliVEvent *event = InputEvent();
if(!event) return;
if( !IsGoodEvent( event ) ) return;
fhEvents->Fill( 5 );
if(fDebugMode > 0) cout << "zvtx = " << fZVert << endl;
AliAODEvent* aodEvent = dynamic_cast<AliAODEvent*>(event);
if(!aodEvent) return;
double fcent;
if( fCard->Get("DataType") > 0.5 ){
AliCentrality *cent = event->GetCentrality();
if( ! cent ) return;
fcent = cent->GetCentralityPercentile("V0M");
fCentBin = fCard->GetBin(kCentrType, fcent);;
}else{
fcent = 0.0;
fCentBin = 0;
}
if(fCentBin<0) return;
fhEvents->Fill( 6 );
Int_t nt = aodEvent->GetNumberOfTracks();
fHistos->FillCentralityHistos(fcent, fCentBin);
fChargedList->Clear();
fIsolatedChargedList->Clear();
double sqrts = fCard->Get("Sqrts");
double isolMethod = fCard->Get("IsolationMethod");
double minIsolationPt = fCard->Get("MinimumIsolatedPt");
double isolationFraction = 99999.;
double isolationThreshold = 99999.;
if( isolMethod > 0.5 ){
isolationThreshold = fCard->Get("IsolationThreshold");
}else{
isolationFraction = fCard->Get("IsolationFraction");
}
double isolR = fCard->Get("IsolationRadius");
for(Int_t it = 0; it < nt; it++) {
AliAODTrack *track = dynamic_cast<AliAODTrack*>(aodEvent->GetTrack(it));
if( !track ) continue;
if( !track->TestFilterBit(filterBit) ) continue;
double eta = track->Eta();
if( !fCard->IsInEtaRange( eta ) ) continue;
AliAODTrack *acceptedTrack = new AliAODTrack( *track );
double pT = acceptedTrack->Pt();
double xT = 2.*pT/sqrts;
double phi = acceptedTrack->Phi();
double effCorr = 1.0;
fHistos->FillInclusiveHistograms(pT, xT, eta, phi, effCorr, fCentBin);
fChargedList->Add( acceptedTrack );
}
Int_t nAcc = fChargedList->GetEntriesFast();
double etaRange = fCard->Get("EtaRange");
for( Int_t it = 0; it < nAcc; it++ ){
AliAODTrack *track = (AliAODTrack*)fChargedList->At(it);
double eta = track->Eta();
if( abs(eta) > etaRange - isolR ) continue;
TLorentzVector lvTrack = TLorentzVector( track->Px(), track->Py(), track->Pz(), track->P() );
double pT = lvTrack.Pt();
if( pT < minIsolationPt ) continue;
if( isolMethod < 0.5 ) isolationThreshold = pT * isolationFraction;
double sum = 0.0;
for( Int_t ia = 0; ia < nAcc; ia++ ){
if( ia == it ) continue;
AliAODTrack *assocTrack = (AliAODTrack*)fChargedList->At(ia);
TLorentzVector lvAssoc = TLorentzVector( assocTrack->Px(), assocTrack->Py(), assocTrack->Pz(), assocTrack->P() );
if( lvTrack.DeltaR( lvAssoc ) < isolR ) sum += lvAssoc.Pt();
}
fHistos->FillInclusiveConeActivities(pT,sum);
if( sum < isolationThreshold ){
double xT = 2.*pT/sqrts;
if( fDebugMode > 0 ){
cout << "DEBUG: isolated particle found " << endl;
cout << "fCentBin = " << fCentBin << ", pT = " << pT << ", xT = " << xT << " and eta = " << eta << endl;
}
fHistos->FillIsolatedConeActivities(pT, sum);
double effCorr = 1.0;
fHistos->FillIsolatedHistograms(pT, xT, eta, track->Phi(), effCorr, fCentBin);
AliAODTrack *acceptedIsolatedTrack = new AliAODTrack( *track );
fIsolatedChargedList->Add( acceptedIsolatedTrack );
}
}
return;
}
void AliXtAnalysis::Terminate(Option_t *)
{
cout<<"Successfully finished"<<endl;
}
bool AliXtAnalysis::IsGoodEvent(AliVEvent *event) {
fhEvents->Fill( 0 );
if(fAnaUtils->IsPileUpEvent(event)) {
return kFALSE;
} else {
Bool_t triggeredEventMB = kFALSE;
fhEvents->Fill( 1 );
Bool_t triggerkMB = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & ( AliVEvent::kMB );
if( triggerkMB ){
triggeredEventMB = kTRUE;
fhEvents->Fill( 2 );
}
int ncontributors = 0;
Bool_t goodRecVertex = kFALSE;
const AliVVertex *vtx = event->GetPrimaryVertex();
if(vtx){
fhEvents->Fill( 3 );
fZVert = vtx->GetZ();
fHistos->FillRawVertexHisto(fZVert);
ncontributors = vtx->GetNContributors();
if(ncontributors > 0){
if(fCard->VertInZRange(fZVert)) {
goodRecVertex = kTRUE;
fhEvents->Fill( 4 );
fHistos->FillAcceptedVertexHisto(fZVert, fCentBin);
fZBin = fCard->GetBin(kZVertType, fZVert);
}
}
}
return triggerkMB && goodRecVertex;
}
}