AliPhysics  master (3d17d9d)
AliAnalysisTaskEmcalQGTagging.cxx
Go to the documentation of this file.
1 //
2 // Jet QG tagging analysis task.
3 //
4 // Author: D. Caffarri, L. Cunqueiro
5 //just testing
6 #include <TClonesArray.h>
7 #include <TH1F.h>
8 #include <TH2F.h>
9 #include <TH3F.h>
10 #include <THnSparse.h>
11 #include <TTree.h>
12 #include <TList.h>
13 #include <TLorentzVector.h>
14 #include <TProfile.h>
15 #include <TChain.h>
16 #include <TSystem.h>
17 #include <TFile.h>
18 #include <TKey.h>
19 #include <AliAnalysisDataSlot.h>
20 #include <AliAnalysisDataContainer.h>
21 #include "TMatrixD.h"
22 #include "TMatrixDSym.h"
23 #include "TMatrixDSymEigen.h"
24 #include "TVector3.h"
25 #include "TVector2.h"
26 #include "AliVCluster.h"
27 #include "AliVTrack.h"
28 #include "AliEmcalJet.h"
29 #include "AliRhoParameter.h"
30 #include "AliLog.h"
31 #include "AliEmcalParticle.h"
32 #include "AliMCEvent.h"
33 #include "AliGenPythiaEventHeader.h"
34 #include "AliAODMCHeader.h"
35 #include "AliMCEvent.h"
36 #include "AliAnalysisManager.h"
37 #include "AliJetContainer.h"
38 #include "AliParticleContainer.h"
39 #include "AliEmcalPythiaInfo.h"
40 #include "TRandom3.h"
41 
42 
43 
44 #include "AliAODEvent.h"
46 
47 using std::cout;
48 using std::endl;
49 
51 
52 //________________________________________________________________________
55  fContainer(0),
56  fMinFractionShared(0),
57  fJetShapeType(kData),
58  fJetShapeSub(kNoSub),
59  fJetSelection(kInclusive),
60  fPtThreshold(-9999.),
61  fRMatching(0.2),
62  fSelectedShapes(0),
63  fminpTTrig(20.),
64  fmaxpTTrig(50.),
65  fangWindowRecoil(0.6),
66  fSemigoodCorrect(0),
67  fHolePos(0),
68  fHoleWidth(0),
69  fCentSelectOn(kTRUE),
70  fCentMin(0),
71  fCentMax(10),
72  fOneConstSelectOn(kFALSE),
73  fTrackCheckPlots(kFALSE),
74  fCheckResolution(kFALSE),
75  fSubjetCutoff(0.1),
76  fMinPtConst(1),
77  fHardCutoff(0),
78  fDoTwoTrack(kFALSE),
79  fDoAreaIterative(kTRUE),
80  fPhiCutValue(0.02),
81  fEtaCutValue(0.02),
82  fMagFieldPolarity(1),
83  fDerivSubtrOrder(0),
84  fh2ResponseUW(0x0),
85  fh2ResponseW(0x0),
86  fPhiJetCorr6(0x0),
87  fPhiJetCorr7(0x0),
88  fEtaJetCorr6(0x0),
89  fEtaJetCorr7(0x0),
90  fPtJetCorr(0x0),
91  fPtJet(0x0),
92  fhpTjetpT(0x0),
93  fhPt(0x0),
94  fhPhi(0x0),
95  fhTrackPhi(0x0),
96  fHLundIterative(0x0),
97  fHCheckResolutionSubjets(0x0),
98  fNbOfConstvspT(0x0),
99  fTreeObservableTagging(0)
100 
101 {
102  for(Int_t i=0;i<12;i++){
103  fShapesVar[i]=0;}
104  SetMakeGeneralHistograms(kTRUE);
105  DefineOutput(1, TList::Class());
106  DefineOutput(2, TTree::Class());
107 }
108 
109 //________________________________________________________________________
111  AliAnalysisTaskEmcalJet(name, kTRUE),
112  fContainer(0),
113  fMinFractionShared(0),
114  fJetShapeType(kData),
115  fJetShapeSub(kNoSub),
116  fJetSelection(kInclusive),
117  fPtThreshold(-9999.),
118  fRMatching(0.2),
119  fSelectedShapes(0),
120  fminpTTrig(20.),
121  fmaxpTTrig(50.),
122  fangWindowRecoil(0.6),
123  fSemigoodCorrect(0),
124  fHolePos(0),
125  fHoleWidth(0),
126  fCentSelectOn(kTRUE),
127  fCentMin(0),
128  fCentMax(10),
129  fOneConstSelectOn(kFALSE),
130  fTrackCheckPlots(kFALSE),
131  fCheckResolution(kFALSE),
132  fSubjetCutoff(0.1),
133  fMinPtConst(1),
134  fHardCutoff(0),
135  fDoTwoTrack(kFALSE),
136  fDoAreaIterative(kTRUE),
137  fPhiCutValue(0.02),
138  fEtaCutValue(0.02),
139  fMagFieldPolarity(1),
140  fDerivSubtrOrder(0),
141  fh2ResponseUW(0x0),
142  fh2ResponseW(0x0),
143  fPhiJetCorr6(0x0),
144  fPhiJetCorr7(0x0),
145  fEtaJetCorr6(0x0),
146  fEtaJetCorr7(0x0),
147  fPtJetCorr(0x0),
148  fPtJet(0x0),
149  fhpTjetpT(0x0),
150  fhPt(0x0),
151  fhPhi(0x0),
152  fhTrackPhi(0x0),
153  fHLundIterative(0x0),
154  fHCheckResolutionSubjets(0x0),
155  fNbOfConstvspT(0x0),
156  fTreeObservableTagging(0)
157 
158 {
159  // Standard constructor.
160  for(Int_t i=0;i<12;i++){
161  fShapesVar[i]=0;}
163 
164  DefineOutput(1, TList::Class());
165  DefineOutput(2, TTree::Class());
166 }
167 
168 //________________________________________________________________________
170 {
171  // Destructor.
172 }
173 
174 //________________________________________________________________________
176 {
177  // Create user output.
178 
180 
181  Bool_t oldStatus = TH1::AddDirectoryStatus();
182  TH1::AddDirectory(kFALSE);
183 
184 
185 
186 
187  fh2ResponseUW= new TH2F("fh2ResponseUW", "fh2ResponseUW", 100, 0, 200, 100, 0, 200);
188  fOutput->Add(fh2ResponseUW);
189  fh2ResponseW= new TH2F("fh2ResponseW", "fh2ResponseW", 100, 0, 200, 100, 0, 200);
190  fOutput->Add(fh2ResponseW);
191  fPhiJetCorr6= new TH2F("fPhiJetCorr6", "fPhiJetCorr6", 50, 0, 2*TMath::Pi(), 50, 0, 2*TMath::Pi());
192  fOutput->Add(fPhiJetCorr6);
193  fEtaJetCorr6= new TH2F("fEtaJetCorr6", "fEtaJetCorr6", 50, -1.5, 1.5, 50, -1.5, 1.5);
194  fOutput->Add(fEtaJetCorr6);
195 
196  fPhiJetCorr7= new TH2F("fPhiJetCorr7", "fPhiJetCorr7", 50, 0, 2*TMath::Pi(), 50, 0, 2*TMath::Pi());
197  fOutput->Add(fPhiJetCorr7);
198  fEtaJetCorr7= new TH2F("fEtaJetCorr7", "fEtaJetCorr7", 50, -1.5, 1.5, 50, -1.5, 1.5);
199  fOutput->Add(fEtaJetCorr7);
200 
201  fPtJetCorr= new TH2F("fPtJetCorr", "fPtJetCorr", 100, 0, 200, 100, 0, 200);
202  fOutput->Add(fPtJetCorr);
203  fPtJet= new TH1F("fPtJet", "fPtJet", 100, 0, 200);
204  fOutput->Add(fPtJet);
205 
206  fhpTjetpT= new TH2F("fhpTjetpT", "fhpTjetpT", 200, 0, 200, 200, 0, 200);
207  fOutput->Add(fhpTjetpT);
208  fhPt= new TH1F("fhPt", "fhPt", 200, 0, 200);
209  fOutput->Add(fhPt);
210  fhPhi= new TH1F("fhPhi", "fhPhi", 100, -TMath::Pi(), TMath::Pi());
211  fOutput->Add(fhPhi);
212  fhTrackPhi= new TH1F("fhTrackPhi", "fhTrackPhi", 100, 0, 2*TMath::Pi());
213  fOutput->Add(fhTrackPhi);
214 
215 
216 
217  //log(1/theta),log(kt),jetpT,depth, algo, Eradiator//
218  const Int_t dimSpec = 6;
219  const Int_t nBinsSpec[6] = {50,100,100,20,100,2};
220  const Double_t lowBinSpec[6] = {0.,-10,0,0,0,0};
221  const Double_t hiBinSpec[6] = {5.,10.,100,20,100,2};
222  fHLundIterative = new THnSparseF("fHLundIterative",
223  "LundIterativePlot [log(1/theta),log(z*theta),pTjet,algo]",
224  dimSpec,nBinsSpec,lowBinSpec,hiBinSpec);
225  fOutput->Add(fHLundIterative);
226 
227 
229  const Int_t dimResol = 5;
230  const Int_t nBinsResol[5] = {10,10,80,80,80};
231  const Double_t lowBinResol[5] = {0,0,-1,-1,-1};
232  const Double_t hiBinResol[5] = {200,0.3,1,1,1};
233  fHCheckResolutionSubjets = new THnSparseF("fHCheckResolutionSubjets",
234  "Mom.Resolution of Subjets vs opening angle",
235  dimResol,nBinsResol,lowBinResol,hiBinResol);
237 
238 
239 
240 
241  fNbOfConstvspT=new TH2F("fNbOfConstvspT", "fNbOfConstvspT", 100, 0, 100, 200, 0, 200);
242  fOutput->Add(fNbOfConstvspT);
243 
244  // =========== Switch on Sumw2 for all histos ===========
245  for (Int_t i=0; i<fOutput->GetEntries(); ++i) {
246  TH1 *h1 = dynamic_cast<TH1*>(fOutput->At(i));
247  if (h1){
248  h1->Sumw2();
249  continue;
250  }
251  THnSparse *hn = dynamic_cast<THnSparse*>(fOutput->At(i));
252  if(hn)hn->Sumw2();
253  }
254 
255 
256  TH1::AddDirectory(oldStatus);
257  const Int_t nVar = 12;
258  const char* nameoutput = GetOutputSlot(2)->GetContainer()->GetName();
259  fTreeObservableTagging = new TTree(nameoutput, nameoutput);
260 
261 
262  TString *fShapesVarNames = new TString [nVar];
263 
264  fShapesVarNames[0] = "partonCode";
265  fShapesVarNames[1] = "ptJet";
266  fShapesVarNames[2] = "ktAv";
267  fShapesVarNames[3] = "thetaAv";
268  fShapesVarNames[4] = "zg";
269  fShapesVarNames[5] = "deltaR";
270  fShapesVarNames[6] = "ptJetMatch";
271  fShapesVarNames[7] = "ktAvMatch";
272  fShapesVarNames[8] = "thetaAvMatch";
273  fShapesVarNames[9] = "zgMatch";
274  fShapesVarNames[10] = "deltaRMatch";
275  fShapesVarNames[11]="weightPythia";
276 
277 
278  for(Int_t ivar=0; ivar < nVar; ivar++){
279  cout<<"looping over variables"<<endl;
280  fTreeObservableTagging->Branch(fShapesVarNames[ivar].Data(), &fShapesVar[ivar], Form("%s/F", fShapesVarNames[ivar].Data()));}
281 
282  PostData(1,fOutput);
283  PostData(2,fTreeObservableTagging);
284 
285  delete [] fShapesVarNames;
286 }
287 
288 //________________________________________________________________________
290 {
291  // Run analysis code here, if needed. It will be executed before FillHistograms().
292 
293  return kTRUE;
294 }
295 
296 //________________________________________________________________________
298 {
299  // Fill histograms.
300  //cout<<"base container"<<endl;
301  AliEmcalJet* jet1 = NULL;
302  AliJetContainer *jetCont = GetJetContainer(0);
303 
304  Float_t kWeight=1;
305  if (fCentSelectOn)
306  if ((fCent>fCentMax) || (fCent<fCentMin)) return 0;
307 
308  AliAODTrack *triggerHadron = 0x0;
309 
310 
311  AliTrackContainer *PartCont =NULL;
312  AliParticleContainer *PartContMC=NULL;
313 
314  if (fJetShapeSub==kConstSub){
316  else PartCont = GetTrackContainer(1);
317  }
318  else{
320  else PartCont = GetTrackContainer(0);
321  }
322 
323  TClonesArray *TrackArray = NULL;
324  TClonesArray *TrackArrayMC = NULL;
325  if (fJetShapeType == AliAnalysisTaskEmcalQGTagging::kGenOnTheFly) TrackArrayMC = PartContMC->GetArray();
326  else TrackArray = PartCont->GetArray();
327 
328  Int_t NTracks=0;
329  if (fJetShapeType == AliAnalysisTaskEmcalQGTagging::kGenOnTheFly) NTracks = TrackArrayMC->GetEntriesFast();
330  else NTracks = TrackArray->GetEntriesFast();
331 
332 
333 
334 
335  if (fJetSelection == kRecoil) {
336  //Printf("Recoil jets!!!, fminpTTrig = %f, fmaxpTTrig = %f", fminpTTrig, fmaxpTTrig);
337  Int_t triggerHadronLabel = SelectTrigger(fminpTTrig, fmaxpTTrig);
338 
339 
340  if (triggerHadronLabel==-99999) {
341  //Printf ("Trigger Hadron not found, return");
342  return 0;}
343 
344  if (fJetShapeType == AliAnalysisTaskEmcalQGTagging::kGenOnTheFly) triggerHadron = static_cast<AliAODTrack*>(TrackArrayMC->At(triggerHadronLabel));
345  else triggerHadron = static_cast<AliAODTrack*>(TrackArray->At(triggerHadronLabel));
346 
348  if (!triggerHadron) {
349  //Printf("No Trigger hadron with the found label!!");
350  return 0;
351  }
352 
353  if(fSemigoodCorrect){
354  Double_t disthole=RelativePhi(triggerHadron->Phi(),fHolePos);
355  if(TMath::Abs(disthole)+fHoleWidth>TMath::Pi()-fangWindowRecoil){
356  return 0;}
357  }
358 
359 
360  fhPt->Fill(triggerHadron->Pt());
361 
362  }
363 
364 
365  if(fTrackCheckPlots){
366  //here check tracks//
367  AliAODTrack *Track = 0x0;
368  for(Int_t i=0; i < NTracks; i++){
370  if((Track = static_cast<AliAODTrack*>(PartContMC->GetAcceptParticle(i)))){
371  if (!Track) continue;
372  if(TMath::Abs(Track->Eta())>0.9) continue;
373  if (Track->Pt()<0.15) continue;
374  fhTrackPhi->Fill(Track->Phi());
375  }
376  }
377  else{
378  if((Track = static_cast<AliAODTrack*>(PartCont->GetAcceptTrack(i)))){
379  if (!Track) continue;
380  if(TMath::Abs(Track->Eta())>0.9) continue;
381  if (Track->Pt()<0.15) continue;
382  fhTrackPhi->Fill(Track->Phi());
383  }
384  }
385  }
386  }
387 
388 
389  // AliParticleContainer *partContAn = GetParticleContainer(0);
390  //TClonesArray *trackArrayAn = partContAn->GetArray();
391 
392 
393  Float_t rhoVal=0, rhoMassVal = 0.;
394  if(jetCont) {
395 
396  jetCont->ResetCurrentID();
398  //rho
399  AliRhoParameter* rhoParam = dynamic_cast<AliRhoParameter*>(InputEvent()->FindListObject("RhoSparseR020"));
400  if (!rhoParam) {
401  Printf("%s: Could not retrieve rho %s (some histograms will be filled with zero)!", GetName(), jetCont->GetRhoName().Data());
402  } else rhoVal = rhoParam->GetVal();
403  //rhom
404  AliRhoParameter* rhomParam = dynamic_cast<AliRhoParameter*>(InputEvent()->FindListObject("RhoMassSparseR020"));
405  if (!rhomParam) {
406  Printf("%s: Could not retrieve rho_m %s (some histograms will be filled with zero)!", GetName(), jetCont->GetRhoMassName().Data());
407  } else rhoMassVal = rhomParam->GetVal();
408  }
409 
410  while((jet1 = jetCont->GetNextAcceptJet())) {
411  if (!jet1) continue;
412  AliEmcalJet* jet2 = 0x0;
413  AliEmcalJet* jet3 = 0x0;
414  fPtJet->Fill(jet1->Pt());
415  AliEmcalJet *jetUS = NULL;
416  Int_t ifound=0, jfound=0;
417  Int_t ilab=-1, jlab=-1;
418 
420  Double_t disthole=RelativePhi(jet1->Phi(),fHolePos);
421  if(TMath::Abs(disthole)<fHoleWidth){
422  continue;}
423  }
424 
425  Float_t dphiRecoil = 0.;
426  if (fJetSelection == kRecoil){
427  dphiRecoil = RelativePhi(triggerHadron->Phi(), jet1->Phi());
428  if (TMath::Abs(dphiRecoil) < (TMath::Pi() - fangWindowRecoil)) {
429  // Printf("Recoil jets back to back not found! continuing");
430  continue;
431  }
432 
433  fhpTjetpT->Fill(triggerHadron->Pt(), jet1->Pt());
434  //Printf(" ************ FILLING HISTOS****** shapeSub = %d, triggerHadron = %f, jet1 = %f", fJetShapeSub, triggerHadron->Pt(), jet1->Pt());
435  fhPhi->Fill(RelativePhi(triggerHadron->Phi(), jet1->Phi()));
436 
437  }
438 
439 
440  fShapesVar[0] = 0.;
442  // AliJetContainer *jetContTrue = GetJetContainer(1);
443  AliJetContainer *jetContUS = GetJetContainer(2);
444 
445  if(fJetShapeSub==kConstSub){
446  for(Int_t i = 0; i<jetContUS->GetNJets(); i++) {
447  jetUS = jetContUS->GetJet(i);
448  if(jetUS->GetLabel()==jet1->GetLabel()) {
449  ifound++;
450  if(ifound==1) ilab = i;
451  }
452  }
453  if(ilab==-1) continue;
454  jetUS=jetContUS->GetJet(ilab);
455  jet2=jetUS->ClosestJet();
456  }
457 
458  if(!(fJetShapeSub==kConstSub)) jet2 = jet1->ClosestJet();
459  if (!jet2) {
460  Printf("jet2 does not exist, returning");
461  continue;
462  }
463 
464  //AliJetContainer *jetContPart=GetJetContainer(3);
465  jet3=jet2->ClosestJet();
466 
467  if(!jet3){
468  Printf("jet3 does not exist, returning");
469  continue;
470  }
471  cout<<"jet 3 exists"<<jet3->Pt()<<endl;
472 
473 
474  fh2ResponseUW->Fill(jet1->Pt(),jet2->Pt());
475 
476  Double_t fraction=0;
477  if(!(fJetShapeSub==kConstSub)) fraction = jetCont->GetFractionSharedPt(jet1);
478  if(fJetShapeSub==kConstSub) fraction = jetContUS->GetFractionSharedPt(jetUS);
479  //if (fraction > 0.1) cout<<"***** hey a jet matched with fraction"<<fraction<<" "<<jet1->Pt()<<" "<<jet2->Pt()<<" "<<fCent<<endl;
480 
481  if(fraction<fMinFractionShared) continue;
482  //InputEvent()->Print();
483 
484  }
485 
486 
487 
488  if (fJetShapeType == kPythiaDef){
489 
490  AliJetContainer *jetContTrue = GetJetContainer(1);
491  AliJetContainer *jetContUS = GetJetContainer(2);
492  AliJetContainer *jetContPart = GetJetContainer(3);
493 
494  if(fJetShapeSub==kConstSub){
495 
496  for(Int_t i = 0; i<jetContUS->GetNJets(); i++) {
497  jetUS = jetContUS->GetJet(i);
498  if(jetUS->GetLabel()==jet1->GetLabel()) {
499  ifound++;
500  if(ifound==1) ilab = i;
501  }
502  }
503  if(ilab==-1) continue;
504  jetUS=jetContUS->GetJet(ilab);
505  jet2=jetUS->ClosestJet();
506 
507  if (!jet2) {
508  Printf("jet2 does not exist, returning");
509  continue;
510  }
511 
512  for(Int_t j=0; j<jetContPart->GetNJets(); j++) {
513 
514  jet3 = jetContPart->GetJet(j);
515  if(!jet3) continue;
516  if(jet3->GetLabel()==jet2->GetLabel()) {
517  jfound++;
518  if(jfound==1) jlab = j;
519  }
520  }
521  if(jlab==-1) continue;
522  jet3=jetContPart->GetJet(jlab);
523  if(!jet3){
524  Printf("jet3 does not exist, returning");
525  continue;
526  }
527  }
528  if(!(fJetShapeSub==kConstSub)) jet3 = jet1->ClosestJet();
529  if (!jet3) {
530  Printf("jet3 does not exist, returning");
531  continue;
532  }
533 
534 
535  fh2ResponseUW->Fill(jet1->Pt(),jet3->Pt());
536  if(fCheckResolution) CheckSubjetResolution(jet1,jetCont,jet3,jetContTrue);
537 
538  }
539 
540 
541  if (fJetShapeType == kGenOnTheFly){
542  const AliEmcalPythiaInfo *partonsInfo = 0x0;
543  partonsInfo = GetPythiaInfo();
544  Double_t jp1=RelativePhi(jet1->Phi(),partonsInfo->GetPartonPhi6());
545  Double_t detap1=(jet1->Eta())-(partonsInfo->GetPartonEta6());
546  kWeight=partonsInfo->GetPythiaEventWeight();
547  fh2ResponseW->Fill(jet1->Pt(),jet1->Pt(),kWeight);
548 
549  Float_t dRp1 = TMath::Sqrt(jp1 * jp1 + detap1 * detap1);
550  fEtaJetCorr6->Fill(jet1->Eta(), partonsInfo->GetPartonEta6());
551  fPhiJetCorr6->Fill(jet1->Phi(), partonsInfo->GetPartonPhi6());
552  if(dRp1 < fRMatching) {
553  fShapesVar[0] = partonsInfo->GetPartonFlag6();
554  fPtJetCorr ->Fill(partonsInfo->GetPartonPt6(), jet1->Pt());
555  }
556  else {
557  jp1=RelativePhi(jet1->Phi(),partonsInfo->GetPartonPhi7());
558  detap1=(jet1->Eta())-(partonsInfo->GetPartonEta7());
559  dRp1 = TMath::Sqrt(jp1 * jp1 + detap1 * detap1);
560  fEtaJetCorr7->Fill(jet1->Eta(), partonsInfo->GetPartonEta7());
561  fPhiJetCorr7->Fill(jet1->Phi(), partonsInfo->GetPartonPhi7());
562  if(dRp1 < fRMatching) {
563  fShapesVar[0] = partonsInfo->GetPartonFlag7();
564  fPtJetCorr->Fill(partonsInfo->GetPartonPt7(), jet1->Pt());
565  }
566  else fShapesVar[0]=0;
567  }
568  }
569 
570 
571 
572 
573  Double_t ptSubtracted = 0;
574  if (fJetShapeSub==kConstSub) ptSubtracted= jet1->Pt();
575 
576  else if (fJetShapeSub==kDerivSub) {
577  ptSubtracted=jet1->Pt()-GetRhoVal(0)*jet1->Area();
578  }
579 
580  else if (fJetShapeSub==kNoSub) {
581  if ((fJetShapeType==kData) || (fJetShapeType==kDetEmbPartPythia)) ptSubtracted=jet1->Pt()-GetRhoVal(0)*jet1->Area();
582  else if ((fJetShapeType==kPythiaDef) || (fJetShapeType==kMCTrue) || (fJetShapeType==kGenOnTheFly)) ptSubtracted= jet1->Pt();
583  }
584 
585  //Printf("ptSubtracted=%f,fPtThreshold =%f ", ptSubtracted, fPtThreshold);
586  if (ptSubtracted < fPtThreshold) continue;
587 
588  if (fOneConstSelectOn == kTRUE) fNbOfConstvspT->Fill(GetJetNumberOfConstituents(jet1,0), ptSubtracted);
589  if ((fCentSelectOn == kFALSE) && (jet1->GetNumberOfTracks() <= 1)) continue;
590 
591 
592  fShapesVar[1] = ptSubtracted;
593  RecursiveParents(jet1,jetCont);
594 
595 
596  Float_t ptMatch=0.;
597  Int_t kMatched = 0;
598  Double_t ktAvMatch=0;;
599  Double_t thetaAvMatch=0;
600  Double_t zgMatch=0;
601  Double_t deltaRMatch=0;
602  Double_t aver1=0;
603  Double_t aver2=0;
604  Double_t aver3=0;
605  Double_t aver4=0;
606  if (fJetShapeType==kPythiaDef) {
607  kMatched =1;
608  if(fJetShapeSub==kConstSub) kMatched = 3;
609 
610  ptMatch=jet3->Pt();
611  RecursiveParentsMCAverage(jet3,kMatched, aver1, aver2,aver3,aver4);
612  ktAvMatch=aver1;
613  thetaAvMatch=aver2;
614  zgMatch=aver3;
615  deltaRMatch=aver4;
616 
617  }
618 
620  if(fJetShapeSub==kConstSub) kMatched = 3;
621  if(fJetShapeSub==kDerivSub) kMatched = 2;
622  ptMatch=jet3->Pt();
623 
624  RecursiveParentsMCAverage(jet3,kMatched, aver1, aver2,aver3,aver4);
625  ktAvMatch=aver1;
626  thetaAvMatch=aver2;
627  zgMatch=aver3;
628  deltaRMatch=aver4;
629 
630  }
631 
632 
633 
635  kMatched = 0;
636  ptMatch=0.;
637  ktAvMatch=0.;
638  thetaAvMatch=0.;
639  zgMatch=0;
640  deltaRMatch=0;
641 
642 
643  }
644 
645 
646 
647  fShapesVar[6] = ptMatch;
648  fShapesVar[7] = ktAvMatch;
649  fShapesVar[8] = thetaAvMatch;
650  fShapesVar[9] = zgMatch;
651  fShapesVar[10]=deltaRMatch;
652  fShapesVar[11] = kWeight;
653  fTreeObservableTagging->Fill();
654 
655 
656 
657 
658 
659 
660  }
661 
662  }
663 
664  return kTRUE;
665 }
666 
667 //________________________________________________________________________
669  //calc subtracted jet mass
670  if((fJetShapeSub==kDerivSub)&&(jetContNb==0))
672  else return jet->GetShapeProperties()->GetSecondOrderSubtracted();
673  else
674  return jet->M();
675 }
676 
677 //________________________________________________________________________
679 
680  AliJetContainer *jetCont = GetJetContainer(jetContNb);
681  if (!jet->GetNumberOfTracks())
682  return 0;
683  Double_t den=0.;
684  Double_t num = 0.;
685  AliVParticle *vp1 = 0x0;
686  for(UInt_t i = 0; i < jet->GetNumberOfTracks(); i++) {
687  vp1 = static_cast<AliVParticle*>(jet->TrackAt(i, jetCont->GetParticleContainer()->GetArray()));
688 
689  if (!vp1){
690  Printf("AliVParticle associated to constituent not found");
691  continue;
692  }
693 
694  Double_t dphi = RelativePhi(vp1->Phi(),jet->Phi());
695  Double_t dr2 = (vp1->Eta()-jet->Eta())*(vp1->Eta()-jet->Eta()) + dphi*dphi;
696  Double_t dr = TMath::Sqrt(dr2);
697  num=num+vp1->Pt()*dr;
698  den=den+vp1->Pt();
699  }
700  return num/den;
701 }
702 
703 //________________________________________________________________________
705 
706  if((fJetShapeSub==kDerivSub) && (jetContNb==0))
709  else
710  return Angularity(jet, jetContNb);
711 
712 }
713 
714 //____________________________________________________________________________
715 
717 
718  AliTrackContainer *PartCont = NULL;
719  AliParticleContainer *PartContMC = NULL;
720 
721 
722  if (fJetShapeSub==kConstSub){
724  else PartCont = GetTrackContainer(1);
725  }
726  else{
728  else PartCont = GetTrackContainer(0);
729  }
730 
731  TClonesArray *TracksArray = NULL;
732  TClonesArray *TracksArrayMC = NULL;
733 
734  if (fJetShapeType == AliAnalysisTaskEmcalQGTagging::kGenOnTheFly) TracksArrayMC = PartContMC->GetArray();
735  else TracksArray = PartCont->GetArray();
736 
738  if(!PartContMC || !TracksArrayMC) return -2;
739  }
740  else {
741  if(!PartCont || !TracksArray) return -2;
742  }
743 
744 
745  AliAODTrack *Track = 0x0;
746  Float_t sumpt=0;
747  Int_t NTracks=0;
748  if (fJetShapeType == AliAnalysisTaskEmcalQGTagging::kGenOnTheFly) NTracks = TracksArrayMC->GetEntriesFast();
749  else NTracks = TracksArray->GetEntriesFast();
750 
751  for(Int_t i=0; i < NTracks; i++){
753  if((Track = static_cast<AliAODTrack*>(PartContMC->GetAcceptParticle(i)))){
754  if (!Track) continue;
755  if(TMath::Abs(Track->Eta())>0.9) continue;
756  Double_t dphi = RelativePhi(Track->Phi(),jet->Phi());
757  Double_t dr2 = (Track->Eta()-jet->Eta())*(Track->Eta()-jet->Eta()) + dphi*dphi;
758  Double_t dr = TMath::Sqrt(dr2);
759  if((dr>=0.8) && (dr<1)) sumpt=sumpt+Track->Pt();
760  }
761  }
762  else{
763  if((Track = static_cast<AliAODTrack*>(PartCont->GetAcceptTrack(i)))){
764  if (!Track) continue;
765  if(TMath::Abs(Track->Eta())>0.9) continue;
766  if (Track->Pt()<0.15) continue;
767  Double_t dphi = RelativePhi(Track->Phi(),jet->Phi());
768  Double_t dr2 = (Track->Eta()-jet->Eta())*(Track->Eta()-jet->Eta()) + dphi*dphi;
769  Double_t dr = TMath::Sqrt(dr2);
770  if((dr>=0.8) && (dr<1)) sumpt=sumpt+Track->Pt();
771 
772  }
773  }
774  }
775 
776 
777 
778  return sumpt;
779 
780 
781 
782 
783 }
784 
785 //________________________________________________________________________
787 
788  if((fJetShapeSub==kDerivSub) && (jetContNb==0)) return -2;
789  else
790  return Coronna(jet, jetContNb);
791 
792 }
793 
794 
795 
796 
797 
798 //________________________________________________________________________
800 
801  AliJetContainer *jetCont = GetJetContainer(jetContNb);
802  if (!jet->GetNumberOfTracks())
803  return 0;
804  Double_t den=0.;
805  Double_t num = 0.;
806  AliVParticle *vp1 = 0x0;
807  for(UInt_t i = 0; i < jet->GetNumberOfTracks(); i++) {
808  vp1 = static_cast<AliVParticle*>(jet->TrackAt(i, jetCont->GetParticleContainer()->GetArray()));
809 
810  if (!vp1){
811  Printf("AliVParticle associated to constituent not found");
812  continue;
813  }
814 
815  num=num+vp1->Pt()*vp1->Pt();
816  den=den+vp1->Pt();
817  }
818  return TMath::Sqrt(num)/den;
819 }
820 
821 //________________________________________________________________________
823  //calc subtracted jet mass
824  if((fJetShapeSub==kDerivSub)&&(jetContNb==0))
826  else return jet->GetShapeProperties()->GetSecondOrderSubtractedpTD();
827  else
828  return PTD(jet, jetContNb);
829 
830 }
831 
832 //_____________________________________________________________________________
834 
835  AliJetContainer *jetCont = GetJetContainer(jetContNb);
836  if (!jet->GetNumberOfTracks())
837  return 0;
838  Double_t mxx = 0.;
839  Double_t myy = 0.;
840  Double_t mxy = 0.;
841  int nc = 0;
842  Double_t sump2 = 0.;
843  Double_t pxjet=jet->Px();
844  Double_t pyjet=jet->Py();
845  Double_t pzjet=jet->Pz();
846 
847 
848  //2 general normalized vectors perpendicular to the jet
849  TVector3 ppJ1(pxjet, pyjet, pzjet);
850  TVector3 ppJ3(- pxjet* pzjet, - pyjet * pzjet, pxjet * pxjet + pyjet * pyjet);
851  ppJ3.SetMag(1.);
852  TVector3 ppJ2(-pyjet, pxjet, 0);
853  ppJ2.SetMag(1.);
854  AliVParticle *vp1 = 0x0;
855  for(UInt_t i = 0; i < jet->GetNumberOfTracks(); i++) {
856  vp1 = static_cast<AliVParticle*>(jet->TrackAt(i, jetCont->GetParticleContainer()->GetArray()));
857 
858  if (!vp1){
859  Printf("AliVParticle associated to constituent not found");
860  continue;
861  }
862 
863  TVector3 pp(vp1->Px(), vp1->Py(), vp1->Pz());
864 
865  //local frame
866  TVector3 pLong = pp.Dot(ppJ1) / ppJ1.Mag2() * ppJ1;
867  TVector3 pPerp = pp - pLong;
868  //projection onto the two perpendicular vectors defined above
869 
870  Float_t ppjX = pPerp.Dot(ppJ2);
871  Float_t ppjY = pPerp.Dot(ppJ3);
872  Float_t ppjT = TMath::Sqrt(ppjX * ppjX + ppjY * ppjY);
873  if(ppjT<=0) return 0;
874 
875  mxx += (ppjX * ppjX / ppjT);
876  myy += (ppjY * ppjY / ppjT);
877  mxy += (ppjX * ppjY / ppjT);
878  nc++;
879  sump2 += ppjT;}
880 
881  if(nc<2) return 0;
882  if(sump2==0) return 0;
883  // Sphericity Matrix
884  Double_t ele[4] = {mxx / sump2, mxy / sump2, mxy / sump2, myy / sump2};
885  TMatrixDSym m0(2,ele);
886 
887  // Find eigenvectors
888  TMatrixDSymEigen m(m0);
889  TVectorD eval(2);
890  TMatrixD evecm = m.GetEigenVectors();
891  eval = m.GetEigenValues();
892  // Largest eigenvector
893  int jev = 0;
894  // cout<<eval[0]<<" "<<eval[1]<<endl;
895  if (eval[0] < eval[1]) jev = 1;
896  TVectorD evec0(2);
897  // Principle axis
898  evec0 = TMatrixDColumn(evecm, jev);
899  Double_t compx=evec0[0];
900  Double_t compy=evec0[1];
901  TVector2 evec(compx, compy);
902  Double_t circ=0;
903  if(jev==1) circ=2*eval[0];
904  if(jev==0) circ=2*eval[1];
905 
906  return circ;
907 
908 
909 
910 }
911 
912 
913 
914 
915 //________________________________________________________________________
917  //calc subtracted jet mass
918 
919  if((fJetShapeSub==kDerivSub)&&(jetContNb==0))
922  else
923  return Circularity(jet, jetContNb);
924 
925 }
926 
927 //________________________________________________________________________
929 
930  AliJetContainer *jetCont = GetJetContainer(jetContNb);
931  if (!jet->GetNumberOfTracks())
932  return 0;
933  Double_t den=0.;
934  Double_t num = 0.;
935  AliVParticle *vp1 = 0x0;
936  AliVParticle *vp2 = 0x0;
937  std::vector<int> ordindex;
939  //Printf("Nbof const = %d", jet->GetNumberOfTracks());
940  //Printf("ordindex[0] = %d, ordindex[1] = %d", ordindex[0], ordindex[1]);
941 
942  if(ordindex.size()<2) return -1;
943 
944  vp1 = static_cast<AliVParticle*>(jet->TrackAt(ordindex[0], jetCont->GetParticleContainer()->GetArray()));
945  if (!vp1){
946  Printf("AliVParticle associated to Leading constituent not found");
947  return -1;
948  }
949 
950  vp2 = static_cast<AliVParticle*>(jet->TrackAt(ordindex[1], jetCont->GetParticleContainer()->GetArray()));
951  if (!vp2){
952  Printf("AliVParticle associated to Subleading constituent not found");
953  return -1;
954  }
955 
956 
957  num=vp1->Pt();
958  den=vp2->Pt();
959  //Printf("vp1->Pt() =%f, vp2->Pt() =%f", vp1->Pt(), vp2->Pt());
960 
961 return num-den;
962 }
963 
964 //________________________________________________________________________
966  //calc subtracted jet mass
967 
968  if((fJetShapeSub==kDerivSub)&&(jetContNb==0))
971  else
972  return LeSub(jet, jetContNb);
973 
974 }
975 
976 //________________________________________________________________________
978  //calc subtracted jet mass
979 
980  if((fJetShapeSub==kDerivSub)&&(jetContNb==0))
983  else
984  return jet->GetNumberOfTracks();
985 
986  }
987 
988 
989 //______________________________________________________________________________
991 
992  AliJetContainer *jetCont = GetJetContainer(jetContNb);
993  if (!jet->GetNumberOfTracks())
994  return 0;
995  Double_t mxx = 0.;
996  Double_t myy = 0.;
997  Double_t mxy = 0.;
998  int nc = 0;
999  Double_t sump2 = 0.;
1000 
1001  AliVParticle *vp1 = 0x0;
1002  for(UInt_t i = 0; i < jet->GetNumberOfTracks(); i++) {
1003  vp1 = static_cast<AliVParticle*>(jet->TrackAt(i, jetCont->GetParticleContainer()->GetArray()));
1004 
1005  if (!vp1){
1006  Printf("AliVParticle associated to constituent not found");
1007  continue;
1008  }
1009 
1010  Double_t ppt=vp1->Pt();
1011  Double_t dphi = RelativePhi(vp1->Phi(),jet->Phi());
1012 
1013  Double_t deta = vp1->Eta()-jet->Eta();
1014  mxx += ppt*ppt*deta*deta;
1015  myy += ppt*ppt*dphi*dphi;
1016  mxy -= ppt*ppt*deta*TMath::Abs(dphi);
1017  nc++;
1018  sump2 += ppt*ppt;
1019 
1020  }
1021  if(nc<2) return 0;
1022  if(sump2==0) return 0;
1023  // Sphericity Matrix
1024  Double_t ele[4] = {mxx , mxy , mxy , myy };
1025  TMatrixDSym m0(2,ele);
1026 
1027  // Find eigenvectors
1028  TMatrixDSymEigen m(m0);
1029  TVectorD eval(2);
1030  TMatrixD evecm = m.GetEigenVectors();
1031  eval = m.GetEigenValues();
1032  // Largest eigenvector
1033  int jev = 0;
1034  // cout<<eval[0]<<" "<<eval[1]<<endl;
1035  if (eval[0] < eval[1]) jev = 1;
1036  TVectorD evec0(2);
1037  // Principle axis
1038  evec0 = TMatrixDColumn(evecm, jev);
1039  Double_t compx=evec0[0];
1040  Double_t compy=evec0[1];
1041  TVector2 evec(compx, compy);
1042  Double_t sig=0;
1043  if(jev==1) sig=TMath::Sqrt(TMath::Abs(eval[0])/sump2);
1044  if(jev==0) sig=TMath::Sqrt(TMath::Abs(eval[1])/sump2);
1045 
1046  return sig;
1047 
1048 }
1049 
1050 //________________________________________________________________________
1052  //calc subtracted jet mass
1053 
1054  if((fJetShapeSub==kDerivSub)&&(jetContNb==0))
1056  else return jet->GetShapeProperties()->GetSecondOrderSubtractedSigma2();
1057  else
1058  return Sigma2(jet, jetContNb);
1059 
1060 }
1061 
1062 //________________________________________________________________________
1064 
1065  AliTrackContainer *PartCont = NULL;
1066  AliParticleContainer *PartContMC = NULL;
1067 
1068 
1069  if (fJetShapeSub==kConstSub){
1071  else PartCont = GetTrackContainer(1);
1072  }
1073  else{
1075  else PartCont = GetTrackContainer(0);
1076  }
1077 
1078  TClonesArray *TracksArray = NULL;
1079  TClonesArray *TracksArrayMC = NULL;
1080 
1081  if (fJetShapeType == AliAnalysisTaskEmcalQGTagging::kGenOnTheFly) TracksArrayMC = PartContMC->GetArray();
1082  else TracksArray = PartCont->GetArray();
1083 
1085  if(!PartContMC || !TracksArrayMC) return -99999;
1086  }
1087  else {
1088  if(!PartCont || !TracksArray) return -99999;
1089  }
1090 
1091 
1092  AliAODTrack *Track = 0x0;
1093 
1094 
1095 
1096  TList trackList;
1097  Int_t triggers[100];
1098  for (Int_t iTrigger=0; iTrigger<100; iTrigger++) triggers[iTrigger] = 0;
1099  Int_t iTT = 0;
1100  Int_t NTracks=0;
1101  if (fJetShapeType == AliAnalysisTaskEmcalQGTagging::kGenOnTheFly) NTracks = TracksArrayMC->GetEntriesFast();
1102  else NTracks = TracksArray->GetEntriesFast();
1103 
1104  for(Int_t i=0; i < NTracks; i++){
1106  if((Track = static_cast<AliAODTrack*>(PartContMC->GetAcceptParticle(i)))){
1107  if (!Track) continue;
1108  if(TMath::Abs(Track->Eta())>0.9) continue;
1109  if (Track->Pt()<0.15) continue;
1110  if ((Track->Pt() >= minpT) && (Track->Pt()< maxpT)) {
1111  triggers[iTT] = i;
1112  iTT++;
1113  }
1114  }
1115  }
1116  else{
1117  if((Track = static_cast<AliAODTrack*>(PartCont->GetAcceptTrack(i)))){
1118  if (!Track) continue;
1119  if(TMath::Abs(Track->Eta())>0.9) continue;
1120  if (Track->Pt()<0.15) continue;
1121  if ((Track->Pt() >= minpT) && (Track->Pt()< maxpT)) {
1122  triggers[iTT] = i;
1123  iTT++;
1124  }
1125  }
1126  }
1127  }
1128 
1129 
1130  if (iTT == 0) return -99999;
1131  Int_t nbRn = 0, index = 0 ;
1132  TRandom3 random(0);
1133  nbRn = random.Integer(iTT);
1134  index = triggers[nbRn];
1135  //Printf("iTT Total= %d, nbRn = %d, Index = %d",iTT, nbRn, index );
1136  return index;
1137 
1138 }
1139 
1140 //__________________________________________________________________________________
1142 
1143  if (vphi < -1*TMath::Pi()) vphi += (2*TMath::Pi());
1144  else if (vphi > TMath::Pi()) vphi -= (2*TMath::Pi());
1145  if (mphi < -1*TMath::Pi()) mphi += (2*TMath::Pi());
1146  else if (mphi > TMath::Pi()) mphi -= (2*TMath::Pi());
1147  double dphi = mphi-vphi;
1148  if (dphi < -1*TMath::Pi()) dphi += (2*TMath::Pi());
1149  else if (dphi > TMath::Pi()) dphi -= (2*TMath::Pi());
1150  return dphi;//dphi in [-Pi, Pi]
1151 }
1152 
1153 
1154 //_________________________________________________________________________
1156 
1157  std::vector<fastjet::PseudoJet> fInputVectors;
1158  fInputVectors.clear();
1159  fastjet::PseudoJet PseudoTracks;
1160 
1161  AliParticleContainer *fTrackCont = fJetCont->GetParticleContainer();
1162 
1163  if (fTrackCont) for (Int_t i=0; i<fJet->GetNumberOfTracks(); i++) {
1164  AliVParticle *fTrk = fJet->TrackAt(i, fTrackCont->GetArray());
1165  if (!fTrk) continue;
1166  if(fDoTwoTrack==kTRUE && CheckClosePartner(i,fJet,fTrk,fTrackCont)) continue;
1167  PseudoTracks.reset(fTrk->Px(), fTrk->Py(), fTrk->Pz(),fTrk->E());
1168  PseudoTracks.set_user_index(fJet->TrackAt(i)+100);
1169  fInputVectors.push_back(PseudoTracks);
1170 
1171  }
1172  fastjet::JetAlgorithm jetalgo(fastjet::cambridge_algorithm);
1173  fastjet::GhostedAreaSpec ghost_spec(1, 1, 0.05);
1174 
1175 
1176  fastjet::JetDefinition fJetDef(jetalgo, 1., static_cast<fastjet::RecombinationScheme>(0), fastjet::BestFJ30 );
1177  fastjet::AreaDefinition fAreaDef(fastjet::passive_area,ghost_spec);
1178  try {
1179  fastjet::ClusterSequenceArea fClustSeqSA(fInputVectors, fJetDef, fAreaDef);
1180  std::vector<fastjet::PseudoJet> fOutputJets;
1181  fOutputJets.clear();
1182  fOutputJets=fClustSeqSA.inclusive_jets(0);
1183 
1184  fastjet::PseudoJet jj;
1185  fastjet::PseudoJet j1;
1186  fastjet::PseudoJet j2;
1187  jj=fOutputJets[0];
1188  double ktaverage=-20;
1189  double thetaverage=-20;
1190  double nall=0;
1191  double flagSubjet=0;
1192  double z=0.;
1193  double delta_R=-20;
1194  double area1=0;
1195  double area2=0;
1196  while(jj.has_parents(j1,j2) && z<fHardCutoff){
1197  nall=nall+1;
1198 
1199  flagSubjet=0;
1200  area1 = j1.area();
1201  area2 = j2.area();
1202  if(fJetShapeSub!=kNoSub) if(j1.perp() < j2.perp()) swap(j1,j2);
1203 
1204  if(fJetShapeSub==kNoSub && fDoAreaIterative== kTRUE){
1205 
1206  if((j1.perp()-area1*GetRhoVal(0)) < (j2.perp()-area2*GetRhoVal(0))) swap(j1,j2);
1207  area1 = j1.area();
1208  area2 = j2.area();
1209  if(j1.perp()-area1*GetRhoVal(0)<0 && j2.perp()-area2*GetRhoVal(0)<0) break;
1210 
1211  }
1212 
1213 
1214  if(j2.perp()-area2*GetRhoVal(0)>0){
1215 
1216 
1217  delta_R=j1.delta_R(j2);
1218 
1219  if(fJetShapeSub==kNoSub && fDoAreaIterative== kTRUE) {z = (j2.perp()-area2*GetRhoVal(0))/((j1.perp()-area1*GetRhoVal(0))+(j2.perp()-area2*GetRhoVal(0)));
1220  }
1221  if(fJetShapeSub!=kNoSub) z=j2.perp()/(j1.perp()+j2.perp());
1222 
1223  double y =log(1.0/delta_R);
1224  double lnpt_rel=log(j2.perp()*delta_R);
1225  double yh=j1.e()+j2.e();
1226  vector < fastjet::PseudoJet > constitj1 = sorted_by_pt(j1.constituents());
1227  if(constitj1[0].perp()>fMinPtConst) flagSubjet=1;
1228 
1229  ktaverage=ktaverage+lnpt_rel;
1230  thetaverage=thetaverage+delta_R;
1231  Double_t LundEntries[6] = {y,lnpt_rel,fOutputJets[0].perp(),nall,yh,flagSubjet};
1232  fHLundIterative->Fill(LundEntries);}
1233 
1234  jj=j1;}
1235 
1236  cout<<"a z"<<z<<endl;
1237  fShapesVar[2]=ktaverage/nall;
1238  fShapesVar[3]=thetaverage/nall;
1239  fShapesVar[4]=z;
1240  fShapesVar[5]=delta_R;
1241 
1242  } catch (fastjet::Error) {
1243  AliError(" [w] FJ Exception caught.");
1244  //return -1;
1245  }
1246 
1247 
1248 
1249 
1250  return;
1251 
1252 
1253 }
1254 //_________________________________________________________________________
1256  AliJetContainer *jetCont = GetJetContainer(km);
1257  std::vector<fastjet::PseudoJet> fInputVectors;
1258  fInputVectors.clear();
1259  fastjet::PseudoJet PseudoTracks;
1260 
1261  AliParticleContainer *fTrackCont = jetCont->GetParticleContainer();
1262 
1263  if (fTrackCont) for (Int_t i=0; i<fJet->GetNumberOfTracks(); i++) {
1264  AliVParticle *fTrk = fJet->TrackAt(i, fTrackCont->GetArray());
1265  if (!fTrk) continue;
1266 
1267  PseudoTracks.reset(fTrk->Px(), fTrk->Py(), fTrk->Pz(),fTrk->E());
1268  PseudoTracks.set_user_index(fJet->TrackAt(i)+100);
1269  fInputVectors.push_back(PseudoTracks);
1270 
1271  }
1272  fastjet::JetAlgorithm jetalgo(fastjet::cambridge_algorithm);
1273 
1274 
1275 
1276  fastjet::JetDefinition fJetDef(jetalgo, 1., static_cast<fastjet::RecombinationScheme>(0), fastjet::BestFJ30 );
1277 
1278  try {
1279  fastjet::ClusterSequence fClustSeqSA(fInputVectors, fJetDef);
1280  std::vector<fastjet::PseudoJet> fOutputJets;
1281  fOutputJets.clear();
1282  fOutputJets=fClustSeqSA.inclusive_jets(0);
1283 
1284  fastjet::PseudoJet jj;
1285  fastjet::PseudoJet j1;
1286  fastjet::PseudoJet j2;
1287  jj=fOutputJets[0];
1288  double ktaverage=0;
1289  double thetaverage=0;
1290  double nall=0;
1291 
1292  double z=0;
1293  double delta_R=0;
1294  while(jj.has_parents(j1,j2) && z<fHardCutoff){
1295  nall=nall+1;
1296 
1297 
1298  if(j1.perp() < j2.perp()) swap(j1,j2);
1299 
1300 
1301  z=j2.perp()/(j1.perp()+j2.perp());
1302  delta_R=j1.delta_R(j2);
1303 
1304  double lnpt_rel=log(j2.perp()*delta_R);
1305 
1306  ktaverage=ktaverage+lnpt_rel;
1307  thetaverage=thetaverage+delta_R;
1308 
1309  jj=j1;}
1310 
1311 
1312  average1=ktaverage/nall;
1313  average2=thetaverage/nall;
1314  average3=z;
1315  average4=delta_R;
1316 
1317  } catch (fastjet::Error) {
1318  AliError(" [w] FJ Exception caught.");
1319  //return -1;
1320  }
1321 
1322 
1323 
1324 
1325  return;
1326 
1327 
1328  }
1329 
1330 //_________________________________________________________________________
1332 
1333  std::vector<fastjet::PseudoJet> fInputVectors;
1334  fInputVectors.clear();
1335  fastjet::PseudoJet PseudoTracks;
1336 
1337  std::vector<fastjet::PseudoJet> fInputVectorsM;
1338  fInputVectorsM.clear();
1339  fastjet::PseudoJet PseudoTracksM;
1340 
1341  AliParticleContainer *fTrackCont = fJetCont->GetParticleContainer();
1342  AliParticleContainer *fTrackContM = fJetContM->GetParticleContainer();
1343 
1344  if (fTrackCont) for (Int_t i=0; i<fJet->GetNumberOfTracks(); i++) {
1345  AliVParticle *fTrk = fJet->TrackAt(i, fTrackCont->GetArray());
1346  if (!fTrk) continue;
1347  PseudoTracks.reset(fTrk->Px(), fTrk->Py(), fTrk->Pz(),fTrk->E());
1348  PseudoTracks.set_user_index(fJet->TrackAt(i)+100);
1349  fInputVectors.push_back(PseudoTracks);
1350 
1351  }
1352  fastjet::JetAlgorithm jetalgo(fastjet::cambridge_algorithm);
1353  fastjet::JetDefinition fJetDef(jetalgo, 1., static_cast<fastjet::RecombinationScheme>(0), fastjet::BestFJ30 );
1354 
1355  if (fTrackContM) for (Int_t i=0; i<fJetM->GetNumberOfTracks(); i++) {
1356  AliVParticle *fTrk = fJetM->TrackAt(i, fTrackContM->GetArray());
1357  if (!fTrk) continue;
1358  PseudoTracksM.reset(fTrk->Px(), fTrk->Py(), fTrk->Pz(),fTrk->E());
1359  PseudoTracksM.set_user_index(fJetM->TrackAt(i)+100);
1360  fInputVectorsM.push_back(PseudoTracksM);
1361 
1362  }
1363  fastjet::JetAlgorithm jetalgoM(fastjet::cambridge_algorithm);
1364  fastjet::JetDefinition fJetDefM(jetalgoM, 1., static_cast<fastjet::RecombinationScheme>(0), fastjet::BestFJ30 );
1365 
1366 
1367  try {
1368  fastjet::ClusterSequence fClustSeqSA(fInputVectors, fJetDef);
1369  std::vector<fastjet::PseudoJet> fOutputJets;
1370  fOutputJets.clear();
1371  fOutputJets=fClustSeqSA.inclusive_jets(0);
1372 
1373  fastjet::ClusterSequence fClustSeqSAM(fInputVectorsM, fJetDefM);
1374  std::vector<fastjet::PseudoJet> fOutputJetsM;
1375  fOutputJetsM.clear();
1376  fOutputJetsM=fClustSeqSAM.inclusive_jets(0);
1377 
1378 
1379 
1380  fastjet::PseudoJet jj,jjM;
1381  fastjet::PseudoJet j1,j1M;
1382  fastjet::PseudoJet j2,j2M;
1383  jj=fOutputJets[0];
1384  jjM=fOutputJetsM[0];
1385 
1386  double z1=0;
1387  double z2=0;
1388  double zcut=0.1;
1389  while((jj.has_parents(j1,j2)) && (z1<zcut)){
1390  if(j1.perp() < j2.perp()) swap(j1,j2);
1391 
1392  z1=j2.perp()/(j1.perp()+j2.perp());
1393  jj=j1;}
1394  if(z1<zcut) return;
1395 
1396 
1397 
1398  while((jjM.has_parents(j1M,j2M)) && (z2<zcut)){
1399  if(j1M.perp() < j2M.perp()) swap(j1M,j2M);
1400 
1401  z2=j2M.perp()/(j1M.perp()+j2M.perp());
1402  jjM=j1M;}
1403  if(z2<zcut) return;
1404 
1405 
1406 
1407  double delta_R1=j1.delta_R(j1M);
1408  double delta_R2=j2.delta_R(j2M);
1409  double delta_R=j1.delta_R(j2);
1410  double residz=(z1-z2)/z2;
1411  double resid1=(j1.perp()-j1M.perp())/j1M.perp();
1412  double resid2=(j2.perp()-j2M.perp())/j2M.perp();
1413 
1414  if((delta_R1<fSubjetCutoff) && (delta_R2<fSubjetCutoff)){
1415  Double_t ResolEntries[5] = {fOutputJets[0].perp(),delta_R,resid1,resid2,residz};
1416  fHCheckResolutionSubjets->Fill(ResolEntries);}
1417 
1418 
1419  } catch (fastjet::Error) {
1420  AliError(" [w] FJ Exception caught.");
1421  //return -1;
1422  }
1423 
1424 
1425 
1426 
1427  return;
1428 
1429 
1430 
1431 
1432 
1433 
1434 
1435 }
1436 
1437 
1439  //check if tracks are close//
1440  for (Int_t i=0; i<fJet->GetNumberOfTracks(); i++) {
1441  AliVParticle *fTrk2 = fJet->TrackAt(i, fTrackCont->GetArray());
1442  if (!fTrk2) continue;
1443  if(i==index) continue;
1444  Double_t phi1 = fTrk1->Phi();
1445  Double_t phi2 = fTrk2->Phi();
1446  Double_t chg1 = fTrk1->Charge();
1447  Double_t chg2 = fTrk2->Charge();
1448  Double_t ptv1 = fTrk1->Pt();
1449  Double_t ptv2 = fTrk2->Pt();
1450  Double_t deta=fTrk2->Eta()-fTrk1->Eta();
1451  const Float_t kLimit = fPhiCutValue* 3;
1452 
1453  if (TMath::Abs(fTrk1->Eta()-fTrk2->Eta()) < fEtaCutValue*2.5*3){
1454  Float_t initdpsinner = (phi2 - TMath::ASin(0.075*chg2*fMagFieldPolarity*0.8/ptv2) -
1455  (phi1 - TMath::ASin(0.075*chg1*fMagFieldPolarity*0.8/ptv1)));
1456 
1457  Float_t initdpsouter = (phi2 - TMath::ASin(0.075*chg2*fMagFieldPolarity*2.5/ptv2) -
1458  (phi1 - TMath::ASin(0.075*chg1*fMagFieldPolarity*2.5/ptv1)));
1459 
1460  initdpsinner = TVector2::Phi_mpi_pi(initdpsinner);
1461  initdpsouter = TVector2::Phi_mpi_pi(initdpsouter);
1462 
1463 
1464 
1465  if (TMath::Abs(initdpsinner) < kLimit ||
1466  TMath::Abs(initdpsouter) < kLimit || initdpsinner * initdpsouter < 0 ) {
1467  Double_t mindps = 1e5;
1468 
1469 
1470 
1471  for (Double_t rad = 0.8; rad < 2.51; rad += 0.01) {
1472  Double_t dps = (phi2 - TMath::ASin(0.075*chg2*fMagFieldPolarity*rad/ptv2) - (phi1 - TMath::ASin(0.075*chg1*fMagFieldPolarity*rad/ptv1)));
1473  dps = TVector2::Phi_mpi_pi(dps);
1474  if (TMath::Abs(dps) < TMath::Abs(mindps))
1475  mindps = dps;
1476  }
1477  if(TMath::Abs(mindps)<fPhiCutValue && TMath::Abs(deta)<fEtaCutValue) return kTRUE;
1478  } }
1479  return kFALSE;
1480  }}
1481 
1482 
1483 
1484 
1485 
1486 //________________________________________________________________________
1488  //
1489  // retrieve event objects
1490  //
1492  return kFALSE;
1493 
1494  return kTRUE;
1495 }
1496 
1497 //_______________________________________________________________________
1499 {
1500  // Called once at the end of the analysis.
1501 
1502  // fTreeObservableTagging = dynamic_cast<TTree*>(GetOutputData(1));
1503  // if (!fTreeObservableTagging){
1504  // Printf("ERROR: fTreeObservableTagging not available");
1505  // return;
1506  // }
1507 
1508 }
1509 
Int_t SelectTrigger(Float_t minpT, Float_t maxpT)
Float_t Coronna(AliEmcalJet *jet, Int_t jetContNb)
Double_t GetFirstOrderSubtractedAngularity() const
Double_t Area() const
Definition: AliEmcalJet.h:130
const TString & GetRhoName() const
double Double_t
Definition: External.C:58
Double_t GetSecondOrderSubtractedSigma2() const
Definition: External.C:236
Bool_t RetrieveEventObjects()
Retrieve common objects from event.
Float_t GetPartonEta6() const
AliEmcalJet * ClosestJet() const
Definition: AliEmcalJet.h:341
AliJetContainer * GetJetContainer(Int_t i=0) const
Bool_t FillHistograms()
Function filling histograms.
Float_t GetPartonEta7() const
Double_t GetSecondOrderSubtractedConstituent() const
Double_t Eta() const
Definition: AliEmcalJet.h:121
Double_t Py() const
Definition: AliEmcalJet.h:107
Double_t Phi() const
Definition: AliEmcalJet.h:117
Float_t GetJetMass(AliEmcalJet *jet, Int_t jetContNb)
Float_t GetPythiaEventWeight() const
Container with name, TClonesArray and cuts for particles.
Int_t GetLabel() const
Definition: AliEmcalJet.h:124
Float_t GetPartonPhi7() const
Float_t GetJetAngularity(AliEmcalJet *jet, Int_t jetContNb)
Int_t GetPartonFlag7() const
Container for particles within the EMCAL framework.
Float_t GetPartonPhi6() const
Int_t TrackAt(Int_t idx) const
Definition: AliEmcalJet.h:160
UShort_t GetNumberOfTracks() const
Definition: AliEmcalJet.h:139
Float_t GetJetCoronna(AliEmcalJet *jet, Int_t jetContNb)
TString kData
Declare data MC or deltaAOD.
Double_t Px() const
Definition: AliEmcalJet.h:106
AliParticleContainer * GetParticleContainer(Int_t i=0) const
Get particle container attached to this task.
const TString & GetRhoMassName() const
Int_t GetPartonFlag6() const
AliParticleContainer * GetParticleContainer() const
Double_t GetFirstOrderSubtractedConstituent() const
int Int_t
Definition: External.C:63
Float_t GetJetCircularity(AliEmcalJet *jet, Int_t jetContNb)
unsigned int UInt_t
Definition: External.C:33
Float_t PTD(AliEmcalJet *jet, Int_t jetContNb)
float Float_t
Definition: External.C:68
Int_t GetNJets() const
Double_t GetSecondOrderSubtractedAngularity() const
Float_t GetSigma2(AliEmcalJet *jet, Int_t jetContNb)
virtual AliVParticle * GetAcceptParticle(Int_t i=-1) const
Double_t fCent
!event centrality
TClonesArray * GetArray() const
AliEmcalJet * GetNextAcceptJet()
Float_t Angularity(AliEmcalJet *jet, Int_t jetContNb)
Bool_t Data(TH1F *h, Double_t *rangefit, Bool_t writefit, Double_t &sgn, Double_t &errsgn, Double_t &bkg, Double_t &errbkg, Double_t &sgnf, Double_t &errsgnf, Double_t &sigmafit, Int_t &status)
Float_t LeSub(AliEmcalJet *jet, Int_t jetContNb)
Double_t Pt() const
Definition: AliEmcalJet.h:109
Double_t GetRhoVal(Int_t i=0) const
Double_t GetFirstOrderSubtractedCircularity() const
void Track()
AliEmcalList * fOutput
!output list
Float_t Sigma2(AliEmcalJet *jet, Int_t jetContNb)
Double_t RelativePhi(Double_t mphi, Double_t vphi)
Double_t GetSecondOrderSubtractedCircularity() const
Float_t GetJetNumberOfConstituents(AliEmcalJet *jet, Int_t jetContNb)
AliTrackContainer * GetTrackContainer(Int_t i=0) const
void RecursiveParents(AliEmcalJet *fJet, AliJetContainer *fJetCont)
Bool_t CheckClosePartner(Int_t index, AliEmcalJet *fJet, AliVParticle *fTrack, AliParticleContainer *fTrackCont)
Store some informaion about a Pythia eventThis class is used to store some information about a Pythia...
void SetMakeGeneralHistograms(Bool_t g)
Enable general histograms.
virtual AliVTrack * GetAcceptTrack(Int_t i=-1) const
Base task in the EMCAL jet framework.
Represent a jet reconstructed using the EMCal jet framework.
Definition: AliEmcalJet.h:51
const AliEmcalPythiaInfo * GetPythiaInfo() const
Float_t GetJetpTD(AliEmcalJet *jet, Int_t jetContNb)
Double_t Pz() const
Definition: AliEmcalJet.h:108
Double_t GetFractionSharedPt(const AliEmcalJet *jet, AliParticleContainer *cont2=0x0) const
Declaration of class AliEmcalPythiaInfo.
const char Option_t
Definition: External.C:48
void UserCreateOutputObjects()
Main initialization function on the worker.
Double_t GetFirstOrderSubtractedSigma2() const
Float_t Circularity(AliEmcalJet *jet, Int_t jetContNb)
bool Bool_t
Definition: External.C:53
void RecursiveParentsMCAverage(AliEmcalJet *fJet, Int_t km, Double_t &aver1, Double_t &aver2, Double_t &aver3, Double_t &aver4)
AliEmcalJetShapeProperties * GetShapeProperties() const
Definition: AliEmcalJet.h:375
Float_t GetJetLeSub(AliEmcalJet *jet, Int_t jetContNb)
Float_t GetPartonPt7() const
void swap(PWGJE::EMCALJetTasks::AliAnalysisTaskEmcalJetHPerformance &first, PWGJE::EMCALJetTasks::AliAnalysisTaskEmcalJetHPerformance &second)
Double_t M() const
Definition: AliEmcalJet.h:120
void ResetCurrentID(Int_t i=-1)
Reset the iterator to a given index.
Container for jet within the EMCAL jet framework.
Bool_t Run()
Run function. This is the core function of the analysis and contains the user code. Therefore users have to implement this function.
Definition: External.C:196
std::vector< int > GetPtSortedTrackConstituentIndexes(TClonesArray *tracks) const
Float_t GetPartonPt6() const
void CheckSubjetResolution(AliEmcalJet *fJet, AliJetContainer *fJetCont, AliEmcalJet *fJetM, AliJetContainer *fJetContM)
AliEmcalJet * GetJet(Int_t i) const