1 /**************************************************************************
2 * Copyright(c) 1998-1999, 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 **************************************************************************/
28 #include <TLorentzVector.h>
33 #include "AliAnalysisTaskUE.h"
34 #include "AliAnalysisManager.h"
35 #include "AliMCEventHandler.h"
36 #include "AliAODEvent.h"
37 #include "AliAODInputHandler.h"
38 #include "AliAODHandler.h"
40 #include "AliAODJet.h"
41 #include "AliAODTrack.h"
46 // Analysis class for Underlying Event studies
48 // Look for correlations on the tranverse regions to
49 // the leading charged jet
51 // This class needs as input AOD with track and Jets
52 // the output is a list of histograms
54 // AOD can be either connected to the InputEventHandler
55 // for a chain of AOD files
57 // to the OutputEventHandler
58 // for a chain of ESD files, so this case class should be
59 // in the train after the Jet finder
61 // Arian.Abrahantes.Quintana@cern.ch
62 // Ernesto.Lopez.Torres@cern.ch
66 ClassImp( AliAnalysisTaskUE)
68 ////////////////////////////////////////////////////////////////////////
71 //____________________________________________________________________
72 AliAnalysisTaskUE:: AliAnalysisTaskUE(const char* name):
73 AliAnalysisTask(name, ""),
80 fMaxJetPtInHist(300.),
84 fAreaReg(1.5393), // Pi*0.7*0.7
85 fUseChPartJet(kFALSE),
86 fUseSingleCharge(kFALSE),
87 fUsePositiveCharge(kTRUE),
92 fJet2DeltaPhiCut(2.616), // 150 degrees
100 fhRegionMultMin(0x0),
103 fhMinRegMaxPtPart(0x0),
104 fhMinRegSumPtvsMult(0x0),
105 fhdNdEta_PhiDist(0x0),
106 fhFullRegPartPtDistVsEt(0x0),
107 fhTransRegPartPtDistVsEt(0x0),
108 fhRegionSumPtMaxVsEt(0x0),
109 fhRegionMultMax(0x0),
110 fhRegionMultMaxVsEt(0x0),
111 fhRegionSumPtMinVsEt(0x0), //fhRegionMultMin(0x0),
112 fhRegionMultMinVsEt(0x0),
113 fhRegionAveSumPtVsEt(0x0),
114 fhRegionDiffSumPtVsEt(0x0),
115 fhRegionAvePartPtMaxVsEt(0x0),
116 fhRegionAvePartPtMinVsEt(0x0),
117 fhRegionMaxPartPtMaxVsEt(0x0),
118 fSettingsTree(0x0)//, fhValidRegion(0x0)
120 // Default constructor
121 // Define input and output slots here
122 // Input slot #0 works with a TChain
123 DefineInput(0, TChain::Class());
124 // Output slot #0 writes into a TList container
125 DefineOutput(0, TList::Class());
128 //____________________________________________________________________
129 void AliAnalysisTaskUE::ConnectInputData(Option_t* /*option*/)
131 // Connect the input data
133 // We need AOD with tracks and jets.
134 // Since AOD can be either connected to the InputEventHandler (input chain fron AOD files)
135 // or to the OutputEventHandler ( AOD is created by a previus task in the train )
136 // we need to check where it is and get the pointer to AODEvent in the right way
138 if (fDebug > 1) AliInfo("ConnectInputData() \n");
140 TObject* handler = AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
142 if( handler && handler->InheritsFrom("AliAODInputHandler") ) {
143 fAOD = ((AliAODInputHandler*)handler)->GetEvent();
144 if (fDebug > 1) AliInfo(" ==== Tracks from AliAODInputHandler");
145 // Case when jets are reconstructed on the fly from AOD tracks
146 // (the Jet Finder is using the AliJetAODReader) of InputEventHandler
147 // and put in the OutputEventHandler AOD. Useful whe you want to reconstruct jets with
148 // different parameters to default ones stored in the AOD or to use a different algorithm
150 handler = AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler();
151 if( handler && handler->InheritsFrom("AliAODHandler") ) {
152 fAODjets = ((AliAODHandler*)handler)->GetAOD();
153 if (fDebug > 1) AliInfo(" ==== Jets from AliAODHandler");
157 if (fDebug > 1) AliInfo(" ==== Jets from AliAODInputHandler");
160 handler = AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler();
161 if( handler && handler->InheritsFrom("AliAODHandler") ) {
162 fAOD = ((AliAODHandler*)handler)->GetAOD();
164 if (fDebug > 1) AliInfo(" ==== Tracks and Jets from AliAODHandler");
166 AliFatal("I can't get any AOD Event Handler");
172 //____________________________________________________________________
173 void AliAnalysisTaskUE::CreateOutputObjects()
175 // Create the output container
177 if (fDebug > 1) AliInfo("CreateOutPutData()");
181 fListOfHistos->SetOwner(kTRUE);
186 //____________________________________________________________________
187 void AliAnalysisTaskUE::Exec(Option_t */*option*/)
189 // Execute analysis for current event
191 if ( fDebug > 3 ) AliInfo( " Processing event..." );
195 PostData(0, fListOfHistos);
198 //____________________________________________________________________
199 void AliAnalysisTaskUE::AnalyseUE()
202 // Look for correlations on the tranverse regions to
203 // the leading charged jet
206 // ------------------------------------------------
207 // Find Leading Jets 1,2,3
208 // (could be skipped if Jets are sort by Pt...)
209 Double_t maxPtJet1 = 0.;
211 Double_t maxPtJet2 = 0.; // jet 2 need for back to back inclusive
213 Double_t maxPtJet3 = 0.; // jet 3 need for back to back exclusive
218 if( !fUseChPartJet ) {
221 nJets = fAODjets->GetNJets();
222 // printf("AOD %d jets \n", nJets);
223 for( Int_t i=0; i<nJets; ++i ) {
224 AliAODJet* jet = fAODjets->GetJet(i);
225 Double_t jetPt = jet->Pt();//*1.666; // FIXME Jet Pt Correction ?????!!!
226 if( jetPt > maxPtJet1 ) {
227 maxPtJet3 = maxPtJet2; index3 = index2;
228 maxPtJet2 = maxPtJet1; index2 = index1;
229 maxPtJet1 = jetPt; index1 = i;
230 } else if( jetPt > maxPtJet2 ) {
231 maxPtJet3 = maxPtJet2; index3 = index2;
232 maxPtJet2 = jetPt; index2 = i;
233 } else if( jetPt > maxPtJet3 ) {
234 maxPtJet3 = jetPt; index3 = i;
238 AliAODJet* jet = fAODjets->GetJet(index1);
239 jetVect[0].SetXYZ(jet->Px(), jet->Py(), jet->Pz());
242 AliAODJet* jet = fAODjets->GetJet(index2);
243 jetVect[1].SetXYZ(jet->Px(), jet->Py(), jet->Pz());
246 AliAODJet* jet = fAODjets->GetJet(index3);
247 jetVect[2].SetXYZ(jet->Px(), jet->Py(), jet->Pz());
252 // Use "Charged Particle Jets"
253 TObjArray* jets = FindChargedParticleJets();
255 nJets = jets->GetEntriesFast();
258 AliAODJet* jet = (AliAODJet*)jets->At(0);
259 maxPtJet1 = jet->Pt();
260 jetVect[0].SetXYZ(jet->Px(), jet->Py(), jet->Pz());
264 AliAODJet* jet = (AliAODJet*)jets->At(1);
265 maxPtJet1 = jet->Pt();
266 jetVect[1].SetXYZ(jet->Px(), jet->Py(), jet->Pz());
270 AliAODJet* jet = (AliAODJet*)jets->At(2);
271 maxPtJet1 = jet->Pt();
272 jetVect[2].SetXYZ(jet->Px(), jet->Py(), jet->Pz());
281 fhNJets->Fill(nJets);
285 AliInfo("\n Skipping Event, not jet found...");
288 AliInfo(Form("\n Pt Leading Jet = %6.1f eta=%5.3f ", maxPtJet1, jetVect[0].Eta() ));
292 // ----------------------------------------------
293 // Cut events by jets topology
296 // - Jet1 |eta| < fJet1EtaCut
297 // 2 = back to back inclusive
299 // - |Jet1.Phi - Jet2.Phi| > fJet2DeltaPhiCut
300 // - Jet2.Pt/Jet1Pt > fJet2RatioPtCut
301 // 3 = back to back exclusive
303 // - Jet3.Pt < fJet3PtCut
305 if( index1 < 0 || TMath::Abs(jetVect[0].Eta()) > fJet1EtaCut) {
306 if( fDebug > 1 ) AliInfo("\n Skipping Event...Jet1 |eta| > fJet1EtaCut");
309 // back to back inclusive
310 if( fAnaType > 1 && index2 == -1 ) {
311 if( fDebug > 1 ) AliInfo("\n Skipping Event... no second Jet found");
314 if( fAnaType > 1 && index2 > -1 ) {
315 if( TMath::Abs(jetVect[0].DeltaPhi(jetVect[1])) < fJet2DeltaPhiCut ||
316 maxPtJet2/maxPtJet1 < fJet2RatioPtCut ) {
317 if( fDebug > 1 ) AliInfo("\n Skipping Event... |Jet1.Phi - Jet2.Phi| < fJet2DeltaPhiCut");
321 // back to back exclusive
322 if( fAnaType > 2 && index3 > -1 ) {
323 if( maxPtJet3 > fJet3PtCut ) {
324 if( fDebug > 1 ) AliInfo("\n Skipping Event... Jet3.Pt > fJet3PtCut ");
329 fhEleadingPt->Fill( maxPtJet1 );
330 //Area for Normalization Purpose at Display histos
331 SetRegionArea(jetVect);
333 // ----------------------------------------------
334 // Find max and min regions
335 Double_t sumPtRegionPosit = 0.;
336 Double_t sumPtRegionNegat = 0.;
337 Double_t maxPartPtRegion = 0.;
338 Int_t nTrackRegionPosit = 0;
339 Int_t nTrackRegionNegat = 0;
340 static const Double_t k270rad = 270.*TMath::Pi()/180.;
342 Int_t nTracks = fAOD->GetNTracks();
343 for (Int_t ipart=0; ipart<nTracks; ++ipart) {
344 AliAODTrack* part = fAOD->GetTrack( ipart );
345 if ( !part->TestFilterBit(fFilterBit) ) continue; // track cut selection
346 // PID Selection: Reject everything but hadrons
347 Bool_t isHadron = part->GetMostProbablePID()==AliAODTrack::kPion ||
348 part->GetMostProbablePID()==AliAODTrack::kKaon ||
349 part->GetMostProbablePID()==AliAODTrack::kProton;
350 if ( !isHadron ) continue;
352 if ( !part->Charge() ) continue; //Only charged
353 if ( fUseSingleCharge ) { // Charge selection
354 if ( fUsePositiveCharge && part->Charge() < 0.) continue; // keep Positives
355 if ( !fUsePositiveCharge && part->Charge() > 0.) continue; // keep Negatives
358 if ( part->Pt() < fTrackPtCut ) continue;
360 TVector3 partVect(part->Px(), part->Py(), part->Pz());
362 Double_t deltaPhi = jetVect[0].DeltaPhi(partVect)+k270rad;
363 if( deltaPhi > 2.*TMath::Pi() ) deltaPhi-= 2.*TMath::Pi();
364 fhdNdEta_PhiDist->Fill( deltaPhi );
365 fhFullRegPartPtDistVsEt->Fill( part->Pt(), maxPtJet1 );
367 Int_t region = IsTrackInsideRegion( jetVect, &partVect );
370 if( maxPartPtRegion < part->Pt() ) maxPartPtRegion = part->Pt();
371 sumPtRegionPosit += part->Pt();
373 fhTransRegPartPtDistVsEt->Fill( part->Pt(), maxPtJet1 );
376 if( maxPartPtRegion < part->Pt() ) maxPartPtRegion = part->Pt();
377 sumPtRegionNegat += part->Pt();
379 fhTransRegPartPtDistVsEt->Fill( part->Pt(), maxPtJet1 );
383 //How quantities will be sorted before Fill Min and Max Histogram
384 // 1=Plots will be CDF-like
385 // 2=Plots will be Marchesini-like
386 if( fOrdering == 1 ) {
387 if( sumPtRegionPosit > sumPtRegionNegat ) {
388 FillSumPtRegion( maxPtJet1, sumPtRegionPosit/fAreaReg, sumPtRegionNegat/fAreaReg );
390 FillSumPtRegion( maxPtJet1, sumPtRegionNegat/fAreaReg, sumPtRegionPosit/fAreaReg );
392 if (nTrackRegionPosit > nTrackRegionNegat ) {
393 FillMultRegion( maxPtJet1, nTrackRegionPosit/fAreaReg, nTrackRegionNegat/fAreaReg, sumPtRegionNegat/fAreaReg );
395 FillMultRegion( maxPtJet1, nTrackRegionNegat/fAreaReg, nTrackRegionPosit/fAreaReg, sumPtRegionPosit/fAreaReg );
397 } else if( fOrdering == 2 ) {
398 if (sumPtRegionPosit > sumPtRegionNegat) {
399 FillSumPtRegion( maxPtJet1, sumPtRegionPosit/fAreaReg, sumPtRegionNegat/fAreaReg );
400 FillMultRegion( maxPtJet1, nTrackRegionPosit/fAreaReg, nTrackRegionNegat/fAreaReg, sumPtRegionNegat/fAreaReg );
402 FillSumPtRegion( maxPtJet1, sumPtRegionNegat/fAreaReg, sumPtRegionPosit/fAreaReg );
403 FillMultRegion( maxPtJet1, nTrackRegionNegat/fAreaReg, nTrackRegionPosit/fAreaReg, sumPtRegionPosit/fAreaReg );
407 Double_t avePosRegion = (nTrackRegionPosit) ? sumPtRegionPosit/nTrackRegionPosit : 0.;
408 Double_t aveNegRegion = (nTrackRegionNegat) ? sumPtRegionNegat/nTrackRegionNegat : 0.;
409 if( avePosRegion > aveNegRegion ) {
410 FillAvePartPtRegion( maxPtJet1, avePosRegion/fAreaReg, aveNegRegion/fAreaReg );
412 FillAvePartPtRegion( maxPtJet1, aveNegRegion/fAreaReg, avePosRegion/fAreaReg );
415 fhRegionMaxPartPtMaxVsEt->Fill(maxPtJet1, maxPartPtRegion );
417 // Compute pedestal like magnitudes
418 fhRegionDiffSumPtVsEt->Fill(maxPtJet1, TMath::Abs(sumPtRegionPosit-sumPtRegionNegat)/(2.0*fAreaReg));
419 fhRegionAveSumPtVsEt->Fill(maxPtJet1, (sumPtRegionPosit+sumPtRegionNegat)/(2.0*fAreaReg));
423 //____________________________________________________________________
424 void AliAnalysisTaskUE::FillSumPtRegion( Double_t leadingE, Double_t ptMax, Double_t ptMin )
426 // Fill sumPt of control regions
429 fhRegionSumPtMaxVsEt->Fill( leadingE, ptMax );
431 fhRegionSumPtMinVsEt->Fill( leadingE, ptMin );
432 // MAke distributions for UE comparison with MB data
433 fhMinRegSumPt->Fill(ptMin);
436 //____________________________________________________________________
437 void AliAnalysisTaskUE::FillAvePartPtRegion( Double_t leadingE, Double_t ptMax, Double_t ptMin )
439 // Fill average particle Pt of control regions
442 fhRegionAvePartPtMaxVsEt->Fill( leadingE, ptMax );
444 fhRegionAvePartPtMinVsEt->Fill( leadingE, ptMin );
445 // MAke distributions for UE comparison with MB data
446 fhMinRegAvePt->Fill(ptMin);
449 //____________________________________________________________________
450 void AliAnalysisTaskUE::FillMultRegion( Double_t leadingE, Double_t nTrackPtmax, Double_t nTrackPtmin, Double_t ptMin )
452 // Fill Nch multiplicity of control regions
455 fhRegionMultMaxVsEt->Fill( leadingE, nTrackPtmax );
456 fhRegionMultMax->Fill( nTrackPtmax );
458 fhRegionMultMinVsEt->Fill( leadingE, nTrackPtmin );
459 fhRegionMultMin->Fill( nTrackPtmin );
460 // MAke distributions for UE comparison with MB data
461 fhMinRegSumPtvsMult->Fill(nTrackPtmin,ptMin);
464 //____________________________________________________________________
465 Int_t AliAnalysisTaskUE::IsTrackInsideRegion(TVector3 *jetVect, TVector3 *partVect)
467 // return de region in delta phi
468 // -1 negative delta phi
469 // 1 positive delta phi
471 static const Double_t k60rad = 60.*TMath::Pi()/180.;
472 static const Double_t k120rad = 120.*TMath::Pi()/180.;
475 if( fRegionType == 1 ) {
476 if( TMath::Abs(partVect->Eta()) > fTrackEtaCut ) return 0;
477 // transverse regions
478 if (jetVect[0].DeltaPhi(*partVect) < -k60rad && jetVect[0].DeltaPhi(*partVect) > -k120rad ) region = -1;
479 if (jetVect[0].DeltaPhi(*partVect) > k60rad && jetVect[0].DeltaPhi(*partVect) < k120rad ) region = 1;
481 } else if( fRegionType == 2 ) {
483 Double_t deltaR = 0.;
485 TVector3 positVect,negatVect;
486 positVect.SetMagThetaPhi(1, 2.*atan(exp(-jetVect[0].Eta())), jetVect[0].Phi()+TMath::PiOver2());
487 negatVect.SetMagThetaPhi(1, 2.*atan(exp(-jetVect[0].Eta())), jetVect[0].Phi()-TMath::PiOver2());
489 if (TMath::Abs(positVect.DeltaPhi(*partVect)) < fConeRadius ) {
491 deltaR = positVect.DrEtaPhi(*partVect);
492 } else if (TMath::Abs(negatVect.DeltaPhi(*partVect)) < fConeRadius) {
494 deltaR = negatVect.DrEtaPhi(*partVect);
497 if (deltaR > fConeRadius) region = 0;
500 AliError("Unknow region type");
502 // For debug (to be removed)
503 //if( region != 0 ) fhValidRegion->Fill( partVect->Eta()-jetVect[0].Eta(), jetVect[0].DeltaPhi(*partVect) );
509 //____________________________________________________________________
510 TObjArray* AliAnalysisTaskUE::FindChargedParticleJets()
512 // Return a TObjArray of "charged particle jets"
514 // Charged particle jet definition from reference:
516 // "Charged jet evolution and the underlying event
517 // in proton-antiproton collisions at 1.8 TeV"
518 // PHYSICAL REVIEW D 65 092002, CDF Collaboration
520 // We define "jets" as circular regions in eta-phi space with
521 // radius defined by R = sqrt( (eta-eta0)^2 +(phi-phi0)^2 ).
522 // Our jet algorithm is as follows:
523 // 1- Order all charged particles according to their pT .
524 // 2- Start with the highest pT particle and include in the jet all
525 // particles within the radius R=0.7 considering each particle
526 // in the order of decreasing pT and recalculating the centroid
527 // of the jet after each new particle is added to the jet .
528 // 3- Go to the next highest pT particle not already included in
529 // a jet and add to the jet all particles not already included in
530 // a jet within R=0.7.
531 // 4- Continue until all particles are in a jet.
532 // We define the transverse momentum of the jet to be
533 // the scalar pT sum of all the particles within the jet, where pT
534 // is measured with respect to the beam axis
536 // 1 - Order all charged particles according to their pT .
537 Int_t nTracks = fAOD->GetNTracks();
538 if( !nTracks ) return 0;
539 TObjArray tracks(nTracks);
541 for (Int_t ipart=0; ipart<nTracks; ++ipart) {
542 AliAODTrack* part = fAOD->GetTrack( ipart );
543 if( !part->TestFilterBit(fFilterBit) ) continue; // track cut selection
544 if( !part->Charge() ) continue;
545 if( part->Pt() < fTrackPtCut ) continue;
546 tracks.AddLast(part);
548 QSortTracks( tracks, 0, tracks.GetEntriesFast() );
550 nTracks = tracks.GetEntriesFast();
551 if( !nTracks ) return 0;
552 TObjArray *jets = new TObjArray(nTracks);
553 TIter itrack(&tracks);
555 // 2- Start with the highest pT particle ...
557 AliAODTrack* track = (AliAODTrack*)itrack.Next();
558 if( !track ) continue;
562 pt = track->Pt(); // Use the energy member to store Pt
563 jets->AddLast( new TLorentzVector(px, py, pz, pt) );
564 tracks.Remove( track );
565 TLorentzVector* jet = (TLorentzVector*)jets->Last();
566 // 3- Go to the next highest pT particle not already included...
568 while ( (track1 = (AliAODTrack*)(itrack.Next())) ) {
569 Double_t dphi = TVector2::Phi_mpi_pi(jet->Phi()-track1->Phi());
570 Double_t r = TMath::Sqrt( (jet->Eta()-track1->Eta())*(jet->Eta()-track1->Eta()) +
572 if( r < fConeRadius ) {
573 Double_t Pt = jet->E()+track1->Pt(); // Scalar sum of Pt
574 // recalculating the centroid
575 Double_t eta = jet->Eta()*jet->E()/Pt + track1->Eta()/Pt;
576 Double_t phi = jet->Phi()*jet->E()/Pt + track1->Phi()/Pt;
577 jet->SetPtEtaPhiE( 1., eta, phi, Pt );
578 tracks.Remove( track1 );
583 nTracks = tracks.GetEntries();
584 // 4- Continue until all particles are in a jet.
586 } // end while nTracks
588 // Convert to AODjets....
589 Int_t njets = jets->GetEntriesFast();
590 TObjArray* aodjets = new TObjArray(njets);
591 aodjets->SetOwner(kTRUE);
592 for(Int_t ijet=0; ijet<njets; ++ijet) {
593 TLorentzVector* jet = (TLorentzVector*)jets->At(ijet);
594 Float_t px, py,pz,en; // convert to 4-vector
595 px = jet->E() * TMath::Cos(jet->Phi()); // Pt * cos(phi)
596 py = jet->E() * TMath::Sin(jet->Phi()); // Pt * sin(phi)
597 pz = jet->E() / TMath::Tan(2.0 * TMath::ATan(TMath::Exp(-jet->Eta())));
598 en = TMath::Sqrt(px * px + py * py + pz * pz);
599 aodjets->AddLast( new AliAODJet(px, py, pz, en) );
601 // Order jets according to their pT .
602 QSortTracks( *aodjets, 0, aodjets->GetEntriesFast() );
605 if (fDebug>3) AliInfo(Form(" %d Charged jets found\n",njets));
610 //____________________________________________________________________
611 void AliAnalysisTaskUE::QSortTracks(TObjArray &a, Int_t first, Int_t last)
613 // Sort array of TObjArray of tracks by Pt using a quicksort algorithm.
616 static int i; // "static" to save stack space
619 while (last - first > 1) {
623 while (++i < last && ((AliVParticle*)a[i])->Pt() > ((AliVParticle*)a[first])->Pt() )
625 while (--j > first && ((AliVParticle*)a[j])->Pt() < ((AliVParticle*)a[first])->Pt() )
641 if (j - first < last - (j + 1)) {
642 QSortTracks(a, first, j);
643 first = j + 1; // QSortTracks(j + 1, last);
645 QSortTracks(a, j + 1, last);
646 last = j; // QSortTracks(first, j);
651 //____________________________________________________________________
652 void AliAnalysisTaskUE::SetRegionArea(TVector3 *jetVect)
654 Double_t fAreaCorrFactor=0.;
655 Double_t deltaEta = 0.;
656 if (fRegionType==1) fAreaReg = 2.*fTrackEtaCut*60.*TMath::Pi()/180.;
657 else if (fRegionType==2){
658 deltaEta = 0.9-TMath::Abs(jetVect[0].Eta());
659 if (deltaEta>fConeRadius) fAreaReg = TMath::Pi()*fConeRadius*fConeRadius;
661 fAreaCorrFactor = fConeRadius*fConeRadius*TMath::ACos(deltaEta/fConeRadius) -
662 (deltaEta*fConeRadius)*TMath::Sqrt( 1. - deltaEta*deltaEta/(fConeRadius*fConeRadius));
663 fAreaReg=TMath::Pi()*fConeRadius*fConeRadius-fAreaCorrFactor;
665 }else AliWarning("Unknown Rgion Type");
666 if (fDebug>5) AliInfo(Form("\n dEta=%5.3f Angle =%5.3f Region Area = %5.3f Corr Factor=%5.4f \n",deltaEta,TMath::ACos(deltaEta/fConeRadius),fAreaReg,fAreaCorrFactor));
669 //____________________________________________________________________
670 void AliAnalysisTaskUE::CreateHistos()
672 fListOfHistos = new TList();
675 fhNJets = new TH1F("fhNJets", "n Jet", 10, 0, 10);
676 fhNJets->SetXTitle("# of jets");
678 fListOfHistos->Add( fhNJets ); // At(0)
680 fhEleadingPt = new TH1F("hEleadingPt", "Leading Jet P_{T}", fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist);
681 fhEleadingPt->SetXTitle("P_{T} (GeV/c)");
682 fhEleadingPt->SetYTitle("dN/dP_{T}");
683 fhEleadingPt->Sumw2();
684 fListOfHistos->Add( fhEleadingPt ); // At(1)
686 fhMinRegPtDist = new TH1F("hMinRegPtDist", "P_{T} distribution in Min zone", 50,0.,20.);
687 fhMinRegPtDist->SetXTitle("P_{T} (GeV/c)");
688 fhMinRegPtDist->SetYTitle("dN/dP_{T}");
689 fhMinRegPtDist->Sumw2();
690 fListOfHistos->Add( fhMinRegPtDist ); // At(2)
692 fhRegionMultMin = new TH1F("hRegionMultMin", "N_{ch}^{90, min}", 21, -0.5, 20.5);
693 fhRegionMultMin->SetXTitle("N_{ch tracks}");
694 fhRegionMultMin->Sumw2();
695 fListOfHistos->Add( fhRegionMultMin ); // At(3)
697 fhMinRegAvePt = new TH1F("hMinRegAvePt", "#LTp_{T}#GT", 50, 0., 20.);
698 fhMinRegAvePt->SetXTitle("P_{T} (GeV/c)");
699 fhMinRegAvePt->Sumw2();
700 fListOfHistos->Add( fhMinRegAvePt ); // At(4)
702 fhMinRegSumPt = new TH1F("hMinRegSumPt", "#Sigma p_{T} ", 50, 0., 20.);
703 fhMinRegSumPt->SetYTitle("Ed^{3}N_{tracks}/dp^{3} (c^{3}/GeV^{2})");
704 fhMinRegSumPt->SetXTitle("#Sigma p_{T} (GeV/c)");
705 fhMinRegSumPt->Sumw2();
706 fListOfHistos->Add( fhMinRegSumPt ); // At(5)
708 fhMinRegMaxPtPart = new TH1F("hMinRegMaxPtPart", "max(p_{T})|_{event} ", 50, 0., 20.);
709 fhMinRegMaxPtPart->SetYTitle("Ed^{3}N_{tracks}/dp^{3} (c^{3}/GeV^{2})");
710 fhMinRegMaxPtPart->SetXTitle("p_{T} (GeV/c)");
711 fhMinRegMaxPtPart->Sumw2();
712 fListOfHistos->Add( fhMinRegMaxPtPart ); // At(6)
714 fhMinRegSumPtvsMult = new TH1F("hMinRegSumPtvsMult", "#Sigma p_{T} vs. Multiplicity ", 21, -0.5, 20.5);
715 fhMinRegSumPtvsMult->SetYTitle("#Sigma p_{T} (GeV/c)");
716 fhMinRegSumPtvsMult->SetXTitle("N_{charge}");
717 fhMinRegSumPtvsMult->Sumw2();
718 fListOfHistos->Add( fhMinRegSumPtvsMult ); // At(7);
720 fhdNdEta_PhiDist = new TH1F("hdNdEta_PhiDist", "Charge particle density |#eta|< 1 vs #Delta#phi", 120, 0., 2.*TMath::Pi());
721 fhdNdEta_PhiDist->SetXTitle("#Delta#phi");
722 fhdNdEta_PhiDist->SetYTitle("dN_{ch}/d#etad#phi");
723 fhdNdEta_PhiDist->Sumw2();
724 fListOfHistos->Add( fhdNdEta_PhiDist ); // At(8)
726 // Can be use to get part pt distribution for differente Jet Pt bins
727 fhFullRegPartPtDistVsEt = new TH2F("hFullRegPartPtDistVsEt", "dN/dP_{T} |#eta|<1 vs Leading Jet P_{T}",
728 50,0.,50., fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist);
729 fhFullRegPartPtDistVsEt->SetYTitle("Leading Jet P_{T}");
730 fhFullRegPartPtDistVsEt->SetXTitle("p_{T}");
731 fhFullRegPartPtDistVsEt->Sumw2();
732 fListOfHistos->Add( fhFullRegPartPtDistVsEt ); // At(9)
734 // Can be use to get part pt distribution for differente Jet Pt bins
735 fhTransRegPartPtDistVsEt = new TH2F("hTransRegPartPtDistVsEt", "dN/dP_{T} in tranvese regions |#eta|<1 vs Leading Jet P_{T}",
736 50,0.,50., fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist);
737 fhTransRegPartPtDistVsEt->SetYTitle("Leading Jet P_{T}");
738 fhTransRegPartPtDistVsEt->SetXTitle("p_{T}");
739 fhTransRegPartPtDistVsEt->Sumw2();
740 fListOfHistos->Add( fhTransRegPartPtDistVsEt ); // At(10)
743 fhRegionSumPtMaxVsEt = new TH1F("hRegionSumPtMaxVsEt", "P_{T}^{90, max} vs Leading Jet P_{T}", fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist);
744 fhRegionSumPtMaxVsEt->SetXTitle("P_{T} (GeV/c)");
745 fhRegionSumPtMaxVsEt->Sumw2();
746 fListOfHistos->Add( fhRegionSumPtMaxVsEt ); // At(11)
748 fhRegionSumPtMinVsEt = new TH1F("hRegionSumPtMinVsEt", "P_{T}^{90, min} vs Leading Jet P_{T}", fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist);
749 fhRegionSumPtMinVsEt->SetXTitle("P_{T} (GeV/c)");
750 fhRegionSumPtMinVsEt->Sumw2();
751 fListOfHistos->Add( fhRegionSumPtMinVsEt ); // At(12)
753 fhRegionMultMax = new TH1I("hRegionMultMax", "N_{ch}^{90, max}", 21, -0.5, 20.5);
754 fhRegionMultMax->SetXTitle("N_{ch tracks}");
755 fhRegionMultMax->Sumw2();
756 fListOfHistos->Add( fhRegionMultMax ); // At(13)
758 fhRegionMultMaxVsEt = new TH1F("hRegionMultMaxVsEt", "N_{ch}^{90, max} vs Leading Jet P_{T}", fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist);
759 fhRegionMultMaxVsEt->SetXTitle("E (GeV hRegionAveSumPtVsEt/c)");
760 fhRegionMultMaxVsEt->Sumw2();
761 fListOfHistos->Add( fhRegionMultMaxVsEt ); // At(14)
763 fhRegionMultMinVsEt = new TH1F("hRegionMultMinVsEt", "N_{ch}^{90, min} vs Leading Jet P_{T}", fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist);
764 fhRegionMultMinVsEt->SetXTitle("E (GeV/c)");
765 fhRegionMultMinVsEt->Sumw2();
766 fListOfHistos->Add( fhRegionMultMinVsEt ); // At(15)
768 fhRegionAveSumPtVsEt = new TH1F("hRegionAveSumPtVsEt", "(P_{T}^{90, max} + P_{T}^{90, min})/2 vs Leading Jet P_{T}", fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist);
769 fhRegionAveSumPtVsEt->SetXTitle("P_{T} (GeV/c)");
770 fhRegionAveSumPtVsEt->Sumw2();
771 fListOfHistos->Add( fhRegionAveSumPtVsEt ); // At(16)
773 fhRegionDiffSumPtVsEt= new TH1F("hRegionPtDiffVsEt", "(P_{T}^{90, max} - P_{T}^{90, min}) vs Leading Jet P_{T}", fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist);
774 fhRegionDiffSumPtVsEt->SetXTitle("P_{T} (GeV/c)");
775 fhRegionDiffSumPtVsEt->Sumw2();
776 fListOfHistos->Add( fhRegionDiffSumPtVsEt ); // At(17)
778 fhRegionAvePartPtMaxVsEt = new TH1F("hRegionAvePartPtMaxVsEt", "#LTp_{T}#GT^{90, max} vs Leading Jet P_{T}", fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist);
779 fhRegionAvePartPtMaxVsEt->SetXTitle("P_{T} (GeV/c)");
780 fhRegionAvePartPtMaxVsEt->Sumw2();
781 fListOfHistos->Add( fhRegionAvePartPtMaxVsEt ); // At(18)
783 fhRegionAvePartPtMinVsEt = new TH1F("hRegionAvePartPtMinVsEt", "#LTp_{T}#GT^{90, min} vs Leading Jet P_{T}", fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist);
784 fhRegionAvePartPtMinVsEt->SetXTitle("P_{T} (GeV/c)");
785 fhRegionAvePartPtMinVsEt->Sumw2();
786 fListOfHistos->Add( fhRegionAvePartPtMinVsEt ); // At(19)
788 fhRegionMaxPartPtMaxVsEt = new TH1F("hRegionMaxPartPtMaxVsEt", "max(p_{T})^{90} vs Leading Jet P_{T}", fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist);
789 fhRegionMaxPartPtMaxVsEt->SetXTitle("P_{T} (GeV/c)");
790 fhRegionMaxPartPtMaxVsEt->Sumw2();
791 fListOfHistos->Add( fhRegionMaxPartPtMaxVsEt ); // At(20)
793 fSettingsTree = new TTree("UEAnalysisSettings","Analysis Settings in UE estimation");
794 fListOfHistos->Add( fSettingsTree ); // At(21)
797 // For debug region selection
798 fhValidRegion = new TH2F("hValidRegion", "dN/d#eta/d#phi",
799 20, -2.,2., 62, -TMath::Pi(), TMath::Pi());
800 fhValidRegion->SetYTitle("#Delta#phi");
801 fhValidRegion->Sumw2();
802 fListOfHistos->Add( fhValidRegion ); // At(15)
806 //____________________________________________________________________
807 void AliAnalysisTaskUE::Terminate(Option_t */*option*/)
809 // Terminate analysis
812 //Save Analysis Settings
815 // Normalize histos to region area TODO:
816 // Normalization done at Analysis, taking into account
817 // area variations on per-event basis (cone case)
819 // Draw some Test plot to the screen
820 if (!gROOT->IsBatch()) {
822 // Update pointers reading them from the output slot
823 fListOfHistos = dynamic_cast<TList*> (GetOutputData(0));
824 if( !fListOfHistos ) {
825 AliError("Histogram List is not available");
828 fhEleadingPt = (TH1F*)fListOfHistos->At(1);
829 fhdNdEta_PhiDist = (TH1F*)fListOfHistos->At(8);
830 fhRegionSumPtMaxVsEt = (TH1F*)fListOfHistos->At(11);
831 fhRegionSumPtMinVsEt = (TH1F*)fListOfHistos->At(12);
832 fhRegionMultMaxVsEt = (TH1F*)fListOfHistos->At(14);
833 fhRegionMultMinVsEt = (TH1F*)fListOfHistos->At(15);
834 fhRegionAveSumPtVsEt = (TH1F*)fListOfHistos->At(16);
836 fhNJets = (TH1F*)fListOfHistos->At(0);
839 TCanvas* c1 = new TCanvas("c1",Form("sumPt dist (%s)", GetTitle()),60,60,1200,800);
842 TH1F *h1r = new TH1F("hRegionEtvsSumPtMax" , "", fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist);
843 h1r->Divide(fhRegionSumPtMaxVsEt,fhEleadingPt,1,1);
844 //h1r->Scale( areafactor );
845 h1r->SetMarkerStyle(20);
846 h1r->SetXTitle("P_{T} of Leading Jet (GeV/c)");
847 h1r->SetYTitle("P_{T}^{90, max}");
852 TH1F *h2r = new TH1F("hRegionEtvsSumPtMin" , "", fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist);
853 h2r->Divide(fhRegionSumPtMinVsEt,fhEleadingPt,1,1);
854 //h2r->Scale( areafactor );
855 h2r->SetMarkerStyle(20);
856 h2r->SetXTitle("P_{T} of Leading Jet (GeV/c)");
857 h2r->SetYTitle("P_{T}^{90, min}");
861 TH1F *h4r = new TH1F("hRegionEtvsDiffPt" , "", fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist);
862 h4r->Divide(fhRegionAveSumPtVsEt,fhEleadingPt,1,1);
863 h4r->Scale(2.); // make average
864 //h4r->Scale( areafactor );
865 h4r->SetYTitle("#DeltaP_{T}^{90}");
866 h4r->SetXTitle("P_{T} of Leading Jet (GeV/c)");
867 h4r->SetMarkerStyle(20);
871 TH1F *h5r = new TH1F("hRegionMultMaxVsEtleading", "", fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist);
872 TH1F *h6r = new TH1F("hRegionMultMinVsEtleading", "", fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist);
874 h5r->Divide(fhRegionMultMaxVsEt,fhEleadingPt,1,1);
875 h6r->Divide(fhRegionMultMinVsEt,fhEleadingPt,1,1);
876 //h5r->Scale( areafactor );
877 //h6r->Scale( areafactor );
878 h5r->SetYTitle("N_{Tracks}^{90}");
879 h5r->SetXTitle("P_{T} of Leading Jet (GeV/c)");
880 h5r->SetMarkerStyle(20);
882 h6r->SetMarkerStyle(21);
883 h6r->SetMarkerColor(2);
884 h6r->SetYTitle("N_{Tracks}^{90}");
885 h6r->SetXTitle("P_{T} of Leading Jet (GeV/c)");
886 h6r->DrawCopy("p same");
889 TCanvas* c2 = new TCanvas("c2","Jet Pt dist",160,160,1200,800);
892 fhEleadingPt->SetMarkerStyle(20);
893 fhEleadingPt->SetMarkerColor(2);
894 fhEleadingPt->DrawCopy("p");
898 fhdNdEta_PhiDist->SetMarkerStyle(20);
899 fhdNdEta_PhiDist->SetMarkerColor(2);
900 fhdNdEta_PhiDist->DrawCopy("p");
906 //fhTransRegPartPtDist = (TH1F*)fListOfHistos->At(2);
907 fhRegionMultMin = (TH1F*)fListOfHistos->At(3);
908 fhMinRegAvePt = (TH1F*)fListOfHistos->At(4);
909 fhMinRegSumPt = (TH1F*)fListOfHistos->At(5);
910 //fhMinRegMaxPtPart = (TH1F*)fListOfHistos->At(6);
911 fhMinRegSumPtvsMult = (TH1F*)fListOfHistos->At(7);
914 TCanvas* c3 = new TCanvas("c3"," p_{T} dist",160,160,1200,800);
917 /*fhTransRegPartPtDist->SetMarkerStyle(20);
918 fhTransRegPartPtDist->SetMarkerColor(2);
919 fhTransRegPartPtDist->Scale(areafactor/fhTransRegPartPtDist->GetEntries());
920 fhTransRegPartPtDist->DrawCopy("p");
924 fhMinRegSumPt->SetMarkerStyle(20);
925 fhMinRegSumPt->SetMarkerColor(2);
926 //fhMinRegSumPt->Scale(areafactor);
927 fhMinRegSumPt->DrawCopy("p");
931 fhMinRegAvePt->SetMarkerStyle(20);
932 fhMinRegAvePt->SetMarkerColor(2);
933 //fhMinRegAvePt->Scale(areafactor);
934 fhMinRegAvePt->DrawCopy("p");
939 TH1F *h7r = new TH1F("hRegionMultMinVsMult", "", 21, -0.5, 20.5);
941 h7r->Divide(fhMinRegSumPtvsMult,fhRegionMultMin,1,1);
943 h7r->SetMarkerStyle(20);
944 h7r->SetMarkerColor(2);
951 fhValidRegion->SetMarkerStyle(20);
952 fhValidRegion->SetMarkerColor(2);
953 fhValidRegion->DrawCopy("p");
957 AliInfo(" Batch mode, not histograms will be shown...");
961 AliInfo("End analysis");
965 void AliAnalysisTaskUE::WriteSettings()
968 fSettingsTree->Branch("fAnaType", &fAnaType, "Ana/I");
969 fSettingsTree->Branch("fRegionType", &fRegionType,"Reg/I");
970 fSettingsTree->Branch("fConeRadius", &fConeRadius,"Rad/D");
971 fSettingsTree->Branch("fUseChPartJet", &fUseChPartJet,"UseChPart/O");
972 fSettingsTree->Branch("fUseSingleCharge", &fUseSingleCharge,"UseSingleCh/O");
973 fSettingsTree->Branch("fUsePositiveCharge", &fUsePositiveCharge,"UsePositiveCh/O");
974 fSettingsTree->Branch("fOrdering", &fOrdering,"OrderMeth/I");
975 fSettingsTree->Branch("fJet1EtaCut", &fJet1EtaCut, "LeadJetEtaCut/D");
976 fSettingsTree->Branch("fJet2DeltaPhiCut", &fJet2DeltaPhiCut, "DeltaPhi/D");
977 fSettingsTree->Branch("fJet2RatioPtCut", &fJet2RatioPtCut, "Jet2Ratio/D");
978 fSettingsTree->Branch("fJet3PtCut", &fJet3PtCut, "Jet3PtCut/D");
979 fSettingsTree->Branch("fTrackPtCut", &fTrackPtCut, "TrackPtCut/D");
980 fSettingsTree->Branch("fTrackEtaCut", &fTrackEtaCut, "TrackEtaCut/D");
981 fSettingsTree->Fill();
984 AliInfo(" All Analysis Settings in Saved Tree");
985 fSettingsTree->Scan();