1 /**************************************************************************
2 * Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
16 //-----------------------------------------------------------------
17 // AliAnalysisTaskJetSpectraAOD class
18 //-----------------------------------------------------------------
25 #include "THnSparse.h"
27 #include "AliAnalysisTask.h"
28 #include "AliAnalysisManager.h"
29 #include "AliVTrack.h"
30 #include "AliAODMCParticle.h"
31 #include "AliVParticle.h"
32 #include "AliAODEvent.h"
33 #include "AliAODTrack.h"
34 #include "AliAODInputHandler.h"
35 #include "AliAnalysisTaskJetSpectraAOD.h"
36 #include "AliAnalysisTaskESDfilter.h"
37 #include "AliAnalysisDataContainer.h"
38 #include "AliCentrality.h"
40 #include "AliVEvent.h"
42 #include <TMCProcess.h>
44 #include "AliSpectraAODTrackCuts.h"
45 #include "AliSpectraAODEventCuts.h"
48 #include "AliAODHandler.h"
49 #include "AliAODJetEventBackground.h"
50 #include "AliAODJet.h"
51 #include "AliAnalysisHelperJetTasks.h"
57 ClassImp(AliAnalysisTaskJetSpectraAOD)
59 //________________________________________________________________________
60 AliAnalysisTaskJetSpectraAOD::AliAnalysisTaskJetSpectraAOD(const char *name) : AliAnalysisTaskSE(name),
70 fBackgroundBranch(""),
71 fOfflineTrgMask(AliVEvent::kMB),
85 fHistEvtSelection(0x0),
90 // Default constructor
92 DefineInput(0, TChain::Class());
93 DefineOutput(1, TList::Class());
94 DefineOutput(2, AliSpectraAODEventCuts::Class());
95 DefineOutput(3, AliSpectraAODTrackCuts::Class());
99 //________________________________________________________________________
100 AliAnalysisTaskJetSpectraAOD::~AliAnalysisTaskJetSpectraAOD()
104 //________________________________________________________________________
105 //________________________________________________________________________
106 void AliAnalysisTaskJetSpectraAOD::UserCreateOutputObjects()
108 Printf("\n\n\n\n\n\n In CreateOutput Object:");
110 fOutput = new TList();
112 fOutput->SetName("chistpt");
114 fListJets = new TList;
116 if (!fTrackCuts) AliFatal("Track Cuts should be set in the steering macro");
117 if (!fEventCuts) AliFatal("Event Cuts should be set in the steering macro");
119 // binning common to all the THn
120 const Double_t ptBins[] = {0.15,5.,10.,15.,20.,25.,30.,35.,40.,50.,75.,100.,150.,200.};
121 const Int_t nptBins=13;
123 //dimensions of THnSparse for jets
124 const Int_t nvarjet=6;
125 // pt_raw pt_corr cent Q vec rho pt_lead
126 Int_t binsHistRealJet[nvarjet] = { nptBins, nptBins, fnCentBins, fnQvecBins, 40., fnptLeadBins};
127 Double_t xminHistRealJet[nvarjet] = { 0., 0., 0., 0., 0., 0.};
128 Double_t xmaxHistRealJet[nvarjet] = { 200., 200., 100., fQvecUpperLim, 200., 20.};
129 THnSparseF* NSparseHistJet = new THnSparseF("NSparseHistJet","NSparseHistJet",nvarjet,binsHistRealJet,xminHistRealJet,xmaxHistRealJet);
130 NSparseHistJet->GetAxis(0)->SetTitle("#it{p}_{T,raw}");
131 NSparseHistJet->GetAxis(0)->SetName("pT_raw");
132 NSparseHistJet->SetBinEdges(0,ptBins);
133 NSparseHistJet->GetAxis(1)->SetTitle("#it{p}_{T,corr}");
134 NSparseHistJet->GetAxis(1)->SetName("pT_corr");
135 NSparseHistJet->SetBinEdges(1,ptBins);
136 NSparseHistJet->GetAxis(2)->SetTitle(Form("%s cent",fEventCuts->GetCentralityMethod().Data()));
137 NSparseHistJet->GetAxis(2)->SetName(Form("%s_cent",fEventCuts->GetCentralityMethod().Data()));
138 NSparseHistJet->GetAxis(3)->SetTitle("Q vec");
139 NSparseHistJet->GetAxis(3)->SetName("Q_vec");
140 NSparseHistJet->GetAxis(4)->SetTitle("rho");
141 NSparseHistJet->GetAxis(4)->SetName("rho");
142 NSparseHistJet->GetAxis(5)->SetTitle("#it{p}_{T,lead}");
143 NSparseHistJet->GetAxis(5)->SetName("pT_lead");
144 fOutput->Add(NSparseHistJet);
146 //dimensions of THnSparse for the normalization
147 const Int_t nvarev=3;
149 Int_t binsHistRealEv[nvarev] = { fnCentBins, fnQvecBins, 40.};
150 Double_t xminHistRealEv[nvarev] = { 0., 0., 0.};
151 Double_t xmaxHistRealEv[nvarev] = { 100., fQvecUpperLim, 200.};
152 THnSparseF* NSparseHistEv = new THnSparseF("NSparseHistEv","NSparseHistEv",nvarev,binsHistRealEv,xminHistRealEv,xmaxHistRealEv);
153 NSparseHistEv->GetAxis(0)->SetTitle(Form("%s cent",fEventCuts->GetCentralityMethod().Data()));
154 NSparseHistEv->GetAxis(0)->SetName(Form("%s_cent",fEventCuts->GetCentralityMethod().Data()));
155 NSparseHistEv->GetAxis(1)->SetTitle("Q vec");
156 NSparseHistEv->GetAxis(1)->SetName("Q_vec");
157 NSparseHistEv->GetAxis(2)->SetTitle("rho");
158 NSparseHistEv->GetAxis(2)->SetName("rho");
159 fOutput->Add(NSparseHistEv);
161 // TH1F* fHistTest = new TH1F("fHistTest","fHistTest",nptBins-1,ptBins);
162 // fOutput->Add(fHistTest);
164 fHistEvtSelection = new TH1I("fHistEvtSelection", "event selection", 6, -0.5, 7.5);
165 fHistEvtSelection->GetXaxis()->SetBinLabel(1,"ACCEPTED");
166 fHistEvtSelection->GetXaxis()->SetBinLabel(2,"events IN");
167 fHistEvtSelection->GetXaxis()->SetBinLabel(3,"event selection (rejected)");
168 fHistEvtSelection->GetXaxis()->SetBinLabel(4,"centrality (rejected)");
169 fHistEvtSelection->GetXaxis()->SetBinLabel(5,"multiplicity (rejected)");
170 fHistEvtSelection->GetXaxis()->SetBinLabel(6,"ESE (rejected)");
171 fOutput->Add(fHistEvtSelection);
173 PostData(1, fOutput );
174 PostData(2, fEventCuts);
175 PostData(3, fTrackCuts);
179 //________________________________________________________________________
180 void AliAnalysisTaskJetSpectraAOD::UserExec(Option_t *)
183 // check for jet branches
184 if(!strlen(fJetBranchName.Data())){
185 AliError("Jet branch name not set.");
190 fAOD = dynamic_cast<AliAODEvent*>(fInputEvent);
192 AliWarning("ERROR: AliAODEvent not available \n");
196 if (strcmp(fAOD->ClassName(), "AliAODEvent"))
198 AliFatal("Not processing AODs");
201 TObject* outHandler = AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler();
202 if( outHandler && outHandler->InheritsFrom("AliAODHandler") ) {
203 fAODJets = ((AliAODHandler*)outHandler)->GetAOD();
206 /* -- event selection -- */
207 fHistEvtSelection->Fill(1); // number of events before event selection
209 //jet service task event selection.
210 Bool_t selected=kTRUE;
211 selected = AliAnalysisHelperJetTasks::Selected();
213 // no selection by the service task, we continue
215 PostData(2, fEventCuts);
216 PostData(3, fTrackCuts);
219 // physics selection: this is now redundant, all should appear as accepted after service task selection
220 AliInputEventHandler* inputHandler = (AliInputEventHandler*)
221 ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
222 //std::cout<<inputHandler->IsEventSelected()<<" "<<fOfflineTrgMask<<std::endl;
223 if(!(inputHandler->IsEventSelected() & fOfflineTrgMask)){
224 if(fDebug) Printf(" Trigger Selection: event REJECTED ... ");
225 fHistEvtSelection->Fill(2);
227 PostData(2, fEventCuts);
228 PostData(3, fTrackCuts);
232 AliAODVertex* primVtx = fAOD->GetPrimaryVertex();
233 Int_t nTracksPrim = primVtx->GetNContributors();
235 if (fDebug) Printf("%s:%d primary vertex selection: %d", (char*)__FILE__,__LINE__,nTracksPrim);
236 if(nTracksPrim < fMinNcontributors){
237 if (fDebug) Printf("%s:%d primary vertex selection: event REJECTED...",(char*)__FILE__,__LINE__);
238 fHistEvtSelection->Fill(3);
240 PostData(2, fEventCuts);
241 PostData(3, fTrackCuts);
245 TString primVtxName(primVtx->GetName());
247 if(primVtxName.CompareTo("TPCVertex",TString::kIgnoreCase) == 1){
248 if (fDebug) Printf("%s:%d primary vertex selection: TPC vertex, event REJECTED...",(char*)__FILE__,__LINE__);
249 fHistEvtSelection->Fill(4);
251 PostData(2, fEventCuts);
252 PostData(3, fTrackCuts);
256 if(fRejectPileup && AliAnalysisHelperJetTasks::IsPileUp()){
257 if (fDebug) Printf("%s:%d SPD pileup: event REJECTED...",(char*)__FILE__,__LINE__);
258 fHistEvtSelection->Fill(5);
260 PostData(2, fEventCuts);
261 PostData(3, fTrackCuts);
266 if(!fEventCuts->IsSelected(fAOD,fTrackCuts)){
267 if (fDebug) Printf("%s:%d ESE Event selection: event REJECTED...",(char*)__FILE__,__LINE__);
268 fHistEvtSelection->Fill(6);
270 PostData(2, fEventCuts);
271 PostData(3, fTrackCuts);
275 if (fDebug) Printf("%s:%d event ACCEPTED ...",(char*)__FILE__,__LINE__);
276 fHistEvtSelection->Fill(0.);
278 // -- end event selection --
281 Double_t Qvec=0.;//in case of MC we save space in the memory
283 if(fIsQvecCalibMode){
284 if(fVZEROside==0)Qvec=fEventCuts->GetqV0A();
285 else if (fVZEROside==1)Qvec=fEventCuts->GetqV0C();
287 else Qvec=fEventCuts->GetQvecPercentile(fVZEROside);
290 if(fIsQvecCut && (Qvec<fQvecMin || Qvec>fQvecMax) ) return;
292 Double_t Cent=fEventCuts->GetCent();
295 AliAODJetEventBackground* externalBackground = 0;
296 if(fAODJets && !externalBackground && fBackgroundBranch.Length()){
297 externalBackground = (AliAODJetEventBackground*)(fAODJets->FindListObject(fBackgroundBranch.Data()));
298 if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
302 if(externalBackground)rho = externalBackground->GetBackground(0); //default schema
305 TClonesArray *aodJets = dynamic_cast<TClonesArray*>(fAODJets->FindListObject(fJetBranchName.Data()));
307 AliError(Form("no jet branch \"%s\" found, in the AODs are:", fJetBranchName.Data()));
309 Printf("Input AOD >>>>");
316 for (Int_t iJet = 0; iJet < aodJets->GetEntriesFast(); iJet++) {
317 AliAODJet *jet = dynamic_cast<AliAODJet*>((*aodJets)[iJet]);
318 if (jet) fListJets->Add(jet);
323 for(Int_t i=0; i<fListJets->GetEntries(); ++i){
324 AliAODJet* jet = (AliAODJet*)(fListJets->At(i));
326 if((jet->Eta()<fJetEtaMin)||(jet->Eta()>fJetEtaMax)) continue;
328 Double_t ptJet = jet->Pt();
330 Double_t areaJet = jet->EffectiveAreaCharged();
332 Double_t ptcorr = ptJet-rho*areaJet;
336 varJet[1]=(Double_t)ptcorr;
337 varJet[2]=(Double_t)Cent;
338 varJet[3]=(Double_t)Qvec;
339 varJet[4]=(Double_t)rho;
341 AliVParticle *leadTrack = LeadingTrackFromJetRefs(jet);
342 if(fLeadPtMin>0 && leadTrack->Pt()<fLeadPtMin)continue;
344 varJet[5]=(Double_t)leadTrack->Pt();
346 ((THnSparseF*)fOutput->FindObject("NSparseHistJet"))->Fill(varJet);//jet loop
351 // for (Int_t iTracks = 0; iTracks < fAOD->GetNumberOfTracks(); iTracks++) { //FIXME loop on aod track... should be on jet tracks???
352 // AliAODTrack* track = fAOD->GetTrack(iTracks);
353 // // if(!(track->TestFilterBit(1024)))continue;
354 // if (!fTrackCuts->IsSelected(track,kTRUE)) continue;
356 // TH1F* h=(TH1F*)fOutput->FindObject("fHistTest");h->Fill(track->Pt());
358 // } // end loop on tracks
364 ((THnSparseF*)fOutput->FindObject("NSparseHistEv"))->Fill(varEv);//event loop
367 PostData(2, fEventCuts);
368 PostData(3, fTrackCuts);
369 //Printf("............. end of Exec");
373 //_________________________________________________________________
374 AliVParticle *AliAnalysisTaskJetSpectraAOD::LeadingTrackFromJetRefs(AliAODJet* jet){
376 TRefArray *refs = jet->GetRefTracks();
378 AliVParticle *leading = 0;
380 for(int i = 0;i<refs->GetEntriesFast();i++){
381 AliVParticle *tmp = dynamic_cast<AliVParticle*>(refs->At(i));
383 if(tmp->Pt()>fMaxPt){
391 //_________________________________________________________________
392 void AliAnalysisTaskJetSpectraAOD::Terminate(Option_t *)
395 printf("AliAnalysisTaskJetSpectraAOD: Terminate() \n");
399 void AliAnalysisTaskJetSpectraAOD::SetBranchNames(const TString &branch)
401 fJetBranchName = branch;
404 void AliAnalysisTaskJetSpectraAOD::SetRecBackgroundBranch(const TString &bckbranch)
406 fBackgroundBranch = bckbranch;