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),
93 // Default constructor
95 DefineInput(0, TChain::Class());
96 DefineOutput(1, TList::Class());
97 DefineOutput(2, AliSpectraAODEventCuts::Class());
98 DefineOutput(3, AliSpectraAODTrackCuts::Class());
102 //________________________________________________________________________
103 AliAnalysisTaskJetSpectraAOD::~AliAnalysisTaskJetSpectraAOD()
107 //________________________________________________________________________
108 //________________________________________________________________________
109 void AliAnalysisTaskJetSpectraAOD::UserCreateOutputObjects()
111 // create output objects
112 fOutput = new TList();
114 fOutput->SetName("chistpt");
116 fListJets = new TList;
118 if (!fTrackCuts) AliFatal("Track Cuts should be set in the steering macro");
119 if (!fEventCuts) AliFatal("Event Cuts should be set in the steering macro");
121 // binning common to all the THn
122 const Double_t ptBins[] = {-50.,-45.,-40.,-35.,-30.,-25.,-20.,-15.,-10.,-5.,0.,5.,10.,15.,20.,25.,30.,35.,40.,45.,50.,55.,60.,65.,70.,75.,80.,85.,90.,100.,150.,200.};
123 const Int_t nptBins=31;
125 //dimensions of THnSparse for jets
126 const Int_t nvarjet=5;
127 // pt_raw pt_corr cent Q vec pt_lead
128 Int_t binsHistRealJet[nvarjet] = { nptBins, nptBins, fnCentBins, fnQvecBins, fnptLeadBins};
129 Double_t xminHistRealJet[nvarjet] = { 0., 0., 0., 0., 0.};
130 Double_t xmaxHistRealJet[nvarjet] = { 200., 200., 100., fQvecUpperLim, 20.};
131 THnSparseF* NSparseHistJet = new THnSparseF("NSparseHistJet","NSparseHistJet",nvarjet,binsHistRealJet,xminHistRealJet,xmaxHistRealJet);
132 NSparseHistJet->GetAxis(0)->SetTitle("#it{p}_{T,raw}");
133 NSparseHistJet->GetAxis(0)->SetName("pT_raw");
134 NSparseHistJet->SetBinEdges(0,ptBins);
135 NSparseHistJet->GetAxis(1)->SetTitle("#it{p}_{T,corr}");
136 NSparseHistJet->GetAxis(1)->SetName("pT_corr");
137 NSparseHistJet->SetBinEdges(1,ptBins);
138 NSparseHistJet->GetAxis(2)->SetTitle(Form("%s cent",fEventCuts->GetCentralityMethod().Data()));
139 NSparseHistJet->GetAxis(2)->SetName(Form("%s_cent",fEventCuts->GetCentralityMethod().Data()));
140 NSparseHistJet->GetAxis(3)->SetTitle("Q vec");
141 NSparseHistJet->GetAxis(3)->SetName("Q_vec");
142 NSparseHistJet->GetAxis(4)->SetTitle("#it{p}_{T,lead}");
143 NSparseHistJet->GetAxis(4)->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, 100 };
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);
265 //cut on difference of the z-vertex
266 if (fZvertexDiff || (fZvertex>0)) {
268 Double_t vzPRI = +999;
269 Double_t vzSPD = -999;
271 const AliVVertex *pv = fAOD->GetPrimaryVertex(); // AOD
272 if (pv && pv->GetNContributors()>0) {
276 const AliVVertex *sv = fAOD->GetPrimaryVertexSPD();
277 if (sv && sv->GetNContributors()>0) {
281 Double_t dvertex = TMath::Abs(vzPRI-vzSPD);
283 if (fZvertexDiff && (dvertex>0.1)) {
284 if (fDebug) Printf("%s:%d ZvertexDiff Event selection: event REJECTED...",(char*)__FILE__,__LINE__);
286 if ((fZvertex>0) && (TMath::Abs(vzPRI)>fZvertex)) {
287 if (fDebug) Printf("%s:%d ZvertexDiff Event selection: event REJECTED...",(char*)__FILE__,__LINE__);
292 if(!fEventCuts->IsSelected(fAOD,fTrackCuts)){
293 if (fDebug) Printf("%s:%d ESE Event selection: event REJECTED...",(char*)__FILE__,__LINE__);
294 fHistEvtSelection->Fill(6);
296 PostData(2, fEventCuts);
297 PostData(3, fTrackCuts);
301 if (fDebug) Printf("%s:%d event ACCEPTED ...",(char*)__FILE__,__LINE__);
302 fHistEvtSelection->Fill(0.);
304 // -- end event selection --
307 Double_t Qvec=0.;//in case of MC we save space in the memory
309 if(fIsQvecCalibMode){
310 if(fVZEROside==0)Qvec=fEventCuts->GetqV0A();
311 else if (fVZEROside==1)Qvec=fEventCuts->GetqV0C();
313 else Qvec=fEventCuts->GetQvecPercentile(fVZEROside);
316 if(fIsQvecCut && (Qvec<fQvecMin || Qvec>fQvecMax) ) return;
318 Double_t Cent=fEventCuts->GetCent();
321 AliAODJetEventBackground* externalBackground = 0;
322 if(fAODJets && !externalBackground && fBackgroundBranch.Length()){
323 externalBackground = (AliAODJetEventBackground*)(fAODJets->FindListObject(fBackgroundBranch.Data()));
324 if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
328 if(externalBackground)rho = externalBackground->GetBackground(0); //default schema
329 if(rho==0) rho=-9999.; //rho value = 0 are non-physical -> removed from the distribution
332 TClonesArray *aodJets = dynamic_cast<TClonesArray*>(fAODJets->FindListObject(fJetBranchName.Data()));
334 AliError(Form("no jet branch \"%s\" found, in the AODs are:", fJetBranchName.Data()));
336 Printf("Input AOD >>>>");
342 Bool_t kDeltaPt = kFALSE;
343 if(fJetBranchName.Contains("RandomCone")){
344 // cout<<"RANDOM CONES BRANCH!"<<endl;
350 for (Int_t iJet = 0; iJet < aodJets->GetEntriesFast(); iJet++) {
351 AliAODJet *jet = dynamic_cast<AliAODJet*>((*aodJets)[iJet]);
352 if (jet) fListJets->Add(jet);
357 for(Int_t i=0; i<fListJets->GetEntries(); ++i){
358 AliAODJet* jet = (AliAODJet*)(fListJets->At(i));
360 if((jet->Eta()<fJetEtaMin)||(jet->Eta()>fJetEtaMax)) continue;
362 Double_t ptJet = jet->Pt();
364 Double_t areaJet = jet->EffectiveAreaCharged();
366 Double_t ptcorr = -999.;
367 if(kDeltaPt) ptcorr = ptJet - (rho*TMath::Pi()*fR*fR);
368 else ptcorr = ptJet-(rho*areaJet);
372 varJet[1]=(Double_t)ptcorr;
373 varJet[2]=(Double_t)Cent;
374 varJet[3]=(Double_t)Qvec;
377 AliVParticle *leadTrack = LeadingTrackFromJetRefs(jet);
378 if(fLeadPtMin>0 && leadTrack->Pt()<fLeadPtMin)continue;
380 varJet[4]=(Double_t)leadTrack->Pt();
384 ((THnSparseF*)fOutput->FindObject("NSparseHistJet"))->Fill(varJet);//jet loop
389 // for (Int_t iTracks = 0; iTracks < fAOD->GetNumberOfTracks(); iTracks++) { //FIXME loop on aod track... should be on jet tracks???
390 // AliAODTrack* track = fAOD->GetTrack(iTracks);
391 // // if(!(track->TestFilterBit(1024)))continue;
392 // if (!fTrackCuts->IsSelected(track,kTRUE)) continue;
394 // TH1F* h=(TH1F*)fOutput->FindObject("fHistTest");h->Fill(track->Pt());
396 // } // end loop on tracks
402 ((THnSparseF*)fOutput->FindObject("NSparseHistEv"))->Fill(varEv);//event loop
405 PostData(2, fEventCuts);
406 PostData(3, fTrackCuts);
407 //Printf("............. end of Exec");
411 //_________________________________________________________________
412 AliVParticle *AliAnalysisTaskJetSpectraAOD::LeadingTrackFromJetRefs(AliAODJet* jet){
414 TRefArray *refs = jet->GetRefTracks();
416 AliVParticle *leading = 0;
418 for(int i = 0;i<refs->GetEntriesFast();i++){
419 AliVParticle *tmp = dynamic_cast<AliVParticle*>(refs->At(i));
421 if(tmp->Pt()>fMaxPt){
429 //_________________________________________________________________
430 void AliAnalysisTaskJetSpectraAOD::Terminate(Option_t *)
436 void AliAnalysisTaskJetSpectraAOD::SetBranchNames(const TString &branch)
438 fJetBranchName = branch;
441 void AliAnalysisTaskJetSpectraAOD::SetRecBackgroundBranch(const TString &bckbranch)
443 fBackgroundBranch = bckbranch;