3 // Task for topological study of three jet events by sona
9 /**************************************************************************
10 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
12 * Author: The ALICE Off-line Project. *
13 * Contributors are mentioned in the code where appropriate. *
15 * Permission to use, copy, modify and distribute this software and its *
16 * documentation strictly for non-commercial purposes is hereby granted *
17 * without fee, provided that the above copyright notice appears in all *
18 * copies and that both the copyright notice and this permission notice *
19 * appear in the supporting documentation. The authors make no claims *
20 * about the suitability of this software for any purpose. It is *
21 * provided "as is" without express or implied warranty. *
22 **************************************************************************/
31 #include <TLorentzVector.h>
32 #include <TClonesArray.h>
33 #include <TRefArray.h>
36 #include <TMatrixDSym.h>
37 #include <TMatrixDSymEigen.h>
41 #include "AliAnalysisTaskThreeJets.h"
42 #include "AliAnalysisManager.h"
43 #include "AliAODEvent.h"
44 #include "AliAODVertex.h"
45 #include "AliAODHandler.h"
46 #include "AliAODTrack.h"
47 #include "AliAODJet.h"
48 #include "AliAODMCParticle.h"
49 //#include "AliGenPythiaEventHeader.h"
50 //#include "AliMCEvent.h"
51 //#include "AliStack.h"
54 #include "AliAnalysisHelperJetTasks.h"
57 ClassImp(AliAnalysisTaskThreeJets)
59 AliAnalysisTaskThreeJets::AliAnalysisTaskThreeJets() : AliAnalysisTaskSE(),
128 fhdPhiThrustGen(0x0),
129 fhdPhiThrustGenALL(0x0),
131 fhdPhiThrustRec(0x0),
132 fhdPhiThrustRecALL(0x0)
138 AliAnalysisTaskThreeJets::AliAnalysisTaskThreeJets(const char * name):
139 AliAnalysisTaskSE(name),
147 fUseAODInput(kFALSE),
208 fhdPhiThrustGen(0x0),
209 fhdPhiThrustGenALL(0x0),
211 fhdPhiThrustRec(0x0),
212 fhdPhiThrustRecALL(0x0)
214 DefineOutput(1, TList::Class());
219 Bool_t AliAnalysisTaskThreeJets::Notify()
222 // Implemented Notify() to read the cross sections
223 // and number of trials from pyxsec.root
227 TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
228 Float_t xsection = 0;
231 Float_t fAvgTrials = 1;
233 TFile *curfile = tree->GetCurrentFile();
235 Error("Notify","No current file");
238 AliAnalysisHelperJetTasks::PythiaInfoFromFile(curfile->GetName(),xsection,ftrials);
239 // construct a poor man average trials
240 Float_t nEntries = (Float_t)tree->GetTree()->GetEntries();
241 if(ftrials>=nEntries)fAvgTrials = ftrials/nEntries; // CKB take this into account for normalisation
244 if(xsection>0)fXsection = xsection;
251 //___________________________________________________________________________________________________________________________________
252 void AliAnalysisTaskThreeJets::UserCreateOutputObjects()
255 // Create the output container
257 // Printf("Analysing event %s :: # %5d\n", gSystem->pwd(), (Int_t) fEntry);
259 printf("AnalysisTaskJetSpectrum::UserCreateOutputObjects() \n");
263 //histogram, that maps were the code returns
264 fhStopHisto = new TH1I("StopHisto", "", 8, 0, 8);
265 fhStopHisto->SetXTitle("No. of the return");
266 fList->Add(fhStopHisto);
268 fhX3X4Gen = new TH2F("X3vsX4Gen", "", 22, 0.6, 1.02, 33, 0.4, 1.02);
269 fhX3X4Gen->SetXTitle("X_{3}");
270 fhX3X4Gen->SetYTitle("X_{4}");
272 fList->Add(fhX3X4Gen);
274 fhX3X4Rec = new TH2F("X3vsX4Rec", "", 22, 0.6, 1.02, 33, 0.4, 1.02);
275 fhX3X4Rec->SetXTitle("X_{3}");
276 fhX3X4Rec->SetYTitle("X_{4}");
278 fList->Add(fhX3X4Rec);
280 fhMu35Rec = new TH1F("Mu35Rec", "", 20,0.1,0.8);
282 fhMu35Rec->SetXTitle("#mu_{35}");
283 fhMu35Rec->SetYTitle("#frac{dN}{d#mu_{35Rec}}");
284 fList->Add(fhMu35Rec);
286 fhMu34Rec = new TH1F("Mu34Rec", "", 20,0.5,1);
288 fhMu34Rec->SetXTitle("#mu_{34}");
289 fhMu34Rec->SetYTitle("#frac{dN}{d#mu_{34}}");
290 fList->Add(fhMu34Rec);
292 fhMu45Rec = new TH1F("Mu45Rec", "", 20,0,0.65);
294 fhMu45Rec->SetXTitle("#mu_{45}");
295 fhMu45Rec->SetYTitle("#frac{dN}{d#mu_{45}}");
296 fList->Add(fhMu45Rec);
298 fhMu35Gen = new TH1F("Mu35Gen", "", 20,0.1,0.8);
300 fhMu35Gen->SetXTitle("#mu_{35Gen}");
301 fhMu35Gen->SetYTitle("#frac{dN}{d#mu_{35Gen}}");
302 fList->Add(fhMu35Gen);
304 fhMu34Gen = new TH1F("Mu34Gen", "", 20,0.5,1);
306 fhMu34Gen->SetXTitle("#mu_{34Gen}");
307 fhMu34Gen->SetYTitle("#frac{dN}{d#mu_{34Gen}}");
308 fList->Add(fhMu34Gen);
310 fhMu45Gen = new TH1F("Mu45Gen", "", 20,0,0.65);
312 fhMu45Gen->SetXTitle("#mu_{45Gen}");
313 fhMu45Gen->SetYTitle("#frac{dN}{d#mu_{45}}");
314 fList->Add(fhMu45Gen);
316 fhInOut = new TH1I("InOut", "", 6, 0, 6);
317 fhInOut->SetXTitle("#RecJets_{GenJets=3}");
318 fhInOut->SetYTitle("#Entries");
321 fhThrustGen2 = new TH1F("ThrustGen2", "", 50, 0.5, 1);
322 fhThrustGen2->Sumw2();
323 fList->Add(fhThrustGen2);
325 fhThrustGen3 = new TH1F("ThrustGen3", "", 50, 0.5, 1);
326 fhThrustGen3->Sumw2();
327 fList->Add(fhThrustGen3);
329 fhThrustRec2 = new TH1F("ThrustRec2", "", 50, 0.5, 1);
330 fhThrustRec2->Sumw2();
331 fList->Add(fhThrustRec2);
333 fhThrustRec3 = new TH1F("ThrustRec3", "", 50, 0.5, 1);
334 fhThrustRec3->Sumw2();
335 fList->Add(fhThrustRec3);
337 fhCGen2 = new TH1F("CGen2", "", 100, 0, 1);
341 fhCGen3 = new TH1F("CGen3", "", 100, 0, 1);
345 fhCRec2 = new TH1F("CRec2", "", 100, 0, 1);
349 fhCRec3 = new TH1F("CRec3", "", 100, 0, 1);
353 fhSGen2 = new TH1F("SGen2", "", 100, 0, 1);
356 fhSGen3 = new TH1F("SGen3", "", 100, 0, 1);
359 fhSRec2 = new TH1F("SRec2", "", 100, 0, 1);
362 fhSRec3 = new TH1F("SRec3", "", 100, 0, 1);
365 fhAGen2 = new TH1F("AGen2", "", 50, 0, 0.5);
368 fhAGen3 = new TH1F("AGen3", "", 50, 0, 0.5);
371 fhARec2 = new TH1F("ARec2", "", 50, 0, 0.5);
374 fhARec3 = new TH1F("ARec3", "", 50, 0, 0.5);
377 fhX3 = new TH2F("X3", "", 22, 0.6, 1.02, 100, 0, 1);
378 fhX3->SetYTitle("|X_{3}^{MC} - X_{3}^{AOD}|/X_{3}^{MC}");
379 fhX3->SetXTitle("X_{3}");
383 fhX4 = new TH2F("X4", "",33, 0.4, 1.02, 100, 0, 1);
384 fhX4->SetYTitle("|X_{4}^{MC} - X_{4}^{AOD}|/X_{4}^{MC}");
385 fhX4->SetXTitle("X_{4}");
389 fhX5 = new TH2F("X5", "",100, 0., 1., 100, 0, 1);
390 fhX5->SetYTitle("|X_{5}^{MC} - X_{5}^{AOD}|/X_{5}^{MC}");
391 fhX5->SetXTitle("X_{5}");
395 fhXSec = new TProfile("XSec", "", 200, 0, 200, 0, 1);
398 fhX3X4Rec60 = new TH2F("X3vsX4Rec60", "", 22, 0.6, 1.02, 33, 0.4, 1.02);
399 fhX3X4Rec60->SetXTitle("X_{3}");
400 fhX3X4Rec60->SetYTitle("X_{4}");
401 fhX3X4Rec60->Sumw2();
402 fList->Add(fhX3X4Rec60);
404 fhX3X4Rec60100 = new TH2F("X3vsX4Rec60100", "", 22, 0.6, 1.02, 33, 0.4, 1.02);
405 fhX3X4Rec60100->SetXTitle("X_{3}");
406 fhX3X4Rec60100->SetYTitle("X_{4}");
407 fhX3X4Rec60100->Sumw2();
408 fList->Add(fhX3X4Rec60100);
410 fhX3X4Rec100 = new TH2F("X3vsX4Rec100", "", 22, 0.6, 1.02, 33, 0.4, 1.02);
411 fhX3X4Rec100->SetXTitle("X_{3}");
412 fhX3X4Rec100->SetYTitle("X_{4}");
413 fhX3X4Rec100->Sumw2();
414 fList->Add(fhX3X4Rec100);
416 fhX3X4Gen60 = new TH2F("X3vsX4Gen60", "", 22, 0.6, 1.02, 33, 0.4, 1.02);
417 fhX3X4Gen60->SetXTitle("X_{3}");
418 fhX3X4Gen60->SetYTitle("X_{4}");
419 fhX3X4Gen60->Sumw2();
420 fList->Add(fhX3X4Gen60);
422 fhX3X4Gen60100 = new TH2F("X3vsX4Gen60100", "", 22, 0.6, 1.02, 33, 0.4, 1.02);
423 fhX3X4Gen60100->SetXTitle("X_{3}");
424 fhX3X4Gen60100->SetYTitle("X_{4}");
425 fhX3X4Gen60100->Sumw2();
426 fList->Add(fhX3X4Gen60100);
428 fhX3X4Gen100 = new TH2F("X3vsX4Gen100", "", 22, 0.6, 1.02, 33, 0.4, 1.02);
429 fhX3X4Gen100->SetXTitle("X_{3}");
430 fhX3X4Gen100->SetYTitle("X_{4}");
431 fhX3X4Gen100->Sumw2();
432 fList->Add(fhX3X4Gen100);
434 fhdPhiThrustGen = new TH2F("dPhiThrustGen", "", 32, -1*TMath::Pi(), TMath::Pi(), 25, 0, 150);
435 fhdPhiThrustGen->Sumw2();
436 fList->Add(fhdPhiThrustGen);
438 fhdPhiThrustGenALL = new TH2F("dPhiThrustGenALL", "", 32, -1*TMath::Pi(), TMath::Pi(), 25, 0, 150);
439 fhdPhiThrustGenALL->Sumw2();
440 fList->Add(fhdPhiThrustGenALL);
442 fhdPhiThrustRec = new TH2F("dPhiThrustRec", "", 32, -1*TMath::Pi(), TMath::Pi(), 25, 0, 150);
443 fhdPhiThrustRec->Sumw2();
444 fList->Add(fhdPhiThrustRec);
446 fhdPhiThrustRecALL = new TH2F("dPhiThrustRecALL", "", 32, -1*TMath::Pi(), TMath::Pi(), 25, 0, 150);
447 fhdPhiThrustRecALL->Sumw2();
448 fList->Add(fhdPhiThrustRecALL);
450 if(fDebug)Printf("UserCreateOutputObjects finished\n");
453 //__________________________________________________________________________________________________________________________________________
454 void AliAnalysisTaskThreeJets::Init()
456 printf("AliAnalysisJetCut::Init() \n");
459 //____________________________________________________________________________________________________________________________________________
460 void AliAnalysisTaskThreeJets::UserExec(Option_t * )
462 if (fDebug > 1) printf("AliAnlysisTaskThreeJets::Analysing event # %5d\n", (Int_t) fEntry);
465 fAOD = dynamic_cast<AliAODEvent*>(InputEvent());
467 Printf("%s:%d AODEvent not found in Input Manager %d",(char*)__FILE__,__LINE__,fUseAODInput);
472 // assume that the AOD is in the general output...
475 Printf("%s:%d AODEvent not found in the Output",(char*)__FILE__,__LINE__);
480 // AliMCEvent* mcEvent =MCEvent();
482 // Printf("%s:%d no mcEvent",(char*)__FILE__,__LINE__);
486 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
489 AliAODVertex * pvtx = dynamic_cast<AliAODVertex*>(fAOD->GetPrimaryVertex());
492 fhStopHisto->Fill(0.5);
497 // AliAODJet genJetsPythia[kMaxJets];
498 // Int_t nPythiaGenJets = 0;
500 AliAODJet recJets[kMaxJets];
503 //array of reconstructed jets from the AOD input
504 TClonesArray *aodRecJets = dynamic_cast<TClonesArray*>(fAOD->FindListObject(fBranchRec.Data()));
507 fhStopHisto->Fill(1.5);
512 // reconstructed jets
513 nRecJets = aodRecJets->GetEntries();
514 if(fDebug)Printf("--- Jets found in bRec: %d", nRecJets);
515 nRecJets = TMath::Min(nRecJets, kMaxJets);
517 for(int ir = 0;ir < nRecJets;++ir)
519 AliAODJet *tmp = dynamic_cast<AliAODJet*>(aodRecJets->At(ir));
524 AliAODJet genJets[kMaxJets];
527 // If we set a second branch for the input jets fetch this
528 TClonesArray * aodGenJets = dynamic_cast<TClonesArray*>(fAOD->FindListObject(fBranchGen.Data()));
532 printf("NO MC jets Found\n");
534 fhStopHisto->Fill(2.5);
540 nGenJets = aodGenJets->GetEntries();
541 nGenJets = TMath::Min(nGenJets, kMaxJets);
543 for(Int_t ig =0 ; ig < nGenJets; ++ig)
545 AliAODJet * tmp = dynamic_cast<AliAODJet*>(aodGenJets->At(ig));
550 // AliGenPythiaEventHeader* pythiaGenHeader = AliAnalysisHelperJetTasks::GetPythiaEventHeader(mcEvent);
551 // if(!pythiaGenHeader){
552 // Printf("!!!NO GEN HEADER AVALABLE!!!");
556 // // Int_t ProcessType = pythiaGenHeader->ProcessType();
557 // // if(ProcessType != 28) return;
558 // nPythiaGenJets = pythiaGenHeader->NTriggerJets();
559 // nPythiaGenJets = TMath::Min(nPythiaGenJets, kMaxJets);
563 Double_t eRec[kMaxJets];
564 Double_t eGen[kMaxJets];
566 Double_t eJetRec[kMaxJets];
567 // Double_t EJetGen[kMaxJets];
569 AliAODJet jetRec[kMaxJets];
570 AliAODJet jetGen[kMaxJets];
572 Int_t idxRec[kMaxJets];
573 Int_t idxGen[kMaxJets];
575 Double_t xRec[kMaxJets];
576 Double_t xGen[kMaxJets];
578 Double_t eSumRec = 0;
579 Double_t eSumGen = 0;
581 TLorentzVector vRec[kMaxJets];
582 TLorentzVector vRestRec[kMaxJets];
584 TLorentzVector vGen[kMaxJets];
585 TLorentzVector vRestGen[kMaxJets];
587 TLorentzVector vsumRec;
588 TLorentzVector vsumGen;
590 TVector3 pRec[kMaxJets];
591 TVector3 pGen[kMaxJets];
593 TVector3 pTrack[kTracks];
595 TVector3 pRestRec[kMaxJets];
596 TVector3 pRestGen[kMaxJets];
598 Double_t psumRestRec = 0;
599 // Double_t psumRestGen = 0;
600 // //Pythia_________________________________________________________________________________________________________________
602 // for(int ip = 0;ip < nPythiaGenJets;++ip)
604 // if(ip>=kMaxJets)continue;
606 // pythiaGenHeader->TriggerJet(ip,p);
607 // genJetsPythia[ip].SetPxPyPzE(p[0],p[1],p[2],p[3]);
610 //_________________________________________________________________________________________________________________________
613 //________histos for MC___________________________________________________________________________________________________________
619 AliAODJet selJets[kMaxJets];
621 for(Int_t i = 0; i < nGenJets; i++)
625 selJets[nGenSel] = genJets[i];
632 for(Int_t j = 0; j < nGenJets; j++)
636 Double_t dRij = genJets[i].DeltaR(&genJets[j]);
638 if(dRij > 2*fR) tag++;
645 selJets[nGenSel] = genJets[i];
654 fhStopHisto->Fill(3.5);
659 for (Int_t gj = 0; gj < nGenSel; gj++)
661 eGen[gj] = selJets[gj].E();
664 TMath::Sort(nGenSel, eGen, idxGen);
665 for (Int_t ig = 0; ig < nGenSel; ig++)
667 jetGen[ig] = selJets[idxGen[ig]];
670 fhXSec->Fill(jetGen[0].Pt(), fXsection);
671 // AliStack * stack = mcEvent->Stack();
674 Double_t eTracksMC[kTracks];
675 Double_t pTracksMC[kTracks];
676 Int_t idxTracksMC[kTracks];
677 TLorentzVector jetTracksMC[kTracks];
678 TLorentzVector jetTracksSortMC[kTracks];
679 TVector3 pTrackMC[kTracks];
680 TLorentzVector vTrackMCAll[kTracks];
681 Double_t pTrackMCAll[kTracks];
682 TLorentzVector vTrackMC[kTracks];
683 TVector3 pTrackMCBoost[kTracks];
684 Double_t eventShapes[4] = {0,};
687 Int_t nInJet[kMaxJets];
688 TLorentzVector inJetPartV[kMaxJets][kTracks];
689 Int_t nAllTracksMC = 0;
692 TClonesArray *tca = dynamic_cast<TClonesArray*>(fAOD->FindListObject(AliAODMCParticle::StdBranchName()));
694 if(fDebug)Printf("NO Ref Tracks\n");
698 nMCtracks = tca->GetEntries();
699 for(Int_t iTrack = 0; iTrack < nMCtracks; iTrack++)
701 // TParticle * part = (TParticle*)stack->Particle(iTrack);
702 AliAODMCParticle *part = dynamic_cast<AliAODMCParticle*>(tca->At(iTrack));
704 if(!part->IsPhysicalPrimary())continue;
705 Double_t fEta = part->Eta();
706 if(TMath::Abs(fEta) > .9) continue;
707 vTrackMCAll[nAllTracksMC].SetPxPyPzE(part->Px(), part->Py(), part->Pz(), part->E());
708 pTrackMCAll[nAllTracksMC] = part->Pt();
711 if(nAllTracksMC == 0){
713 fhStopHisto->Fill(4.5);
718 for(Int_t iJet = 0; iJet < nGenSel; iJet++)
720 Int_t nJetTracks = 0;
721 for(Int_t i = 0; i < nAllTracksMC; i++)
723 Double_t dPhi = (jetGen[iJet].Phi()-vTrackMCAll[i].Phi());
724 if(dPhi > TMath::Pi()) dPhi = dPhi - 2.*TMath::Pi();
725 if(dPhi < (-1.*TMath::Pi())) dPhi = dPhi + 2.*TMath::Pi();
726 Double_t dEta = (jetGen[iJet].Eta()-vTrackMCAll[i].Eta());
727 Double_t deltaR = TMath::Sqrt(dPhi*dPhi+dEta*dEta);
728 if(deltaR < fR && vTrackMCAll[i].Pt() > 1.5)
730 jetTracksMC[nAccTr] = vTrackMCAll[i];
731 eTracksMC[nAccTr] = vTrackMCAll[i].E();
732 pTracksMC[nAccTr] = vTrackMCAll[i].Pt();
733 inJetPartV[iJet][nJetTracks].SetPxPyPzE(vTrackMCAll[i].Px(), vTrackMCAll[i].Py(), vTrackMCAll[i].Pz(),vTrackMCAll[i].E());
738 nInJet[iJet] = nJetTracks;
743 fhStopHisto->Fill(5.5);
747 // if(fDebug)Printf("*********** Number of Jets : %d ***************\n", nGenSel);
748 Double_t pTav[kMaxJets];
749 for(Int_t i = 0; i < nGenSel; i++)
752 // if(fDebug)Printf("*********** Number of particles in Jet %d = %d *******************\n", i+3, nInJet[i]);
753 for(Int_t iT = 0; iT < nInJet[i]; iT++)
755 Double_t pt = inJetPartV[i][iT].Pt();
758 pTav[i] = pTsum/nInJet[i];
761 TMath::Sort(nAllTracksMC, pTrackMCAll, idxTracksMC);
762 for(Int_t i = 0; i < nAllTracksMC; i++)
764 jetTracksSortMC[i] = vTrackMCAll[idxTracksMC[i]];
765 pTrackMC[i].SetXYZ(jetTracksSortMC[i].Px(), jetTracksSortMC[i].Py(), jetTracksSortMC[i].Pz());
766 vTrackMC[i].SetPxPyPzE(jetTracksSortMC[i].Px(), jetTracksSortMC[i].Py(), jetTracksSortMC[i].Pz(), jetTracksSortMC[i].E());
769 n01MC = pTrackMC[0].Unit();
772 //Thrust calculation, iterative method
777 if(fDebug)Printf("**************Shapes for MC*************");
778 AliAnalysisHelperJetTasks::GetEventShapes(n01MC, pTrackMC, nAllTracksMC, eventShapes);
780 if(eventShapes[0] < 2/TMath::Pi()){
781 Double_t eventShapesTest[4] = {0,};
783 Int_t rnd_max = nAllTracksMC;
784 Int_t k = (Int_t)(gRandom->Rndm()*rnd_max)+3;
785 while(TMath::Abs(pTrackMC[k].X()) < 10e-5 && TMath::Abs(pTrackMC[k].Y()) < 10e-5){
788 n01Test = pTrackMC[k].Unit();
790 AliAnalysisHelperJetTasks::GetEventShapes(n01Test, pTrackMC, nAllTracksMC, eventShapesTest);
791 eventShapes[0] = TMath::Max(eventShapes[0], eventShapesTest[0]);
792 if(TMath::Abs(eventShapes[0]-eventShapesTest[0]) < 10e-7) n01MC = n01Test;
795 Double_t s = eventShapes[1];
796 Double_t a = eventShapes[2];
797 Double_t c = eventShapes[3];
816 Double_t thrust01MC = eventShapes[0];
821 fhThrustGen2->Fill(thrust01MC, fXsection);
824 fhThrustGen3->Fill(thrust01MC, fXsection);
832 for (Int_t i = 0; i < nGenSel; ++i)
834 vGen[i].SetPxPyPzE(jetGen[i].Px(), jetGen[i].Py(), jetGen[i].Pz(), jetGen[i].E());
835 pGen[i].SetXYZ(vGen[i].Px(), vGen[i].Py(), vGen[i].Pz());
839 if(eventShapes[0] > 0.8 && nGenSel > 1)
841 for(Int_t i = 0; i < nGenSel; i++)
842 fhdPhiThrustGen->Fill(n01MC.DeltaPhi(pGen[i]), jetGen[i].E());
845 if(eventShapes[0] <= 0.8 && nGenSel > 1)
847 for(Int_t i = 0; i < nGenSel; i++)
848 fhdPhiThrustGenALL->Fill(n01MC.DeltaPhi(pGen[i]), jetGen[i].E());
852 Double_t fPxGen = vsumGen.Px();
853 Double_t fPyGen = vsumGen.Py();
854 Double_t fPzGen = vsumGen.Pz();
855 Double_t fEGen = vsumGen.E();
857 Double_t eRestGen[kMaxJets];
858 for (Int_t j = 0; j < nGenSel; j++)
860 vGen[j].Boost(-fPxGen/fEGen, -fPyGen/fEGen, -fPzGen/fEGen);
861 eRestGen[j] = vGen[j].E();
864 for (Int_t j = 0; j < nAccTr; j++)
866 vTrackMC[j].Boost(-fPxGen/fEGen, -fPyGen/fEGen, -fPzGen/fEGen);
867 pTrackMCBoost[j].SetXYZ(vTrackMC[j].Px(),vTrackMC[j].Py(),vTrackMC[j].Pz());
870 Int_t idxRestGen[kMaxJets];
871 TMath::Sort(nGenSel, eRestGen, idxRestGen);
872 for(Int_t j = 0; j < nGenSel; j++)
874 vRestGen[j] = vGen[idxRestGen[j]];
875 eSumGen += vRestGen[j].E();
880 // if(nInJet[0] < 3 || nInJet[1] < 3 || nInJet[2] < 3) return;
881 // if(pRestGen[1].DeltaPhi(pRestGen[2]) > 0.95 && pRestGen[1].DeltaPhi(pRestGen[2]) < 1.15)
884 for(Int_t i = 0; i < nGenSel; i++)
886 xGen[i] = 2*vRestGen[i].E()/eSumGen;
889 if(fDebug)Printf("***************** Values of Dalitz variables are : %f, %f, %f ****************\n", xGen[0], xGen[1], xGen[2]);
891 if(fDebug)Printf("***************** fXSection = %f ******************\n", fXsection);
893 fhX3X4Gen60->Fill(xGen[0], xGen[1], fXsection);
895 if(eSumGen > 60 && eSumGen <= 100)
896 fhX3X4Gen60100->Fill(xGen[0], xGen[1], fXsection);
899 fhX3X4Gen100->Fill(xGen[0], xGen[1], fXsection);
901 FillTopology(fhX3X4Gen, fhMu34Gen, fhMu45Gen, fhMu35Gen, xGen, pRestGen, fXsection);
907 //_______________________________________________histos for MC_____________________________________________________
910 //_______________________________________________histos AOD________________________________________________________
912 // Printf("Event Number : %d, Number of gen jets : %d ", fEntry, nGenJets);
918 AliAODJet recSelJets[kMaxJets];
919 if(fDebug)Printf("---- Number of reco jets: %d\n",nRecJets);
920 for(Int_t i = 0; i < nRecJets; i++)
924 recSelJets[nRecSel] = recJets[i];
931 for(Int_t j = 0; j < nRecJets; j++)
935 Double_t dRij = recJets[i].DeltaR(&recJets[j]);
937 if(dRij > 2*fR) tag1++;
942 if(tag1/counter1 == 1)
944 recSelJets[nRecSel] = recJets[i];
954 fhStopHisto->Fill(6.5);
959 //sort rec/gen jets by energy in C.M.S
960 for (Int_t rj = 0; rj < nRecSel; rj++)
962 eRec[rj] = recSelJets[rj].E();
965 Int_t nAODtracks = fAOD->GetNumberOfTracks();
966 Int_t nTracks = 0; //tracks accepted in the whole event
967 Int_t nTracksALL = 0;
968 TLorentzVector jetTracks[kTracks];
969 TLorentzVector jetTracksSort[kTracks];
970 Double_t * eTracks = new Double_t[kTracks];
971 Double_t pTracks[kTracks];
972 Int_t * idxTracks = new Int_t[kTracks];
973 Double_t eventShapesRec[4] = {0,};
974 Int_t jetMult[kMaxJets];
975 // TLorentzVector vTracksAll[kTracks];
976 // Double_t pTracksAll[kTracks];
978 AliAODJet jetRecAcc[kMaxJets];
979 Int_t nJetTracks = 0;
981 AliAODTrack jetTrack[kTracks];
982 Double_t * cv = new Double_t[21];
983 TMath::Sort(nRecSel, eRec, idxRec);
984 for (Int_t rj = 0; rj < nRecSel; rj++)
987 eJetRec[rj] = eRec[idxRec[rj]];
988 jetRec[rj] = recSelJets[idxRec[rj]];
989 TRefArray * jetTracksAOD = dynamic_cast<TRefArray*>(jetRec[rj].GetRefTracks());
990 if(!jetTracksAOD) continue;
991 if(jetTracksAOD->GetEntries() < 3) continue;
992 for(Int_t i = 0; i < jetTracksAOD->GetEntries(); i++)
994 AliAODTrack * track = (AliAODTrack*)jetTracksAOD->At(i);
995 track->GetCovarianceXYZPxPyPz(cv);
996 if(cv[14] > 1000.) continue;
997 // jetTrack[nTracks] = *track;
998 // jetTracks[nTracks].SetPxPyPzE(jetTrack[nTracks].Px(), jetTrack[nTracks].Py(), jetTrack[nTracks].Pz(), jetTrack[nTracks].E());
999 // eTracks[nTracks] = jetTracks[nTracks].E();
1000 // pTracks[nTracks] = jetTracks[nTracks].Pt();
1004 if(nJetTracks < 3) continue;
1005 jetRecAcc[nAccJets] = jetRec[rj];
1006 jetMult[nAccJets] = jetTracksAOD->GetEntries();
1012 fhStopHisto->Fill(7.5);
1017 for(Int_t i = 0; i < nAODtracks; i++)
1019 AliAODTrack * track = dynamic_cast<AliAODTrack*>(fAOD->GetTrack(i));
1020 if(!track) continue;
1021 track->GetCovarianceXYZPxPyPz(cv);
1022 if(cv[14] > 1000.) continue;
1023 jetTrack[nTracksALL] = *track;
1024 jetTracks[nTracksALL].SetPxPyPzE(jetTrack[nTracksALL].Px(), jetTrack[nTracksALL].Py(), jetTrack[nTracksALL].Pz(), jetTrack[nTracksALL].E());
1025 eTracks[nTracksALL] = jetTracks[nTracksALL].E();
1026 pTracks[nTracksALL] = jetTracks[nTracksALL].Pt();
1031 TLorentzVector vTrack[kTracks];
1032 TMath::Sort(nTracksALL, pTracks, idxTracks);
1033 for(Int_t i = 0; i < nTracksALL; i++)
1035 jetTracksSort[i] = jetTracks[idxTracks[i]];
1036 pTrack[i].SetXYZ(jetTracksSort[i].Px(), jetTracksSort[i].Py(), jetTracksSort[i].Pz());
1037 vTrack[i].SetPxPyPzE(jetTracksSort[i].Px(), jetTracksSort[i].Py(), jetTracksSort[i].Pz(), jetTracksSort[i].E());
1040 for (Int_t i = 0; i < nAccJets; ++i)
1042 vRec[i].SetPxPyPzE(jetRecAcc[i].Px(), jetRecAcc[i].Py(), jetRecAcc[i].Pz(), jetRecAcc[i].E());
1043 pRec[i].SetXYZ(vRec[i].Px(), vRec[i].Py(), vRec[i].Pz());
1047 //Thrust, iterative method, AODs
1048 TVector3 n01 = pTrack[0].Unit();
1052 // if(fGlobVar == 1)
1054 if(fDebug)Printf("*********Shapes for AOD********");
1055 AliAnalysisHelperJetTasks::GetEventShapes(n01, pTrack, nTracksALL, eventShapesRec);
1057 if(eventShapesRec[0] < 2/TMath::Pi()){
1058 Double_t eventShapesTest[4] = {0,};
1060 Int_t rnd_max = nTracksALL;
1061 Int_t k = (Int_t)(gRandom->Rndm()*rnd_max)+3;
1062 while(TMath::Abs(pTrack[k].X()) < 10e-5 && TMath::Abs(pTrack[k].Y()) < 10e-5){
1066 n01Test = pTrack[k].Unit();
1068 AliAnalysisHelperJetTasks::GetEventShapes(n01Test, pTrack, nTracksALL, eventShapesTest);
1069 eventShapesRec[0] = TMath::Max(eventShapesRec[0], eventShapesTest[0]);
1070 if(TMath::Abs(eventShapesRec[0]-eventShapesTest[0]) < 10e-7) n01 = n01Test;
1075 // Double_t Max3 = TMath::Max(eventShapesRec0[0],eventShapesRec1[0]);
1076 // Double_t Max4 = TMath::Max(eventShapesRec3[0],eventShapesRec2[0]);
1078 Double_t thrust = eventShapesRec[0];
1080 if(eventShapesRec[0] > 0.8)
1082 for(Int_t i = 0; i < nAccJets; i++)
1083 fhdPhiThrustRec->Fill(n01.DeltaPhi(pRec[i]), jetRecAcc[i].E());
1087 if(eventShapesRec[0] <= 0.8)
1089 for(Int_t i = 0; i < nAccJets; i++)
1090 fhdPhiThrustRecALL->Fill(n01.DeltaPhi(pRec[i]), jetRecAcc[i].E());
1096 fhThrustRec2->Fill(thrust, fXsection);
1099 fhThrustRec3->Fill(thrust, fXsection);
1107 fhARec2->Fill(eventShapesRec[2], fXsection);
1108 fhSRec2->Fill(eventShapesRec[1], fXsection);
1109 fhCRec2->Fill(eventShapesRec[3], fXsection);
1114 fhARec3->Fill(eventShapesRec[2], fXsection);
1115 fhSRec3->Fill(eventShapesRec[1], fXsection);
1116 fhCRec3->Fill(eventShapesRec[3], fXsection);
1122 //rest frame for reconstructed jets
1123 Double_t fPx = vsumRec.Px();
1124 Double_t fPy = vsumRec.Py();
1125 Double_t fPz = vsumRec.Pz();
1126 Double_t fE = vsumRec.E();
1128 TVector3 pTrackRest[kTracks];
1129 for(Int_t j = 0; j < nTracks; j++)
1131 vTrack[j].Boost(-fPx/fE, -fPy/fE, -fPz/fE);
1132 pTrackRest[j].SetXYZ(vTrack[j].Px(), vTrack[j].Py(),vTrack[j].Pz());
1135 Double_t eRestRec[kMaxJets];
1136 Int_t idxRestRec[kMaxJets];
1137 for (Int_t j = 0; j < nAccJets; j++)
1139 vRec[j].Boost(-fPx/fE, -fPy/fE, -fPz/fE);
1140 eRestRec[j] = vRec[j].E();
1141 eSumRec += vRec[j].E();
1144 TMath::Sort(nAccJets, eRestRec, idxRestRec);
1145 for (Int_t i = 0; i < nAccJets; i++)
1147 vRestRec[i] = vRec[idxRestRec[i]];
1148 pRestRec[i].SetXYZ(vRestRec[i].Px(), vRestRec[i].Py(), vRestRec[i].Pz());
1149 psumRestRec += pRestRec[i].Perp();
1154 // if(pRest[1].DeltaPhi(pRest[2]) > 0.95 && pRest[1].DeltaPhi(pRest[2]) < 1.15)
1156 if(fUseMC) fhInOut->Fill(nGenSel);
1157 // for(Int_t j = 0; j < nTracksALL; j++)
1159 // vTracksAll[j].Boost(-fPx/fE, -fPy/fE, -fPz/fE);
1160 // pTracksAll[j].SetXYZ(vTracksAll[j].Px(), vTracksAll[j].Py(),vTracksAll[j].Pz());
1161 // fhdPhiRec->Fill(pRest[0].DeltaPhi(pTracksAll[j]), pTracksAll[j].Perp(), fXsection);
1163 //and the Dalitz variables and Energy distributions in the rest frame
1164 for (Int_t i = 0; i < nAccJets; i++)
1165 xRec[i] = 2*vRestRec[i].E()/eSumRec;
1168 fhX3X4Rec60->Fill(xRec[0], xRec[1], fXsection);
1170 if(eSumRec > 60 && eSumRec <= 100)
1171 fhX3X4Rec60100->Fill(xRec[0], xRec[1], fXsection);
1174 fhX3X4Rec100->Fill(xRec[0], xRec[1], fXsection);
1176 if(nAccJets == 3 && nAccJets == nGenJets)
1178 fhX3->Fill(xGen[0], TMath::Abs(xGen[0]-xRec[0])/xGen[0], fXsection);
1179 fhX4->Fill(xGen[1], TMath::Abs(xGen[1]-xRec[1])/xGen[1], fXsection);
1180 fhX5->Fill(xGen[2], TMath::Abs(xGen[2]-xRec[2])/xGen[2], fXsection);
1183 FillTopology(fhX3X4Rec, fhMu34Rec, fhMu45Rec, fhMu35Rec, xRec, pRestRec, fXsection);
1185 if(fDebug)Printf("%s:%d",(char*)__FILE__,__LINE__);
1189 if(fDebug)Printf("%s:%d Data Posted",(char*)__FILE__,__LINE__);
1193 //__________________________________________________________________________________________________________________________________________________
1194 void AliAnalysisTaskThreeJets::Terminate(Option_t *)
1196 if(fDebug)printf(" AliAnalysisTaskThreeJets::Terminate()");
1200 //_______________________________________User defined functions_____________________________________________________________________________________
1201 void AliAnalysisTaskThreeJets::FillTopology(TH2F * Dalitz, TH1F * fhMu34, TH1F * fhMu45, TH1F * fhMu35, Double_t * x, TVector3 * pRest, Double_t xsection)
1204 // fill the topology histos
1206 Dalitz->Fill(x[0], x[1], xsection);
1207 fhMu35->Fill(TMath::Sqrt(x[0]*x[2]*(1-(pRest[0].Unit()).Dot(pRest[2].Unit()))/2), xsection);
1208 fhMu34->Fill(TMath::Sqrt(x[0]*x[1]*(1-(pRest[0].Unit()).Dot(pRest[1].Unit()))/2), xsection);
1209 fhMu45->Fill(TMath::Sqrt(x[1]*x[2]*(1-(pRest[1].Unit()).Dot(pRest[2].Unit()))/2), xsection);
1212 //_____________________________________________________________________________________________________________________________
1214 Bool_t AliAnalysisTaskThreeJets::IsPrimChar(TParticle* aParticle, Int_t aTotalPrimaries, Bool_t adebug)
1217 // this function checks if a particle from the event generator (i.e. among the nPrim particles in the stack)
1218 // shall be counted as a primary particle
1220 // This function or a equivalent should be available in some common place of AliRoot
1222 // WARNING: Call this function only for particles that are among the particles from the event generator!
1223 // --> stack->Particle(id) with id < stack->GetNprimary()
1225 // if the particle has a daughter primary, we do not want to count it
1226 if (aParticle->GetFirstDaughter() != -1 && aParticle->GetFirstDaughter() < aTotalPrimaries)
1229 printf("Dropping particle because it has a daughter among the primaries.\n");
1233 Int_t pdgCode = TMath::Abs(aParticle->GetPdgCode());
1236 // skip quarks and gluon
1237 if (pdgCode <= 10 || pdgCode == 21)
1240 printf("Dropping particle because it is a quark or gluon.\n");
1244 Int_t status = aParticle->GetStatusCode();
1245 // skip non final state particles..
1248 printf("Dropping particle because it is not a final state particle.\n");
1252 if (strcmp(aParticle->GetName(),"XXX") == 0)
1254 Printf("WARNING: There is a particle named XXX (pdg code %d).", pdgCode);
1258 TParticlePDG* pdgPart = aParticle->GetPDG();
1260 if (strcmp(pdgPart->ParticleClass(),"Unknown") == 0)
1262 Printf("WARNING: There is a particle with an unknown particle class (pdg code %d).", pdgCode);
1266 if (pdgPart->Charge() == 0)
1269 printf("Dropping particle because it is not charged.\n");
1276 //______________________________________________________________________________________________________
1279 //__________________________________________________________________________________________________________________________
1281 Double_t AliAnalysisTaskThreeJets::Exponent(Double_t x,const Double_t * const par) const
1283 return par[0]*TMath::Power(1/TMath::E(), TMath::Power(par[1]/x, par[2])+0.5*TMath::Power((x-par[3])/par[0], 2))+par[4]*x;
1286 Double_t AliAnalysisTaskThreeJets::Exponent2(Double_t x,const Double_t * const par) const
1288 return par[0]*TMath::Power(1/TMath::E(), TMath::Power(par[1]/x, par[2]))+par[3]*x;
1291 Double_t AliAnalysisTaskThreeJets::Gauss(Double_t x,const Double_t * const par) const
1293 return 1/(par[1])*TMath::Power(1/TMath::E(), 0.5*(x-par[0])*(x-par[0])/(par[1]*par[1]));
1296 Double_t AliAnalysisTaskThreeJets::Total(Double_t x,const Double_t * const par) const
1298 return Exponent(x, par)+Gauss(x, &par[4]);