2 // **************************************
3 // Task used for the correction of determiantion of reconstructed jet spectra
4 // Compares input (gen) and output (rec) jets
5 // *******************************************
8 /**************************************************************************
9 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
11 * Author: The ALICE Off-line Project. *
12 * Contributors are mentioned in the code where appropriate. *
14 * Permission to use, copy, modify and distribute this software and its *
15 * documentation strictly for non-commercial purposes is hereby granted *
16 * without fee, provided that the above copyright notice appears in all *
17 * copies and that both the copyright notice and this permission notice *
18 * appear in the supporting documentation. The authors make no claims *
19 * about the suitability of this software for any purpose. It is *
20 * provided "as is" without express or implied warranty. *
21 **************************************************************************/
28 #include <TInterpreter.h>
37 #include <TLorentzVector.h>
39 #include <TClonesArray.h>
40 #include "TDatabasePDG.h"
42 #include "AliAnalysisTaskJetServices.h"
43 #include "AliCentrality.h"
44 #include "AliAnalysisDataContainer.h"
45 #include "AliAnalysisDataSlot.h"
46 #include "AliAnalysisManager.h"
47 #include "AliJetFinder.h"
48 #include "AliJetHeader.h"
49 #include "AliJetReader.h"
50 #include "AliJetReaderHeader.h"
51 #include "AliUA1JetHeaderV1.h"
52 #include "AliESDEvent.h"
53 #include "AliAODEvent.h"
54 #include "AliAODHandler.h"
55 #include "AliAODTrack.h"
56 #include "AliAODJet.h"
57 #include "AliAODMCParticle.h"
58 #include "AliMCEventHandler.h"
59 #include "AliMCEvent.h"
61 #include "AliGenPythiaEventHeader.h"
62 #include "AliJetKineReaderHeader.h"
63 #include "AliGenCocktailEventHeader.h"
64 #include "AliInputEventHandler.h"
65 #include "AliPhysicsSelection.h"
66 #include "AliTriggerAnalysis.h"
68 #include "AliAnalysisHelperJetTasks.h"
70 ClassImp(AliAnalysisTaskJetServices)
72 AliAODHeader* AliAnalysisTaskJetServices::fgAODHeader = NULL;
73 TClonesArray* AliAnalysisTaskJetServices::fgAODVertices = NULL;
75 AliAnalysisTaskJetServices::AliAnalysisTaskJetServices():
78 fUsePhysicsSelection(kFALSE),
80 fFilterAODCollisions(kFALSE),
81 fPhysicsSelectionFlag(AliVEvent::kMB),
86 fCollisionType(kPbPb),
95 fMaxCosmicAngle(0.01),
97 fTrackRecEtaWindow(0.9),
105 fh1PtHardTrials(0x0),
106 fh1SelectionInfoESD(0x0),
107 fh1EventCutInfoESD(0),
111 fh2TriggerCount(0x0),
112 fh2ESDTriggerCount(0x0),
114 fh2ESDTriggerVtx(0x0),
115 fh2ESDTriggerRun(0x0),
117 fh1NCosmicsPerEvent(0x0),
119 fh2RPCentrality(0x0),
122 fh2RPCosDeltaRP(0x0),
125 fTriggerAnalysis(0x0),
128 fRunRange[0] = fRunRange[1] = 0;
129 fFlatA[0] = fFlatA[1] = 0;
130 fFlatB[0] = fFlatB[1] = 0;
131 fDeltaQxy[0] = fDeltaQxy[1] = 0;
135 AliAnalysisTaskJetServices::AliAnalysisTaskJetServices(const char* name):
136 AliAnalysisTaskSE(name),
137 fUseAODInput(kFALSE),
138 fUsePhysicsSelection(kFALSE),
140 fFilterAODCollisions(kFALSE),
141 fPhysicsSelectionFlag(AliVEvent::kMB),
142 fSelectionInfoESD(0),
145 fRPSubeventMethod(0),
146 fCollisionType(kPbPb),
155 fMaxCosmicAngle(0.01),
157 fTrackRecEtaWindow(0.9),
165 fh1PtHardTrials(0x0),
166 fh1SelectionInfoESD(0x0),
167 fh1EventCutInfoESD(0),
171 fh2TriggerCount(0x0),
172 fh2ESDTriggerCount(0x0),
174 fh2ESDTriggerVtx(0x0),
175 fh2ESDTriggerRun(0x0),
177 fh1NCosmicsPerEvent(0x0),
179 fh2RPCentrality(0x0),
182 fh2RPCosDeltaRP(0x0),
186 fTriggerAnalysis(0x0),
189 fRunRange[0] = fRunRange[1] = 0;
190 fFlatA[0] = fFlatA[1] = 0;
191 fFlatB[0] = fFlatB[1] = 0;
192 fDeltaQxy[0] = fDeltaQxy[1] = 0;
193 DefineOutput(1,TList::Class());
198 Bool_t AliAnalysisTaskJetServices::Notify()
201 // Implemented Notify() to read the cross sections
202 // and number of trials from pyxsec.root
205 TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
206 Float_t xsection = 0;
211 TFile *curfile = tree->GetCurrentFile();
213 Error("Notify","No current file");
216 if(!fh1Xsec||!fh1Trials){
217 Printf("%s%d No Histogram fh1Xsec",(char*)__FILE__,__LINE__);
220 AliAnalysisHelperJetTasks::PythiaInfoFromFile(curfile->GetName(),xsection,ftrials);
221 fh1Xsec->Fill("<#sigma>",xsection);
222 // construct a poor man average trials
223 Float_t nEntries = (Float_t)tree->GetTree()->GetEntries();
224 if(ftrials>=nEntries && nEntries>0.)fAvgTrials = ftrials/nEntries;
229 void AliAnalysisTaskJetServices::UserCreateOutputObjects()
233 // Create the output container
236 fRandomizer = new TRandom3(0);
237 if (fDebug > 1) printf("AnalysisTaskJetServices::UserCreateOutputObjects() \n");
240 if(!fHistList)fHistList = new TList();
241 fHistList->SetOwner();
242 PostData(1, fHistList); // post data in any case once
244 Bool_t oldStatus = TH1::AddDirectoryStatus();
245 TH1::AddDirectory(kFALSE);
246 fh1Xsec = new TProfile("fh1Xsec","xsec from pyxsec.root",1,0,1);
247 fh1Xsec->GetXaxis()->SetBinLabel(1,"<#sigma>");
248 fHistList->Add(fh1Xsec);
250 fh1Trials = new TH1F("fh1Trials","trials root file",1,0,1);
251 fh1Trials->GetXaxis()->SetBinLabel(1,"#sum{ntrials}");
252 fHistList->Add(fh1Trials);
254 const Int_t nBinPt = 100;
255 Double_t binLimitsPt[nBinPt+1];
256 for(Int_t iPt = 0;iPt <= nBinPt;iPt++){
258 binLimitsPt[iPt] = 0.0;
261 binLimitsPt[iPt] = binLimitsPt[iPt-1] + 2.5;
266 fh1CentralityESD = new TH1F("fh1CentralityESD","cent",103,-1,102);
267 fHistList->Add(fh1CentralityESD);
269 fh1Centrality = new TH1F("fh1Centrality","cent",103,-1,102);
270 fHistList->Add(fh1Centrality);
272 fh1RP = new TH1F("fh1RP","RP;#Psi",440, -1.*TMath::Pi(), 2.*TMath::Pi());
273 fHistList->Add(fh1RP);
275 fh2TriggerCount = new TH2F("fh2TriggerCount",";Trigger No.;constrained;Count",6,-0.5,5.5,kConstraints,-0.5,kConstraints-0.5);
276 fHistList->Add(fh2TriggerCount);
278 fh2ESDTriggerCount = new TH2F("fh2ESDTriggerCount",";Trigger No.;constrained;Count",6,-0.5,5.5,kConstraints,-0.5,kConstraints-0.5);
279 fHistList->Add(fh2ESDTriggerCount);
280 const Int_t nBins = 6*kConstraints;
281 fh2TriggerVtx = new TH2F("fh2TriggerVtx",";Constraint No. * (trig no+1);Vtx (cm);Count",nBins,-0.5,nBins-0.5,400,-20.,20.);
282 fHistList->Add(fh2TriggerVtx);
284 fh2ESDTriggerVtx = new TH2F("fh2ESDTriggerVtx",";Constraint No.* (trg no+1);Vtx (cm);Count",nBins,-0.5,nBins-0.5,400,-20.,20.);
285 fHistList->Add(fh2ESDTriggerVtx);
288 fh1PtHard = new TH1F("fh1PtHard","PYTHIA Pt hard;p_{T,hard}",nBinPt,binLimitsPt);
289 fHistList->Add(fh1PtHard);
290 fh1PtHardTrials = new TH1F("fh1PtHardTrials","PYTHIA Pt hard weight with trials;p_{T,hard}",nBinPt,binLimitsPt);
291 fHistList->Add(fh1PtHardTrials);
292 fh1SelectionInfoESD = new TH1F("fh1SelectionInfoESD","Bit Masks that satisfy the selection info",
293 AliAnalysisHelperJetTasks::kTotalSelections,0.5,AliAnalysisHelperJetTasks::kTotalSelections+0.5);
294 fHistList->Add(fh1SelectionInfoESD);
296 fh1EventCutInfoESD = new TH1F("fh1EventCutInfoESD","Bit Masks that for the events after each step of cuts",
297 kTotalEventCuts,0.5,kTotalEventCuts+0.5);
298 fHistList->Add(fh1EventCutInfoESD);
300 // 3 decisions, 0 trigger X, X + SPD vertex, X + SPD vertex in range
301 // 3 triggers BB BE/EB EE
303 fh2ESDTriggerRun = new TH2F("fh2ESDTriggerRun","Eventclass vs run number:run;trigger",(Int_t)(1+fRunRange[1]-fRunRange[0]),fRunRange[0]-0.5,fRunRange[1]+0.5,10,-0.5,9.5);
304 fHistList->Add(fh2ESDTriggerRun);
306 fh2VtxXY = new TH2F("fh2VtxXY","Beam Spot all INT triggered events;x (cm);y (cm)",160,-10,10,160,-10,10);
307 fHistList->Add(fh2VtxXY);
308 // =========== Switch on Sumw2 for all histos ===========
309 for (Int_t i=0; i<fHistList->GetEntries(); ++i) {
310 TH1 *h1 = dynamic_cast<TH1*>(fHistList->At(i));
315 THnSparse *hn = dynamic_cast<THnSparse*>(fHistList->At(i));
319 fh1NCosmicsPerEvent = new TH1F("fh1NCosmicsPerEvent","Number of cosmic candidates per event",10,0.,10.);
322 fh2RPSubevents = new TH2F("fh2RPSubevents" ,"Reaction Plane Angle" , 180, 0, TMath::Pi(), 180, 0, TMath::Pi());
323 fHistList->Add( fh2RPSubevents);
325 fh2RPCentrality = new TH2F("fh2RPCentrality" ,"Reaction Plane Angle" , 20, 0.,100., 180, 0, TMath::Pi());
326 fHistList->Add(fh2RPCentrality);
328 fh2RPDeltaRP = new TH2F("fh2DeltaRP" ,"Delta Reaction Plane Angle" , 100, -TMath::Pi()/2, TMath::Pi()/2,20,0.,100.0);
329 fHistList->Add(fh2RPDeltaRP);
331 fh2RPQxQy = new TH2F("fh2RPQxQy" ,"" , 100, -100,100,100,-100,100);
332 fHistList->Add(fh2RPQxQy);
334 fh2RPCosDeltaRP = new TH2F("fh2RPCosDeltaRP" ,"" , 20, 0.001,100.001,100,-1,1);
335 fHistList->Add(fh2RPCosDeltaRP);
337 fh3RPPhiTracks = new TH3F("fh3RPPhiTracks","Phi Tracks Pt Centrality", 10, 0.,100.,20,-5,5,180, 0, 2*TMath::Pi());
338 fHistList->Add(fh3RPPhiTracks);
341 fHistList->Add(fh1NCosmicsPerEvent),
344 TH1::AddDirectory(oldStatus);
346 // Add an AOD branch for replication
347 if(fNonStdFile.Length()){
348 if (fDebug > 1) AliInfo("Replicating header");
349 fgAODHeader = new AliAODHeader;
350 AddAODBranch("AliAODHeader",&fgAODHeader,fNonStdFile.Data());
351 if (fDebug > 1) AliInfo("Replicating primary vertices");
352 fgAODVertices = new TClonesArray("AliAODVertex",3);
353 fgAODVertices->SetName("vertices");
354 AddAODBranch("TClonesArray",&fgAODVertices,fNonStdFile.Data());
358 void AliAnalysisTaskJetServices::Init()
363 if (fDebug > 1) printf("AnalysisTaskJetServices::Init() \n");
367 void AliAnalysisTaskJetServices::UserExec(Option_t */*option*/)
371 // Execute analysis for current event
374 AliAODEvent *aod = 0;
375 AliESDEvent *esd = 0;
379 AliAnalysisHelperJetTasks::Selected(kTRUE,kFALSE); // set slection to false
380 AliAnalysisHelperJetTasks::EventClass(kTRUE,0);
381 AliAnalysisHelperJetTasks::ReactionPlane(kTRUE,0); // set slection to false
382 fSelectionInfoESD = 0; // reset
383 fEventCutInfoESD = 0; // reset
384 AliAnalysisHelperJetTasks::SelectInfo(kTRUE,fSelectionInfoESD); // set slection to false
387 static AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
392 aod = dynamic_cast<AliAODEvent*>(InputEvent());
394 Printf("%s:%d AODEvent not found in Input Manager %d",(char*)__FILE__,__LINE__,fUseAODInput);
400 // assume that the AOD is in the general output...
403 Printf("%s:%d AODEvent not found in the Output",(char*)__FILE__,__LINE__);
406 esd = dynamic_cast<AliESDEvent*>(InputEvent());
410 Printf("Vertices %d",aod->GetNumberOfVertices());
411 Printf("tracks %d",aod->GetNumberOfTracks());
412 Printf("jets %d",aod->GetNJets());
414 fSelectionInfoESD |= kNoEventCut;
415 fEventCutInfoESD |= kNoEventCut;
417 Bool_t esdVtxValid = false;
418 Bool_t esdVtxIn = false;
419 Bool_t aodVtxValid = false;
420 Bool_t aodVtxIn = false;
424 if(!fTriggerAnalysis){
425 fTriggerAnalysis = new AliTriggerAnalysis;
426 fTriggerAnalysis->SetAnalyzeMC(fMC);
427 fTriggerAnalysis->SetSPDGFOThreshhold(1);
429 // fTriggerAnalysis->FillTriggerClasses(esd);
430 Bool_t v0A = fTriggerAnalysis->IsOfflineTriggerFired(esd, AliTriggerAnalysis::kV0A);
431 Bool_t v0C = fTriggerAnalysis->IsOfflineTriggerFired(esd, AliTriggerAnalysis::kV0C);
432 Bool_t v0ABG = fTriggerAnalysis->IsOfflineTriggerFired(esd, AliTriggerAnalysis::kV0ABG);
433 Bool_t v0CBG = fTriggerAnalysis->IsOfflineTriggerFired(esd, AliTriggerAnalysis::kV0CBG);
434 Bool_t spdFO = fTriggerAnalysis->SPDFiredChips(esd, 0);;
435 if(v0A)fSelectionInfoESD |= AliAnalysisHelperJetTasks::kV0A;
436 if(v0C)fSelectionInfoESD |= AliAnalysisHelperJetTasks::kV0C;
437 if(!(v0ABG||v0CBG))fSelectionInfoESD |= AliAnalysisHelperJetTasks::kNoV0BG;
438 if(spdFO)fSelectionInfoESD |= AliAnalysisHelperJetTasks::kSPDFO;
441 // Apply additional constraints
442 Bool_t esdEventSelected = IsEventSelected(esd);
443 Bool_t esdEventPileUp = IsEventPileUp(esd);
444 Bool_t esdEventCosmic = IsEventCosmic(esd);
446 Bool_t aodEventSelected = IsEventSelected(aod);
448 Bool_t physicsSelection = ((fInputHandler->IsEventSelected())&fPhysicsSelectionFlag);
451 fEventCutInfoESD |= kPhysicsSelectionCut; // other alreay set via IsEventSelected
452 fh1EventCutInfoESD->Fill(fEventCutInfoESD);
454 if(esdEventSelected) fSelectionInfoESD |= AliAnalysisHelperJetTasks::kVertexIn;
455 if(esdEventPileUp) fSelectionInfoESD |= AliAnalysisHelperJetTasks::kIsPileUp;
456 if(esdEventCosmic) fSelectionInfoESD |= AliAnalysisHelperJetTasks::kIsCosmic;
457 if(physicsSelection) fSelectionInfoESD |= AliAnalysisHelperJetTasks::kPhysicsSelection;
460 // here we have all selection information, fill histogram
461 for(unsigned int i = 1;i<(UInt_t)fh1SelectionInfoESD->GetNbinsX();i++){
462 if((i&fSelectionInfoESD)==i)fh1SelectionInfoESD->Fill(i);
464 AliAnalysisHelperJetTasks::SelectInfo(kTRUE,fSelectionInfoESD);
466 if(esd&&aod&&fDebug){
467 if(esdEventSelected&&!aodEventSelected){
468 Printf("%s:%d Different Selection for ESD and AOD",(char*)__FILE__,__LINE__);
469 const AliESDVertex *vtxESD = esd->GetPrimaryVertex();
470 const AliAODVertex *vtxAOD = aod->GetPrimaryVertex();
471 Printf("ESD Vtx %s %s %d",vtxESD->GetName(),vtxESD->GetTitle(),vtxESD->GetNContributors());
473 Printf("AOD Vtx %s %s %d",vtxAOD->GetName(),vtxAOD->GetTitle(),vtxAOD->GetNContributors());
478 // loop over all possible triggers for esd
481 if(fCollisionType==kPbPb){
482 if(aod)cent = aod->GetHeader()->GetCentrality();
483 if(fDebug)Printf("%s:%d %3.3f",(char*)__FILE__,__LINE__,cent);
484 if(cent<0)cent = 101;
490 const AliESDVertex *vtxESD = esd->GetPrimaryVertex();
491 esdVtxValid = IsVertexValid(vtxESD);
492 esdVtxIn = IsVertexIn(vtxESD);
493 if(aodH&&physicsSelection&&fFilterAODCollisions&&aod){
494 if(fDebug)Printf("%s:%d Centrality %3.3f vtxin %d",(char*)__FILE__,__LINE__,cent,esdVtxIn);
495 if(cent<=80&&esdVtxIn){
496 aodH->SetFillAOD(kTRUE);
497 aodH->SetFillExtension(kTRUE);
502 Float_t zvtx = vtxESD->GetZ();
503 Int_t iCl = GetEventClass(esd);
504 AliAnalysisHelperJetTasks::EventClass(kTRUE,iCl);
505 Bool_t cand = physicsSelection;
507 if(fDebug)Printf("%s:%d %d %d %d Icl %d",(char*)__FILE__,__LINE__,esdVtxValid,esdVtxIn,cand,iCl);
508 fh2ESDTriggerCount->Fill(0.,kAllTriggered);
509 fh2ESDTriggerCount->Fill(iCl,kAllTriggered);
511 fh2ESDTriggerCount->Fill(0.,kSelectedALICE);
512 fh2ESDTriggerCount->Fill(iCl,kSelectedALICE);
513 fh2ESDTriggerVtx->Fill(kSelectedALICE*(iCl+1),zvtx);
515 // if(!fUsePhysicsSelection)cand = AliAnalysisHelperJetTasks::IsTriggerFired(esd,AliAnalysisHelperJetTasks::kMB1);
517 fh2ESDTriggerCount->Fill(0.,kTriggeredVertex);
518 fh2ESDTriggerCount->Fill(iCl,kTriggeredVertex);
519 fh2ESDTriggerVtx->Fill(iCl,zvtx);
521 fh2ESDTriggerCount->Fill(0.,kTriggeredVertexIn);
522 fh2ESDTriggerCount->Fill(iCl,kTriggeredVertexIn);
523 fh2ESDTriggerVtx->Fill(kTriggeredVertexIn*(iCl+1),zvtx);
526 fh2ESDTriggerCount->Fill(0.,kSelectedALICEVertexValid);
527 fh2ESDTriggerCount->Fill(iCl,kSelectedALICEVertexValid);
528 fh2ESDTriggerVtx->Fill(kSelectedALICEVertexValid*(iCl+1),zvtx);
532 if(cand&&esdVtxIn&&iCl<5){
533 fh2ESDTriggerCount->Fill(0.,kSelectedALICEVertexIn);
534 fh2ESDTriggerCount->Fill(iCl,kSelectedALICEVertexIn);
535 fh2ESDTriggerVtx->Fill(kSelectedALICEVertexIn*(iCl+1),zvtx);
536 fh2ESDTriggerVtx->Fill(kSelected*(iCl+1),zvtx);
537 fh2ESDTriggerCount->Fill(iCl,kSelected);
538 fh2ESDTriggerCount->Fill(0.,kSelected);
539 AliAnalysisHelperJetTasks::Selected(kTRUE,kTRUE);// select this event
540 if(esd->GetCentrality()){
541 Float_t tmpCent = 100;
542 tmpCent = esd->GetCentrality()->GetCentralityPercentile("V0M");
543 if(tmpCent<0)tmpCent = 101;
544 fh1CentralityESD->Fill(tmpCent);
552 const AliAODVertex *vtxAOD = aod->GetPrimaryVertex();
556 aodVtxValid = IsVertexValid(vtxAOD);
557 aodVtxIn = IsVertexIn(vtxAOD);
558 Float_t zvtx = vtxAOD->GetZ();
559 Int_t iCl = GetEventClass(aod);
560 AliAnalysisHelperJetTasks::EventClass(kTRUE,iCl);
561 Bool_t cand = aod->GetHeader()->GetOfflineTrigger()&fPhysicsSelectionFlag;
562 if(fDebug)Printf("%s:%d AOD selection %d %d",(char*)__FILE__,__LINE__,cand,aod->GetHeader()->GetOfflineTrigger());
563 fh2TriggerCount->Fill(0.,kAllTriggered);
564 fh2TriggerCount->Fill(iCl,kAllTriggered);
566 fh2TriggerCount->Fill(0.,kSelectedALICE);
567 fh2TriggerCount->Fill(iCl,kSelectedALICE);
568 fh2TriggerVtx->Fill(kSelectedALICE*(iCl+1),zvtx);
571 fh2TriggerCount->Fill(0.,kTriggeredVertex);
572 fh2TriggerCount->Fill(iCl,kTriggeredVertex);
573 fh2TriggerVtx->Fill(iCl,zvtx);
575 fh2TriggerCount->Fill(0.,kTriggeredVertexIn);
576 fh2TriggerCount->Fill(iCl,kTriggeredVertexIn);
577 fh2TriggerVtx->Fill(kTriggeredVertexIn*(iCl+1),zvtx);
580 fh2TriggerCount->Fill(0.,kSelectedALICEVertexValid);
581 fh2TriggerCount->Fill(iCl,kSelectedALICEVertexValid);
582 fh2TriggerVtx->Fill(kSelectedALICEVertexValid*(iCl+1),zvtx);
586 if(cand&&aodVtxIn&&iCl<5){
587 fh2TriggerCount->Fill(0.,kSelectedALICEVertexIn);
588 fh2TriggerCount->Fill(iCl,kSelectedALICEVertexIn);
589 fh2TriggerVtx->Fill(kSelectedALICEVertexIn*(iCl+1),zvtx);
590 fh2TriggerVtx->Fill(kSelected*(iCl+1),zvtx);
591 fh2TriggerCount->Fill(iCl,kSelected);
592 fh2TriggerCount->Fill(0.,kSelected);
593 fh1Centrality->Fill(cent);
594 AliAnalysisHelperJetTasks::Selected(kTRUE,kTRUE);// select this event
595 if(aodH&&cand&&fFilterAODCollisions&&!esd){
596 if(fCentrality<=80&&aodVtxIn){
597 aodH->SetFillAOD(kTRUE);
598 aodH->SetFillExtension(kTRUE);
603 GetListOfTracks(&recTracks);
604 // CalculateReactionPlaneAngle(&recTracks);
605 fRPAngle = aod->GetHeader()->GetEventplane();
606 fh1RP->Fill(fRPAngle);
607 fh2RPCentrality->Fill(fCentrality,fRPAngle);
609 AliAnalysisHelperJetTasks::ReactionPlane(kTRUE,fRPAngle); // set slection to false
610 if(fUseAODInput&&fCentrality<=80){
611 if(fFilterAODCollisions&&aod){
612 aodH->SetFillAOD(kTRUE);
618 if (fDebug > 1)printf(" AliAnalysisTaskJetServices: Analysing event # %5d\n", (Int_t) fEntry);
622 Double_t nTrials = 1; // Trials for MC trigger
624 fh1Trials->Fill("#sum{ntrials}",fAvgTrials);
625 AliMCEvent* mcEvent = MCEvent();
626 // AliStack *pStack = 0;
628 AliGenPythiaEventHeader* pythiaGenHeader = AliAnalysisHelperJetTasks::GetPythiaEventHeader(mcEvent);
630 nTrials = pythiaGenHeader->Trials();
631 ptHard = pythiaGenHeader->GetPtHard();
632 int iProcessType = pythiaGenHeader->ProcessType();
634 // 12 f+barf -> f+barf
639 if (fDebug > 10)Printf("%d iProcessType %d",__LINE__, iProcessType);
640 if(fDebug>20)AliAnalysisHelperJetTasks::PrintStack(mcEvent);
641 fh1PtHard->Fill(ptHard);
642 fh1PtHardTrials->Fill(ptHard,nTrials);
644 }// if pythia gen header
650 if(fNonStdFile.Length()&&aod){
652 *fgAODHeader = *(dynamic_cast<AliAODHeader*>(aod->GetHeader()));
653 Double_t q[2] = {fRPAngle,fRPAngle};
654 fgAODHeader->SetQTheta(q,2);
657 fgAODVertices->Delete();
658 TClonesArray &vertices = *fgAODVertices;
659 const AliAODVertex *vtxAOD = aod->GetPrimaryVertex();
660 // we only use some basic information,
666 vtxAOD->GetXYZ(pos); // position
667 vtxAOD->GetCovMatrix(covVtx); //covariance matrix
669 AliAODVertex * vtx = new(vertices[jVertices++])
670 AliAODVertex(pos, covVtx, vtxAOD->GetChi2perNDF(), NULL, -1, AliAODVertex::kPrimary);
671 vtx->SetName(vtxAOD->GetName());
672 vtx->SetTitle(vtxAOD->GetTitle());
673 TString vtitle = vtxAOD->GetTitle();
674 vtx->SetNContributors(vtxAOD->GetNContributors());
676 // Add SPD "main" vertex
677 const AliAODVertex *vtxS = aod->GetPrimaryVertexSPD();
678 vtxS->GetXYZ(pos); // position
679 vtxS->GetCovMatrix(covVtx); //covariance matrix
680 AliAODVertex * mVSPD = new(vertices[jVertices++])
681 AliAODVertex(pos, covVtx, vtxS->GetChi2perNDF(), NULL, -1, AliAODVertex::kMainSPD);
682 mVSPD->SetName(vtxS->GetName());
683 mVSPD->SetTitle(vtxS->GetTitle());
684 mVSPD->SetNContributors(vtxS->GetNContributors());
686 // Add tpc only vertex
688 const AliESDVertex *vtxT = esd->GetPrimaryVertexTPC();
689 vtxT->GetXYZ(pos); // position
690 vtxT->GetCovMatrix(covVtx); //covariance matrix
691 AliAODVertex * mVTPC = new(vertices[jVertices++])
692 AliAODVertex(pos, covVtx, vtxT->GetChi2toNDF(), NULL, -1, AliAODVertex::kMainTPC);
693 mVTPC->SetName(vtxT->GetName());
694 mVTPC->SetTitle(vtxT->GetTitle());
695 mVTPC->SetNContributors(vtxT->GetNContributors());
700 PostData(1, fHistList);
703 Bool_t AliAnalysisTaskJetServices::IsEventSelected(const AliESDEvent* esd){
704 if(!esd)return kFALSE;
705 const AliESDVertex *vtx = esd->GetPrimaryVertex();
706 return IsVertexIn(vtx); // vertex in calls vertex valid
709 AliAnalysisTaskJetServices::~AliAnalysisTaskJetServices(){
711 fgAODVertices->Delete();
712 delete fgAODVertices;
715 if(fgAODHeader)delete fgAODHeader;
719 Bool_t AliAnalysisTaskJetServices::IsEventSelected(const AliAODEvent* aod) const {
720 if(!aod)return kFALSE;
721 const AliAODVertex *vtx = aod->GetPrimaryVertex();
722 return IsVertexIn(vtx); // VertexIn calls VertexValid
725 Bool_t AliAnalysisTaskJetServices::IsVertexValid ( const AliESDVertex* vtx) {
727 // We can check the type of the vertex by its name and title
728 // if vertexer failed title is empty (default c'tor) and ncontributors is 0
730 // Tracks PrimaryVertex VertexerTracksNoConstraint
731 // Tracks PrimaryVertex VertexerTracksWithConstraint
732 // TPC TPCVertex VertexerTracksNoConstraint
733 // TPC TPCVertex VertexerTracksWithConstraint
734 // SPD SPDVertex vertexer: 3D
735 // SPD SPDVertex vertexer: Z
738 Printf("%s:%d No ESD vertex found",(char*)__FILE__,__LINE__);
741 Int_t nCont = vtx->GetNContributors();
743 fEventCutInfoESD |= kContributorsCut1;
745 fEventCutInfoESD |= kContributorsCut2;
747 fEventCutInfoESD |= kContributorsCut3;
752 if(nCont<3)return kFALSE;
754 // do not want tpc only primary vertex
755 TString vtxName(vtx->GetName());
756 if(vtxName.Contains("TPCVertex")){
757 fEventCutInfoESD |= kVertexTPC;
760 if(vtxName.Contains("SPDVertex"))fEventCutInfoESD |= kVertexSPD;
761 if(vtxName.Contains("PrimaryVertex"))fEventCutInfoESD |= kVertexGlobal;
764 TString vtxTitle(vtx->GetTitle());
765 if(vtxTitle.Contains("vertexer: Z")){
766 if(vtx->GetDispersion()>0.02)return kFALSE;
768 fEventCutInfoESD |= kSPDDispersionCut;
773 Bool_t AliAnalysisTaskJetServices::IsVertexValid ( const AliAODVertex* vtx) const {
775 // We can check the type of the vertex by its name and title
776 // if vertexer failed title is empty (default c'tor) and ncontributors is 0
778 // Tracks PrimaryVertex VertexerTracksNoConstraint
779 // TPC TPCVertex VertexerTracksNoConstraint
780 // SPD SPDVertex vertexer: 3D
781 // SPD SPDVertex vertexer: Z
784 Printf("%s:%d No AOD vertex found",(char*)__FILE__,__LINE__);
790 Printf(" n contrib %d",vtx->GetNContributors());
794 // if(vtx->GetNContributors()<3)return kFALSE;
795 // do not want tpc only primary vertex
796 TString vtxName(vtx->GetName());
797 if(vtxName.Contains("TPCVertex"))return kFALSE;
799 // no dispersion yet...
801 TString vtxTitle(vtx->GetTitle());
802 if(vtxTitle.Contains("vertexer: Z")){
803 if(vtx->GetDispersion()>0.02)return kFALSE;
810 Bool_t AliAnalysisTaskJetServices::IsVertexIn (const AliESDVertex* vtx) {
812 if(!IsVertexValid(vtx))return kFALSE;
814 Float_t zvtx = vtx->GetZ();
815 Float_t yvtx = vtx->GetY();
816 Float_t xvtx = vtx->GetX();
824 if(TMath::Abs(zvtx)>fVtxZCut){
827 fEventCutInfoESD |= kVertexZCut;
828 Float_t r2 = yvtx*yvtx+xvtx*xvtx;
829 if(r2>(fVtxRCut*fVtxRCut)){
832 fEventCutInfoESD |= kVertexRCut;
837 Bool_t AliAnalysisTaskJetServices::IsVertexIn (const AliAODVertex* vtx) const {
839 if(!IsVertexValid(vtx))return kFALSE;
841 Float_t zvtx = vtx->GetZ();
842 Float_t yvtx = vtx->GetY();
843 Float_t xvtx = vtx->GetX();
849 Float_t r2 = yvtx*yvtx+xvtx*xvtx;
851 Bool_t vertexIn = TMath::Abs(zvtx)<fVtxZCut&&r2<(fVtxRCut*fVtxRCut);
855 Bool_t AliAnalysisTaskJetServices::IsEventPileUp(const AliESDEvent* esd) const{
856 if(!esd)return kFALSE;
857 return esd->IsPileupFromSPD();
860 Bool_t AliAnalysisTaskJetServices::IsEventCosmic(const AliESDEvent* esd) const {
861 if(!esd)return kFALSE;
862 // add track cuts for which we look for cosmics...
864 Bool_t isCosmic = kFALSE;
865 Int_t nTracks = esd->GetNumberOfTracks();
866 Int_t nCosmicCandidates = 0;
868 for (Int_t iTrack1 = 0; iTrack1 < nTracks; iTrack1++) {
869 AliESDtrack* track1 = (AliESDtrack*)esd->GetTrack(iTrack1);
870 if (!track1) continue;
871 UInt_t status1 = track1->GetStatus();
872 //If track is ITS stand alone track, skip the track
873 if (((status1 & AliESDtrack::kITSin) == 0 || (status1 & AliESDtrack::kTPCin))) continue;
874 if(track1->Pt()<fPtMinCosmic) continue;
875 //Start 2nd track loop to look for correlations
876 for (Int_t iTrack2 = iTrack1+1; iTrack2 < nTracks; iTrack2++) {
877 AliESDtrack* track2 = (AliESDtrack*)esd->GetTrack(iTrack2);
878 if(!track2) continue;
879 UInt_t status2 = track2->GetStatus();
880 //If track is ITS stand alone track, skip the track
881 if (((status2 & AliESDtrack::kITSin) == 0 || (status2 & AliESDtrack::kTPCin))) continue;
882 if(track2->Pt()<fPtMinCosmic) continue;
883 //Check if back-to-back
884 Double_t mom1[3],mom2[3];
885 track1->GetPxPyPz(mom1);
886 track2->GetPxPyPz(mom2);
887 TVector3 momv1(mom1[0],mom1[1],mom1[2]);
888 TVector3 momv2(mom2[0],mom2[1],mom2[2]);
889 Float_t theta = (float)(momv1.Phi()-momv2.Phi());
890 if(theta<-0.5*TMath::Pi()) theta+=2.*TMath::Pi();
892 Float_t deltaPhi = track1->Phi()-track2->Phi();
893 if(deltaPhi<-0.5*TMath::Pi()) deltaPhi+=2.*TMath::Pi();
895 Float_t rIsol = (float)(TMath::Sqrt( deltaPhi*deltaPhi+(track1->Eta()-track2->Eta())*(track1->Eta()-track2->Eta()) ));
896 if(rIsol<fRIsolMinCosmic) continue;
898 if(TMath::Abs(TMath::Pi()-theta)<fMaxCosmicAngle) {
899 nCosmicCandidates+=1;
906 fh1NCosmicsPerEvent->Fill((float)nCosmicCandidates);
912 Int_t AliAnalysisTaskJetServices::GetEventClass(AliESDEvent *esd){
915 if(fCollisionType==kPbPb){
916 if(esd->GetCentrality()){
917 cent = esd->GetCentrality()->GetCentralityPercentile("V0M");
919 if(cent<0)cent = 101;
920 if(cent>80||cent<0)return 5;
930 Int_t AliAnalysisTaskJetServices::GetEventClass(AliAODEvent *aod){
932 if(fCollisionType==kPbPb){
933 Float_t cent = aod->GetHeader()->GetCentrality();
934 if(cent>80||cent<0)return 5;
945 void AliAnalysisTaskJetServices::Terminate(Option_t */*option*/)
947 // Terminate analysis
951 Bool_t AliAnalysisTaskJetServices::CalculateReactionPlaneAngle(const TList *trackList)
954 if(!trackList)return kFALSE;
957 // need to get this info from elsewhere??
959 Double_t fPsiRP =0,fDeltaPsiRP = 0;
964 Float_t mQx= fDeltaQxy[0], mQy=fDeltaQxy[1];
966 Float_t mQx1=fDeltaQxy[0], mQy1=fDeltaQxy[1];
967 Float_t mQx2=fDeltaQxy[0], mQy2=fDeltaQxy[1];
969 AliVParticle *track=0x0;
970 Int_t count[3]={0,0,0};
973 for (Int_t iter=0;iter<trackList->GetEntries();iter++){
975 track=(AliVParticle*)trackList->At(iter);
977 //cuts already applied before
978 // Comment DCA not correctly implemented yet for AOD tracks
981 if(track->Charge()>0){momentum=track->Pt();}
982 else{momentum=-track->Pt();}
987 fh3RPPhiTracks->Fill(fCentrality,momentum,track->Phi());
990 Double_t phiweight=GetPhiWeight(track->Phi(),momentum);
991 // Double_t phiweight=1;
993 if(track->Pt()<2){weight=track->Pt();}
996 mQx += (cos(2*track->Phi()))*weight*phiweight;
997 mQy += (sin(2*track->Phi()))*weight*phiweight;
999 // Make random Subevents
1001 if(fRPSubeventMethod==0){
1002 if(fRandomizer->Binomial(1,0.5)){
1003 mQx1 += (cos(2*track->Phi()))*weight*phiweight;
1004 mQy1 += (sin(2*track->Phi()))*weight*phiweight;
1007 mQx2 += (cos(2*track->Phi()))*weight*phiweight;
1008 mQy2 += (sin(2*track->Phi()))*weight*phiweight;
1011 else if(fRPSubeventMethod==1){
1012 // Make eta dependent subevents
1014 mQx1 += (cos(2*track->Phi()))*weight*phiweight;
1015 mQy1 += (sin(2*track->Phi()))*weight*phiweight;
1018 mQx2 += (cos(2*track->Phi()))*weight*phiweight;
1019 mQy2 += (sin(2*track->Phi()))*weight*phiweight;
1027 //If no track passes the cuts, the ,Q.Phi() will return Pi and a peak at Pi/2 in the RP Angular Distribution will appear
1028 if(count[0]==0||count[1]==0||count[2]==0){
1036 // cout<<"MQ"<<mQx<<" " <<mQy<<" psi"<<endl;
1041 fPsiRP+=fFlatA[0]*TMath::Cos(2*fPsiRP)+fFlatB[0]*TMath::Sin(2*fPsiRP)+fFlatA[1]*TMath::Cos(4*fPsiRP)+fFlatB[1]*TMath::Sin(4*fPsiRP);
1043 Double_t fPsiRP1=mQ1.Phi()/2;
1044 fPsiRP1+=fFlatA[0]*TMath::Cos(2*fPsiRP1)+fFlatB[0]*TMath::Sin(2*fPsiRP1)+fFlatA[1]*TMath::Cos(4*fPsiRP1)+fFlatB[1]*TMath::Sin(4*fPsiRP1);
1045 Double_t fPsiRP2=mQ2.Phi()/2;
1046 fPsiRP2+=fFlatA[0]*TMath::Cos(2*fPsiRP2)+fFlatB[0]*TMath::Sin(2*fPsiRP2)+fFlatA[1]*TMath::Cos(4*fPsiRP2)+fFlatB[1]*TMath::Sin(4*fPsiRP2);
1047 fDeltaPsiRP=fPsiRP1-fPsiRP2;
1049 if(fPsiRP>TMath::Pi()){fPsiRP-=TMath::Pi();}
1050 if(fPsiRP<0){fPsiRP+=TMath::Pi();}
1052 // reactionplaneangle + Pi() is the same angle
1053 if(TMath::Abs(fDeltaPsiRP)>TMath::Pi()/2){
1054 if(fDeltaPsiRP>0)fDeltaPsiRP-=TMath::Pi();
1055 else fDeltaPsiRP+=TMath::Pi();
1058 Double_t cos2deltaRP=TMath::Cos(2*fDeltaPsiRP);
1061 fh2RPSubevents->Fill(fPsiRP1,fPsiRP2);
1062 fh1RP->Fill(fPsiRP);
1063 fh2RPCentrality->Fill(fCentrality,fPsiRP);
1064 fh2RPDeltaRP->Fill(fDeltaPsiRP,fCentrality);
1065 fh2RPQxQy->Fill(mQx,mQy);
1066 fh2RPCosDeltaRP->Fill(fCentrality,cos2deltaRP);
1072 Double_t AliAnalysisTaskJetServices::GetPhiWeight(Double_t phi,Double_t signedpt){
1073 if(!fh3PhiWeights)return 1;
1074 else return fh3PhiWeights->GetBinContent(fh3PhiWeights->GetXaxis()->FindBin(fCentrality),fh3PhiWeights->GetYaxis()->FindBin(signedpt),fh3PhiWeights->GetZaxis()->FindBin(phi));
1077 //________________________________________________________________________
1079 Int_t AliAnalysisTaskJetServices::GetListOfTracks(TList *list){
1081 AliAODEvent *aod = 0;
1082 if(fUseAODInput)aod = dynamic_cast<AliAODEvent*>(InputEvent());
1083 else aod = AODEvent();
1087 for(int it = 0;it < aod->GetNumberOfTracks();++it){
1088 AliAODTrack *tr = aod->GetTrack(it);
1089 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
1090 if(TMath::Abs(tr->Eta())>fTrackRecEtaWindow)continue;
1091 if(tr->Pt()<fMinTrackPt)continue;