2 // ******************************************
3 // This task computes several jet observables like
4 // the fraction of energy in inner and outer coronnas,
5 // jet-track correlations,triggered jet shapes and
6 // correlation strength distribution of particles inside jets.
7 // Author: lcunquei@cern.ch
8 // *******************************************
11 /**************************************************************************
12 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
14 * Author: The ALICE Off-line Project. *
15 * Contributors are mentioned in the code where appropriate. *
17 * Permission to use, copy, modify and distribute this software and its *
18 * documentation strictly for non-commercial purposes is hereby granted *
19 * without fee, provided that the above copyright notice appears in all *
20 * copies and that both the copyright notice and this permission notice *
21 * appear in the supporting documentation. The authors make no claims *
22 * about the suitability of this software for any purpose. It is *
23 * provided "as is" without express or implied warranty. *
24 **************************************************************************/
33 #include "THnSparse.h"
38 #include "AliAnalysisTask.h"
39 #include "AliAnalysisManager.h"
41 #include "AliVEvent.h"
42 #include "AliESDEvent.h"
43 #include "AliESDInputHandler.h"
44 #include "AliCentrality.h"
45 #include "AliAnalysisHelperJetTasks.h"
46 #include "AliInputEventHandler.h"
47 #include "AliAODJetEventBackground.h"
48 #include "AliAnalysisTaskFastEmbedding.h"
49 #include "AliAODEvent.h"
50 #include "AliAODHandler.h"
51 #include "AliAODJet.h"
53 #include "AliAnalysisTaskJetCore.h"
55 ClassImp(AliAnalysisTaskJetCore)
57 AliAnalysisTaskJetCore::AliAnalysisTaskJetCore() :
63 fBackgroundBranch(""),
66 fOfflineTrgMask(AliVEvent::kAny),
79 fAngStructCloseTracks(0),
96 fJetTriggerExcludeMask(AliAODJet::kHighTrackPtTriggered),
97 fJetPtFractionMin(0.5),
105 fHistEvtSelection(0x0),
108 fh2JetCoreMethod1C10(0x0),
109 fh2JetCoreMethod2C10(0x0),
110 fh2JetCoreMethod1C20(0x0),
111 fh2JetCoreMethod2C20(0x0),
112 fh2JetCoreMethod1C30(0x0),
113 fh2JetCoreMethod2C30(0x0),
114 fh2JetCoreMethod1C60(0x0),
115 fh2JetCoreMethod2C60(0x0),
116 fh3JetTrackC3060(0x0),
118 fh3JetTrackC4080(0x0),
119 fh2AngStructpt1C10(0x0),
120 fh2AngStructpt2C10(0x0),
121 fh2AngStructpt3C10(0x0),
122 fh2AngStructpt4C10(0x0),
123 fh2AngStructpt1C20(0x0),
124 fh2AngStructpt2C20(0x0),
125 fh2AngStructpt3C20(0x0),
126 fh2AngStructpt4C20(0x0),
127 fh2AngStructpt1C30(0x0),
128 fh2AngStructpt2C30(0x0),
129 fh2AngStructpt3C30(0x0),
130 fh2AngStructpt4C30(0x0),
131 fh2AngStructpt1C60(0x0),
132 fh2AngStructpt2C60(0x0),
133 fh2AngStructpt3C60(0x0),
134 fh2AngStructpt4C60(0x0),
138 fh3JetDensityA4(0x0),
140 fh3spectriggeredC4080(0x0),
141 fh3spectriggeredC20(0x0),
142 fh3spectriggeredC3060(0x0)
146 // default Constructor
150 for(Int_t i=0; i<10; i++) {
151 for(Int_t j=0; j<6; j++) {
160 fJetBranchName[0] = "";
161 fJetBranchName[1] = "";
163 fListJets[0] = new TList;
164 fListJets[1] = new TList;
167 AliAnalysisTaskJetCore::AliAnalysisTaskJetCore(const char *name) :
168 AliAnalysisTaskSE(name),
173 fBackgroundBranch(""),
176 fOfflineTrgMask(AliVEvent::kAny),
188 fNInputTracksMax(-1),
189 fAngStructCloseTracks(0),
206 fJetTriggerExcludeMask(AliAODJet::kHighTrackPtTriggered),
207 fJetPtFractionMin(0.5),
215 fHistEvtSelection(0x0),
218 fh2JetCoreMethod1C10(0x0),
219 fh2JetCoreMethod2C10(0x0),
220 fh2JetCoreMethod1C20(0x0),
221 fh2JetCoreMethod2C20(0x0),
222 fh2JetCoreMethod1C30(0x0),
223 fh2JetCoreMethod2C30(0x0),
224 fh2JetCoreMethod1C60(0x0),
225 fh2JetCoreMethod2C60(0x0),
226 fh3JetTrackC3060(0x0),
228 fh3JetTrackC4080(0x0),
229 fh2AngStructpt1C10(0x0),
230 fh2AngStructpt2C10(0x0),
231 fh2AngStructpt3C10(0x0),
232 fh2AngStructpt4C10(0x0),
233 fh2AngStructpt1C20(0x0),
234 fh2AngStructpt2C20(0x0),
235 fh2AngStructpt3C20(0x0),
236 fh2AngStructpt4C20(0x0),
237 fh2AngStructpt1C30(0x0),
238 fh2AngStructpt2C30(0x0),
239 fh2AngStructpt3C30(0x0),
240 fh2AngStructpt4C30(0x0),
241 fh2AngStructpt1C60(0x0),
242 fh2AngStructpt2C60(0x0),
243 fh2AngStructpt3C60(0x0),
244 fh2AngStructpt4C60(0x0),
248 fh3JetDensityA4(0x0),
250 fh3spectriggeredC4080(0x0),
251 fh3spectriggeredC20(0x0),
252 fh3spectriggeredC3060(0x0)
258 for(Int_t i=0; i<10; i++) {
259 for(Int_t j=0; j<6; j++) {
266 fJetBranchName[0] = "";
267 fJetBranchName[1] = "";
269 fListJets[0] = new TList;
270 fListJets[1] = new TList;
272 DefineOutput(1, TList::Class());
275 AliAnalysisTaskJetCore::~AliAnalysisTaskJetCore()
281 void AliAnalysisTaskJetCore::SetBranchNames(const TString &branch1, const TString &branch2)
283 fJetBranchName[0] = branch1;
284 fJetBranchName[1] = branch2;
287 void AliAnalysisTaskJetCore::Init()
290 // check for jet branches
291 if(!strlen(fJetBranchName[0].Data()) || !strlen(fJetBranchName[1].Data())){
292 AliError("Jet branch name not set.");
297 void AliAnalysisTaskJetCore::UserCreateOutputObjects()
302 if(!fOutputList) fOutputList = new TList;
303 fOutputList->SetOwner(kTRUE);
305 Bool_t oldStatus = TH1::AddDirectoryStatus();
306 TH1::AddDirectory(kFALSE);
309 fHistEvtSelection = new TH1I("fHistEvtSelection", "event selection", 6, -0.5, 5.5);
310 fHistEvtSelection->GetXaxis()->SetBinLabel(1,"ACCEPTED");
311 fHistEvtSelection->GetXaxis()->SetBinLabel(2,"events IN");
312 fHistEvtSelection->GetXaxis()->SetBinLabel(3,"event selection (rejected)");
313 fHistEvtSelection->GetXaxis()->SetBinLabel(4,"vertex cut (rejected)");
314 fHistEvtSelection->GetXaxis()->SetBinLabel(5,"centrality (rejected)");
315 fHistEvtSelection->GetXaxis()->SetBinLabel(6,"multiplicity (rejected)");
317 UInt_t entries = 0; // bit coded, see GetDimParams() below
318 entries = 1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<6 |1<<7;
319 fhnDeltaR = NewTHnSparseF("fhnDeltaR", entries);
321 //change binning in pTtrack
322 Double_t *xPt3 = new Double_t[10];
324 for(int i = 1; i<=9;i++){
325 if(xPt3[i-1]<2)xPt3[i] = xPt3[i-1] + 0.4; // 1 - 5
326 else if(xPt3[i-1]<11)xPt3[i] = xPt3[i-1] + 3; // 5 - 12
327 else xPt3[i] = xPt3[i-1] + 150.; // 18
329 fhnDeltaR->SetBinEdges(2,xPt3);
332 //change binning in HTI
333 Double_t *xPt4 = new Double_t[14];
335 for(int i = 1; i<=13;i++){
336 if(xPt4[i-1]<10)xPt4[i] = xPt4[i-1] + 1; // 1 - 10
337 else if(xPt4[i-1]<20)xPt4[i] = xPt4[i-1] + 5; // 10 - 12
338 else xPt4[i] = xPt4[i-1] + 30.; // 13
340 fhnDeltaR->SetBinEdges(6,xPt4);
350 UInt_t cifras = 0; // bit coded, see GetDimParams() below
351 cifras = 1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<7;
352 fhnMixedEvents = NewTHnSparseF("fhnMixedEvents", cifras);}
355 fh2JetCoreMethod1C10 = new TH2F("JetCoreMethod1C10","",150, 0., 150.,100, 0., 1.5);
356 fh2JetCoreMethod2C10 = new TH2F("JetCoreMethod2C10","",150, 0., 150.,100, 0., 1.5);
357 fh2JetCoreMethod1C20 = new TH2F("JetCoreMethod1C20","",150, 0., 150.,100, 0., 1.5);
358 fh2JetCoreMethod2C20 = new TH2F("JetCoreMethod2C20","",150, 0., 150.,100, 0., 1.5);
359 fh2JetCoreMethod1C30 = new TH2F("JetCoreMethod1C30","",150, 0., 150.,100, 0., 1.5);
360 fh2JetCoreMethod2C30 = new TH2F("JetCoreMethod2C30","",150, 0., 150.,100, 0., 1.5);
361 fh2JetCoreMethod1C60 = new TH2F("JetCoreMethod1C60","",150, 0., 150.,100, 0., 1.5);
362 fh2JetCoreMethod2C60 = new TH2F("JetCoreMethod2C60","",150, 0., 150.,100, 0., 1.5);}
364 fh3JetTrackC3060=new TH3F("JetTrackC3060","",50,0,50,150,0.,150.,34,0,3.4);
365 fh3JetTrackC20=new TH3F("JetTrackC20","",50,0,50,150,0.,150.,34,0,3.4);
366 fh3JetTrackC4080=new TH3F("JetTrackC4080","",50,0,50,150,0.,150.,34,0,3.4);
367 if(fAngStructCloseTracks>0){
368 fh2AngStructpt1C10 = new TH2F("Ang struct pt1 C10","",15,0.,1.5,150,0.,10.);
369 fh2AngStructpt2C10 = new TH2F("Ang struct pt2 C10","",15,0.,1.5,150,0.,10.);
370 fh2AngStructpt3C10 = new TH2F("Ang struct pt3 C10","",15,0.,1.5,150,0.,10.);
371 fh2AngStructpt4C10 = new TH2F("Ang struct pt4 C10","",15,0.,1.5,150,0.,10.);
372 fh2AngStructpt1C20 = new TH2F("Ang struct pt1 C20","",15,0.,1.5,150,0.,10.);
373 fh2AngStructpt2C20 = new TH2F("Ang struct pt2 C20","",15,0.,1.5,150,0.,10.);
374 fh2AngStructpt3C20 = new TH2F("Ang struct pt3 C20","",15,0.,1.5,150,0.,10.);
375 fh2AngStructpt4C20 = new TH2F("Ang struct pt4 C20","",15,0.,1.5,150,0.,10.);
376 fh2AngStructpt1C30 = new TH2F("Ang struct pt1 C30","",15,0.,1.5,150,0.,10.);
377 fh2AngStructpt2C30 = new TH2F("Ang struct pt2 C30","",15,0.,1.5,150,0.,10.);
378 fh2AngStructpt3C30 = new TH2F("Ang struct pt3 C30","",15,0.,1.5,150,0.,10.);
379 fh2AngStructpt4C30 = new TH2F("Ang struct pt4 C30","",15,0.,1.5,150,0.,10.);
380 fh2AngStructpt1C60 = new TH2F("Ang struct pt1 C60","",15,0.,1.5,150,0.,10.);
381 fh2AngStructpt2C60 = new TH2F("Ang struct pt2 C60","",15,0.,1.5,150,0.,10.);
382 fh2AngStructpt3C60 = new TH2F("Ang struct pt3 C60","",15,0.,1.5,150,0.,10.);
383 fh2AngStructpt4C60 = new TH2F("Ang struct pt4 C60","",15,0.,1.5,150,0.,10.); }
387 fh2Ntriggers=new TH2F("# of triggers","",10,0.,100.,50,0.,50.);
388 fh2Ntriggers2=new TH2F("# of triggers2","",100,0.,4000.,50,0.,50.);
390 fh3JetDensity=new TH3F("Jet density vs mutliplicity A>0.4","",100,0.,4000.,100,0.,5.,10,0.,50.);
391 fh3JetDensityA4=new TH3F("Jet density vs multiplicity A>0.4","",100,0.,4000.,100,0.,5.,10,0.,50.);
392 fh2RPJets=new TH2F("RPJet","",3,0.,3.,150,0.,150.);
393 fh3spectriggeredC4080 = new TH3F("Triggered spectrumC4080","",100,0.,1.,140,-80.,200.,10,0.,50.);
394 fh3spectriggeredC20 = new TH3F("Triggered spectrumC20","",100,0.,1.,140,-80.,200.,10,0.,50.);
395 fh3spectriggeredC3060 = new TH3F("Triggered spectrumC3060","",100,0.,1.,140,-80.,200.,10,0.,50.);
399 fOutputList->Add(fHistEvtSelection);
401 fOutputList->Add(fhnDeltaR);
403 fOutputList->Add(fhnMixedEvents);
409 fOutputList->Add(fh2JetCoreMethod1C10);
410 fOutputList->Add(fh2JetCoreMethod2C10);
411 fOutputList->Add(fh2JetCoreMethod1C20);
412 fOutputList->Add(fh2JetCoreMethod2C20);
413 fOutputList->Add(fh2JetCoreMethod1C30);
414 fOutputList->Add(fh2JetCoreMethod2C30);
415 fOutputList->Add(fh2JetCoreMethod1C60);
416 fOutputList->Add(fh2JetCoreMethod2C60);}
418 fOutputList->Add(fh3JetTrackC3060);
419 fOutputList->Add(fh3JetTrackC20);
420 fOutputList->Add(fh3JetTrackC4080);
425 if(fAngStructCloseTracks>0){
426 fOutputList->Add(fh2AngStructpt1C10);
427 fOutputList->Add(fh2AngStructpt2C10);
428 fOutputList->Add(fh2AngStructpt3C10);
429 fOutputList->Add(fh2AngStructpt4C10);
430 fOutputList->Add(fh2AngStructpt1C20);
431 fOutputList->Add(fh2AngStructpt2C20);
432 fOutputList->Add(fh2AngStructpt3C20);
433 fOutputList->Add(fh2AngStructpt4C20);
434 fOutputList->Add(fh2AngStructpt1C30);
435 fOutputList->Add(fh2AngStructpt2C30);
436 fOutputList->Add(fh2AngStructpt3C30);
437 fOutputList->Add(fh2AngStructpt4C30);
438 fOutputList->Add(fh2AngStructpt1C60);
439 fOutputList->Add(fh2AngStructpt2C60);
440 fOutputList->Add(fh2AngStructpt3C60);
441 fOutputList->Add(fh2AngStructpt4C60);}
447 fOutputList->Add(fh2Ntriggers);
448 fOutputList->Add(fh2Ntriggers2);
449 fOutputList->Add(fh3JetDensity);
450 fOutputList->Add(fh3JetDensityA4);
451 fOutputList->Add(fh2RPJets);
452 fOutputList->Add(fh3spectriggeredC4080);
453 fOutputList->Add(fh3spectriggeredC20);
454 fOutputList->Add(fh3spectriggeredC3060);
457 // =========== Switch on Sumw2 for all histos ===========
458 for (Int_t i=0; i<fOutputList->GetEntries(); ++i) {
459 TH1 *h1 = dynamic_cast<TH1*>(fOutputList->At(i));
464 THnSparse *hn = dynamic_cast<THnSparse*>(fOutputList->At(i));
469 TH1::AddDirectory(oldStatus);
471 PostData(1, fOutputList);
474 void AliAnalysisTaskJetCore::UserExec(Option_t *)
478 if(!strlen(fJetBranchName[0].Data()) || !strlen(fJetBranchName[1].Data())){
479 AliError("Jet branch name not set.");
483 fESD=dynamic_cast<AliESDEvent*>(InputEvent());
485 AliError("ESD not available");
486 fAODIn = dynamic_cast<AliAODEvent*>(InputEvent());
488 fAODOut = dynamic_cast<AliAODEvent*>(AODEvent());
490 static AliAODEvent* aod = 0;
491 // take all other information from the aod we take the tracks from
493 if(!fESD)aod = fAODIn;
498 if(fNonStdFile.Length()!=0){
499 // case that we have an AOD extension we need can fetch the jets from the extended output
500 AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
501 fAODExtension = (aodH?aodH->GetExtension(fNonStdFile.Data()):0);
503 if(fDebug>1)Printf("AODExtension found for %s",fNonStdFile.Data());
507 // -- event selection --
508 fHistEvtSelection->Fill(1); // number of events before event selection
511 AliInputEventHandler* inputHandler = (AliInputEventHandler*)
512 ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
513 cout<<inputHandler->IsEventSelected()<<" "<<fOfflineTrgMask<<endl;
514 if(!(inputHandler->IsEventSelected() & fOfflineTrgMask)){
515 if(fDebug) Printf(" Trigger Selection: event REJECTED ... ");
516 fHistEvtSelection->Fill(2);
517 PostData(1, fOutputList);
523 if(fDebug) Printf("%s:%d No AOD",(char*)__FILE__,__LINE__);
524 fHistEvtSelection->Fill(3);
525 PostData(1, fOutputList);
527 AliAODVertex* primVtx = aod->GetPrimaryVertex();
530 if(fDebug) Printf("%s:%d No primVtx",(char*)__FILE__,__LINE__);
531 fHistEvtSelection->Fill(3);
532 PostData(1, fOutputList);
536 Int_t nTracksPrim = primVtx->GetNContributors();
537 if ((nTracksPrim < fMinContribVtx) ||
538 (primVtx->GetZ() < fVtxZMin) ||
539 (primVtx->GetZ() > fVtxZMax) ){
540 if(fDebug) Printf("%s:%d primary vertex z = %f: event REJECTED...",(char*)__FILE__,__LINE__,primVtx->GetZ());
541 fHistEvtSelection->Fill(3);
542 PostData(1, fOutputList);
546 // event class selection (from jet helper task)
547 Int_t eventClass = AliAnalysisHelperJetTasks::EventClass();
548 if(fDebug) Printf("Event class %d", eventClass);
549 if (eventClass < fEvtClassMin || eventClass > fEvtClassMax){
550 fHistEvtSelection->Fill(4);
551 PostData(1, fOutputList);
555 // centrality selection
556 AliCentrality *cent = 0x0;
557 Double_t centValue = 0.;
559 if(fESD) {cent = fESD->GetCentrality();
560 if(cent) centValue = cent->GetCentralityPercentile("V0M");}
561 else centValue=aod->GetHeader()->GetCentrality();
563 if(fDebug) printf("centrality: %f\n", centValue);
564 if (centValue < fCentMin || centValue > fCentMax){
565 fHistEvtSelection->Fill(4);
566 PostData(1, fOutputList);
571 fHistEvtSelection->Fill(0);
573 // -- end event selection --
576 AliAODJetEventBackground* externalBackground = 0;
577 if(fAODOut&&!externalBackground&&fBackgroundBranch.Length()){
578 externalBackground = (AliAODJetEventBackground*)(fAODOut->FindListObject(fBackgroundBranch.Data()));
579 if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
581 if(fAODExtension&&!externalBackground&&fBackgroundBranch.Length()){
582 externalBackground = (AliAODJetEventBackground*)(fAODExtension->GetAOD()->FindListObject(fBackgroundBranch.Data()));
583 if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
586 if(fAODIn&&!externalBackground&&fBackgroundBranch.Length()){
587 externalBackground = (AliAODJetEventBackground*)(fAODIn->FindListObject(fBackgroundBranch.Data()));
588 if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
594 if(externalBackground)rho = externalBackground->GetBackground(0);}
596 if(externalBackground)rho = externalBackground->GetBackground(2);}
599 TClonesArray *aodJets[2];
601 if(fAODOut&&!aodJets[0]){
602 aodJets[0] = dynamic_cast<TClonesArray*>(fAODOut->FindListObject(fJetBranchName[0].Data()));
603 aodJets[1] = dynamic_cast<TClonesArray*>(fAODOut->FindListObject(fJetBranchName[1].Data())); }
604 if(fAODExtension && !aodJets[0]){
605 aodJets[0] = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fJetBranchName[0].Data()));
606 aodJets[1] = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fJetBranchName[1].Data())); }
607 if(fAODIn&&!aodJets[0]){
608 aodJets[0] = dynamic_cast<TClonesArray*>(fAODIn->FindListObject(fJetBranchName[0].Data()));
609 aodJets[1] = dynamic_cast<TClonesArray*>(fAODIn->FindListObject(fJetBranchName[1].Data())); }
612 //Double_t ptsub[aodJets[0]->GetEntriesFast()];
613 //Int_t inord[aodJets[0]->GetEntriesFast()];
614 //for(Int_t n=0;n<aodJets[0]->GetEntriesFast();n++){
619 Int_t nT = GetListOfTracks(&ParticleList);
620 for (Int_t iJetType = 0; iJetType < 2; iJetType++) {
621 fListJets[iJetType]->Clear();
622 if (!aodJets[iJetType]) continue;
624 if(fDebug) Printf("%s: %d jets",fJetBranchName[iJetType].Data(),aodJets[iJetType]->GetEntriesFast());
627 for (Int_t iJet = 0; iJet < aodJets[iJetType]->GetEntriesFast(); iJet++) {
628 AliAODJet *jet = dynamic_cast<AliAODJet*>((*aodJets[iJetType])[iJet]);
629 if (jet) fListJets[iJetType]->Add(jet);
631 // ptsub[iJet]=jet->Pt()-rho*jet->EffectiveAreaCharged();}
640 Double_t areasmall=0;
641 Double_t phismall=0.;
647 Int_t trigBBTrack=-1;
648 Int_t trigInTrack=-1;
649 fRPAngle = aod->GetHeader()->GetEventplane();
652 AliVParticle *partback = (AliVParticle*)ParticleList.At(nT);
654 PostData(1, fOutputList);
656 fh2Ntriggers->Fill(centValue,partback->Pt());
657 fh2Ntriggers2->Fill(ParticleList.GetEntries(),partback->Pt());
659 Double_t accep=2.*TMath::Pi()*1.8;
662 for(Int_t i=0; i<fListJets[0]->GetEntries(); ++i){
663 AliAODJet* jetbig = (AliAODJet*)(fListJets[0]->At(i));
664 etabig = jetbig->Eta();
665 phibig = jetbig->Phi();
666 ptbig = jetbig->Pt();
667 if(ptbig==0) continue;
668 Int_t phiBin = GetPhiBin(phibig-fRPAngle);
669 areabig = jetbig->EffectiveAreaCharged();
670 Double_t ptcorr=ptbig-rho*areabig;
671 if((etabig<fJetEtaMin)||(etabig>fJetEtaMax)) continue;
672 if(areabig>=0.07) injet=injet+1;
673 if(areabig>=0.4) injet4=injet4+1;
674 Double_t dphi=RelativePhi(partback->Phi(),phibig);
677 Double_t etadif= partback->Eta()-etabig;
678 if(TMath::Abs(etadif)<=0.5){
679 if(centValue>40. && centValue<80.) fh3JetTrackC4080->Fill(partback->Pt(),ptcorr,TMath::Abs(dphi));
680 if(centValue<20.) fh3JetTrackC20->Fill(partback->Pt(),ptcorr,TMath::Abs(dphi));
681 if(centValue>30. && centValue<60.) fh3JetTrackC3060->Fill(partback->Pt(),ptcorr,TMath::Abs(dphi));}}
683 if(centValue>40. && centValue<80.) fh3JetTrackC4080->Fill(partback->Pt(),ptcorr,TMath::Abs(dphi));
684 if(centValue<20.) fh3JetTrackC20->Fill(partback->Pt(),ptcorr,TMath::Abs(dphi));
685 if(centValue>30. && centValue<60.) fh3JetTrackC3060->Fill(partback->Pt(),ptcorr,TMath::Abs(dphi));}
689 if(fFlagJetHadron==0){
690 if(fFlagPhiBkg!=0) if((TMath::Abs(dphi)<TMath::Pi()/2.-0.1)||(TMath::Abs(dphi)>TMath::Pi()/2.+0.1)) continue;
691 if(fFlagPhiBkg==0) if(TMath::Abs(dphi)<TMath::Pi()-0.6) continue;}
693 if(fFlagJetHadron!=0) if(TMath::Abs(dphi)>0.4) continue;
696 if(centValue<20.) fh2RPJets->Fill(phiBin, ptcorr);
697 Double_t dismin=100.;
701 if(centValue>40. && centValue<80.) fh3spectriggeredC4080->Fill(jetbig->EffectiveAreaCharged(),ptcorr,partback->Pt());
702 if(centValue<20.) fh3spectriggeredC20->Fill(jetbig->EffectiveAreaCharged(),ptcorr,partback->Pt());
703 if(centValue>30. && centValue<60.) fh3spectriggeredC3060->Fill(jetbig->EffectiveAreaCharged(),ptcorr,partback->Pt());
705 if(ptcorr<=0) continue;
708 AliAODTrack* leadtrack=0;
711 if(fFlagJetHadron==0){
712 TRefArray *genTrackList = jetbig->GetRefTracks();
713 Int_t nTracksGenJet = genTrackList->GetEntriesFast();
714 AliAODTrack* genTrack;
715 for(Int_t ir=0; ir<nTracksGenJet; ++ir){
716 genTrack = (AliAODTrack*)(genTrackList->At(ir));
717 if(genTrack->Pt()>ppt){ppt=genTrack->Pt();
719 leadtrack=(AliAODTrack*)(genTrackList->At(ippt));
720 if(!leadtrack) continue;}
722 AliVParticle* leadtrackb=0;
723 if(fFlagJetHadron!=0){
724 Int_t nTb = GetHardestTrackBackToJet(jetbig);
725 leadtrackb = (AliVParticle*)ParticleList.At(nTb);
726 if(!leadtrackb) continue;
733 //store one trigger info
742 for(Int_t j=0; j<fListJets[1]->GetEntries(); ++j){
743 AliAODJet* jetsmall = (AliAODJet*)(fListJets[1]->At(j));
744 etasmall = jetsmall->Eta();
745 phismall = jetsmall->Phi();
746 ptsmall = jetsmall->Pt();
747 areasmall = jetsmall->EffectiveAreaCharged();
748 Double_t tmpDeltaR=(phismall-phibig)*(phismall-phibig)+(etasmall-etabig)*(etasmall-etabig);
749 tmpDeltaR=TMath::Sqrt(tmpDeltaR);
750 //Fraction in the jet core
751 if((ptsmall>ptmax)&&(tmpDeltaR<=fRadioFrac)){ptmax=ptsmall;
753 if(tmpDeltaR<=dismin){ dismin=tmpDeltaR;
754 index1=j;}} //en of loop over R=0.2 jets
755 //method1:most concentric jet=core
756 if(dismin<fMinDist){ AliAODJet* jetmethod1 = (AliAODJet*)(fListJets[1]->At(index1));
757 if(centValue<10) fh2JetCoreMethod1C10->Fill(ptcorr,jetmethod1->Pt()/ptbig);
758 if((centValue>20)&&(centValue<40)) fh2JetCoreMethod1C20->Fill(ptcorr,jetmethod1->Pt()/ptbig);
759 if((centValue>30)&&(centValue<60)) fh2JetCoreMethod1C30->Fill(ptcorr,jetmethod1->Pt()/ptbig);
760 if(centValue>60) fh2JetCoreMethod1C60->Fill(ptcorr,jetmethod1->Pt()/ptbig); }
761 //method2:hardest contained jet=core
763 AliAODJet* jetmethod2 = (AliAODJet*)(fListJets[1]->At(index2));
764 if(centValue<10) fh2JetCoreMethod2C10->Fill(ptcorr,jetmethod2->Pt()/ptbig);
765 if((centValue>20)&&(centValue<40)) fh2JetCoreMethod2C20->Fill(ptcorr,jetmethod2->Pt()/ptbig);
766 if((centValue>30)&&(centValue<60)) fh2JetCoreMethod2C30->Fill(ptcorr,jetmethod2->Pt()/ptbig);
767 if(centValue>60) fh2JetCoreMethod2C60->Fill(ptcorr,jetmethod2->Pt()/ptbig); }}
770 if(fDoEventMixing==0 && fFlagOnlyRecoil==0){
771 for(int it = 0;it<ParticleList.GetEntries();++it){
772 AliVParticle *part = (AliVParticle*)ParticleList.At(it);
773 Double_t deltaR = jetbig->DeltaR(part);
774 Double_t deltaEta = etabig-part->Eta();
777 Double_t deltaPhi=phibig-part->Phi();
778 if(deltaPhi<-0.5*TMath::Pi()) deltaPhi+=2.*TMath::Pi();
779 if(deltaPhi>3./2.*TMath::Pi()) deltaPhi-=2.*TMath::Pi();
781 if(fFlagJetHadron==0) pTcont=leadtrack->Pt();
782 if(fFlagJetHadron!=0) pTcont=leadtrackb->Pt();
783 Double_t jetEntries[8] = {centValue,ptcorr,part->Pt(),deltaR,deltaEta,deltaPhi,pTcont,partback->Pt()};
784 fhnDeltaR->Fill(jetEntries);}
787 //end of track loop, we only do it if EM is switched off
798 if(injet>0) fh3JetDensity->Fill(ParticleList.GetEntries(),injet/accep,partback->Pt());
799 if(injet4>0)fh3JetDensityA4->Fill(ParticleList.GetEntries(),injet4/accep,partback->Pt());
805 if(fDoEventMixing>0){
806 //check before if the trigger exists
807 // fTrigBuffer[i][0] = zvtx
808 // fTrigBuffer[i][1] = phi
809 // fTrigBuffer[i][2] = eta
810 // fTrigBuffer[i][3] = pt_jet
811 // fTrigBuffer[i][4] = pt_trig
812 // fTrigBuffer[i][5]= centrality
813 if(fTindex==10) fTindex=0;
814 if(fTrigBuffer[fTindex][3]>0){
815 if (TMath::Abs(fTrigBuffer[fTindex][0]-primVtx->GetZ()<2.)){
816 if (TMath::Abs(fTrigBuffer[fTindex][5]-centValue<5)){
818 for(int it = 0;it<nT;++it){
819 AliVParticle *part = (AliVParticle*)ParticleList.At(it);
820 Double_t DPhi = fTrigBuffer[fTindex][1] - part->Phi();
821 Double_t DEta = fTrigBuffer[fTindex][2] - part->Eta();
822 Double_t DR=TMath::Sqrt(DPhi*DPhi+DEta*DEta);
823 if(DPhi<-0.5*TMath::Pi()) DPhi+=2.*TMath::Pi();
824 if(DPhi>3./2.*TMath::Pi()) DPhi-=2.*TMath::Pi();
825 Double_t triggerEntries[7] = {centValue,fTrigBuffer[fTindex][3],part->Pt(),DR,DEta,DPhi,fTrigBuffer[fTindex][4]};
826 fhnMixedEvents->Fill(triggerEntries);
829 if(fNevents==10) fTindex=fTindex+1;
832 if(fTindex==10&&fNevents==10) fCountAgain=0;
834 // Copy the triggers from the current event into the buffer.
835 //again, only if the trigger exists:
838 AliAODJet* jetT = (AliAODJet*)(fListJets[0]->At(trigJet)); AliVParticle *partT = (AliVParticle*)ParticleList.At(trigBBTrack);
839 fTrigBuffer[fTrigBufferIndex][0] = primVtx->GetZ();
840 fTrigBuffer[fTrigBufferIndex][1] = jetT->Phi();
841 fTrigBuffer[fTrigBufferIndex][2] = jetT->Eta();
842 fTrigBuffer[fTrigBufferIndex][3] = jetT->Pt()-rho*jetT->EffectiveAreaCharged();
843 fTrigBuffer[fTrigBufferIndex][4] = partT->Pt();
844 fTrigBuffer[fTrigBufferIndex][5] = centValue;
846 if(fTrigBufferIndex==9) {fTrigBufferIndex=0;
855 //////////////////ANGULAR STRUCTURE//////////////////////////////////////
857 //tracks up to R=0.8 distant from the jet axis
858 // if(fAngStructCloseTracks==1){
859 // TList CloseTrackList;
860 // Int_t nn=GetListOfTracksCloseToJet(&CloseTrackList,jetbig);
861 // Double_t difR=0.04;
862 // for(Int_t l=0;l<15;l++){
863 // Double_t rr=l*0.1+0.1;
864 // for(int it = 0;it<nn;++it){
865 // AliVParticle *part1 = (AliVParticle*)CloseTrackList.At(it);
866 // for(int itu=it+1;itu<CloseTrackList.GetEntries();itu++){
867 // AliVParticle *part2 = (AliVParticle*)CloseTrackList.At(itu);
868 // Double_t ptm=part1->Pt();
869 // Double_t ptn=part2->Pt();
870 // Double_t Rnm = (part1->Eta()-part2->Eta())*(part1->Eta()-part2->Eta())+(part1->Phi()-part2->Phi())*(part1->Phi()-part2->Phi());
871 // Rnm=TMath::Sqrt(Rnm);
872 // Double_t deltag=(1./(TMath::Sqrt(2*TMath::Pi())*difR))*TMath::Exp(-1.*(rr-Rnm)*(rr-Rnm)/(2.*difR*difR));
873 // Double_t stepf=0.5*(1.+TMath::Erf((rr-Rnm)/(TMath::Sqrt(2.)*difR)));
874 // if((ptcorr<85.) && (ptcorr>=70.)){up1[l]=up1[l]+ptm*ptn*Rnm*Rnm*deltag;
875 // down1[l]=down1[l]+ptm*ptn*Rnm*Rnm*stepf;}
876 // if((ptcorr<100.) && (ptcorr>=85.)){up2[l]=up2[l]+ptm*ptn*Rnm*Rnm*deltag;
877 // down2[l]=down2[l]+ptm*ptn*Rnm*Rnm*stepf;}
878 // if((ptcorr<120.) && (ptcorr>=100.)){up3[l]=up3[l]+ptm*ptn*Rnm*Rnm*deltag;
879 // down3[l]=down3[l]+ptm*ptn*Rnm*Rnm*stepf;}
880 // if((ptcorr<140.) && (ptcorr>=120.)){up4[l]=up4[l]+ptm*ptn*Rnm*Rnm*deltag;
881 // down4[l]=down4[l]+ptm*ptn*Rnm*Rnm*stepf;}}}}
884 // //only jet constituents
885 // if(fAngStructCloseTracks==2){
887 // Double_t difR=0.04;
888 // for(Int_t l=0;l<15;l++){
889 // Double_t rr=l*0.1+0.1;
892 // AliAODTrack* part1;
893 // AliAODTrack* part2;
895 // TRefArray *genTrackListb = jetbig->GetRefTracks();
896 // Int_t nTracksGenJetb = genTrackListb->GetEntriesFast();
900 // for(Int_t it=0; it<nTracksGenJetb; ++it){
901 // part1 = (AliAODTrack*)(genTrackListb->At(it));
902 // for(Int_t itu=0; itu<nTracksGenJetb; ++itu){
903 // part2 = (AliAODTrack*)(genTrackListb->At(itu));
904 // Double_t ptm=part1->Pt();
905 // Double_t ptn=part2->Pt();
906 // Double_t Rnm = (part1->Eta()-part2->Eta())*(part1->Eta()-part2->Eta())+(part1->Phi()-part2->Phi())*(part1->Phi()-part2->Phi());
907 // Rnm=TMath::Sqrt(Rnm);
908 // Double_t deltag=(1./(TMath::Sqrt(2*TMath::Pi())*difR))*TMath::Exp(-1.*(rr-Rnm)*(rr-Rnm)/(2.*difR*difR));
909 // Double_t stepf=0.5*(1.+TMath::Erf((rr-Rnm)/(TMath::Sqrt(2.)*difR)));
910 // if((ptcorr<85.) && (ptcorr>=70.)){up1[l]=up1[l]+ptm*ptn*Rnm*Rnm*deltag;
911 // down1[l]=down1[l]+ptm*ptn*Rnm*Rnm*stepf;}
912 // if((ptcorr<100.) && (ptcorr>=85.)){up2[l]=up2[l]+ptm*ptn*Rnm*Rnm*deltag;
913 // down2[l]=down2[l]+ptm*ptn*Rnm*Rnm*stepf;}
914 // if((ptcorr<120.) && (ptcorr>=100.)){up3[l]=up3[l]+ptm*ptn*Rnm*Rnm*deltag;
915 // down3[l]=down3[l]+ptm*ptn*Rnm*Rnm*stepf;}
916 // if((ptcorr<140.) && (ptcorr>=120.)){up4[l]=up4[l]+ptm*ptn*Rnm*Rnm*deltag;
917 // down4[l]=down4[l]+ptm*ptn*Rnm*Rnm*stepf;}}}}}
919 // //end loop over R=0.4 jets
920 // if(fAngStructCloseTracks>0){
921 // for(Int_t l=0;l<15;l++){
922 // Double_t rr=l*0.1+0.1;
924 // if(centValue<10.)fh2AngStructpt1C10->Fill(rr,rr*up1[l]/down1[l]);
925 // if(centValue>20. && centValue<40.) fh2AngStructpt1C20->Fill(rr,rr*up1[l]/down1[l]);
926 // if(centValue>30. && centValue<60.) fh2AngStructpt1C30->Fill(rr,rr*up1[l]/down1[l]);
927 // if(centValue>60.) fh2AngStructpt1C60->Fill(rr,rr*up1[l]/down1[l]);}
929 // if(centValue<10.) fh2AngStructpt2C10->Fill(rr,rr*up2[l]/down2[l]);
930 // if(centValue>20. && centValue<40.) fh2AngStructpt2C20->Fill(rr,rr*up2[l]/down2[l]);
931 // if(centValue>30. && centValue<60.) fh2AngStructpt2C30->Fill(rr,rr*up2[l]/down2[l]);
932 // if(centValue>60.) fh2AngStructpt2C60->Fill(rr,rr*up2[l]/down2[l]);}
934 // if(centValue<10.) fh2AngStructpt3C10->Fill(rr,rr*up3[l]/down3[l]);
935 // if(centValue>20. && centValue<40.) fh2AngStructpt3C20->Fill(rr,rr*up3[l]/down3[l]);
936 // if(centValue>30. && centValue<60.) fh2AngStructpt3C30->Fill(rr,rr*up3[l]/down3[l]);
937 // if(centValue>60.) fh2AngStructpt3C60->Fill(rr,rr*up3[l]/down3[l]);}
939 // if(centValue<10.) fh2AngStructpt4C10->Fill(rr,rr*up4[l]/down4[l]);
940 // if(centValue>20. && centValue<40.) fh2AngStructpt4C20->Fill(rr,rr*up4[l]/down4[l]);
941 // if(centValue>30. && centValue<60.) fh2AngStructpt4C30->Fill(rr,rr*up4[l]/down4[l]);
942 // if(centValue>60.) fh2AngStructpt4C60->Fill(rr,rr*up4[l]/down4[l]);}}}
950 PostData(1, fOutputList);
953 void AliAnalysisTaskJetCore::Terminate(const Option_t *)
955 // Draw result to the screen
956 // Called once at the end of the query
958 if (!GetOutputData(1))
967 Int_t AliAnalysisTaskJetCore::GetListOfTracks(TList *list){
970 AliAODEvent *aod = 0;
971 if(!fESD)aod = fAODIn;
975 for(int it = 0;it < aod->GetNumberOfTracks();++it){
976 AliAODTrack *tr = aod->GetTrack(it);
977 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
978 if(TMath::Abs(tr->Eta())>0.9)continue;
979 if(tr->Pt()<0.15)continue;
982 if(tr->Pt()>ptmax){ ptmax=tr->Pt();
992 Int_t AliAnalysisTaskJetCore::GetHardestTrackBackToJet(AliAODJet *jetbig){
994 AliAODEvent *aod = 0;
995 if(!fESD)aod = fAODIn;
1002 for(int it = 0;it < aod->GetNumberOfTracks();++it){
1003 AliAODTrack *tr = aod->GetTrack(it);
1004 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
1005 if(TMath::Abs(tr->Eta())>0.9)continue;
1006 if(tr->Pt()<0.15)continue;
1008 dphi=RelativePhi(tr->Phi(),jetbig->Phi());
1009 if(TMath::Abs(dphi)<TMath::Pi()-0.6) continue;
1010 if(tr->Pt()>ptmax){ ptmax=tr->Pt();
1026 Int_t AliAnalysisTaskJetCore::GetListOfTracksCloseToJet(TList *list,AliAODJet *jetbig){
1029 AliAODEvent *aod = 0;
1030 if(!fESD)aod = fAODIn;
1033 for(int it = 0;it < aod->GetNumberOfTracks();++it){
1034 AliAODTrack *tr = aod->GetTrack(it);
1035 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
1036 if(TMath::Abs(tr->Eta())>0.9)continue;
1037 if(tr->Pt()<0.15)continue;
1038 Double_t disR=jetbig->DeltaR(tr);
1039 if(disR>0.8) continue;
1041 //cout<<fAOD->GetNumberOfTracks()<<" "<<tr->Pt()<<endl;
1060 Int_t AliAnalysisTaskJetCore::GetNInputTracks()
1063 Int_t nInputTracks = 0;
1064 AliAODEvent *aod = 0;
1065 if(!fESD)aod = fAODIn;
1067 TString jbname(fJetBranchName[1]);
1068 //needs complete event, use jets without background subtraction
1069 for(Int_t i=1; i<=3; ++i){
1070 if(jbname.Contains(Form("B%d",i))) jbname.ReplaceAll(Form("B%d",i),"B0");
1072 // use only HI event
1073 if(jbname.Contains("AODextraonly")) jbname.ReplaceAll("AODextraonly","AOD");
1074 if(jbname.Contains("AODextra")) jbname.ReplaceAll("AODextra","AOD");
1076 if(fDebug) Printf("Multiplicity from jet branch %s", jbname.Data());
1077 TClonesArray *tmpAODjets = dynamic_cast<TClonesArray*>(aod->FindListObject(jbname.Data()));
1079 Printf("Jet branch %s not found", jbname.Data());
1080 Printf("AliAnalysisTaskJetCore::GetNInputTracks FAILED");
1084 for (Int_t iJet=0; iJet<tmpAODjets->GetEntriesFast(); iJet++){
1085 AliAODJet *jet = dynamic_cast<AliAODJet*>((*tmpAODjets)[iJet]);
1087 TRefArray *trackList = jet->GetRefTracks();
1088 Int_t nTracks = trackList->GetEntriesFast();
1089 nInputTracks += nTracks;
1090 if(fDebug) Printf("#jet%d: %d tracks", iJet, nTracks);
1092 if(fDebug) Printf("---> input tracks: %d", nInputTracks);
1094 return nInputTracks;
1099 Double_t AliAnalysisTaskJetCore::RelativePhi(Double_t mphi,Double_t vphi){
1101 if (vphi < -1*TMath::Pi()) vphi += (2*TMath::Pi());
1102 else if (vphi > TMath::Pi()) vphi -= (2*TMath::Pi());
1103 if (mphi < -1*TMath::Pi()) mphi += (2*TMath::Pi());
1104 else if (mphi > TMath::Pi()) mphi -= (2*TMath::Pi());
1105 double dphi = mphi-vphi;
1106 if (dphi < -1*TMath::Pi()) dphi += (2*TMath::Pi());
1107 else if (dphi > TMath::Pi()) dphi -= (2*TMath::Pi());
1108 return dphi;//dphi in [-Pi, Pi]
1111 Int_t AliAnalysisTaskJetCore::GetPhiBin(Double_t phi)
1114 if(!(TMath::Abs(phi)<=2*TMath::Pi())){AliError("phi w.r.t. RP out of defined range");return -1;}
1115 Double_t phiwrtrp=TMath::ACos(TMath::Abs(TMath::Cos(phi)));
1116 phibin=Int_t(fNRPBins*phiwrtrp/(0.5*TMath::Pi()));
1117 if(phibin<0||phibin>=fNRPBins){AliError("Phi Bin not defined");}
1124 THnSparse* AliAnalysisTaskJetCore::NewTHnSparseF(const char* name, UInt_t entries)
1126 // generate new THnSparseF, axes are defined in GetDimParams()
1129 UInt_t tmp = entries;
1132 tmp = tmp &~ -tmp; // clear lowest bit
1135 TString hnTitle(name);
1136 const Int_t dim = count;
1143 while(c<dim && i<32){
1147 GetDimParams(i, label, nbins[c], xmin[c], xmax[c]);
1148 hnTitle += Form(";%s",label.Data());
1156 return new THnSparseF(name, hnTitle.Data(), dim, nbins, xmin, xmax);
1159 void AliAnalysisTaskJetCore::GetDimParams(Int_t iEntry, TString &label, Int_t &nbins, Double_t &xmin, Double_t &xmax)
1161 // stores label and binning of axis for THnSparse
1163 const Double_t pi = TMath::Pi();
1168 label = "V0 centrality (%)";
1177 label = "corrected jet pt";
1220 label = "leading track";
1228 label = "trigger track";