2 // ******************************************
3 // This task searches for events with large dijet imbalance
4 // and then looks to the jet structure of the b-t-b 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 **************************************************************************/
30 #include "THnSparse.h"
32 #include "TMatrixDSym.h"
33 #include "TMatrixDSymEigen.h"
39 #include "AliAnalysisTask.h"
40 #include "AliAnalysisManager.h"
42 #include "AliVEvent.h"
43 #include "AliESDEvent.h"
44 #include "AliESDInputHandler.h"
45 #include "AliCentrality.h"
46 #include "AliAnalysisHelperJetTasks.h"
47 #include "AliInputEventHandler.h"
48 #include "AliAODJetEventBackground.h"
49 #include "AliAnalysisTaskFastEmbedding.h"
50 #include "AliAODEvent.h"
51 #include "AliAODHandler.h"
52 #include "AliAODJet.h"
54 #include "AliAnalysisTaskAj.h"
56 ClassImp(AliAnalysisTaskAj)
58 AliAnalysisTaskAj::AliAnalysisTaskAj() :
64 fBackgroundBranch(""),
67 fOfflineTrgMask(AliVEvent::kAny),
80 fAngStructCloseTracks(0),
88 fJetTriggerExcludeMask(AliAODJet::kHighTrackPtTriggered),
89 fJetPtFractionMin(0.5),
97 fHistEvtSelection(0x0),
100 fh3LocalCoordinates(0x0),
123 // default Constructor
126 fJetBranchName[0] = "";
127 fJetBranchName[1] = "";
129 fListJets[0] = new TList;
130 fListJets[1] = new TList;
133 AliAnalysisTaskAj::AliAnalysisTaskAj(const char *name) :
134 AliAnalysisTaskSE(name),
139 fBackgroundBranch(""),
142 fOfflineTrgMask(AliVEvent::kAny),
154 fNInputTracksMax(-1),
155 fAngStructCloseTracks(0),
163 fJetTriggerExcludeMask(AliAODJet::kHighTrackPtTriggered),
164 fJetPtFractionMin(0.5),
172 fHistEvtSelection(0x0),
175 fh3LocalCoordinates(0x0),
206 fJetBranchName[0] = "";
207 fJetBranchName[1] = "";
209 fListJets[0] = new TList;
210 fListJets[1] = new TList;
212 DefineOutput(1, TList::Class());
215 AliAnalysisTaskAj::~AliAnalysisTaskAj()
221 void AliAnalysisTaskAj::SetBranchNames(const TString &branch1, const TString &branch2)
223 fJetBranchName[0] = branch1;
224 fJetBranchName[1] = branch2;
227 void AliAnalysisTaskAj::Init()
230 // check for jet branches
231 if(!strlen(fJetBranchName[0].Data()) || !strlen(fJetBranchName[1].Data())){
232 AliError("Jet branch name not set.");
237 void AliAnalysisTaskAj::UserCreateOutputObjects()
242 if(!fOutputList) fOutputList = new TList;
243 fOutputList->SetOwner(kTRUE);
245 Bool_t oldStatus = TH1::AddDirectoryStatus();
246 TH1::AddDirectory(kFALSE);
249 fHistEvtSelection = new TH1I("fHistEvtSelection", "event selection", 6, -0.5, 5.5);
250 fHistEvtSelection->GetXaxis()->SetBinLabel(1,"ACCEPTED");
251 fHistEvtSelection->GetXaxis()->SetBinLabel(2,"events IN");
252 fHistEvtSelection->GetXaxis()->SetBinLabel(3,"event selection (rejected)");
253 fHistEvtSelection->GetXaxis()->SetBinLabel(4,"vertex cut (rejected)");
254 fHistEvtSelection->GetXaxis()->SetBinLabel(5,"centrality (rejected)");
255 fHistEvtSelection->GetXaxis()->SetBinLabel(6,"multiplicity (rejected)");
257 UInt_t entries = 0; // bit coded, see GetDimParams() below
258 entries = 1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<6 |1<<7|1<<8;
259 fhnDeltaR = NewTHnSparseF("fhnDeltaR", entries);
262 //change binning in centrality
263 Double_t *xPt0 = new Double_t[4];
265 for(int i = 1; i<=3;i++){
266 if(xPt0[i-1]<10)xPt0[i] = xPt0[i-1] + 10; // 1 - 5
267 else if(xPt0[i-1]<40)xPt0[i] = xPt0[i-1] + 30; // 5 - 12
268 else xPt0[i] = xPt0[i-1] + 60.; // 18
270 fhnDeltaR->SetBinEdges(0,xPt0);
275 //change binning in jTtrack
276 Double_t *xPt3 = new Double_t[3];
278 for(int i = 1; i<=2;i++){
279 if(xPt3[i-1]<1)xPt3[i] = xPt3[i-1] + 1.; // 1 - 5
280 else xPt3[i] = xPt3[i-1] + 149.; // 18
282 fhnDeltaR->SetBinEdges(3,xPt3);
287 //change binning in pTtrack
288 Double_t *xPt4 = new Double_t[5];
290 for(int i = 1; i<=4;i++){
291 if(xPt4[i-1]<0.4)xPt4[i] = xPt4[i-1] + 0.4; // 1 - 5
292 else if(xPt4[i-1]<3)xPt4[i] = xPt4[i-1] + 2.6; // 5 - 12
293 else if(xPt4[i-1]<10)xPt4[i] = xPt4[i-1] + 7.4; // 5 - 12
294 else xPt4[i] = xPt4[i-1] + 150.; // 18
296 fhnDeltaR->SetBinEdges(4,xPt4);
304 //change binning in HTI
305 Double_t *xPt5 = new Double_t[4];
307 for(int i = 1; i<=3;i++){
308 if(xPt5[i-1]<10)xPt5[i] = xPt5[i-1] + 5; // 10 - 12
309 else xPt5[i] = xPt5[i-1] + 40.; // 13
311 fhnDeltaR->SetBinEdges(8,xPt5);
316 fh2Pt1Pt2C10 = new TH2F("Dijet spectra central","",20,0.,200.,20,0.,200.);
317 fh2Pt1Pt2C40 = new TH2F("Dijet spectra peripheral","",20,0.,200.,20,0.,200.);
318 fh3LocalCoordinates = new TH3F("Local coordinates","",10,-2,2,10,-2,2,10,0,100);
319 fh2Sum2pt20 = new TH2F("pL R<0.2 pt20","",10,0.,1.,100,0.,100.);
320 fh2Sum4pt20 = new TH2F("pL R<0.4 pt20","",10,0.,1.,100,0.,100.);
321 fh2Sum6pt20 = new TH2F("pL R<0.6 pt20","",10,0.,1.,100,0.,100.);
322 fh2Sum8pt20 = new TH2F("pL R<0.8 pt20","",10,0.,1.,100,0.,100.);
323 fh2Sum12pt20 = new TH2F("pL R<1.2 pt20","",10,0.,1.,100,0.,100.);
324 fh2Sum2lpt20 = new TH2F("pL R<0.2 low pt pt20","",10,0.,1.,100,0,100);
325 fh2Sum4lpt20 = new TH2F("pL R<0.4 low pt pt20","",10,0.,1.,100,0,100);
326 fh2Sum6lpt20 = new TH2F("pL R<0.6 low pt pt20","",10,0.,1.,100,0,100);
327 fh2Sum8lpt20 = new TH2F("pL R<0.8 low pt pt20","",10,0.,1.,100,0,100);
328 fh2Sum12lpt20 = new TH2F("pL R<1.2 low pt pt20","",10,0.,1.,100,0,100);
329 fh2Sum2pt40 = new TH2F("pL R<0.2 pt40","",10,0.,1.,100,0.,100.);
330 fh2Sum4pt40 = new TH2F("pL R<0.4 pt40","",10,0.,1.,100,0.,100.);
331 fh2Sum6pt40 = new TH2F("pL R<0.6 pt40","",10,0.,1.,100,0.,100.);
332 fh2Sum8pt40 = new TH2F("pL R<0.8 pt40","",10,0.,1.,100,0.,100.);
333 fh2Sum12pt40 = new TH2F("pL R<1.2 pt40","",10,0.,1.,100,0.,100.);
334 fh2Sum2lpt40 = new TH2F("pL R<0.2 low pt pt40","",10,0.,1.,100,0,100);
335 fh2Sum4lpt40 = new TH2F("pL R<0.4 low pt pt40","",10,0.,1.,100,0,100);
336 fh2Sum6lpt40 = new TH2F("pL R<0.6 low pt pt40","",10,0.,1.,100,0,100);
337 fh2Sum8lpt40 = new TH2F("pL R<0.8 low pt pt40","",10,0.,1.,100,0,100);
338 fh2Sum12lpt40 = new TH2F("pL R<1.2 low pt pt40","",10,0.,1.,100,0,100);
341 fOutputList->Add(fHistEvtSelection);
342 fOutputList->Add(fh2Pt1Pt2C10);
343 fOutputList->Add(fh2Pt1Pt2C40);
344 fOutputList->Add(fh3LocalCoordinates);
346 fOutputList->Add(fh2Sum2pt20);
347 fOutputList->Add(fh2Sum4pt20);
348 fOutputList->Add(fh2Sum6pt20);
349 fOutputList->Add(fh2Sum8pt20);
350 fOutputList->Add(fh2Sum12pt20);
351 fOutputList->Add(fh2Sum2lpt20);
352 fOutputList->Add(fh2Sum4lpt20);
353 fOutputList->Add(fh2Sum6lpt20);
354 fOutputList->Add(fh2Sum8lpt20);
355 fOutputList->Add(fh2Sum12lpt20);
357 fOutputList->Add(fh2Sum2pt40);
358 fOutputList->Add(fh2Sum4pt40);
359 fOutputList->Add(fh2Sum6pt40);
360 fOutputList->Add(fh2Sum8pt40);
361 fOutputList->Add(fh2Sum12pt40);
362 fOutputList->Add(fh2Sum2lpt40);
363 fOutputList->Add(fh2Sum4lpt40);
364 fOutputList->Add(fh2Sum6lpt40);
365 fOutputList->Add(fh2Sum8lpt40);
366 fOutputList->Add(fh2Sum12lpt40);
368 fOutputList->Add(fhnDeltaR);
372 // fOutputList->Add(fh3specbiased);
374 // =========== Switch on Sumw2 for all histos ===========
375 for (Int_t i=0; i<fOutputList->GetEntries(); ++i) {
376 TH1 *h1 = dynamic_cast<TH1*>(fOutputList->At(i));
381 THnSparse *hn = dynamic_cast<THnSparse*>(fOutputList->At(i));
386 TH1::AddDirectory(oldStatus);
388 PostData(1, fOutputList);
391 void AliAnalysisTaskAj::UserExec(Option_t *)
395 if(!strlen(fJetBranchName[0].Data()) || !strlen(fJetBranchName[1].Data())){
396 AliError("Jet branch name not set.");
400 fESD=dynamic_cast<AliESDEvent*>(InputEvent());
402 AliError("ESD not available");
403 fAODIn = dynamic_cast<AliAODEvent*>(InputEvent());}
404 fAODOut = dynamic_cast<AliAODEvent*>(AODEvent());
406 static AliAODEvent* aod = 0;
407 // take all other information from the aod we take the tracks from
409 if(!fESD)aod = fAODIn;
414 if(fNonStdFile.Length()!=0){
415 // case that we have an AOD extension we need can fetch the jets from the extended output
416 AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
417 fAODExtension = (aodH?aodH->GetExtension(fNonStdFile.Data()):0);
419 if(fDebug>1)Printf("AODExtension found for %s",fNonStdFile.Data());
426 // -- event selection --
427 fHistEvtSelection->Fill(1); // number of events before event selection
430 AliInputEventHandler* inputHandler = (AliInputEventHandler*)
431 ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
432 cout<<inputHandler->IsEventSelected()<<" "<<fOfflineTrgMask<<endl;
433 if(!(inputHandler->IsEventSelected() & fOfflineTrgMask)){
434 if(fDebug) Printf(" Trigger Selection: event REJECTED ... ");
435 fHistEvtSelection->Fill(2);
436 PostData(1, fOutputList);
442 if(fDebug) Printf("%s:%d No AOD",(char*)__FILE__,__LINE__);
443 fHistEvtSelection->Fill(3);
444 PostData(1, fOutputList);
446 AliAODVertex* primVtx = aod->GetPrimaryVertex();
449 if(fDebug) Printf("%s:%d No primVtx",(char*)__FILE__,__LINE__);
450 fHistEvtSelection->Fill(3);
451 PostData(1, fOutputList);
455 Int_t nTracksPrim = primVtx->GetNContributors();
456 if ((nTracksPrim < fMinContribVtx) ||
457 (primVtx->GetZ() < fVtxZMin) ||
458 (primVtx->GetZ() > fVtxZMax) ){
459 if(fDebug) Printf("%s:%d primary vertex z = %f: event REJECTED...",(char*)__FILE__,__LINE__,primVtx->GetZ());
460 fHistEvtSelection->Fill(3);
461 PostData(1, fOutputList);
465 // event class selection (from jet helper task)
466 Int_t eventClass = AliAnalysisHelperJetTasks::EventClass();
467 if(fDebug) Printf("Event class %d", eventClass);
468 if (eventClass < fEvtClassMin || eventClass > fEvtClassMax){
469 fHistEvtSelection->Fill(4);
470 PostData(1, fOutputList);
474 // centrality selection
475 AliCentrality *cent = 0x0;
476 Double_t centValue = 0.;
477 if(fESD) {cent = fESD->GetCentrality();
478 if(cent) centValue = cent->GetCentralityPercentile("V0M");}
479 else centValue=aod->GetHeader()->GetCentrality();
481 if(fDebug) printf("centrality: %f\n", centValue);
482 // if (centValue < fCentMin || centValue > fCentMax){
483 // fHistEvtSelection->Fill(4);
484 // PostData(1, fOutputList);
489 fHistEvtSelection->Fill(0);
491 // -- end event selection --
494 AliAODJetEventBackground* externalBackground = 0;
495 if(fAODOut&&!externalBackground&&fBackgroundBranch.Length()){
496 externalBackground = (AliAODJetEventBackground*)(fAODOut->FindListObject(fBackgroundBranch.Data()));
497 if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
499 if(fAODExtension&&!externalBackground&&fBackgroundBranch.Length()){
500 externalBackground = (AliAODJetEventBackground*)(fAODExtension->GetAOD()->FindListObject(fBackgroundBranch.Data()));
501 if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
504 if(fAODIn&&!externalBackground&&fBackgroundBranch.Length()){
505 externalBackground = (AliAODJetEventBackground*)(fAODIn->FindListObject(fBackgroundBranch.Data()));
506 if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
509 if(externalBackground)rho = externalBackground->GetBackground(0);
513 TClonesArray *aodJets[2];
515 if(fAODOut&&!aodJets[0]){
516 aodJets[0] = dynamic_cast<TClonesArray*>(fAODOut->FindListObject(fJetBranchName[0].Data()));
517 aodJets[1] = dynamic_cast<TClonesArray*>(fAODOut->FindListObject(fJetBranchName[1].Data())); }
518 if(fAODExtension && !aodJets[0]){
519 aodJets[0] = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fJetBranchName[0].Data()));
520 aodJets[1] = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fJetBranchName[1].Data())); }
521 if(fAODIn&&!aodJets[0]){
522 aodJets[0] = dynamic_cast<TClonesArray*>(fAODIn->FindListObject(fJetBranchName[0].Data()));
523 aodJets[1] = dynamic_cast<TClonesArray*>(fAODIn->FindListObject(fJetBranchName[1].Data())); }
525 //Double_t ptsub[aodJets[0]->GetEntriesFast()];
526 //Int_t inord[aodJets[0]->GetEntriesFast()];
527 //for(Int_t n=0;n<aodJets[0]->GetEntriesFast();n++){
532 Int_t nT = GetListOfTracks(&ParticleList);
533 for (Int_t iJetType = 0; iJetType < 2; iJetType++) {
534 fListJets[iJetType]->Clear();
535 if (!aodJets[iJetType]) continue;
537 if(fDebug) Printf("%s: %d jets",fJetBranchName[iJetType].Data(),aodJets[iJetType]->GetEntriesFast());
540 for (Int_t iJet = 0; iJet < aodJets[iJetType]->GetEntriesFast(); iJet++) {
541 AliAODJet *jet = dynamic_cast<AliAODJet*>((*aodJets[iJetType])[iJet]);
542 if (jet) fListJets[iJetType]->Add(jet);
544 // ptsub[iJet]=jet->Pt()-rho*jet->EffectiveAreaCharged();}
556 for(Int_t i=0; i<fListJets[0]->GetEntries(); ++i){
557 AliAODJet* jetj = (AliAODJet*)(fListJets[0]->At(i));
562 areaj = jetj->EffectiveAreaCharged();
563 ptcorrj=ptj-rho*areaj;
564 if(ptcorrj<=0) continue;
565 if((etaj<fJetEtaMin)||(eta1>fJetEtaMax)) continue;
566 if(ptcorrj>ptmax){ptmax=ptcorrj;
568 ///hardest jet selected
569 if(selec<0){PostData(1, fOutputList);
571 AliAODJet* jet1 = (AliAODJet*)(fListJets[0]->At(selec));
572 //What is the hardest constituent track?
573 AliAODTrack* leadtrack1;
576 TRefArray *genTrackList = jet1->GetRefTracks();
577 Int_t nTracksGenJet = genTrackList->GetEntriesFast();
578 AliAODTrack* genTrack;
579 for(Int_t ir=0; ir<nTracksGenJet; ++ir){
580 genTrack = (AliAODTrack*)(genTrackList->At(ir));
581 if(genTrack->Pt()>ppt){ppt=genTrack->Pt();
583 leadtrack1=(AliAODTrack*)(genTrackList->At(ippt));
584 //If it doesn't exist or if it is greater that 100 GeV, discard.
585 if(!leadtrack1) {PostData(1, fOutputList);
587 if(leadtrack1->Pt()>=100.){ PostData(1, fOutputList);
590 //Look to the back-to-back jet
592 for(Int_t j=1;j<fListJets[0]->GetEntries();j++){
593 if(j==selec) continue;
594 AliAODJet* jetb = (AliAODJet*)(fListJets[0]->At(j));
599 areaj = jetb->EffectiveAreaCharged();
600 ptcorrj=ptj-rho*areaj;
601 if(ptcorrj<=0) continue;
602 if((etaj<fJetEtaMin)||(etaj>fJetEtaMax)) continue;
603 Double_t dphij=RelativePhi(jetb->Phi(),jet1->Phi());
604 if(TMath::Abs(dphij)>TMath::Pi()-0.2) { btb=j;
607 AliAODJet* jet2 = (AliAODJet*)(fListJets[0]->At(btb));
608 //the back-to-back jet is also identified
610 if(btb<0){PostData(1, fOutputList);
613 Double_t ptcorr1=jet1->Pt()-rho*jet1->EffectiveAreaCharged();
614 Double_t ptcorr2=jet2->Pt()-rho*jet2->EffectiveAreaCharged();
616 if(centValue<10.) fh2Pt1Pt2C10->Fill(ptcorr1,ptcorr2);
617 if(centValue>40.) fh2Pt1Pt2C40->Fill(ptcorr1,ptcorr2);
620 Double_t px2=jet2->Px();
621 Double_t py2=jet2->Py();
622 Double_t pz2=jet2->Pz();
623 Double_t phi2=jet2->Phi();
624 Double_t eta2=jet2->Eta();
625 //Once we have have a dijet event,look to the structure of the back-to-back jet:
627 TVector3 ppJ1(px2, py2, pz2);
628 TVector3 ppJ3(- px2 * pz2, - py2 * pz2, px2 * px2 + py2 * py2);
630 TVector3 ppJ2(-py2, px2, 0);
641 //1st loop over all tracks
642 for(int it = 0;it<nT;++it){
643 AliVParticle *track = (AliVParticle*)ParticleList.At(it);
644 TVector3 pp(track->Px(), track->Py(), track->Pz());
645 Float_t phi = track->Phi();
646 Float_t eta = track->Eta();
647 Float_t pt = track->Pt();
648 Float_t jT = pp.Perp(ppJ1);
649 Float_t deta = eta - eta2;
650 Float_t dphi = phi - phi2;
651 if (dphi > TMath::Pi()) dphi = 2. * TMath::Pi() - dphi;
652 if (dphi < - TMath::Pi()) dphi = - 2. * TMath::Pi() - dphi;
653 Float_t r = TMath::Sqrt(dphi * dphi + deta * deta);
654 /////////To compute the TM axis, we use particles with large jT
656 //cout<<"Jt spectrum............"<<ptbig<<" "<<jT<<endl;
657 /////////We compute the TM with large jT particles only
658 if((jT >1.)&&(r<1.2)){
659 //longitudinal and perpendicular component of the track pT in the
661 TVector3 pLong = pp.Dot(ppJ1) / ppJ1.Mag2() * ppJ1;
662 TVector3 pPerp = pp - pLong;
663 //projection onto the two perpendicular vectors defined above
664 Float_t ppjX = pPerp.Dot(ppJ2);
665 Float_t ppjY = pPerp.Dot(ppJ3);
666 Float_t ppjT = TMath::Sqrt(ppjX * ppjX + ppjY * ppjY);
667 //components of the sphericity matrix
668 mxx += (ppjX * ppjX / ppjT);
669 myy += (ppjY * ppjY / ppjT);
670 mxy += (ppjX * ppjY / ppjT);
683 // At this point we have mxx, myy, mxy
686 const Double_t ele[4] = {mxx / sump2, mxy / sump2, mxy / sump2, myy / sump2};
687 TMatrixDSym m0(2,ele);
689 TMatrixDSymEigen m(m0);
691 TMatrixD evecm = m.GetEigenVectors();
692 eval = m.GetEigenValues();
693 // Largest eigenvector
695 if (eval[0] < eval[1]) jev = 1;
698 evec0 = TMatrixDColumn(evecm, jev);
699 TVector2 evec(evec0[0], evec0[1]);
700 // Principle axis from leading partice
701 Float_t phiM = TMath::ATan2(phiMax, etaMax);
702 TVector2 evecM(TMath::Cos(phiM), TMath::Sin(phiM));
703 Float_t phistM = evecM.DeltaPhi(evec);
704 if (TMath::Abs(phistM) > TMath::Pi()/2.) evec*=(-1.);
706 //////we have now the direction
707 /////along which the sum of the projections of the particle
708 ///momentum is higher.
709 Double_t sum2lpt20=0;
710 Double_t sum4lpt20=0;
711 Double_t sum6lpt20=0;
712 Double_t sum8lpt20=0;
713 Double_t sum12lpt20=0;
718 Double_t sum12pt20=0;
720 Double_t sum2lpt40=0;
721 Double_t sum4lpt40=0;
722 Double_t sum6lpt40=0;
723 Double_t sum8lpt40=0;
724 Double_t sum12lpt40=0;
729 Double_t sum12pt40=0;
731 for (Int_t ip = 0; ip < nT; ip++) {
732 AliVParticle *track = (AliVParticle*)ParticleList.At(ip);
733 TVector3 pp(track->Px(), track->Py(), track->Pz());
734 Float_t phi = track->Phi();
735 Float_t eta = track->Eta();
736 Float_t pt = track->Pt();
737 Float_t jT = pp.Perp(ppJ1);
738 Double_t deta = eta - eta2;
739 Double_t deltaPhi = phi - phi2;
740 Double_t r = TMath::Sqrt(deltaPhi * deltaPhi + deta * deta);
742 if(ptcorr2>20. && ptcorr2<40.){
744 if(r<0.2) sum2lpt20=sum2lpt20-1.*pt*TMath::Cos(phi-jet1->Phi());
745 if(r<0.4) sum4lpt20=sum4lpt20-1.*pt*TMath::Cos(phi-jet1->Phi());
746 if(r<0.6) sum6lpt20=sum6lpt20-1.*pt*TMath::Cos(phi-jet1->Phi());
747 if(r<0.8) sum8lpt20=sum8lpt20-1.*pt*TMath::Cos(phi-jet1->Phi());
748 if(r<1.2) sum12lpt20=sum12lpt20-1.*pt*TMath::Cos(phi-jet1->Phi());}
750 if(r<0.2) sum2pt20=sum2pt20-1.*pt*TMath::Cos(phi-jet1->Phi());
751 if(r<0.4) sum4pt20=sum4pt20-1.*pt*TMath::Cos(phi-jet1->Phi());
752 if(r<0.6) sum6pt20=sum6pt20-1.*pt*TMath::Cos(phi-jet1->Phi());
753 if(r<0.8) sum8pt20=sum8pt20-1.*pt*TMath::Cos(phi-jet1->Phi());
754 if(r<1.2) sum12pt20=sum12pt20-1.*pt*TMath::Cos(phi-jet1->Phi());}
757 if(ptcorr2>40. && ptcorr2<60.){
759 if(r<0.2) sum2lpt40=sum2lpt40-1.*pt*TMath::Cos(phi-jet1->Phi());
760 if(r<0.4) sum4lpt40=sum4lpt40-1.*pt*TMath::Cos(phi-jet1->Phi());
761 if(r<0.6) sum6lpt40=sum6lpt40-1.*pt*TMath::Cos(phi-jet1->Phi());
762 if(r<0.8) sum8lpt40=sum8lpt40-1.*pt*TMath::Cos(phi-jet1->Phi());
763 if(r<1.2) sum12lpt40=sum12lpt40-1.*pt*TMath::Cos(phi-jet1->Phi());}
765 if(r<0.2) sum2pt40=sum2pt40-1.*pt*TMath::Cos(phi-jet1->Phi());
766 if(r<0.4) sum4pt40=sum4pt40-1.*pt*TMath::Cos(phi-jet1->Phi());
767 if(r<0.6) sum6pt40=sum6pt40-1.*pt*TMath::Cos(phi-jet1->Phi());
768 if(r<0.8) sum8pt40=sum8pt40-1.*pt*TMath::Cos(phi-jet1->Phi());
769 if(r<1.2) sum12pt40=sum12pt40-1.*pt*TMath::Cos(phi-jet1->Phi());}
774 TVector3 pLong = pp.Dot(ppJ1) / ppJ1.Mag2() * ppJ1;
775 TVector3 pPerp = pp - pLong;
776 Float_t ppjX = pPerp.Dot(ppJ2);
777 Float_t ppjY = pPerp.Dot(ppJ3);
778 TVector2 vr(ppjX, ppjY) ;
779 //and this is the angle between the particle and the TM axis.
780 Float_t phistr = evec.DeltaPhi(vr);
782 //Double_t phistr=vr.Phi()-evec.Phi();
784 if(centValue<10.) fh3LocalCoordinates->Fill(ppjX,ppjY,ptcorr2);
785 Double_t deltaEta = eta2-track->Eta();
788 if(deltaPhi<-0.5*TMath::Pi()) deltaPhi+=2.*TMath::Pi();
789 if(deltaPhi>3./2.*TMath::Pi()) deltaPhi-=2.*TMath::Pi();
790 Double_t jetEntries[9] = {centValue,ptcorr1,ptcorr2,jT,pt,deltaEta,deltaPhi,phistr,ptMax};
791 fhnDeltaR->Fill(jetEntries);
796 Double_t aj=(ptcorr1-ptcorr2)/(ptcorr1+ptcorr2);
798 fh2Sum2pt20->Fill(aj,sum2pt20);
799 fh2Sum4pt20->Fill(aj,sum4pt20);
800 fh2Sum6pt20->Fill(aj,sum6pt20);
801 fh2Sum8pt20->Fill(aj,sum8pt20);
802 fh2Sum12pt20->Fill(aj,sum12pt20);
803 fh2Sum2lpt20->Fill(aj,sum2lpt20);
804 fh2Sum4lpt20->Fill(aj,sum4lpt20);
805 fh2Sum6lpt20->Fill(aj,sum6lpt20);
806 fh2Sum8lpt20->Fill(aj,sum8lpt20);
807 fh2Sum12lpt20->Fill(aj,sum12lpt20);
809 fh2Sum2pt40->Fill(aj,sum2pt40);
810 fh2Sum4pt40->Fill(aj,sum4pt40);
811 fh2Sum6pt40->Fill(aj,sum6pt40);
812 fh2Sum8pt40->Fill(aj,sum8pt40);
813 fh2Sum12pt40->Fill(aj,sum12pt40);
814 fh2Sum2lpt40->Fill(aj,sum2lpt40);
815 fh2Sum4lpt40->Fill(aj,sum4lpt40);
816 fh2Sum6lpt40->Fill(aj,sum6lpt40);
817 fh2Sum8lpt40->Fill(aj,sum8lpt40);
818 fh2Sum12lpt40->Fill(aj,sum12lpt40);
827 PostData(1, fOutputList);
830 void AliAnalysisTaskAj::Terminate(const Option_t *)
832 // Draw result to the screen
833 // Called once at the end of the query
835 if (!GetOutputData(1))
849 Int_t AliAnalysisTaskAj::GetListOfTracks(TList *list){
853 AliAODEvent *aod = 0;
854 if(!fESD)aod = fAODIn;
856 if(!aod) return iCount;
858 for(int it = 0;it < aod->GetNumberOfTracks();++it){
859 AliAODTrack *tr = aod->GetTrack(it);
860 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
861 if(TMath::Abs(tr->Eta())>0.9)continue;
862 if(tr->Pt()<0.15)continue;
864 //cout<<fAOD->GetNumberOfTracks()<<" "<<tr->Pt()<<endl;
873 Int_t AliAnalysisTaskAj::GetHardestTrackBackToJet(AliAODJet *jetbig){
876 AliAODEvent *aod = 0;
877 if(!fESD)aod = fAODIn;
879 if(!aod) return index;
886 for(int it = 0;it < aod->GetNumberOfTracks();++it){
887 AliAODTrack *tr = aod->GetTrack(it);
888 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
889 if(TMath::Abs(tr->Eta())>0.9)continue;
890 if(tr->Pt()<0.15)continue;
892 dphi=RelativePhi(tr->Phi(),jetbig->Phi());
893 if(TMath::Abs(dphi)<TMath::Pi()-0.2) continue;
894 if(tr->Pt()>ptmax){ ptmax=tr->Pt();
910 Int_t AliAnalysisTaskAj::GetListOfTracksCloseToJet(TList *list,AliAODJet *jetbig){
913 AliAODEvent *aod = 0;
914 if(!fESD)aod = fAODIn;
916 if(!aod) return iCount;
920 for(int it = 0;it < aod->GetNumberOfTracks();++it){
921 AliAODTrack *tr = aod->GetTrack(it);
922 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
923 if(TMath::Abs(tr->Eta())>0.9)continue;
924 if(tr->Pt()<0.15)continue;
925 Double_t disR=jetbig->DeltaR(tr);
926 if(disR>0.8) continue;
928 //cout<<fAOD->GetNumberOfTracks()<<" "<<tr->Pt()<<endl;
947 Int_t AliAnalysisTaskAj::GetNInputTracks()
950 Int_t nInputTracks = 0;
951 AliAODEvent *aod = 0;
952 if(!fESD)aod = fAODIn;
954 if(!aod) return nInputTracks;
957 TString jbname(fJetBranchName[1]);
958 //needs complete event, use jets without background subtraction
959 for(Int_t i=1; i<=3; ++i){
960 if(jbname.Contains(Form("B%d",i))) jbname.ReplaceAll(Form("B%d",i),"B0");
963 if(jbname.Contains("AODextraonly")) jbname.ReplaceAll("AODextraonly","AOD");
964 if(jbname.Contains("AODextra")) jbname.ReplaceAll("AODextra","AOD");
966 if(fDebug) Printf("Multiplicity from jet branch %s", jbname.Data());
967 TClonesArray *tmpAODjets = dynamic_cast<TClonesArray*>(aod->FindListObject(jbname.Data()));
969 Printf("Jet branch %s not found", jbname.Data());
970 Printf("AliAnalysisTaskAj::GetNInputTracks FAILED");
974 for (Int_t iJet=0; iJet<tmpAODjets->GetEntriesFast(); iJet++){
975 AliAODJet *jet = dynamic_cast<AliAODJet*>((*tmpAODjets)[iJet]);
977 TRefArray *trackList = jet->GetRefTracks();
978 Int_t nTracks = trackList->GetEntriesFast();
979 nInputTracks += nTracks;
980 if(fDebug) Printf("#jet%d: %d tracks", iJet, nTracks);
982 if(fDebug) Printf("---> input tracks: %d", nInputTracks);
989 Double_t AliAnalysisTaskAj::RelativePhi(Double_t mphi,Double_t vphi){
991 if (vphi < -1*TMath::Pi()) vphi += (2*TMath::Pi());
992 else if (vphi > TMath::Pi()) vphi -= (2*TMath::Pi());
993 if (mphi < -1*TMath::Pi()) mphi += (2*TMath::Pi());
994 else if (mphi > TMath::Pi()) mphi -= (2*TMath::Pi());
995 double dphi = mphi-vphi;
996 if (dphi < -1*TMath::Pi()) dphi += (2*TMath::Pi());
997 else if (dphi > TMath::Pi()) dphi -= (2*TMath::Pi());
998 return dphi;//dphi in [-Pi, Pi]
1003 THnSparse* AliAnalysisTaskAj::NewTHnSparseF(const char* name, UInt_t entries)
1005 // generate new THnSparseF, axes are defined in GetDimParams()
1008 UInt_t tmp = entries;
1011 tmp = tmp &~ -tmp; // clear lowest bit
1014 TString hnTitle(name);
1015 const Int_t dim = count;
1022 while(c<dim && i<32){
1026 GetDimParams(i, label, nbins[c], xmin[c], xmax[c]);
1027 hnTitle += Form(";%s",label.Data());
1035 return new THnSparseF(name, hnTitle.Data(), dim, nbins, xmin, xmax);
1038 void AliAnalysisTaskAj::GetDimParams(Int_t iEntry, TString &label, Int_t &nbins, Double_t &xmin, Double_t &xmax)
1040 // stores label and binning of axis for THnSparse
1042 const Double_t pi = TMath::Pi();
1047 label = "V0 centrality (%)";
1056 label = "corrected jet pt1";
1063 label = "corrected jet pt2";
1104 label = "deltaPhiTM";
1113 label = "leading track";