1 // **************************************
2 // Task used for the correction of determiantion of reconstructed jet spectra
3 // Compares input (gen) and output (rec) jets
4 // *******************************************
7 /**************************************************************************
8 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
10 * Author: The ALICE Off-line Project. *
11 * Contributors are mentioned in the code where appropriate. *
13 * Permission to use, copy, modify and distribute this software and its *
14 * documentation strictly for non-commercial purposes is hereby granted *
15 * without fee, provided that the above copyright notice appears in all *
16 * copies and that both the copyright notice and this permission notice *
17 * appear in the supporting documentation. The authors make no claims *
18 * about the suitability of this software for any purpose. It is *
19 * provided "as is" without express or implied warranty. *
20 **************************************************************************/
27 #include <TInterpreter.h>
36 #include <TLorentzVector.h>
37 #include <TClonesArray.h>
38 #include "TDatabasePDG.h"
40 #include "AliAnalysisTaskJetServices.h"
41 #include "AliAnalysisDataContainer.h"
42 #include "AliAnalysisDataSlot.h"
43 #include "AliAnalysisManager.h"
44 #include "AliJetFinder.h"
45 #include "AliJetHeader.h"
46 #include "AliJetReader.h"
47 #include "AliJetReaderHeader.h"
48 #include "AliUA1JetHeaderV1.h"
49 #include "AliESDEvent.h"
50 #include "AliAODEvent.h"
51 #include "AliAODHandler.h"
52 #include "AliAODTrack.h"
53 #include "AliAODJet.h"
54 #include "AliAODMCParticle.h"
55 #include "AliMCEventHandler.h"
56 #include "AliMCEvent.h"
58 #include "AliGenPythiaEventHeader.h"
59 #include "AliJetKineReaderHeader.h"
60 #include "AliGenCocktailEventHeader.h"
61 #include "AliInputEventHandler.h"
62 #include "AliPhysicsSelection.h"
63 #include "AliTriggerAnalysis.h"
65 #include "AliAnalysisHelperJetTasks.h"
67 ClassImp(AliAnalysisTaskJetServices)
69 AliAnalysisTaskJetServices::AliAnalysisTaskJetServices(): AliAnalysisTaskSE(),
71 fUsePhysicsSelection(kFALSE),
73 fPhysicsSelectionFlag(AliVEvent::kMB),
84 fMaxCosmicAngle(0.01),
89 fh1SelectionInfoESD(0x0),
90 fh1EventCutInfoESD(0),
92 fh2ESDTriggerCount(0x0),
94 fh2ESDTriggerVtx(0x0),
95 fh2ESDTriggerRun(0x0),
97 fh1NCosmicsPerEvent(0x0),
98 fTriggerAnalysis(0x0),
101 fRunRange[0] = fRunRange[1] = 0;
104 AliAnalysisTaskJetServices::AliAnalysisTaskJetServices(const char* name):
105 AliAnalysisTaskSE(name),
106 fUseAODInput(kFALSE),
107 fUsePhysicsSelection(kFALSE),
109 fPhysicsSelectionFlag(AliVEvent::kMB),
110 fSelectionInfoESD(0),
120 fMaxCosmicAngle(0.01),
124 fh1PtHardTrials(0x0),
125 fh1SelectionInfoESD(0x0),
126 fh1EventCutInfoESD(0),
127 fh2TriggerCount(0x0),
128 fh2ESDTriggerCount(0x0),
130 fh2ESDTriggerVtx(0x0),
131 fh2ESDTriggerRun(0x0),
133 fh1NCosmicsPerEvent(0x0),
134 fTriggerAnalysis(0x0),
137 fRunRange[0] = fRunRange[1] = 0;
138 DefineOutput(1,TList::Class());
143 Bool_t AliAnalysisTaskJetServices::Notify()
146 // Implemented Notify() to read the cross sections
147 // and number of trials from pyxsec.root
150 TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
151 Float_t xsection = 0;
156 TFile *curfile = tree->GetCurrentFile();
158 Error("Notify","No current file");
161 if(!fh1Xsec||!fh1Trials){
162 Printf("%s%d No Histogram fh1Xsec",(char*)__FILE__,__LINE__);
165 AliAnalysisHelperJetTasks::PythiaInfoFromFile(curfile->GetName(),xsection,ftrials);
166 fh1Xsec->Fill("<#sigma>",xsection);
167 // construct a poor man average trials
168 Float_t nEntries = (Float_t)tree->GetTree()->GetEntries();
169 if(ftrials>=nEntries && nEntries>0.)fAvgTrials = ftrials/nEntries;
174 void AliAnalysisTaskJetServices::UserCreateOutputObjects()
178 // Create the output container
182 if (fDebug > 1) printf("AnalysisTaskJetServices::UserCreateOutputObjects() \n");
185 if(!fHistList)fHistList = new TList();
187 Bool_t oldStatus = TH1::AddDirectoryStatus();
188 TH1::AddDirectory(kFALSE);
189 fh1Xsec = new TProfile("fh1Xsec","xsec from pyxsec.root",1,0,1);
190 fh1Xsec->GetXaxis()->SetBinLabel(1,"<#sigma>");
191 fHistList->Add(fh1Xsec);
193 fh1Trials = new TH1F("fh1Trials","trials root file",1,0,1);
194 fh1Trials->GetXaxis()->SetBinLabel(1,"#sum{ntrials}");
195 fHistList->Add(fh1Trials);
197 const Int_t nBinPt = 100;
198 Double_t binLimitsPt[nBinPt+1];
199 for(Int_t iPt = 0;iPt <= nBinPt;iPt++){
201 binLimitsPt[iPt] = 0.0;
204 binLimitsPt[iPt] = binLimitsPt[iPt-1] + 2.5;
208 fh2TriggerCount = new TH2F("fh2TriggerCount",";Trigger No.;constrained;Count",AliAnalysisHelperJetTasks::kTrigger,-0.5,AliAnalysisHelperJetTasks::kTrigger-0.5,kConstraints,-0.5,kConstraints-0.5);
209 fHistList->Add(fh2TriggerCount);
211 fh2ESDTriggerCount = new TH2F("fh2ESDTriggerCount",";Trigger No.;constrained;Count",AliAnalysisHelperJetTasks::kTrigger,-0.5,AliAnalysisHelperJetTasks::kTrigger-0.5,kConstraints,-0.5,kConstraints-0.5);
212 fHistList->Add(fh2ESDTriggerCount);
213 const Int_t nBins = AliAnalysisHelperJetTasks::kTrigger*kConstraints;
214 fh2TriggerVtx = new TH2F("fh2TriggerVtx",";Constraint No. * (trig no+1);Vtx (cm);Count",nBins,-0.5,nBins-0.5,400,-20.,20.);
215 fHistList->Add(fh2TriggerVtx);
217 fh2ESDTriggerVtx = new TH2F("fh2ESDTriggerVtx",";Constraint No.* (trg no+1);Vtx (cm);Count",nBins,-0.5,nBins-0.5,400,-20.,20.);
218 fHistList->Add(fh2ESDTriggerVtx);
221 fh1PtHard = new TH1F("fh1PtHard","PYTHIA Pt hard;p_{T,hard}",nBinPt,binLimitsPt);
222 fHistList->Add(fh1PtHard);
223 fh1PtHardTrials = new TH1F("fh1PtHardTrials","PYTHIA Pt hard weight with trials;p_{T,hard}",nBinPt,binLimitsPt);
224 fHistList->Add(fh1PtHardTrials);
225 fh1SelectionInfoESD = new TH1F("fh1SelectionInfoESD","Bit Masks that satisfy the selection info",
226 AliAnalysisHelperJetTasks::kTotalSelections,0.5,AliAnalysisHelperJetTasks::kTotalSelections+0.5);
227 fHistList->Add(fh1SelectionInfoESD);
229 fh1EventCutInfoESD = new TH1F("fh1EventCutInfoESD","Bit Masks that for the events after each step of cuts",
230 kTotalEventCuts,0.5,kTotalEventCuts+0.5);
231 fHistList->Add(fh1EventCutInfoESD);
233 // 3 decisions, 0 trigger X, X + SPD vertex, X + SPD vertex in range
234 // 3 triggers BB BE/EB EE
236 fh2ESDTriggerRun = new TH2F("fh2ESDTriggerRun","Trigger 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);
237 fHistList->Add(fh2ESDTriggerRun);
239 fh2VtxXY = new TH2F("fh2VtxXY","Beam Spot all INT triggered events;x (cm);y (cm)",160,-10,10,160,-10,10);
240 fHistList->Add(fh2VtxXY);
241 // =========== Switch on Sumw2 for all histos ===========
242 for (Int_t i=0; i<fHistList->GetEntries(); ++i) {
243 TH1 *h1 = dynamic_cast<TH1*>(fHistList->At(i));
248 THnSparse *hn = dynamic_cast<THnSparse*>(fHistList->At(i));
252 fh1NCosmicsPerEvent = new TH1F("fh1NCosmicsPerEvent","Number of cosmic candidates per event",10,0.,10.);
253 fHistList->Add(fh1NCosmicsPerEvent),
256 TH1::AddDirectory(oldStatus);
259 void AliAnalysisTaskJetServices::Init()
264 if (fDebug > 1) printf("AnalysisTaskJetServices::Init() \n");
268 void AliAnalysisTaskJetServices::UserExec(Option_t */*option*/)
272 // Execute analysis for current event
275 AliAODEvent *aod = 0;
276 AliESDEvent *esd = 0;
278 AliAnalysisHelperJetTasks::Selected(kTRUE,kFALSE); // set slection to false
279 fSelectionInfoESD = 0; // reset
280 fEventCutInfoESD = 0; // reset
281 AliAnalysisHelperJetTasks::SelectInfo(kTRUE,fSelectionInfoESD); // set slection to false
285 aod = dynamic_cast<AliAODEvent*>(InputEvent());
287 Printf("%s:%d AODEvent not found in Input Manager %d",(char*)__FILE__,__LINE__,fUseAODInput);
293 // assume that the AOD is in the general output...
296 Printf("%s:%d AODEvent not found in the Output",(char*)__FILE__,__LINE__);
299 esd = dynamic_cast<AliESDEvent*>(InputEvent());
302 fSelectionInfoESD |= kNoEventCut;
303 fEventCutInfoESD |= kNoEventCut;
305 Bool_t esdVtxValid = false;
306 Bool_t esdVtxIn = false;
307 Bool_t aodVtxValid = false;
308 Bool_t aodVtxIn = false;
312 if(!fTriggerAnalysis){
313 fTriggerAnalysis = new AliTriggerAnalysis;
314 fTriggerAnalysis->SetAnalyzeMC(fMC);
315 fTriggerAnalysis->SetSPDGFOThreshhold(1);
317 // fTriggerAnalysis->FillTriggerClasses(esd);
318 Bool_t v0A = fTriggerAnalysis->IsOfflineTriggerFired(esd, AliTriggerAnalysis::kV0A);
319 Bool_t v0C = fTriggerAnalysis->IsOfflineTriggerFired(esd, AliTriggerAnalysis::kV0C);
320 Bool_t v0ABG = fTriggerAnalysis->IsOfflineTriggerFired(esd, AliTriggerAnalysis::kV0ABG);
321 Bool_t v0CBG = fTriggerAnalysis->IsOfflineTriggerFired(esd, AliTriggerAnalysis::kV0CBG);
322 Bool_t spdFO = fTriggerAnalysis->SPDFiredChips(esd, 0);;
323 if(v0A)fSelectionInfoESD |= AliAnalysisHelperJetTasks::kV0A;
324 if(v0C)fSelectionInfoESD |= AliAnalysisHelperJetTasks::kV0C;
325 if(!(v0ABG||v0CBG))fSelectionInfoESD |= AliAnalysisHelperJetTasks::kNoV0BG;
326 if(spdFO)fSelectionInfoESD |= AliAnalysisHelperJetTasks::kSPDFO;
328 Float_t run = (Float_t)esd->GetRunNumber();
329 const AliESDVertex *vtxESD = esd->GetPrimaryVertex();
331 esdVtxIn = IsVertexIn(vtxESD);
337 zvtx = vtxESD->GetZ();
338 yvtx = vtxESD->GetY();
339 xvtx = vtxESD->GetX();
342 // CKB this can be cleaned up a bit...
345 if(esd->GetFiredTriggerClasses().Contains("CINT1B")
346 ||esd->GetFiredTriggerClasses().Contains("CSMBB")
347 ||esd->GetFiredTriggerClasses().Contains("MB1")
348 ||esd->GetFiredTriggerClasses().Contains("CINT6B")){
350 fSelectionInfoESD |= AliAnalysisHelperJetTasks::kBunchBunch;
352 else if(esd->GetFiredTriggerClasses().Contains("CINT1A")
353 ||esd->GetFiredTriggerClasses().Contains("CSMBA")
354 ||esd->GetFiredTriggerClasses().Contains("CINT6A")
355 ||esd->GetFiredTriggerClasses().Contains("CINT1C")
356 ||esd->GetFiredTriggerClasses().Contains("CSMBC")
357 ||esd->GetFiredTriggerClasses().Contains("CINT6C")){
358 // empty bunch or bunch empty
360 fSelectionInfoESD |= AliAnalysisHelperJetTasks::kBunchEmpty;
362 else if(esd->GetFiredTriggerClasses().Contains("CINT1-E")
363 ||esd->GetFiredTriggerClasses().Contains("CINT6-E")){
365 fSelectionInfoESD |= AliAnalysisHelperJetTasks::kEmptyEmpty;
371 fh2ESDTriggerRun->Fill(run,iTrig+1);
372 if(vtxESD->GetNContributors()>2){
373 fh2ESDTriggerRun->Fill(run,iTrig+2);
374 fh2VtxXY->Fill(xvtx,yvtx);
379 Float_t r2 = xvtx *xvtx + yvtx *yvtx;
380 if(TMath::Abs(zvtx)<fVtxZCut&&r2<(fVtxRCut*fVtxRCut))fh2ESDTriggerRun->Fill(run,iTrig+3);
383 fh2ESDTriggerRun->Fill(run,0);
389 // Apply additional constraints
390 Bool_t esdEventSelected = IsEventSelected(esd);
391 Bool_t esdEventPileUp = IsEventPileUp(esd);
392 Bool_t esdEventCosmic = IsEventCosmic(esd);
394 Bool_t aodEventSelected = IsEventSelected(aod);
396 Bool_t physicsSelection = ((fInputHandler->IsEventSelected())&fPhysicsSelectionFlag);
397 fEventCutInfoESD |= kPhysicsSelectionCut; // other alreay set via IsEventSelected
398 fh1EventCutInfoESD->Fill(fEventCutInfoESD);
400 if(esdEventSelected) fSelectionInfoESD |= AliAnalysisHelperJetTasks::kVertexIn;
401 if(esdEventPileUp) fSelectionInfoESD |= AliAnalysisHelperJetTasks::kIsPileUp;
402 if(esdEventCosmic) fSelectionInfoESD |= AliAnalysisHelperJetTasks::kIsCosmic;
403 if(physicsSelection) fSelectionInfoESD |= AliAnalysisHelperJetTasks::kPhysicsSelection;
406 // here we have all selection information, fill histogram
407 for(unsigned int i = 1;i<(UInt_t)fh1SelectionInfoESD->GetNbinsX();i++){
408 if((i&fSelectionInfoESD)==i)fh1SelectionInfoESD->Fill(i);
410 AliAnalysisHelperJetTasks::SelectInfo(kTRUE,fSelectionInfoESD);
412 if(esd&&aod&&fDebug){
413 if(esdEventSelected&&!aodEventSelected){
414 Printf("%s:%d Different Selection for ESD and AOD",(char*)__FILE__,__LINE__);
415 const AliESDVertex *vtxESD = esd->GetPrimaryVertex();
416 const AliAODVertex *vtxAOD = aod->GetPrimaryVertex();
417 Printf("ESD Vtx %s %s %d",vtxESD->GetName(),vtxESD->GetTitle(),vtxESD->GetNContributors());
419 Printf("AOD Vtx %s %s %d",vtxAOD->GetName(),vtxAOD->GetTitle(),vtxAOD->GetNContributors());
424 // loop over all possible triggers for esd
427 const AliESDVertex *vtxESD = esd->GetPrimaryVertex();
428 // Printf(">> ESDvtx %s %s",vtxESD->GetName(),vtxESD->GetTitle());vtxESD->Print();
429 TString vtxName(vtxESD->GetName());
430 Float_t zvtx = vtxESD->GetZ();
431 for(int it = AliAnalysisHelperJetTasks::kAcceptAll;it < AliAnalysisHelperJetTasks::kTrigger;it++){
432 Bool_t esdTrig = kFALSE;
433 esdTrig = AliAnalysisHelperJetTasks::IsTriggerFired(esd,(AliAnalysisHelperJetTasks::Trigger)it);
434 if(esdTrig)fh2ESDTriggerCount->Fill(it,kAllTriggered);
435 Bool_t cand = physicsSelection;
437 fh2ESDTriggerCount->Fill(it,kSelectedALICE);
438 fh2ESDTriggerVtx->Fill(kSelectedALICE*(it+1),zvtx);
440 if(!fUsePhysicsSelection)cand = AliAnalysisHelperJetTasks::IsTriggerFired(esd,AliAnalysisHelperJetTasks::kMB1);
441 if(vtxESD->GetNContributors()>2&&!vtxName.Contains("TPCVertex")){
443 fh2ESDTriggerCount->Fill(it,kTriggeredVertex);
444 fh2ESDTriggerVtx->Fill(kTriggeredVertex*(it+1),zvtx);
446 if(esdEventSelected&&esdTrig){
447 fh2ESDTriggerCount->Fill(it,kTriggeredVertexIn);
448 fh2ESDTriggerVtx->Fill(kTriggeredVertexIn*(it+1),zvtx);
451 fh2ESDTriggerCount->Fill(it,kSelectedALICEVertexValid);
452 fh2ESDTriggerVtx->Fill(kSelectedALICEVertexValid*(it+1),zvtx);
455 if(cand&&esdEventSelected){
456 fh2ESDTriggerCount->Fill(it,kSelectedALICEVertexIn);
457 fh2ESDTriggerVtx->Fill(kSelectedALICEVertexIn*(it+1),zvtx);
458 fh2ESDTriggerVtx->Fill(kSelected*(it+1),zvtx);
459 fh2ESDTriggerCount->Fill(it,kSelected);
460 AliAnalysisHelperJetTasks::Selected(kTRUE,kTRUE);// select this event
466 const AliAODVertex *vtxAOD = aod->GetPrimaryVertex();
467 aodVtxValid = IsVertexValid(vtxAOD);
468 aodVtxIn = IsVertexIn(vtxAOD);
470 for(int it = AliAnalysisHelperJetTasks::kAcceptAll;it < AliAnalysisHelperJetTasks::kTrigger;it++){
471 Bool_t aodTrig = kFALSE;
472 aodTrig = AliAnalysisHelperJetTasks::IsTriggerFired(aod,(AliAnalysisHelperJetTasks::Trigger)it);
473 Bool_t cand = aod->GetHeader()->GetOfflineTrigger()&AliVEvent::kMB;
474 if(aodTrig)fh2TriggerCount->Fill(it,kAllTriggered);
476 Float_t zvtx = vtxAOD->GetZ();
478 fh2TriggerCount->Fill(it,kTriggeredVertex);
479 fh2TriggerVtx->Fill(kTriggeredVertex*(it+1),zvtx);
481 if(cand&&aodEventSelected){
482 fh2TriggerCount->Fill(it,kSelected);
484 if(aodTrig&&aodEventSelected){
485 fh2TriggerVtx->Fill(kTriggeredVertexIn*(it+1),zvtx);
486 fh2TriggerCount->Fill(it,kTriggeredVertexIn);
489 fh2TriggerCount->Fill(it,kSelectedALICEVertexValid);
490 fh2TriggerVtx->Fill(kSelectedALICEVertexValid*(it+1),zvtx);
491 if(aodEventSelected){
492 fh2TriggerCount->Fill(it,kSelectedALICEVertexIn);
493 fh2TriggerVtx->Fill(kSelectedALICEVertexIn*(it+1),zvtx);
500 if (fDebug > 1)printf(" AliAnalysisTaskJetServices: Analysing event # %5d\n", (Int_t) fEntry);
504 Double_t nTrials = 1; // Trials for MC trigger
506 fh1Trials->Fill("#sum{ntrials}",fAvgTrials);
507 AliMCEvent* mcEvent = MCEvent();
508 // AliStack *pStack = 0;
510 AliGenPythiaEventHeader* pythiaGenHeader = AliAnalysisHelperJetTasks::GetPythiaEventHeader(mcEvent);
512 nTrials = pythiaGenHeader->Trials();
513 ptHard = pythiaGenHeader->GetPtHard();
514 int iProcessType = pythiaGenHeader->ProcessType();
516 // 12 f+barf -> f+barf
521 if (fDebug > 10)Printf("%d iProcessType %d",__LINE__, iProcessType);
522 if(fDebug>20)AliAnalysisHelperJetTasks::PrintStack(mcEvent);
523 fh1PtHard->Fill(ptHard);
524 fh1PtHardTrials->Fill(ptHard,nTrials);
526 }// if pythia gen header
532 PostData(1, fHistList);
535 Bool_t AliAnalysisTaskJetServices::IsEventSelected(const AliESDEvent* esd){
536 if(!esd)return kFALSE;
537 const AliESDVertex *vtx = esd->GetPrimaryVertex();
538 return IsVertexIn(vtx); // vertex in calls vertex valid
542 Bool_t AliAnalysisTaskJetServices::IsEventSelected(const AliAODEvent* aod) const {
543 if(!aod)return kFALSE;
544 const AliAODVertex *vtx = aod->GetPrimaryVertex();
545 return IsVertexIn(vtx); // VertexIn calls VertexValid
548 Bool_t AliAnalysisTaskJetServices::IsVertexValid ( const AliESDVertex* vtx) {
550 // We can check the type of the vertex by its name and title
551 // if vertexer failed title is empty (default c'tor) and ncontributors is 0
553 // Tracks PrimaryVertex VertexerTracksNoConstraint
554 // Tracks PrimaryVertex VertexerTracksWithConstraint
555 // TPC TPCVertex VertexerTracksNoConstraint
556 // TPC TPCVertex VertexerTracksWithConstraint
557 // SPD SPDVertex vertexer: 3D
558 // SPD SPDVertex vertexer: Z
560 Int_t nCont = vtx->GetNContributors();
563 fEventCutInfoESD |= kContributorsCut1;
565 fEventCutInfoESD |= kContributorsCut2;
567 fEventCutInfoESD |= kContributorsCut3;
572 if(nCont<3)return kFALSE;
574 // do not want tpc only primary vertex
575 TString vtxName(vtx->GetName());
576 if(vtxName.Contains("TPCVertex")){
577 fEventCutInfoESD |= kVertexTPC;
580 if(vtxName.Contains("SPDVertex"))fEventCutInfoESD |= kVertexSPD;
581 if(vtxName.Contains("PrimaryVertex"))fEventCutInfoESD |= kVertexGlobal;
584 TString vtxTitle(vtx->GetTitle());
585 if(vtxTitle.Contains("vertexer: Z")){
586 if(vtx->GetDispersion()>0.02)return kFALSE;
588 fEventCutInfoESD |= kSPDDispersionCut;
593 Bool_t AliAnalysisTaskJetServices::IsVertexValid ( const AliAODVertex* vtx) const {
595 // We can check the type of the vertex by its name and title
596 // if vertexer failed title is empty (default c'tor) and ncontributors is 0
598 // Tracks PrimaryVertex VertexerTracksNoConstraint
599 // TPC TPCVertex VertexerTracksNoConstraint
600 // SPD SPDVertex vertexer: 3D
601 // SPD SPDVertex vertexer: Z
603 if(vtx->GetNContributors()<3)return kFALSE;
604 // do not want tpc only primary vertex
605 TString vtxName(vtx->GetName());
606 if(vtxName.Contains("TPCVertex"))return kFALSE;
608 // no dispersion yet...
610 TString vtxTitle(vtx->GetTitle());
611 if(vtxTitle.Contains("vertexer: Z")){
612 if(vtx->GetDispersion()>0.02)return kFALSE;
619 Bool_t AliAnalysisTaskJetServices::IsVertexIn (const AliESDVertex* vtx) {
621 if(!IsVertexValid(vtx))return kFALSE;
623 Float_t zvtx = vtx->GetZ();
624 Float_t yvtx = vtx->GetY();
625 Float_t xvtx = vtx->GetX();
633 if(TMath::Abs(zvtx)>fVtxZCut){
636 fEventCutInfoESD |= kVertexZCut;
637 Float_t r2 = yvtx*yvtx+xvtx*xvtx;
638 if(r2>(fVtxRCut*fVtxRCut)){
641 fEventCutInfoESD |= kVertexRCut;
646 Bool_t AliAnalysisTaskJetServices::IsVertexIn (const AliAODVertex* vtx) const {
648 if(!IsVertexValid(vtx))return kFALSE;
650 Float_t zvtx = vtx->GetZ();
651 Float_t yvtx = vtx->GetY();
652 Float_t xvtx = vtx->GetX();
658 Float_t r2 = yvtx*yvtx+xvtx*xvtx;
660 Bool_t vertexIn = TMath::Abs(zvtx)<fVtxZCut&&r2<(fVtxRCut*fVtxRCut);
664 Bool_t AliAnalysisTaskJetServices::IsEventPileUp(const AliESDEvent* esd) const{
665 if(!esd)return kFALSE;
666 return esd->IsPileupFromSPD();
669 Bool_t AliAnalysisTaskJetServices::IsEventCosmic(const AliESDEvent* esd) const {
670 if(!esd)return kFALSE;
671 // add track cuts for which we look for cosmics...
673 Bool_t isCosmic = kFALSE;
674 Int_t nTracks = esd->GetNumberOfTracks();
675 Int_t nCosmicCandidates = 0;
677 for (Int_t iTrack1 = 0; iTrack1 < nTracks; iTrack1++) {
678 AliESDtrack* track1 = (AliESDtrack*)esd->GetTrack(iTrack1);
679 if (!track1) continue;
680 UInt_t status1 = track1->GetStatus();
681 //If track is ITS stand alone track, skip the track
682 if (((status1 & AliESDtrack::kITSin) == 0 || (status1 & AliESDtrack::kTPCin))) continue;
683 if(track1->Pt()<fPtMinCosmic) continue;
684 //Start 2nd track loop to look for correlations
685 for (Int_t iTrack2 = iTrack1+1; iTrack2 < nTracks; iTrack2++) {
686 AliESDtrack* track2 = (AliESDtrack*)esd->GetTrack(iTrack2);
687 if(!track2) continue;
688 UInt_t status2 = track2->GetStatus();
689 //If track is ITS stand alone track, skip the track
690 if (((status2 & AliESDtrack::kITSin) == 0 || (status2 & AliESDtrack::kTPCin))) continue;
691 if(track2->Pt()<fPtMinCosmic) continue;
692 //Check if back-to-back
693 Double_t mom1[3],mom2[3];
694 track1->GetPxPyPz(mom1);
695 track2->GetPxPyPz(mom2);
696 TVector3 momv1(mom1[0],mom1[1],mom1[2]);
697 TVector3 momv2(mom2[0],mom2[1],mom2[2]);
698 Float_t theta = (float)(momv1.Phi()-momv2.Phi());
699 if(theta<-0.5*TMath::Pi()) theta+=2.*TMath::Pi();
701 Float_t deltaPhi = track1->Phi()-track2->Phi();
702 if(deltaPhi<-0.5*TMath::Pi()) deltaPhi+=2.*TMath::Pi();
704 Float_t rIsol = (float)(TMath::Sqrt( deltaPhi*deltaPhi+(track1->Eta()-track2->Eta())*(track1->Eta()-track2->Eta()) ));
705 if(rIsol<fRIsolMinCosmic) continue;
707 if(TMath::Abs(TMath::Pi()-theta)<fMaxCosmicAngle) {
708 nCosmicCandidates+=1;
715 fh1NCosmicsPerEvent->Fill((float)nCosmicCandidates);
723 void AliAnalysisTaskJetServices::Terminate(Option_t */*option*/)
725 // Terminate analysis