AliPhysics  1168478 (1168478)
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
AliCFTaskVertexingHF.cxx
Go to the documentation of this file.
1 /**************************************************************************
2  * Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
3  * *
4  * Author: The ALICE Off-line Project. *
5  * Contributors are mentioned in the code where appropriate. *
6  * *
7  * Permission to use, copy, modify and distribute this software and its *
8  * documentation strictly for non-commercial purposes is hereby granted *
9  * without fee, provided that the above copyright notice appears in all *
10  * copies and that both the copyright notice and this permission notice *
11  * appear in the supporting documentation. The authors make no claims *
12  * about the suitability of this software for any purpose. It is *
13  * provided "as is" without express or implied warranty. *
14  **************************************************************************/
15 
16 //-----------------------------------------------------------------------
17 // Class for HF corrections as a function of many variables
18 // 6 Steps introduced: MC, MC Acc, Reco, Reco Acc, Reco Acc + ITS Cl,
19 // Reco Acc + ITS Cl + PPR cuts
20 // 12 variables used: pt, y, cosThetaStar, ptPi, ptK, ct,
21 // dca, d0Pi, d0K, d0Pixd0K, cosPointingAngle, phi
22 //
23 //-----------------------------------------------------------------------
24 // Author : C. Zampolli, CERN
25 // D. Caffarri, Univ & INFN Padova caffarri@pd.infn.it
26 //-----------------------------------------------------------------------
27 //-----------------------------------------------------------------------
28 // Base class for HF Unfolding (pt and eta)
29 // correlation matrix filled at Acceptance and PPR level
30 // Author: A.Grelli , Utrecht - agrelli@uu.nl
31 //-----------------------------------------------------------------------
32 #include <TCanvas.h>
33 #include <TParticle.h>
34 #include <TDatabasePDG.h>
35 #include <TProfile.h>
36 #include <TH1I.h>
37 #include <TStyle.h>
38 #include <TFile.h>
39 #include <TF1.h>
40 
41 #include "AliCFTaskVertexingHF.h"
42 #include "AliMCEvent.h"
43 #include "AliCFManager.h"
44 #include "AliCFContainer.h"
45 #include "AliLog.h"
46 #include "AliInputEventHandler.h"
47 #include "AliAnalysisManager.h"
48 #include "AliAODHandler.h"
49 #include "AliAODEvent.h"
50 #include "AliAODRecoDecay.h"
51 #include "AliAODRecoDecayHF.h"
55 #include "AliAODRecoCascadeHF.h"
56 #include "AliAODMCParticle.h"
57 #include "AliAODMCHeader.h"
58 #include "AliESDtrack.h"
59 #include "TChain.h"
60 #include "THnSparse.h"
61 #include "TH2D.h"
62 #include "AliESDtrackCuts.h"
63 #include "AliRDHFCuts.h"
64 #include "AliRDHFCutsD0toKpi.h"
67 #include "AliRDHFCutsDstoKKpi.h"
68 #include "AliRDHFCutsLctopKpi.h"
69 #include "AliRDHFCutsD0toKpipipi.h"
70 #include "AliRDHFCutsLctoV0.h"
71 #include "AliCFVertexingHF2Prong.h"
72 #include "AliCFVertexingHF3Prong.h"
75 #include "AliCFVertexingHF.h"
76 #include "AliVertexingHFUtils.h"
77 #include "AliAnalysisDataSlot.h"
78 #include "AliAnalysisDataContainer.h"
79 #include "AliAnalysisVertexingHF.h"
80 #include "AliPIDResponse.h"
81 
82 //__________________________________________________________________________
85  fCFManager(0x0),
86  fHistEventsProcessed(0x0),
87  fCorrelation(0x0),
88  fListProfiles(0),
89  fCountMC(0),
90  fCountGenLimAcc(0),
91  fCountGenLimAccNoAcc(0),
92  fCountAcc(0),
93  fCountVertex(0),
94  fCountRefit(0),
95  fCountReco(0),
96  fCountRecoAcc(0),
97  fCountRecoITSClusters(0),
98  fCountRecoPPR(0),
99  fCountRecoPID(0),
100  fEvents(0),
101  fDecayChannel(0),
102  fFillFromGenerated(kFALSE),
103  fOriginDselection(0),
104  fAcceptanceUnf(kTRUE),
105  fCuts(0),
106  fUseWeight(kFALSE),
107  fWeight(1.),
108  fUseFlatPtWeight(kFALSE),
109  fUseZWeight(kFALSE),
110  fUseNchWeight(kFALSE),
111  fUseTrackletsWeight(kFALSE),
112  fUseMultRatioAsWeight(kFALSE),
113  fNvar(0),
114  fPartName(""),
115  fDauNames(""),
116  fSign(2),
117  fCentralitySelection(kTRUE),
118  fFakeSelection(0),
119  fRejectIfNoQuark(kTRUE),
120  fUseMCVertex(kFALSE),
121  fDsOption(1),
122  fGenDsOption(3),
123  fConfiguration(kCheetah), // by default, setting the fast configuration
124  fFuncWeight(0x0),
125  fHistoPtWeight(0x0),
126  fHistoMeasNch(0x0),
127  fHistoMCNch(0x0),
128  fResonantDecay(0),
129  fLctoV0bachelorOption(1),
130  fGenLctoV0bachelorOption(0),
131  fUseSelectionBit(kTRUE),
132  fPDGcode(0),
133  fMultiplicityEstimator(kNtrk10),
134  fRefMult(9.26),
135  fZvtxCorrectedNtrkEstimator(kFALSE),
136  fIsPPData(kFALSE),
137  fIsPPbData(kFALSE),
138  fUseAdditionalCuts(kFALSE),
139  fUseCutsForTMVA(kFALSE),
140  fUseCascadeTaskForLctoV0bachelor(kFALSE),
141  fCutOnMomConservation(0.00001)
142 {
143  //
144  //Default ctor
145  //
146  for(Int_t i=0; i<4; i++) fMultEstimatorAvg[i]=0;
147 }
148 //___________________________________________________________________________
150  AliAnalysisTaskSE(name),
151  fCFManager(0x0),
152  fHistEventsProcessed(0x0),
153  fCorrelation(0x0),
154  fListProfiles(0),
155  fCountMC(0),
156  fCountGenLimAcc(0),
157  fCountGenLimAccNoAcc(0),
158  fCountAcc(0),
159  fCountVertex(0),
160  fCountRefit(0),
161  fCountReco(0),
162  fCountRecoAcc(0),
163  fCountRecoITSClusters(0),
164  fCountRecoPPR(0),
165  fCountRecoPID(0),
166  fEvents(0),
167  fDecayChannel(0),
168  fFillFromGenerated(kFALSE),
169  fOriginDselection(0),
170  fAcceptanceUnf(kTRUE),
171  fCuts(cuts),
172  fUseWeight(kFALSE),
173  fWeight(1.),
174  fUseFlatPtWeight(kFALSE),
175  fUseZWeight(kFALSE),
176  fUseNchWeight(kFALSE),
177  fUseTrackletsWeight(kFALSE),
178  fUseMultRatioAsWeight(kFALSE),
179  fNvar(0),
180  fPartName(""),
181  fDauNames(""),
182  fSign(2),
183  fCentralitySelection(kTRUE),
184  fFakeSelection(0),
185  fRejectIfNoQuark(kTRUE),
186  fUseMCVertex(kFALSE),
187  fDsOption(1),
188  fGenDsOption(3),
189  fConfiguration(kCheetah), // by default, setting the fast configuration
190  fFuncWeight(func),
191  fHistoPtWeight(0x0),
192  fHistoMeasNch(0x0),
193  fHistoMCNch(0x0),
194  fResonantDecay(0),
195  fLctoV0bachelorOption(1),
196  fGenLctoV0bachelorOption(0),
197  fUseSelectionBit(kTRUE),
198  fPDGcode(0),
199  fMultiplicityEstimator(kNtrk10),
200  fRefMult(9.26),
201  fZvtxCorrectedNtrkEstimator(kFALSE),
202  fIsPPData(kFALSE),
203  fIsPPbData(kFALSE),
204  fUseAdditionalCuts(kFALSE),
205  fUseCutsForTMVA(kFALSE),
206  fUseCascadeTaskForLctoV0bachelor(kFALSE),
207  fCutOnMomConservation(0.00001)
208 {
209  //
210  // Constructor. Initialization of Inputs and Outputs
211  //
212  /*
213  DefineInput(0) and DefineOutput(0)
214  are taken care of by AliAnalysisTaskSE constructor
215  */
216  DefineOutput(1,TH1I::Class());
217  DefineOutput(2,AliCFContainer::Class());
218  DefineOutput(3,THnSparseD::Class());
219  DefineOutput(4,AliRDHFCuts::Class());
220  for(Int_t i=0; i<4; i++) fMultEstimatorAvg[i]=0;
221  DefineOutput(5,TList::Class()); // slot #5 keeps the zvtx Ntrakclets correction profiles
222 
223  fCuts->PrintAll();
224 }
225 
226 //___________________________________________________________________________
228 {
229  //
230  // Assignment operator
231  //
232  if (this!=&c) {
233  AliAnalysisTaskSE::operator=(c) ;
236  fCuts = c.fCuts;
241  for(Int_t i=0; i<4; i++) fMultEstimatorAvg[i]=c.fMultEstimatorAvg[i];
242  }
243  return *this;
244 }
245 
246 //___________________________________________________________________________
249  fCFManager(c.fCFManager),
250  fHistEventsProcessed(c.fHistEventsProcessed),
251  fCorrelation(c.fCorrelation),
252  fListProfiles(c.fListProfiles),
253  fCountMC(c.fCountMC),
254  fCountGenLimAcc(c.fCountGenLimAcc),
255  fCountGenLimAccNoAcc(c.fCountGenLimAccNoAcc),
256  fCountAcc(c.fCountAcc),
257  fCountVertex(c.fCountVertex),
258  fCountRefit(c.fCountRefit),
259  fCountReco(c.fCountReco),
260  fCountRecoAcc(c.fCountRecoAcc),
261  fCountRecoITSClusters(c.fCountRecoITSClusters),
262  fCountRecoPPR(c.fCountRecoPPR),
263  fCountRecoPID(c.fCountRecoPID),
264  fEvents(c.fEvents),
265  fDecayChannel(c.fDecayChannel),
266  fFillFromGenerated(c.fFillFromGenerated),
267  fOriginDselection(c.fOriginDselection),
268  fAcceptanceUnf(c.fAcceptanceUnf),
269  fCuts(c.fCuts),
270  fUseWeight(c.fUseWeight),
271  fWeight(c.fWeight),
272  fUseFlatPtWeight(c.fUseFlatPtWeight),
273  fUseZWeight(c.fUseZWeight),
274  fUseNchWeight(c.fUseNchWeight),
275  fUseTrackletsWeight(c.fUseTrackletsWeight),
276  fUseMultRatioAsWeight(c.fUseMultRatioAsWeight),
277  fNvar(c.fNvar),
278  fPartName(c.fPartName),
279  fDauNames(c.fDauNames),
280  fSign(c.fSign),
281  fCentralitySelection(c.fCentralitySelection),
282  fFakeSelection(c.fFakeSelection),
283  fRejectIfNoQuark(c.fRejectIfNoQuark),
284  fUseMCVertex(c.fUseMCVertex),
285  fDsOption(c.fDsOption),
286  fGenDsOption(c.fGenDsOption),
287  fConfiguration(c.fConfiguration),
288  fFuncWeight(c.fFuncWeight),
289  fHistoPtWeight(c.fHistoPtWeight),
290  fHistoMeasNch(c.fHistoMeasNch),
291  fHistoMCNch(c.fHistoMCNch),
292  fResonantDecay(c.fResonantDecay),
293  fLctoV0bachelorOption(c.fLctoV0bachelorOption),
294  fGenLctoV0bachelorOption(c.fGenLctoV0bachelorOption),
295  fUseSelectionBit(c.fUseSelectionBit),
296  fPDGcode(c.fPDGcode),
297  fMultiplicityEstimator(c.fMultiplicityEstimator),
298  fRefMult(c.fRefMult),
299  fZvtxCorrectedNtrkEstimator(c.fZvtxCorrectedNtrkEstimator),
300  fIsPPData(c.fIsPPData),
301  fIsPPbData(c.fIsPPbData),
302  fUseAdditionalCuts(c.fUseAdditionalCuts),
303  fUseCutsForTMVA(c.fUseCutsForTMVA),
304  fUseCascadeTaskForLctoV0bachelor(c.fUseCascadeTaskForLctoV0bachelor),
305  fCutOnMomConservation(c.fCutOnMomConservation)
306 {
307  //
308  // Copy Constructor
309  //
310  for(Int_t i=0; i<4; i++) fMultEstimatorAvg[i]=c.fMultEstimatorAvg[i];
311 }
312 
313 //___________________________________________________________________________
315 {
316  //
317  //destructor
318  //
319  if (fCFManager) delete fCFManager ;
321  if (fCorrelation) delete fCorrelation ;
322  if (fListProfiles) delete fListProfiles;
323  if (fCuts) delete fCuts;
324  if (fFuncWeight) delete fFuncWeight;
325  if (fHistoPtWeight) delete fHistoPtWeight;
326  if (fHistoMeasNch) delete fHistoMeasNch;
327  if (fHistoMCNch) delete fHistoMCNch;
328  for(Int_t i=0; i<4; i++) { if(fMultEstimatorAvg[i]) delete fMultEstimatorAvg[i]; }
329 }
330 
331 //_________________________________________________________________________-
333 {
334  //
335  // Initialization
336  //
337 
338  if (fDebug>1) printf("AliCFTaskVertexingHF::Init()");
339  if(fUseWeight && fUseZWeight) { AliFatal("Can not use at the same time pt and z-vtx weights, please choose"); return; }
340  if(fUseWeight && fUseNchWeight) { AliInfo("Beware, using at the same time pt and Nch weights, please check"); }
341  if(fUseNchWeight && !fHistoMCNch) { AliFatal("Need to pass the MC Nch distribution to use Nch weights"); return; }
343 
344  AliRDHFCuts *copyfCuts = 0x0;
345  if (!fCuts){
346  AliFatal("No cuts defined - Exiting...");
347  return;
348  }
349 
350  switch (fDecayChannel){
351  case 2:{
352  fPDGcode = 421;
353  copyfCuts = new AliRDHFCutsD0toKpi(*(static_cast<AliRDHFCutsD0toKpi*>(fCuts)));
354  switch (fConfiguration) {
355  case kSnail: // slow configuration: all variables in
356  fNvar = 16;
357  break;
358  case kCheetah:// fast configuration: only pt_candidate, y, phi, ct, fake, z_vtx, centrality, multiplicity will be filled
359  fNvar = 8;
360  break;
361  }
362  fPartName="D0";
363  fDauNames="K+pi";
364  break;
365  }
366  case 21:{
367  fPDGcode = 413;
368  copyfCuts = new AliRDHFCutsDStartoKpipi(*(static_cast<AliRDHFCutsDStartoKpipi*>(fCuts)));
369  switch (fConfiguration) {
370  case kSnail: // slow configuration: all variables in
371  fNvar = 16;
372  break;
373  case kCheetah:// fast configuration: only pt_candidate, y, phi, ct, fake, z_vtx, centrality, multiplicity will be filled
374  fNvar = 8;
375  break;
376  }
377  fPartName="Dstar";
378  fDauNames="K+pi+pi";
379  break;
380  }
381  case 22:{
382  fPDGcode = 4122;
383  copyfCuts = new AliRDHFCutsLctoV0(*(static_cast<AliRDHFCutsLctoV0*>(fCuts)));
384  switch (fConfiguration) {
385  case kSnail: // slow configuration: all variables in
386  fNvar = 16;
387  break;
388  case kCheetah:// fast configuration: only pt_candidate, y, phi, ct, fake, z_vtx, centrality, multiplicity will be filled
389  fNvar = 8;
390  break;
391  }
392  fPartName="Lambdac";
393  fDauNames="V0+bachelor";
394  break;
395  }
396  case 31:{
397  fPDGcode = 411;
398  copyfCuts = new AliRDHFCutsDplustoKpipi(*(static_cast<AliRDHFCutsDplustoKpipi*>(fCuts)));
399  switch (fConfiguration) {
400  case kSnail: // slow configuration: all variables in
401  fNvar = 14;
402  break;
403  case kCheetah:// fast configuration: only pt_candidate, y, phi, ct, fake, z_vtx, centrality, multiplicity will be filled
404  fNvar = 8;
405  break;
406  }
407  fPartName="Dplus";
408  fDauNames="K+pi+pi";
409  break;
410  }
411  case 32:{
412  fPDGcode = 4122;
413  copyfCuts = new AliRDHFCutsLctopKpi(*(static_cast<AliRDHFCutsLctopKpi*>(fCuts)));
414  switch (fConfiguration) {
415  case kSnail: // slow configuration: all variables in
416  fNvar = 18;
417  break;
418  case kCheetah:// fast configuration: only pt_candidate, y, phi, ct, fake, z_vtx, centrality, multiplicity will be filled
419  fNvar = 8;
420  break;
421  }
422  fPartName="Lambdac";
423  fDauNames="p+K+pi";
424  break;
425  }
426  case 33:{
427  fPDGcode = 431;
428  copyfCuts = new AliRDHFCutsDstoKKpi(*(static_cast<AliRDHFCutsDstoKKpi*>(fCuts)));
429  switch (fConfiguration) {
430  case kSnail: // slow configuration: all variables in
431  fNvar = 14;
432  break;
433  case kCheetah:// fast configuration: only pt_candidate, y, phi, ct, fake, z_vtx, centrality, multiplicity will be filled
434  fNvar = 8;
435  break;
436  }
437  fPartName="Ds";
438  fDauNames="K+K+pi";
439  break;
440  }
441  case 4:{
442  fPDGcode = 421;
443  copyfCuts = new AliRDHFCutsD0toKpipipi(*(static_cast<AliRDHFCutsD0toKpipipi*>(fCuts)));
444  switch (fConfiguration) {
445  case kSnail: // slow configuration: all variables in
446  fNvar = 16;
447  break;
448  case kCheetah:// fast configuration: only pt_candidate, y, phi, ct, fake, z_vtx, centrality, multiplicity will be filled
449  fNvar = 8;
450  break;
451  }
452  fPartName="D0";
453  fDauNames="K+pi+pi+pi";
454  break;
455  }
456  default:
457  AliFatal("The decay channel MUST be defined according to AliCFVertexing::DecayChannel - Exiting...");
458  break;
459  }
460 
461  const char* nameoutput=GetOutputSlot(4)->GetContainer()->GetName();
462  if (copyfCuts){
463  copyfCuts->SetName(nameoutput);
464 
465  //Post the data
466  PostData(4, copyfCuts);
467  }
468  else{
469  AliFatal("Failing initializing AliRDHFCuts object - Exiting...");
470  }
471 
472  fListProfiles = new TList();
473  fListProfiles->SetOwner();
474  TString period[4];
475  Int_t nProfiles=4;
476 
477  if (fIsPPbData) { //if pPb, use only two estimator histos
478  period[0] = "LHC13b"; period[1] = "LHC13c";
479  nProfiles = 2;
480  } else { // else assume pp (four histos for LHC10)
481  period[0] = "LHC10b"; period[1] = "LHC10c"; period[2] = "LHC10d"; period[3] = "LHC10e";
482  nProfiles = 4;
483  }
484 
485  for(Int_t i=0; i<nProfiles; i++){
486  if(fMultEstimatorAvg[i]){
487  TProfile* hprof=new TProfile(*fMultEstimatorAvg[i]);
488  hprof->SetName(Form("ProfileTrkVsZvtx%s\n",period[i].Data()));
489  fListProfiles->Add(hprof);
490  }
491  }
492 
493  // Save also the weight functions or histograms
498 
499  PostData(5,fListProfiles);
500 
501  return;
502 }
503 
504 //_________________________________________________
506 {
507  //
508  // Main loop function
509  //
510 
511  PostData(1,fHistEventsProcessed) ;
512  PostData(2,fCFManager->GetParticleContainer()) ;
513  PostData(3,fCorrelation) ;
514 
515  AliDebug(3,Form("*** Processing event %d\n", fEvents));
516 
517  if (fFillFromGenerated){
518  AliWarning("Flag to fill container with generated value ON ---> dca, d0pi, d0K, d0xd0, cosPointingAngle will be set as dummy!");
519  }
520 
521  if (!fInputEvent) {
522  Error("UserExec","NO EVENT FOUND!");
523  return;
524  }
525 
526  AliAODEvent* aodEvent = dynamic_cast<AliAODEvent*>(fInputEvent);
527 
528  TClonesArray *arrayBranch=0;
529 
530  if(!aodEvent && AODEvent() && IsStandardAOD()) {
531  // In case there is an AOD handler writing a standard AOD, use the AOD
532  // event in memory rather than the input (ESD) event.
533  aodEvent = dynamic_cast<AliAODEvent*> (AODEvent());
534  // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
535  // have to taken from the AOD event hold by the AliAODExtension
536  AliAODHandler* aodHandler = (AliAODHandler*)
537  ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
538  if(aodHandler->GetExtensions()) {
539  AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject("AliAOD.VertexingHF.root");
540  AliAODEvent *aodFromExt = ext->GetAOD();
541 
542  switch (fDecayChannel){
543  case 2:{
544  arrayBranch=(TClonesArray*)aodFromExt->GetList()->FindObject("D0toKpi");
545  break;
546  }
547  case 21:{
548  arrayBranch=(TClonesArray*)aodFromExt->GetList()->FindObject("Dstar");
549  break;
550  }
551  case 22:{
552  arrayBranch=(TClonesArray*)aodFromExt->GetList()->FindObject("CascadesHF");
553  break;
554  }
555  case 31:
556  case 32:
557  case 33:{
558  arrayBranch=(TClonesArray*)aodFromExt->GetList()->FindObject("Charm3Prong");
559  break;
560  }
561  case 4:{
562  arrayBranch=(TClonesArray*)aodFromExt->GetList()->FindObject("Charm4Prong");
563  break;
564  }
565  default:
566  break;
567  }
568  }
569  }
570  else {
571  switch (fDecayChannel){
572  case 2:{
573  arrayBranch=(TClonesArray*)aodEvent->GetList()->FindObject("D0toKpi");
574  break;
575  }
576  case 21:{
577  arrayBranch=(TClonesArray*)aodEvent->GetList()->FindObject("Dstar");
578  break;
579  }
580  case 22:{
581  arrayBranch=(TClonesArray*)aodEvent->GetList()->FindObject("CascadesHF");
582  break;
583  }
584  case 31:
585  case 32:
586  case 33:{
587  arrayBranch=(TClonesArray*)aodEvent->GetList()->FindObject("Charm3Prong");
588  break;
589  }
590  case 4:{
591  arrayBranch=(TClonesArray*)aodEvent->GetList()->FindObject("Charm4Prong");
592  break;
593  }
594  default:
595  break;
596  }
597  }
598 
599  AliAODVertex *aodVtx = (AliAODVertex*)aodEvent->GetPrimaryVertex();
600  if (!aodVtx) {
601  AliDebug(3, "The event was skipped due to missing vertex");
602  return;
603  }
604 
605  if (!arrayBranch) {
606  AliError("Could not find array of HF vertices");
607  return;
608  }
609 
610  fEvents++;
611 
612  fCFManager->SetRecEventInfo(aodEvent);
613  fCFManager->SetMCEventInfo(aodEvent);
614 
615  //******** DEFINE number of variables of the container***** for now set at 13, in the future in the config macro.
616 
617  //loop on the MC event
618 
619  TClonesArray* mcArray = dynamic_cast<TClonesArray*>(aodEvent->FindListObject(AliAODMCParticle::StdBranchName()));
620  if (!mcArray) {
621  AliError("Could not find Monte-Carlo in AOD");
622  return;
623  }
624  Int_t icountMC = 0;
625  Int_t icountGenLimAcc = 0;
626  Int_t icountGenLimAccNoAcc = 0;
627  Int_t icountAcc = 0;
628  Int_t icountReco = 0;
629  Int_t icountVertex = 0;
630  Int_t icountRefit = 0;
631  Int_t icountRecoAcc = 0;
632  Int_t icountRecoITSClusters = 0;
633  Int_t icountRecoPPR = 0;
634  Int_t icountRecoPID = 0;
635  Int_t cquarks = 0;
636 
637  AliAODMCHeader *mcHeader = dynamic_cast<AliAODMCHeader*>(aodEvent->GetList()->FindObject(AliAODMCHeader::StdBranchName()));
638  if (!mcHeader) {
639  AliError("Could not find MC Header in AOD");
640  return;
641  }
642 
643  fHistEventsProcessed->Fill(0.5);
644 
645  Double_t* containerInput = new Double_t[fNvar];
646  Double_t* containerInputMC = new Double_t[fNvar];
647 
648 
649  AliCFVertexingHF* cfVtxHF=0x0;
650  switch (fDecayChannel){
651  case 2:{
652  cfVtxHF = new AliCFVertexingHF2Prong(mcArray, fOriginDselection);
653  break;
654  }
655  case 21:{
656  cfVtxHF = new AliCFVertexingHFCascade(mcArray, fOriginDselection);
657  ((AliCFVertexingHFCascade*)cfVtxHF)->SetPDGcascade(413);
658  ((AliCFVertexingHFCascade*)cfVtxHF)->SetPDGbachelor(211);
659  ((AliCFVertexingHFCascade*)cfVtxHF)->SetPDGneutrDaugh(421);
660  ((AliCFVertexingHFCascade*)cfVtxHF)->SetPDGneutrDaughForMC(421);
661  ((AliCFVertexingHFCascade*)cfVtxHF)->SetPDGneutrDaughPositive(211);
662  ((AliCFVertexingHFCascade*)cfVtxHF)->SetPDGneutrDaughNegative(321);
663  ((AliCFVertexingHFCascade*)cfVtxHF)->SetPrimaryVertex(aodVtx);
664  break;
665  }
666  case 22:{
667  // Lc -> K0S+proton
669  cfVtxHF = new AliCFVertexingHFCascade(mcArray, fOriginDselection);
670  ((AliCFVertexingHFCascade*)cfVtxHF)->SetPDGcascade(4122);
671  ((AliCFVertexingHFCascade*)cfVtxHF)->SetPDGbachelor(2212);
672  ((AliCFVertexingHFCascade*)cfVtxHF)->SetPDGneutrDaugh(310);
673  ((AliCFVertexingHFCascade*)cfVtxHF)->SetPDGneutrDaughForMC(311);
674  ((AliCFVertexingHFCascade*)cfVtxHF)->SetPDGneutrDaughPositive(211);
675  ((AliCFVertexingHFCascade*)cfVtxHF)->SetPDGneutrDaughNegative(211);
676  ((AliCFVertexingHFCascade*)cfVtxHF)->SetPrimaryVertex(aodVtx);
677  ((AliCFVertexingHFCascade*)cfVtxHF)->SetCutOnMomConservation(fCutOnMomConservation);
678  if (fUseAdditionalCuts) ((AliCFVertexingHFCascade*)cfVtxHF)->SetUseCutsForTMVA(fUseCutsForTMVA);
679  }
680  else {
682  }
683  break;
684  }
685  case 31:
686  // case 32:
687  case 33:{
688  cfVtxHF = new AliCFVertexingHF3Prong(mcArray, fOriginDselection, fDecayChannel);
689  if(fDecayChannel==33){
690  ((AliCFVertexingHF3Prong*)cfVtxHF)->SetGeneratedDsOption(fGenDsOption);
691  }
692  break;
693  }
694  case 32:{
696  }
697  case 4:{
698  //cfVtxHF = new AliCFVertexingHF4Prong(mcArray, originDselection); // not there yet
699  break;
700  }
701  default:
702  break;
703  }
704  if (!cfVtxHF){
705  AliError("No AliCFVertexingHF initialized");
706  delete[] containerInput;
707  delete[] containerInputMC;
708  return;
709  }
710 
711  Double_t zPrimVertex = aodVtx ->GetZ();
712  Double_t zMCVertex = mcHeader->GetVtxZ();
713  Int_t runnumber = aodEvent->GetRunNumber();
714 
715  // Multiplicity definition with tracklets
716  Double_t nTracklets = 0;
717  Int_t nTrackletsEta10 = static_cast<Int_t>(AliVertexingHFUtils::GetNumberOfTrackletsInEtaRange(aodEvent,-1.,1.));
718  Int_t nTrackletsEta16 = static_cast<Int_t>(AliVertexingHFUtils::GetNumberOfTrackletsInEtaRange(aodEvent,-1.6,1.6));
719  nTracklets = (Double_t)nTrackletsEta10;
720  if(fMultiplicityEstimator==kNtrk10to16) { nTracklets = (Double_t)(nTrackletsEta16 - nTrackletsEta10); }
721 
722  // Apply the Ntracklets z-vtx data driven correction
724  TProfile* estimatorAvg = GetEstimatorHistogram(aodEvent);
725  if(estimatorAvg) {
726  Int_t nTrackletsEta10Corr = static_cast<Int_t>(AliVertexingHFUtils::GetCorrectedNtracklets(estimatorAvg,nTrackletsEta10,zPrimVertex,fRefMult));
727  Int_t nTrackletsEta16Corr = static_cast<Int_t>(AliVertexingHFUtils::GetCorrectedNtracklets(estimatorAvg,nTrackletsEta16,zPrimVertex,fRefMult));
728  nTracklets = (Double_t)nTrackletsEta10Corr;
729  if(fMultiplicityEstimator==kNtrk10to16) { nTracklets = (Double_t)(nTrackletsEta16Corr - nTrackletsEta10Corr); }
730  }
731  }
732 
733 
734  fWeight=1.;
735  if(fUseZWeight) fWeight *= GetZWeight(zMCVertex,runnumber);
736  if(fUseNchWeight){
737  Int_t nChargedMCPhysicalPrimary=AliVertexingHFUtils::GetGeneratedPhysicalPrimariesInEtaRange(mcArray,-1.0,1.0);
738  if(!fUseTrackletsWeight) fWeight *= GetNchWeight(nChargedMCPhysicalPrimary);
739  else fWeight *= GetNchWeight(static_cast<Int_t>(nTracklets));
740  AliDebug(2,Form("Using Nch weights, Mult=%d Weight=%f\n",nChargedMCPhysicalPrimary,fWeight));
741  }
742  Double_t eventWeight=fWeight;
743 
744  if (TMath::Abs(zMCVertex) > fCuts->GetMaxVtxZ()){
745  AliDebug(3,Form("z coordinate of MC vertex = %f, it was required to be within [-%f, +%f], skipping event", zMCVertex, fCuts->GetMaxVtxZ(), fCuts->GetMaxVtxZ()));
746  delete[] containerInput;
747  delete[] containerInputMC;
748  delete cfVtxHF;
749  return;
750  }
751 
752  if(aodEvent->GetTriggerMask()==0 &&
753  (runnumber>=195344 && runnumber<=195677)){
754  AliDebug(3,"Event rejected because of null trigger mask");
755  delete[] containerInput;
756  delete[] containerInputMC;
757  delete cfVtxHF;
758  return;
759  }
760 
761  AliESDtrackCuts** trackCuts = new AliESDtrackCuts*[cfVtxHF->GetNProngs()];
762  if (fDecayChannel == 21){
763  // for the D*, setting the third element of the array of the track cuts to those for the soft pion
764  for (Int_t iProng = 0; iProng<cfVtxHF->GetNProngs()-1; iProng++){
765  trackCuts[iProng]=fCuts->GetTrackCuts();
766  }
767  trackCuts[2] = fCuts->GetTrackCutsSoftPi();
768  }
769  else if (fDecayChannel == 22) {
770  // for the Lc->V0+bachelor, setting the second and third elements of the array of the track cuts to those for the V0 daughters
771  trackCuts[0]=fCuts->GetTrackCuts();
772  trackCuts[1]=fCuts->GetTrackCutsV0daughters();
773  trackCuts[2]=fCuts->GetTrackCutsV0daughters();
774  }
775  else {
776  for (Int_t iProng = 0; iProng<cfVtxHF->GetNProngs(); iProng++){
777  trackCuts[iProng]=fCuts->GetTrackCuts();
778  }
779  }
780 
781  //General settings: vertex, feed down and fill reco container with generated values.
782  cfVtxHF->SetRecoPrimVertex(zPrimVertex);
783  cfVtxHF->SetMCPrimaryVertex(zMCVertex);
785  cfVtxHF->SetNVar(fNvar);
789 
790  // switch-off the trigger class selection (doesn't work for MC)
791  fCuts->SetTriggerClass("");
792 
793  // MC vertex, to be used, in case, for pp
795 
796  if (fCentralitySelection){ // keep only the requested centrality
797 
798  if(fCuts->IsEventSelectedInCentrality(aodEvent)!=0) {
799  delete[] containerInput;
800  delete[] containerInputMC;
801  delete [] trackCuts;
802  delete cfVtxHF;
803  return;
804  }
805  } else { // keep all centralities
806  fCuts->SetMinCentrality(0.);
807  fCuts->SetMaxCentrality(100.);
808  }
809 
810  Float_t centValue = 0.;
811  if(!fIsPPData) centValue = fCuts->GetCentrality(aodEvent);
812  cfVtxHF->SetCentralityValue(centValue);
813 
814  // multiplicity estimator with VZERO
815  Double_t vzeroMult=0;
816  AliAODVZERO *vzeroAOD = (AliAODVZERO*)aodEvent->GetVZEROData();
817  if(vzeroAOD) vzeroMult = vzeroAOD->GetMTotV0A() + vzeroAOD->GetMTotV0C();
818 
819  Double_t multiplicity = nTracklets; // set to the Ntracklet estimator
820  if(fMultiplicityEstimator==kVZERO) { multiplicity = vzeroMult; }
821 
822  cfVtxHF->SetMultiplicity(multiplicity);
823 
824  // printf("Multiplicity estimator %d, value %2.2f\n",fMultiplicityEstimator,multiplicity);
825 
826  for (Int_t iPart=0; iPart<mcArray->GetEntriesFast(); iPart++) {
827  AliAODMCParticle* mcPart = dynamic_cast<AliAODMCParticle*>(mcArray->At(iPart));
828  if (!mcPart){
829  AliError("Failed casting particle from MC array!, Skipping particle");
830  continue;
831  }
832 
833  //counting c quarks
834  cquarks += cfVtxHF->MCcquarkCounting(mcPart);
835 
836  // check the MC-level cuts, must be the desidered particle
837  if (!fCFManager->CheckParticleCuts(0, mcPart)) {
838  AliDebug(2,"Check the MC-level cuts - not desidered particle");
839  continue; // 0 stands for MC level
840  }
841  else {
842  AliDebug(3, Form("\n\n---> COOL! we found a particle (particle %d)!!! with PDG code = %d \n\n", iPart, mcPart->GetPdgCode()));
843  }
844  cfVtxHF->SetMCCandidateParam(iPart);
845 
846 
847  if (!(cfVtxHF->SetLabelArray())){
848  AliDebug(2,Form("Impossible to set the label array for particle %d (decaychannel = %d)", iPart, fDecayChannel));
849  continue;
850  }
851 
852  //check the candiate family at MC level
853  if (!(cfVtxHF->CheckMCPartFamily(mcPart, mcArray))) {
854  AliDebug(2,Form("Check on the family wrong for particle %d!!! (decaychannel = %d)", iPart, fDecayChannel));
855  continue;
856  }
857  else{
858  AliDebug(2,Form("Check on the family OK for particle %d!!! (decaychannel = %d)", iPart, fDecayChannel));
859  }
860 
861  //Fill the MC container
862  Bool_t mcContainerFilled = cfVtxHF -> FillMCContainer(containerInputMC);
863  AliDebug(2, Form("particle = %d mcContainerFilled = %d", iPart, mcContainerFilled));
864  if (mcContainerFilled) {
865  if (fUseWeight){
866  if (fHistoPtWeight) { // using an histogram as weight function
867  AliDebug(2,"Using Histogram as Pt weight function");
868  fWeight = eventWeight*GetPtWeightFromHistogram(containerInputMC[0]);
869  }
870  else if (fFuncWeight){ // using user-defined function
871  AliDebug(2,"Using function");
872  fWeight = eventWeight*fFuncWeight->Eval(containerInputMC[0]);
873  }
874  else{ // using FONLL
875  AliDebug(2,"Using FONLL");
876  fWeight = eventWeight*GetWeight(containerInputMC[0]);
877  }
878  AliDebug(2,Form("pt = %f, weight = %f",containerInputMC[0], fWeight));
879  }
880  if (!fCuts->IsInFiducialAcceptance(containerInputMC[0],containerInputMC[1])) {
881  AliDebug(3, Form("Not in limited acceptance, containerInputMC[0] = %f, containerInputMC[1] = %f", containerInputMC[0], containerInputMC[1]));
882  continue;
883  }
884  else{
885  AliDebug(3, Form("YES!! in limited acceptance, containerInputMC[0] = %f, containerInputMC[1] = %f", containerInputMC[0],containerInputMC[1]));
886  }
887 
888  //MC Limited Acceptance
889  if (TMath::Abs(containerInputMC[1]) < 0.5) {
890  fCFManager->GetParticleContainer()->Fill(containerInputMC,kStepGeneratedLimAcc, fWeight);
891  icountGenLimAcc++;
892  AliDebug(3,"MC Lim Acc container filled\n");
893  if (fCFManager->GetParticleContainer()->GetNStep() == kStepGenLimAccNoAcc+1) {
894  if (!(cfVtxHF-> MCAcceptanceStep())) {
895  fCFManager->GetParticleContainer()->Fill(containerInputMC,kStepGenLimAccNoAcc, fWeight);
896  icountGenLimAccNoAcc++;
897  AliDebug(3,"MC Lim Acc No Acc container filled\n");
898  }
899  }
900  }
901 
902  //MC
903  fCFManager->GetParticleContainer()->Fill(containerInputMC, kStepGenerated, fWeight);
904  icountMC++;
905  AliDebug(3,"MC container filled \n");
906 
907  // MC in acceptance
908  // check the MC-Acceptance level cuts
909  // since standard CF functions are not applicable, using Kine Cuts on daughters
910  Bool_t mcAccepStep = cfVtxHF-> MCAcceptanceStep();
911  if (mcAccepStep){
912  fCFManager->GetParticleContainer()->Fill(containerInputMC,kStepAcceptance, fWeight);
913  AliDebug(3,"MC acceptance cut passed\n");
914  icountAcc++;
915 
916  //MC Vertex step
917  if (fCuts->IsEventSelected(aodEvent)){
918  // filling the container if the vertex is ok
919  fCFManager->GetParticleContainer()->Fill(containerInputMC,kStepVertex, fWeight) ;
920  AliDebug(3,"Vertex cut passed and container filled\n");
921  icountVertex++;
922 
923  //mc Refit requirement
924  Bool_t mcRefitStep = cfVtxHF->MCRefitStep(aodEvent, &trackCuts[0]);
925  if (mcRefitStep){
926  fCFManager->GetParticleContainer()->Fill(containerInputMC,kStepRefit, fWeight);
927  AliDebug(3,"MC Refit cut passed and container filled\n");
928  icountRefit++;
929  }
930  else{
931  AliDebug(3,"MC Refit cut not passed\n");
932  continue;
933  }
934  }
935  else{
936  AliDebug (3, "MC vertex step not passed\n");
937  continue;
938  }
939  }
940  else{
941  AliDebug (3, "MC in acceptance step not passed\n");
942  continue;
943  }
944  }
945  else {
946  AliDebug (3, "MC container not filled\n");
947  }
948  }
949 
950  if (cquarks<2) AliDebug(2,Form("Event with %d c-quarks", cquarks));
951  AliDebug(2,Form("Found %i MC particles that are %s!!",icountMC,fPartName.Data()));
952  AliDebug(2,Form("Found %i MC particles that are %s and satisfy Acc cuts!!",icountAcc,fPartName.Data()));
953  AliDebug(2,Form("Found %i MC particles that are %s and satisfy Vertex cuts!!",icountVertex,fPartName.Data()));
954  AliDebug(2,Form("Found %i MC particles that are %s and satisfy Refit cuts!!",icountRefit,fPartName.Data()));
955 
956  // Now go to rec level
957  fCountMC += icountMC;
958  fCountGenLimAcc += icountGenLimAcc;
959  fCountGenLimAccNoAcc += icountGenLimAccNoAcc;
960  fCountAcc += icountAcc;
961  fCountVertex+= icountVertex;
962  fCountRefit+= icountRefit;
963 
964  AliDebug(2,Form("Found %d vertices for decay channel %d",arrayBranch->GetEntriesFast(),fDecayChannel));
966  for(Int_t iCandid = 0; iCandid<arrayBranch->GetEntriesFast();iCandid++){
967  fHistEventsProcessed->Fill(2.5);
968  AliAODRecoDecayHF* charmCandidate=0x0;
969  switch (fDecayChannel){
970  case 2:{
971  charmCandidate = (AliAODRecoDecayHF2Prong*)arrayBranch->At(iCandid);
972  if(charmCandidate->GetIsFilled()!=0) fHistEventsProcessed->Fill(3.5);
973  if(!vHF->FillRecoCand(aodEvent,(AliAODRecoDecayHF2Prong*)charmCandidate)){
974  fHistEventsProcessed->Fill(5.5);
975  continue;
976  }else{
977  fHistEventsProcessed->Fill(4.5);
978  }
979  break;
980  }
981  case 21:{
982  charmCandidate = (AliAODRecoCascadeHF*)arrayBranch->At(iCandid);
983  if(charmCandidate->GetIsFilled()!=0) fHistEventsProcessed->Fill(3.5);
984  if(!vHF->FillRecoCasc(aodEvent,((AliAODRecoCascadeHF*)charmCandidate),kTRUE)){
985  fHistEventsProcessed->Fill(5.5);
986  continue; //DStar
987  }else{
988  fHistEventsProcessed->Fill(4.5);
989  }
990  break;
991  }
992  case 22:{
993  charmCandidate = (AliAODRecoCascadeHF*)arrayBranch->At(iCandid);
994  if(charmCandidate->GetIsFilled()!=0) fHistEventsProcessed->Fill(3.5);
995  if(!vHF->FillRecoCasc(aodEvent,((AliAODRecoCascadeHF*)charmCandidate),kFALSE)){
996  fHistEventsProcessed->Fill(5.5);
997  continue; //Cascade
998  }else{
999  fHistEventsProcessed->Fill(4.5);
1000  }
1001  break;
1002  }
1003  case 31:
1004  case 32:
1005  case 33:{
1006  charmCandidate = (AliAODRecoDecayHF3Prong*)arrayBranch->At(iCandid);
1007  if(charmCandidate->GetIsFilled()!=0) fHistEventsProcessed->Fill(3.5);
1008  if(!vHF->FillRecoCand(aodEvent,(AliAODRecoDecayHF3Prong*)charmCandidate)){
1009  fHistEventsProcessed->Fill(5.5);
1010  continue;
1011  }else{
1012  fHistEventsProcessed->Fill(4.5);
1013  }
1014  break;
1015  }
1016  case 4:{
1017  charmCandidate = (AliAODRecoDecayHF4Prong*)arrayBranch->At(iCandid);
1018  break;
1019  }
1020  default:
1021  break;
1022  }
1023 
1024  Bool_t unsetvtx=kFALSE;
1025  if(!charmCandidate->GetOwnPrimaryVtx()) {
1026  charmCandidate->SetOwnPrimaryVtx(aodVtx); // needed to compute all variables
1027  unsetvtx=kTRUE;
1028  }
1029 
1030  Bool_t signAssociation = cfVtxHF->SetRecoCandidateParam((AliAODRecoDecayHF*)charmCandidate);
1031  if (!signAssociation){
1032  if(unsetvtx) charmCandidate->UnsetOwnPrimaryVtx();
1033  continue;
1034  }
1035 
1036  Int_t isPartOrAntipart = cfVtxHF->CheckReflexion(fSign);
1037  if (isPartOrAntipart == 0){
1038  AliDebug(2, Form("The candidate pdg code doesn't match the requirement set in the task (fSign = %d)",fSign));
1039  if(unsetvtx) charmCandidate->UnsetOwnPrimaryVtx();
1040  continue;
1041  }
1042 
1043  AliDebug(3,Form("iCandid=%d - signAssociation=%d, isPartOrAntipart=%d",iCandid, signAssociation, isPartOrAntipart));
1044 
1045  Bool_t recoContFilled = cfVtxHF->FillRecoContainer(containerInput);
1046  AliDebug(3, Form("CF task: RecoContFilled for candidate %d is %d", iCandid, (Int_t)recoContFilled));
1047  if (recoContFilled){
1048 
1049  // weight according to pt
1050  if (fUseWeight){
1051  if (fHistoPtWeight) {
1052  AliDebug(2,"Using Histogram as Pt weight function");
1053  fWeight = eventWeight*GetPtWeightFromHistogram(containerInput[0]);
1054  }
1055  else if (fFuncWeight){ // using user-defined function
1056  AliDebug(2, "Using function");
1057  fWeight = eventWeight*fFuncWeight->Eval(containerInput[0]);
1058  }
1059  else{ // using FONLL
1060  AliDebug(2, "Using FONLL");
1061  fWeight = eventWeight*GetWeight(containerInput[0]);
1062  }
1063  AliDebug(2, Form("pt = %f, weight = %f",containerInput[0], fWeight));
1064  }
1065 
1066  if (!fCuts->IsInFiducialAcceptance(containerInput[0],containerInput[1])){
1067  if(unsetvtx) charmCandidate->UnsetOwnPrimaryVtx();
1068  continue;
1069  }
1070  //Reco Step
1071  Bool_t recoStep = cfVtxHF->RecoStep();
1072  if (recoStep) AliDebug(2, Form("particle = %d --> CF task: Reco step for candidate %d is %d", iCandid, iCandid, (Int_t)recoStep));
1073  Bool_t vtxCheck = fCuts->IsEventSelected(aodEvent);
1074 
1075 
1076  // Selection on the filtering bit
1077  Bool_t isBitSelected = kTRUE;
1078  if(fDecayChannel==2) {
1079  if(fUseSelectionBit && !charmCandidate->HasSelectionBit(AliRDHFCuts::kD0toKpiCuts)) isBitSelected = kFALSE;
1080  }else if(fDecayChannel==31){
1081  if(fUseSelectionBit && !charmCandidate->HasSelectionBit(AliRDHFCuts::kDplusCuts)) isBitSelected = kFALSE;
1082  }else if(fDecayChannel==33){
1083  if(fUseSelectionBit && !charmCandidate->HasSelectionBit(AliRDHFCuts::kDsCuts)) isBitSelected = kFALSE;
1084  }else if(fDecayChannel==32){
1085  if(fUseSelectionBit && !charmCandidate->HasSelectionBit(AliRDHFCuts::kLcCuts)) isBitSelected = kFALSE;
1086  }else if(fDecayChannel==22){
1087  if(!((dynamic_cast<AliAODRecoCascadeHF*>(charmCandidate))->CheckCascadeFlags())) isBitSelected = kFALSE; // select only Lc among cascade candidates
1088  }
1089  if(!isBitSelected){
1090  if(unsetvtx) charmCandidate->UnsetOwnPrimaryVtx();
1091  continue;
1092  }
1093 
1094 
1095  if (recoStep && recoContFilled && vtxCheck){
1096  fCFManager->GetParticleContainer()->Fill(containerInput,kStepReconstructed, fWeight) ;
1097  icountReco++;
1098  AliDebug(3,"Reco step passed and container filled\n");
1099 
1100  //Reco in the acceptance -- take care of UNFOLDING!!!!
1101  Bool_t recoAcceptanceStep = cfVtxHF->RecoAcceptStep(&trackCuts[0]);
1102  if (recoAcceptanceStep) {
1103  fCFManager->GetParticleContainer()->Fill(containerInput,kStepRecoAcceptance, fWeight) ;
1104  icountRecoAcc++;
1105  AliDebug(3,"Reco acceptance cut passed and container filled\n");
1106 
1107  if(fAcceptanceUnf){
1108  Double_t fill[4]; //fill response matrix
1109  Bool_t bUnfolding = cfVtxHF -> FillUnfoldingMatrix(fPDGcode,fill);
1110  if (bUnfolding) fCorrelation->Fill(fill);
1111  }
1112 
1113  //Number of ITS cluster requirements
1114  Int_t recoITSnCluster = fCuts->IsSelected(charmCandidate, AliRDHFCuts::kTracks, aodEvent);
1115  if (recoITSnCluster){
1116  fCFManager->GetParticleContainer()->Fill(containerInput,kStepRecoITSClusters, fWeight) ;
1117  icountRecoITSClusters++;
1118  AliDebug(3,"Reco n ITS cluster cut passed and container filled\n");
1119 
1120  Bool_t iscutsusingpid = fCuts->GetIsUsePID();
1121  Int_t recoAnalysisCuts = -1, recoPidSelection = -1;
1122  fCuts->SetUsePID(kFALSE);
1123  recoAnalysisCuts = fCuts->IsSelected(charmCandidate, AliRDHFCuts::kCandidate, aodEvent);
1124 
1125  if (fDecayChannel==33){ // Ds case, where more possibilities are considered
1126  Bool_t keepDs=ProcessDs(recoAnalysisCuts);
1127  if(keepDs) recoAnalysisCuts=3;
1128  }
1129  else if (fDecayChannel==22){ // Lc->V0+bachelor case, where more possibilities are considered
1130  Bool_t keepLctoV0bachelor = ProcessLctoV0Bachelor(recoAnalysisCuts);
1131  if (keepLctoV0bachelor) recoAnalysisCuts=3;
1132  AliAnalysisManager *man = AliAnalysisManager::GetAnalysisManager();
1133  AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
1134  AliPIDResponse* pidResponse = inputHandler->GetPIDResponse();
1135  if (fUseAdditionalCuts){
1136  if (!((AliCFVertexingHFCascade*)cfVtxHF)->CheckAdditionalCuts(pidResponse)) recoAnalysisCuts = -1;
1137  }
1138  }
1139 
1140  fCuts->SetUsePID(iscutsusingpid); //restoring usage of the PID from the cuts object
1141  Bool_t tempAn=(recoAnalysisCuts == 3 || recoAnalysisCuts == isPartOrAntipart);
1142  if (fDecayChannel == 22) tempAn = (recoAnalysisCuts == 3);
1143  if (fDecayChannel == 32) tempAn=(recoAnalysisCuts >0 || recoAnalysisCuts == isPartOrAntipart);
1144 
1145  if (tempAn){
1146  fCFManager->GetParticleContainer()->Fill(containerInput, kStepRecoPPR, fWeight);
1147  icountRecoPPR++;
1148  AliDebug(3,"Reco Analysis cuts passed and container filled \n");
1149  //pid selection
1150  //recoPidSelection = fCuts->IsSelected(charmCandidate, AliRDHFCuts::kPID);
1151  //if((fCuts->CombineSelectionLevels(3,recoAnalysisCuts,recoPidSelection)==isPartOrAntipart)||(fCuts->CombineSelectionLevels(3,recoAnalysisCuts,recoPidSelection)==3)){
1152  recoPidSelection = fCuts->IsSelected(charmCandidate, AliRDHFCuts::kCandidate, aodEvent);
1153 
1154  if (fDecayChannel==33){ // Ds case, where more possibilities are considered
1155  Bool_t keepDs=ProcessDs(recoPidSelection);
1156  if(keepDs) recoPidSelection=3;
1157  } else if (fDecayChannel==22){ // Lc->V0+bachelor case, where more possibilities are considered
1158  Bool_t keepLctoV0bachelor=ProcessLctoV0Bachelor(recoPidSelection);
1159  if (keepLctoV0bachelor) recoPidSelection=3;
1160  }
1161 
1162  Bool_t tempPid=(recoPidSelection == 3 || recoPidSelection == isPartOrAntipart);
1163  if (fDecayChannel == 22) tempPid = (recoPidSelection == 3);
1164  if (fDecayChannel == 32) tempPid=(recoPidSelection >0 || recoPidSelection == isPartOrAntipart);
1165 
1166  if (tempPid){
1167  Double_t weigPID = 1.;
1168  if (fDecayChannel == 2){ // D0 with Bayesian PID using weights
1169  if(((AliRDHFCutsD0toKpi*)fCuts)->GetCombPID() && (((AliRDHFCutsD0toKpi*)fCuts)->GetBayesianStrategy() == AliRDHFCutsD0toKpi::kBayesWeight || ((AliRDHFCutsD0toKpi*)fCuts)->GetBayesianStrategy() == AliRDHFCutsD0toKpi::kBayesWeightNoFilter)){
1170  if (isPartOrAntipart == 1){
1171  weigPID = ((AliRDHFCutsD0toKpi*)fCuts)->GetWeightsNegative()[AliPID::kKaon] * ((AliRDHFCutsD0toKpi*)fCuts)->GetWeightsPositive()[AliPID::kPion];
1172  }else if (isPartOrAntipart == 2){
1173  weigPID = ((AliRDHFCutsD0toKpi*)fCuts)->GetWeightsPositive()[AliPID::kKaon] * ((AliRDHFCutsD0toKpi*)fCuts)->GetWeightsNegative()[AliPID::kPion];
1174  }
1175  if ((weigPID < 0) || (weigPID > 1)) weigPID = 0.;
1176  }
1177  }else if (fDecayChannel == 33){ // Ds with Bayesian PID using weights
1179  Int_t labDau0=((AliAODTrack*)charmCandidate->GetDaughter(0))->GetLabel();
1180  AliAODMCParticle* firstDau=(AliAODMCParticle*)mcArray->UncheckedAt(TMath::Abs(labDau0));
1181  if(firstDau){
1182  Int_t pdgCode0=TMath::Abs(firstDau->GetPdgCode());
1183  if(pdgCode0==321){
1184  weigPID=((AliRDHFCutsDstoKKpi*)fCuts)->GetWeightForKKpi();
1185  }else if(pdgCode0==211){
1186  weigPID=((AliRDHFCutsDstoKKpi*)fCuts)->GetWeightForpiKK();
1187  }
1188  if ((weigPID < 0) || (weigPID > 1)) weigPID = 0.;
1189  }else{
1190  weigPID=0.;
1191  }
1192  }
1193  }
1194  fCFManager->GetParticleContainer()->Fill(containerInput, kStepRecoPID, fWeight*weigPID);
1195  icountRecoPID++;
1196  AliDebug(3,"Reco PID cuts passed and container filled \n");
1197  if(!fAcceptanceUnf){
1198  Double_t fill[4]; //fill response matrix
1199  Bool_t bUnfolding = cfVtxHF -> FillUnfoldingMatrix(fPDGcode,fill);
1200  if (bUnfolding) fCorrelation->Fill(fill);
1201  }
1202  }
1203  else {
1204  AliDebug(3, "Analysis Cuts step not passed \n");
1205  if(unsetvtx) charmCandidate->UnsetOwnPrimaryVtx();
1206  continue;
1207  }
1208  }
1209  else {
1210  AliDebug(3, "PID selection not passed \n");
1211  if(unsetvtx) charmCandidate->UnsetOwnPrimaryVtx();
1212  continue;
1213  }
1214  }
1215  else{
1216  AliDebug(3, "Number of ITS cluster step not passed\n");
1217  if(unsetvtx) charmCandidate->UnsetOwnPrimaryVtx();
1218  continue;
1219  }
1220  }
1221  else{
1222  AliDebug(3, "Reco acceptance step not passed\n");
1223  if(unsetvtx) charmCandidate->UnsetOwnPrimaryVtx();
1224  continue;
1225  }
1226  }
1227  else {
1228  AliDebug(3, "Reco step not passed\n");
1229  if(unsetvtx) charmCandidate->UnsetOwnPrimaryVtx();
1230  continue;
1231  }
1232  }
1233 
1234  if(unsetvtx) charmCandidate->UnsetOwnPrimaryVtx();
1235  } // end loop on candidate
1236  delete vHF;
1237  fCountReco+= icountReco;
1238  fCountRecoAcc+= icountRecoAcc;
1239  fCountRecoITSClusters+= icountRecoITSClusters;
1240  fCountRecoPPR+= icountRecoPPR;
1241  fCountRecoPID+= icountRecoPID;
1242 
1243  fHistEventsProcessed->Fill(1.5);
1244 
1245  delete[] containerInput;
1246  delete[] containerInputMC;
1247  delete cfVtxHF;
1248  if (trackCuts){
1249  // for (Int_t i=0; i<cfVtxHF->GetNProngs(); i++){
1250  // delete [] trackCuts[i];
1251  // }
1252  delete [] trackCuts;
1253  }
1254 
1255 
1256 }
1257 
1258 //___________________________________________________________________________
1260 {
1261  // The Terminate() function is the last function to be called during
1262  // a query. It always runs on the client, it can be used to present
1263  // the results graphically or save the results to file.
1264 
1265  AliAnalysisTaskSE::Terminate();
1266 
1267  AliInfo(Form("Found %i MC particles that are %s in MC, in %d events",fCountMC,fPartName.Data(),fEvents));
1268  AliInfo(Form("Found %i MC particles that are %s in MC in limited acceptance, in %d events",fCountGenLimAcc,fPartName.Data(),fEvents));
1269  AliInfo(Form("Found %i MC particles that are %s in MC in limited acceptance and don't satisfy Acc cuts, in %d events",fCountGenLimAccNoAcc,fPartName.Data(),fEvents));
1270  AliInfo(Form("Found %i MC particles that are %s in MC and satisfy Acc cuts, in %d events",fCountAcc,fPartName.Data(),fEvents));
1271  AliInfo(Form("Found %i MC particles that are %s in MC and satisfy Acc cuts, and satisfy Vertex requirement in %d events",fCountVertex,fPartName.Data(),fEvents));
1272  AliInfo(Form("Found %i MC particles that are %s in MC and satisfy Acc cuts, and satisfy ITS+TPC refit requirementin %d events",fCountRefit,fPartName.Data(),fEvents));
1273  AliInfo(Form("Found %i reco %s that are decaying in %s, in %d events",fCountReco,fPartName.Data(),fDauNames.Data(),fEvents));
1274  AliInfo(Form("Among the above, found %i reco %s that are decaying in %s and are in the requested acceptance, in %d events",fCountRecoAcc,fPartName.Data(),fDauNames.Data(),fEvents));
1275  AliInfo(Form("Among the above, found %i reco %s that are decaying in %s and have at least 5 clusters in ITS, in %d events",fCountRecoITSClusters,fPartName.Data(),fDauNames.Data(),fEvents));
1276  AliInfo(Form("Among the above, found %i reco %s that are decaying in %s and satisfy PPR cuts, in %d events",fCountRecoPPR,fPartName.Data(),fDauNames.Data(),fEvents));
1277  AliInfo(Form("Among the above, found %i reco %s that are decaying in %s and satisfy PPR+PID cuts, in %d events",fCountRecoPID,fPartName.Data(),fDauNames.Data(),fEvents));
1278 
1279  // draw some example plots....
1280  AliCFContainer *cont= dynamic_cast<AliCFContainer*> (GetOutputData(2));
1281  if(!cont) {
1282  printf("CONTAINER NOT FOUND\n");
1283  return;
1284  }
1285  // projecting the containers to obtain histograms
1286  // first argument = variable, second argument = step
1287 
1288  TH1D** h = new TH1D*[3];
1289  Int_t nvarToPlot = 0;
1290  if (fConfiguration == kSnail){
1291  //h = new TH1D[3][12];
1292  for (Int_t ih = 0; ih<3; ih++){
1293  if(fDecayChannel==22){
1294  nvarToPlot = 16;
1295  } else {
1296  nvarToPlot = 12;
1297  }
1298  h[ih] = new TH1D[nvarToPlot];
1299  }
1300  for(Int_t iC=1;iC<nvarToPlot; iC++){
1301  // MC-level
1302  h[0][iC] = *(cont->ShowProjection(iC,0));
1303  // MC-Acceptance level
1304  h[1][iC] = *(cont->ShowProjection(iC,1));
1305  // Reco-level
1306  h[2][iC] = *(cont->ShowProjection(iC,4));
1307  }
1308  }
1309  else {
1310  //h = new TH1D[3][12];
1311  nvarToPlot = 8;
1312  for (Int_t ih = 0; ih<3; ih++){
1313  h[ih] = new TH1D[nvarToPlot];
1314  }
1315  for(Int_t iC=0;iC<nvarToPlot; iC++){
1316  // MC-level
1317  h[0][iC] = *(cont->ShowProjection(iC,0));
1318  // MC-Acceptance level
1319  h[1][iC] = *(cont->ShowProjection(iC,1));
1320  // Reco-level
1321  h[2][iC] = *(cont->ShowProjection(iC,4));
1322  }
1323  }
1324  TString* titles;
1325  //Int_t nvarToPlot = 0;
1326  if (fConfiguration == kSnail){
1327  if(fDecayChannel==31){
1328  //nvarToPlot = 12;
1329  titles = new TString[nvarToPlot];
1330  titles[0]="pT_Dplus (GeV/c)";
1331  titles[1]="rapidity";
1332  titles[2]="phi (rad)";
1333  titles[3]="cT (#mum)";
1334  titles[4]="cosPointingAngle";
1335  titles[5]="pT_1 (GeV/c)";
1336  titles[6]="pT_2 (GeV/c)";
1337  titles[7]="pT_3 (GeV/c)";
1338  titles[8]="d0_1 (#mum)";
1339  titles[9]="d0_2 (#mum)";
1340  titles[10]="d0_3 (#mum)";
1341  titles[11]="zVertex (cm)";
1342  } else if (fDecayChannel==22) {
1343  //nvarToPlot = 16;
1344  titles = new TString[nvarToPlot];
1345  titles[0]="p_{T}(#Lambda_{c}) [GeV/c]";
1346  titles[1]="y(#Lambda_{c})";
1347  titles[2]="#varphi(#Lambda_{c}) [rad]";
1348  titles[3]="onTheFlyStatusV0";
1349  titles[4]="z_{vtx} [cm]";
1350  titles[5]="centrality";
1351  titles[6]="fake";
1352  titles[7]="multiplicity";
1353  //titles[8]="pT(bachelor) [GeV/c]";
1354  titles[8]="p(bachelor) [GeV/c]";
1355  titles[9]="p_{T}(V0) [GeV/c]";
1356  titles[10]="y(V0)";
1357  titles[11]="#varphi(V0) [rad]";
1358  titles[12]="m_{inv}(#pi^{+}#pi^{+}) [GeV/c^{2}]";
1359  titles[13]="dcaV0 (nSigma)";
1360  titles[14]="cosine pointing angle (V0)";
1361  titles[15]="cosine pointing angle (#Lambda_{c})";
1362  //titles[16]="c#tauV0 (#mum)";
1363  //titles[17]="c#tau (#mum)";
1364  } else {
1365  //nvarToPlot = 12;
1366  titles = new TString[nvarToPlot];
1367  titles[0]="pT_D0 (GeV/c)";
1368  titles[1]="rapidity";
1369  titles[2]="cosThetaStar";
1370  titles[3]="pT_pi (GeV/c)";
1371  titles[4]="pT_K (Gev/c)";
1372  titles[5]="cT (#mum)";
1373  titles[6]="dca (#mum)";
1374  titles[7]="d0_pi (#mum)";
1375  titles[8]="d0_K (#mum)";
1376  titles[9]="d0xd0 (#mum^2)";
1377  titles[10]="cosPointingAngle";
1378  titles[11]="phi (rad)";
1379  }
1380  }
1381  else {
1382  //nvarToPlot = 8;
1383  titles = new TString[nvarToPlot];
1384  if (fDecayChannel==22) {
1385  titles[0]="p_{T}(#Lambda_{c}) [GeV/c]";
1386  titles[1]="y(#Lambda_{c})";
1387  titles[2]="#varphi(#Lambda_{c}) [rad]";
1388  titles[3]="onTheFlyStatusV0";
1389  titles[4]="z_{vtx} [cm]";
1390  titles[5]="centrality";
1391  titles[6]="fake";
1392  titles[7]="multiplicity";
1393  } else {
1394  titles[0]="pT_candidate (GeV/c)";
1395  titles[1]="rapidity";
1396  titles[2]="cT (#mum)";
1397  titles[3]="phi";
1398  titles[4]="z_{vtx}";
1399  titles[5]="centrality";
1400  titles[6]="fake";
1401  titles[7]="multiplicity";
1402  }
1403  }
1404 
1405  Int_t markers[16]={20,24,21,25,27,28,
1406  20,24,21,25,27,28,
1407  20,24,21,25};
1408  Int_t colors[3]={2,8,4};
1409  for(Int_t iC=0;iC<nvarToPlot; iC++){
1410  for(Int_t iStep=0;iStep<3;iStep++){
1411  h[iStep][iC].SetTitle(titles[iC].Data());
1412  h[iStep][iC].GetXaxis()->SetTitle(titles[iC].Data());
1413  Double_t maxh=h[iStep][iC].GetMaximum();
1414  h[iStep][iC].GetYaxis()->SetRangeUser(0,maxh*1.2);
1415  h[iStep][iC].SetMarkerStyle(markers[iC]);
1416  h[iStep][iC].SetMarkerColor(colors[iStep]);
1417  }
1418  }
1419 
1420  gStyle->SetCanvasColor(0);
1421  gStyle->SetFrameFillColor(0);
1422  gStyle->SetTitleFillColor(0);
1423  gStyle->SetStatColor(0);
1424 
1425  // drawing in 2 separate canvas for a matter of clearity
1426  TCanvas * c1 =new TCanvas(Form("c1New_%d",fDecayChannel),"Vars 0, 1, 2, 3",1100,1200);
1427  c1->Divide(3,4);
1428  Int_t iPad=1;
1429  for(Int_t iVar=0; iVar<4; iVar++){
1430  c1->cd(iPad++);
1431  h[0][iVar].DrawCopy("p");
1432  c1->cd(iPad++);
1433  h[1][iVar].DrawCopy("p");
1434  c1->cd(iPad++);
1435  h[2][iVar].DrawCopy("p");
1436  }
1437 
1438  TCanvas * c2 =new TCanvas(Form("c2New_%d",fDecayChannel),"Vars 4, 5, 6, 7",1100,1200);
1439  c2->Divide(3,4);
1440  iPad=1;
1441  for(Int_t iVar=4; iVar<8; iVar++){
1442  c2->cd(iPad++);
1443  h[0][iVar].DrawCopy("p");
1444  c2->cd(iPad++);
1445  h[1][iVar].DrawCopy("p");
1446  c2->cd(iPad++);
1447  h[2][iVar].DrawCopy("p");
1448  }
1449 
1450  if (fConfiguration == kSnail){
1451  TCanvas * c3 =new TCanvas(Form("c3New_%d",fDecayChannel),"Vars 8, 9, 10, 11",1100,1200);
1452  c3->Divide(3,4);
1453  iPad=1;
1454  for(Int_t iVar=8; iVar<12; iVar++){
1455  c3->cd(iPad++);
1456  h[0][iVar].DrawCopy("p");
1457  c3->cd(iPad++);
1458  h[1][iVar].DrawCopy("p");
1459  c3->cd(iPad++);
1460  h[2][iVar].DrawCopy("p");
1461  }
1462  if (fDecayChannel==22) {
1463  TCanvas * c4 =new TCanvas(Form("c4New_%d",fDecayChannel),"Vars 12, 13, 14, 15",1100,1200);
1464  c4->Divide(3,4);
1465  iPad=1;
1466  for(Int_t iVar=12; iVar<16; iVar++){
1467  c4->cd(iPad++);
1468  h[0][iVar].DrawCopy("p");
1469  c4->cd(iPad++);
1470  h[1][iVar].DrawCopy("p");
1471  c4->cd(iPad++);
1472  h[2][iVar].DrawCopy("p");
1473  }
1474  }
1475  }
1476 
1477  /*
1478  THnSparseD* hcorr = dynamic_cast<THnSparseD*> (GetOutputData(3));
1479 
1480  TH2D* corr1 = hcorr->Projection(0,2);
1481  TH2D* corr2 = hcorr->Projection(1,3);
1482 
1483  TCanvas * c7 =new TCanvas(Form("c7New_%d",fDecayChannel),"",800,400);
1484  c7->Divide(2,1);
1485  c7->cd(1);
1486  corr1->DrawCopy("text");
1487  c7->cd(2);
1488  corr2->DrawCopy("text");
1489  */
1490  TFile* file_projection = new TFile("CFtaskHFprojectionNew.root","RECREATE");
1491 
1492  // corr1->Write();
1493  // corr2->Write();
1494 
1495  for(Int_t iC=0;iC<nvarToPlot; iC++){
1496  for(Int_t iStep=0;iStep<3;iStep++){
1497  h[iStep][iC].Write(Form("Step%d_%s",iStep,titles[iC].Data()));
1498  }
1499  }
1500  file_projection->Close();
1501  for (Int_t ih = 0; ih<3; ih++) delete [] h[ih];
1502  delete [] h;
1503  delete [] titles;
1504 
1505 }
1506 
1507 //___________________________________________________________________________
1509 {
1510  //HERE ONE CAN CREATE OUTPUT OBJECTS, IN PARTICULAR IF THE OBJECT PARAMETERS DON'T NEED
1511  //TO BE SET BEFORE THE EXECUTION OF THE TASK
1512  //
1513  Info("UserCreateOutputObjects","CreateOutputObjects of task %s\n", GetName());
1514 
1515  //slot #1
1516  OpenFile(1);
1517  const char* nameoutput=GetOutputSlot(1)->GetContainer()->GetName();
1518  fHistEventsProcessed = new TH1I(nameoutput,"",6,0,6) ;
1519  fHistEventsProcessed->GetXaxis()->SetBinLabel(1,"Events processed (all)");
1520  fHistEventsProcessed->GetXaxis()->SetBinLabel(2,"Events analyzed (after selection)");
1521  fHistEventsProcessed->GetXaxis()->SetBinLabel(3,"Candidates processed (all)");
1522  fHistEventsProcessed->GetXaxis()->SetBinLabel(4,"Candidates already filled");
1523  fHistEventsProcessed->GetXaxis()->SetBinLabel(5,"Candidates OK in FillRecoCand");
1524  fHistEventsProcessed->GetXaxis()->SetBinLabel(6,"Candidates failing in FillRecoCand");
1525 
1526  PostData(1,fHistEventsProcessed) ;
1527  PostData(2,fCFManager->GetParticleContainer()) ;
1528  PostData(3,fCorrelation) ;
1529 
1530 }
1531 
1532 
1533 //_________________________________________________________________________
1535  // ad-hoc weight function from ratio of
1536  // pt spectra from FONLL 2.76 TeV and
1537  // pt spectra from MC production LHC12a17a (PYTHIA Perugia0 with pthard bins)
1538  if(fFuncWeight) delete fFuncWeight;
1539  fFuncWeight=new TF1("funcWeight","[0]+[1]*TMath::Exp(-[2]*x)",0.,50.);
1540  fFuncWeight->SetParameter(0,4.63891e-02);
1541  fFuncWeight->SetParameter(1,1.51674e+01);
1542  fFuncWeight->SetParameter(2,4.09941e-01);
1543  fUseWeight=kTRUE;
1544 }
1545 //_________________________________________________________________________
1547  // ad-hoc weight function from ratio of
1548  // D0 pt spectra in PbPb 2011 0-10% centrality and
1549  // pt spectra from MC production LHC12a17a (PYTHIA Perugia0 with pthard bins)
1550  if(fFuncWeight) delete fFuncWeight;
1551  fFuncWeight=new TF1("funcWeight","[0]+[1]/TMath::Power(x,[2])",0.05,50.);
1552  fFuncWeight->SetParameter(0,1.43116e-02);
1553  fFuncWeight->SetParameter(1,4.37758e+02);
1554  fFuncWeight->SetParameter(2,3.08583);
1555  fUseWeight=kTRUE;
1556 }
1557 
1558 //_________________________________________________________________________
1560  // weight function from the ratio of the LHC12a17b MC
1561  // and FONLL calculations for pp data
1562  if(fFuncWeight) delete fFuncWeight;
1563  fFuncWeight=new TF1("funcWeight","([0]*x)/TMath::Power([2],(1+TMath::Power([3],x/[1])))+[4]*TMath::Exp([5]+[6]*x)+[7]*TMath::Exp([8]*x)",0.15,50.);
1564  fFuncWeight->SetParameters(1.92381e+01, 5.05055e+00, 1.05314e+01, 2.5, 1.88214e-03, 3.44871e+00, -9.74325e-02, 1.97671e+00, -3.21278e-01);
1565  fUseWeight=kTRUE;
1566 }
1567 
1568 //_________________________________________________________________________
1570  // weight function from the ratio of the LHC12a17b MC
1571  // and FONLL calculations for pp data
1572  // corrected by the BAMPS Raa calculation for 30-50% CC
1573  if(fFuncWeight) delete fFuncWeight;
1574  fFuncWeight=new TF1("funcWeight","([0]*x)/TMath::Power([2],(1+TMath::Power([3],x/[1])))+[4]*TMath::Exp([5]+[6]*x)+[7]*TMath::Exp([8]*x)",0.15,50.);
1575  fFuncWeight->SetParameters(6.10443e+00, 1.53487e+00, 1.99474e+00, 2.5, 5.51172e-03, 5.86590e+00, -5.46963e-01, 9.41201e-02, -1.64323e-01);
1576  fUseWeight=kTRUE;
1577 }
1578 
1579 //_________________________________________________________________________
1581  // weight function from the ratio of the LHC16i2a MC
1582  // 1.5-14 GeV/c using data and 1-1.5, 14-50 GeV/c using FONLL calculations
1583 
1584  if(fHistoPtWeight) delete fHistoPtWeight;
1585  fHistoPtWeight = new TH1F("histoWeight","histoWeight",500,0.,50.);
1586  Float_t binc[500]={ 1.695705, 1.743693, 1.790289, 1.835410, 1.878981, 1.920938, 1.961223, 1.999787, 2.036589, 2.071597, 2.104784, 2.136132, 2.165629, 2.193270, 2.219057, 2.174545, 2.064698, 1.959489, 1.858770, 1.762396, 1.670224, 1.582115, 1.497931, 1.417541, 1.340814, 1.267622, 1.197842, 1.131352, 1.068033, 1.007770, 0.950450, 0.895963, 0.844202, 0.795062, 0.748441, 0.704241, 0.662363, 0.622715, 0.585204, 0.549742, 0.516242, 0.484620, 0.454795, 0.426686, 0.400217, 0.375314, 0.351903, 0.329915, 0.309281, 0.289936, 0.271816, 0.254860, 0.239007, 0.224201, 0.210386, 0.197508, 0.185516, 0.174360, 0.163992, 0.154366, 0.145438, 0.137166, 0.129508, 0.122426, 0.115882, 0.109840, 0.104266, 0.099128, 0.094395, 0.090036, 0.086023, 0.082331, 0.078933, 0.075805, 0.072925, 0.070271, 0.067823, 0.065562, 0.063471, 0.061532, 0.059730, 0.058051, 0.056481, 0.055007, 0.053619, 0.052306, 0.051059, 0.049867, 0.048725, 0.047624, 0.046558, 0.045522, 0.044511, 0.043521, 0.042548, 0.041590, 0.040643, 0.039706, 0.038778, 0.037857, 0.036944, 0.036039, 0.035141, 0.034251, 0.033370, 0.032500, 0.031641, 0.030796, 0.029966, 0.029153, 0.028359, 0.027587, 0.026837, 0.026113, 0.025416, 0.024748, 0.024111, 0.023507, 0.022937, 0.022402, 0.021904, 0.021443, 0.021020, 0.020634, 0.020286, 0.019974, 0.019698, 0.019455, 0.019244, 0.019062, 0.018905, 0.018770, 0.018652, 0.018545, 0.018444, 0.018342, 0.018231, 0.018102, 0.017947, 0.017755, 0.017536, 0.017327, 0.017120, 0.016915, 0.016713, 0.016514, 0.016317, 0.016122, 0.015929, 0.015739, 0.015551, 0.015366, 0.015182, 0.015001, 0.014822, 0.014645, 0.014470, 0.014297, 0.014127, 0.013958, 0.013791, 0.013627, 0.013464, 0.013303, 0.013145, 0.012988, 0.012833, 0.012679, 0.012528, 0.012378, 0.012231, 0.012085, 0.011940, 0.011798, 0.011657, 0.011518, 0.011380, 0.011244, 0.011110, 0.010978, 0.010846, 0.010717, 0.010589, 0.010463, 0.010338, 0.010214, 0.010092, 0.009972, 0.009853, 0.009735, 0.009619, 0.009504, 0.009391, 0.009279, 0.009168, 0.009058, 0.008950, 0.008843, 0.008738, 0.008633, 0.008530, 0.008429, 0.008328, 0.008229, 0.008130, 0.008033, 0.007937, 0.007843, 0.007749, 0.007656, 0.007565, 0.007475, 0.007385, 0.007297, 0.007210, 0.007124, 0.007039, 0.006955, 0.006872, 0.006790, 0.006709, 0.006629, 0.006550, 0.006471, 0.006394, 0.006318, 0.006242, 0.006168, 0.006094, 0.006022, 0.005950, 0.005879, 0.005808, 0.005739, 0.005671, 0.005603, 0.005536, 0.005470, 0.005405, 0.005340, 0.005276, 0.005213, 0.005151, 0.005090, 0.005029, 0.004969, 0.004909, 0.004851, 0.004793, 0.004736, 0.004679, 0.004623, 0.004568, 0.004514, 0.004460, 0.004406, 0.004354, 0.004302, 0.004251, 0.004200, 0.004150, 0.004100, 0.004051, 0.004003, 0.003955, 0.003908, 0.003861, 0.003815, 0.003770, 0.003725, 0.003680, 0.003636, 0.003593, 0.003550, 0.003507, 0.003466, 0.003424, 0.003383, 0.003343, 0.003303, 0.003264, 0.003225, 0.003186, 0.003148, 0.003110, 0.003073, 0.003037, 0.003000, 0.002965, 0.002929, 0.002894, 0.002860, 0.002826, 0.002792, 0.002758, 0.002726, 0.002693, 0.002661, 0.002629, 0.002598, 0.002567, 0.002536, 0.002506, 0.002476, 0.002446, 0.002417, 0.002388, 0.002360, 0.002332, 0.002304, 0.002276, 0.002249, 0.002222, 0.002196, 0.002169, 0.002144, 0.002118, 0.002093, 0.002068, 0.002043, 0.002019, 0.001995, 0.001971, 0.001947, 0.001924, 0.001901, 0.001878, 0.001856, 0.001834, 0.001812, 0.001790, 0.001769, 0.001748, 0.001727, 0.001706, 0.001686, 0.001666, 0.001646, 0.001626, 0.001607, 0.001588, 0.001569, 0.001550, 0.001531, 0.001513, 0.001495, 0.001477, 0.001460, 0.001442, 0.001425, 0.001408, 0.001391, 0.001374, 0.001358, 0.001342, 0.001326, 0.001310, 0.001294, 0.001279, 0.001264, 0.001249, 0.001234, 0.001219, 0.001204, 0.001190, 0.001176, 0.001162, 0.001148, 0.001134, 0.001121, 0.001107, 0.001094, 0.001081, 0.001068, 0.001055, 0.001043, 0.001030, 0.001018, 0.001006, 0.000994, 0.000982, 0.000970, 0.000959, 0.000947, 0.000936, 0.000925, 0.000914, 0.000903, 0.000892, 0.000881, 0.000871, 0.000860, 0.000850, 0.000840, 0.000830, 0.000820, 0.000810, 0.000801, 0.000791, 0.000782, 0.000772, 0.000763, 0.000754, 0.000745, 0.000736, 0.000727, 0.000719, 0.000710, 0.000702, 0.000693, 0.000685, 0.000677, 0.000669, 0.000661, 0.000653, 0.000645, 0.000637, 0.000630, 0.000622, 0.000615, 0.000607, 0.000600, 0.000593, 0.000586, 0.000579, 0.000572, 0.000565, 0.000558, 0.000552, 0.000545, 0.000539, 0.000532, 0.000526, 0.000520, 0.000513, 0.000507, 0.000501, 0.000495, 0.000489, 0.000483, 0.000478, 0.000472, 0.000466, 0.000461, 0.000455, 0.000450, 0.000444, 0.000439, 0.000434, 0.000429, 0.000424, 0.000419, 0.000414, 0.000409, 0.000404, 0.000399, 0.000394, 0.000389, 0.000385, 0.000380, 0.000376, 0.000371, 0.000367, 0.000362, 0.000358, 0.000354, 0.000350, 0.000345, 0.000341, 0.000337, 0.000333, 0.000329, 0.000325, 0.000321, 0.000318, 0.000314, 0.000310, 0.000306, 0.000303, 0.000299, 0.000295, 0.000292, 0.000288, 0.000285, 0.000282, 0.000278, 0.000275, 0.000272, 0.000268, 0.000265, 0.000262, 0.000259, 0.000256, 0.000253, 0.000250, 0.000247, 0.000244, 0.000241, 0.000238, 0.000235};
1587  for(Int_t i=0; i<500; i++){
1588  fHistoPtWeight->SetBinContent(i+1,binc[i]);
1589  }
1590  //SetWeightHistogram();
1591  fUseWeight=kTRUE;
1592 }
1593 //_________________________________________________________________________
1595  // weight function from the ratio of the LHC16i2a MC
1596  // using FONLL*Raa from Xu.Cao.Bass(LBT model)
1597 
1598  if(fHistoPtWeight) delete fHistoPtWeight;
1599  fHistoPtWeight = new TH1F("histoWeight","histoWeight",500,0.,50.);
1600  Float_t binc[500]={ -3.491009, -2.151267, -1.169817, -0.462113, 0.038852, 0.385901, 0.620406, 0.774498, 0.872869, 0.934235, 0.972536, 0.997905, 1.017465, 1.035981, 1.056389, 1.080233, 1.108019, 1.139503, 1.173928, 1.210210, 1.247090, 1.283254, 1.317421, 1.348413, 1.375204, 1.396948, 1.413000, 1.422920, 1.426469, 1.423596, 1.414424, 1.399224, 1.378394, 1.352429, 1.321897, 1.287417, 1.249627, 1.209171, 1.166675, 1.122735, 1.077901, 1.032675, 0.987496, 0.942748, 0.898751, 0.855766, 0.813999, 0.773607, 0.734700, 0.697350, 0.661596, 0.627448, 0.594895, 0.563911, 0.534455, 0.506477, 0.479923, 0.454732, 0.430845, 0.408201, 0.386738, 0.366399, 0.347127, 0.328866, 0.311564, 0.295172, 0.279641, 0.264928, 0.250988, 0.237781, 0.248506, 0.240198, 0.232287, 0.224750, 0.217563, 0.210707, 0.204160, 0.197906, 0.191927, 0.186209, 0.180735, 0.175494, 0.170472, 0.165657, 0.161039, 0.156606, 0.152350, 0.148261, 0.144331, 0.140552, 0.136916, 0.133416, 0.130046, 0.126800, 0.123671, 0.120654, 0.117744, 0.114937, 0.112226, 0.109608, 0.107080, 0.104636, 0.102273, 0.099988, 0.097778, 0.095638, 0.093567, 0.091561, 0.089618, 0.087735, 0.085910, 0.084141, 0.082424, 0.080759, 0.079143, 0.077574, 0.076051, 0.074571, 0.073134, 0.071737, 0.070379, 0.069059, 0.067775, 0.066526, 0.065311, 0.064128, 0.062977, 0.061856, 0.060764, 0.059700, 0.058664, 0.057654, 0.056670, 0.055710, 0.054775, 0.053862, 0.052972, 0.052103, 0.051255, 0.050428, 0.049620, 0.048831, 0.048061, 0.047308, 0.046573, 0.045855, 0.045152, 0.044466, 0.043795, 0.043139, 0.042498, 0.041870, 0.041256, 0.040656, 0.040068, 0.039493, 0.038930, 0.038379, 0.037839, 0.037310, 0.036793, 0.036286, 0.035789, 0.035302, 0.034825, 0.034358, 0.033900, 0.033451, 0.033010, 0.032578, 0.032155, 0.031740, 0.031332, 0.030932, 0.030540, 0.030155, 0.029778, 0.029407, 0.029043, 0.028686, 0.028335, 0.027991, 0.027653, 0.027320, 0.026994, 0.026674, 0.026359, 0.026049, 0.025745, 0.025447, 0.025153, 0.024864, 0.024581, 0.024302, 0.024027, 0.023758, 0.023492, 0.023232, 0.022975, 0.022723, 0.022474, 0.022230, 0.021990, 0.021754, 0.021521, 0.021292, 0.021066, 0.020845, 0.020626, 0.020411, 0.020199, 0.019991, 0.019786, 0.019584, 0.019385, 0.019189, 0.018995, 0.018805, 0.018618, 0.018433, 0.018251, 0.018072, 0.017895, 0.017721, 0.017549, 0.017380, 0.017214, 0.017049, 0.016887, 0.016727, 0.016570, 0.016415, 0.016262, 0.016111, 0.015962, 0.015815, 0.015670, 0.015527, 0.015386, 0.015247, 0.015110, 0.014974, 0.014841, 0.014709, 0.014579, 0.014450, 0.014324, 0.014199, 0.014075, 0.013953, 0.013833, 0.013714, 0.013597, 0.013481, 0.013367, 0.013254, 0.013143, 0.013033, 0.012924, 0.012817, 0.012711, 0.012606, 0.012503, 0.012401, 0.012300, 0.012200, 0.012102, 0.012004, 0.011908, 0.011813, 0.011719, 0.011626, 0.011535, 0.011444, 0.011355, 0.011266, 0.011179, 0.011092, 0.011007, 0.010922, 0.010839, 0.010756, 0.010675, 0.010594, 0.010514, 0.010435, 0.010357, 0.010280, 0.010204, 0.010128, 0.010053, 0.009980, 0.009907, 0.009834, 0.009763, 0.009692, 0.009622, 0.009553, 0.009485, 0.009417, 0.009350, 0.009284, 0.009218, 0.009153, 0.009089, 0.009026, 0.008963, 0.008901, 0.008839, 0.008778, 0.008718, 0.008658, 0.008599, 0.008540, 0.008483, 0.008425, 0.008368, 0.008312, 0.008257, 0.008202, 0.008147, 0.008093, 0.008040, 0.007987, 0.007934, 0.007883, 0.007831, 0.007780, 0.007730, 0.007680, 0.007631, 0.007582, 0.007533, 0.007485, 0.007438, 0.007390, 0.007344, 0.007298, 0.007252, 0.007206, 0.007161, 0.007117, 0.007073, 0.007029, 0.006986, 0.006943, 0.006900, 0.006858, 0.006817, 0.006775, 0.006734, 0.006694, 0.006653, 0.006613, 0.006574, 0.006535, 0.006496, 0.006457, 0.006419, 0.006381, 0.006344, 0.006307, 0.006270, 0.006233, 0.006197, 0.006161, 0.006126, 0.006090, 0.006055, 0.006021, 0.005986, 0.005952, 0.005918, 0.005885, 0.005852, 0.005819, 0.005786, 0.005754, 0.005722, 0.005690, 0.005658, 0.005627, 0.005596, 0.005565, 0.005534, 0.005504, 0.005474, 0.005444, 0.005415, 0.005385, 0.005356, 0.005327, 0.005299, 0.005270, 0.005242, 0.005214, 0.005186, 0.005159, 0.005132, 0.005104, 0.005078, 0.005051, 0.005025, 0.004998, 0.004972, 0.004946, 0.004921, 0.004895, 0.004870, 0.004845, 0.004820, 0.004796, 0.004771, 0.004747, 0.004723, 0.004699, 0.004675, 0.004651, 0.004628, 0.004605, 0.004582, 0.004559, 0.004536, 0.004514, 0.004491, 0.004469, 0.004447, 0.004425, 0.004404, 0.004382, 0.004361, 0.004339, 0.004318, 0.004297, 0.004277, 0.004256, 0.004235, 0.004215, 0.004195, 0.004175, 0.004155, 0.004135, 0.004116, 0.004096, 0.004077, 0.004058, 0.004039, 0.004020, 0.004001, 0.003982, 0.003964, 0.003945, 0.003927, 0.003909, 0.003891, 0.003873, 0.003855, 0.003837, 0.003820, 0.003802, 0.003785, 0.003768, 0.003751, 0.003734, 0.003717, 0.003700, 0.003684, 0.003667, 0.003651, 0.003634, 0.003618, 0.003602, 0.003586, 0.003570, 0.003555, 0.003539, 0.003523, 0.003508, 0.003493, 0.003477, 0.003462, 0.003447, 0.003432, 0.003417, 0.003403, 0.003388, 0.003373, 0.003359, 0.003345, 0.003330, 0.003316, 0.003302, 0.003288, 0.003274, 0.003260, 0.003246, 0.003233, 0.003219, 0.003206, 0.003192};
1601  for(Int_t i=0; i<500; i++){
1602  fHistoPtWeight->SetBinContent(i+1,binc[i]);
1603  }
1604  //SetWeightHistogram();
1605  fUseWeight=kTRUE;
1606 }
1607 //_________________________________________________________________________
1609  // weight function from the ratio of the LHC16i2a+b+c MC
1610  // and FONLL calculations for pp data
1611 
1612  if(fHistoPtWeight) delete fHistoPtWeight;
1613  fHistoPtWeight = new TH1F("histoWeight","histoWeight",400,0.,40.);
1614  Float_t binc[400]={1.118416, 1.003458, 0.935514, 0.907222, 0.904359, 0.913668, 0.933906, 0.963898, 0.996388, 1.031708, 1.066404, 1.099683, 1.125805, 1.145181, 1.165910, 1.181905, 1.193425, 1.203891, 1.204726, 1.209411, 1.209943, 1.204763, 1.205291, 1.198912, 1.197390, 1.182005, 1.184194, 1.175994, 1.167881, 1.158348, 1.147190, 1.139833, 1.126940, 1.123322, 1.108389, 1.102199, 1.089464, 1.075874, 1.061964, 1.051429, 1.038113, 1.026668, 1.011441, 0.998567, 0.987658, 0.972434, 0.950068, 0.940758, 0.916880, 0.911931, 0.894512, 0.878691, 0.860589, 0.848025, 0.830774, 0.819399, 0.801134, 0.775276, 0.766382, 0.750495, 0.736935, 0.717529, 0.702637, 0.689152, 0.671334, 0.652030, 0.635696, 0.621365, 0.608362, 0.599019, 0.576024, 0.562136, 0.550938, 0.533587, 0.516410, 0.509744, 0.501655, 0.487402, 0.476469, 0.463762, 0.445979, 0.438088, 0.422214, 0.417467, 0.404357, 0.391450, 0.379996, 0.371201, 0.361497, 0.352912, 0.343189, 0.329183, 0.327662, 0.310783, 0.304525, 0.301007, 0.293306, 0.278332, 0.274419, 0.267361, 0.261459, 0.255514, 0.249293, 0.241129, 0.237600, 0.231343, 0.221982, 0.216872, 0.211094, 0.206954, 0.202333, 0.196572, 0.193274, 0.188240, 0.181817, 0.178364, 0.173614, 0.167135, 0.166055, 0.163423, 0.156557, 0.155821, 0.151985, 0.144909, 0.145062, 0.139720, 0.138873, 0.131892, 0.129969, 0.126509, 0.126978, 0.120451, 0.117661, 0.116300, 0.115604, 0.112215, 0.109237, 0.107720, 0.106419, 0.102050, 0.102777, 0.097406, 0.098447, 0.095964, 0.093868, 0.092430, 0.089329, 0.088249, 0.085881, 0.084417, 0.085498, 0.082444, 0.079151, 0.079565, 0.077811, 0.077293, 0.075218, 0.072445, 0.073054, 0.071545, 0.070279, 0.068046, 0.067854, 0.068092, 0.065378, 0.064405, 0.062060, 0.063391, 0.061718, 0.059616, 0.058913, 0.058895, 0.058311, 0.056320, 0.056527, 0.055349, 0.053701, 0.054735, 0.052264, 0.051277, 0.051554, 0.050545, 0.048995, 0.049507, 0.048466, 0.048156, 0.046809, 0.047600, 0.046078, 0.044801, 0.044113, 0.043700, 0.043530, 0.043396, 0.042556, 0.041048, 0.041657, 0.040394, 0.041314, 0.040720, 0.039656, 0.038478, 0.039276, 0.038777, 0.037730, 0.036918, 0.036466, 0.035827, 0.035285, 0.035963, 0.034371, 0.034757, 0.033205, 0.033666, 0.033266, 0.032583, 0.033570, 0.032102, 0.032107, 0.031464, 0.032160, 0.030091, 0.030564, 0.029464, 0.029613, 0.029626, 0.029512, 0.029324, 0.028607, 0.027628, 0.027251, 0.027072, 0.027077, 0.026724, 0.026961, 0.026303, 0.026237, 0.025454, 0.025133, 0.025365, 0.026014, 0.024807, 0.023901, 0.023459, 0.023405, 0.023654, 0.023981, 0.023675, 0.022493, 0.022781, 0.021801, 0.021704, 0.022372, 0.021189, 0.020681, 0.020779, 0.021324, 0.020558, 0.020901, 0.020586, 0.020808, 0.019276, 0.019516, 0.019706, 0.018935, 0.018632, 0.018516, 0.019187, 0.018916, 0.018039, 0.018208, 0.018045, 0.017628, 0.017916, 0.017711, 0.017838, 0.017222, 0.016565, 0.015733, 0.016264, 0.015826, 0.016090, 0.016622, 0.015802, 0.016621, 0.015441, 0.015309, 0.014860, 0.014935, 0.014968, 0.014443, 0.014485, 0.015136, 0.014078, 0.014414, 0.013908, 0.014071, 0.014078, 0.013766, 0.013436, 0.013507, 0.013480, 0.013224, 0.013041, 0.013935, 0.012885, 0.012453, 0.012528, 0.012492, 0.012225, 0.012542, 0.012706, 0.012136, 0.011902, 0.011560, 0.011448, 0.011861, 0.011271, 0.011831, 0.011159, 0.011171, 0.010966, 0.011311, 0.011002, 0.011130, 0.010995, 0.010450, 0.010663, 0.010678, 0.010492, 0.009861, 0.010507, 0.009916, 0.010121, 0.010029, 0.010046, 0.009370, 0.009647, 0.010104, 0.009282, 0.009830, 0.009403, 0.009148, 0.009172, 0.008893, 0.009158, 0.009019, 0.008780, 0.008579, 0.009063, 0.008634, 0.008988, 0.008265, 0.008581, 0.008575, 0.008690, 0.008181, 0.008352, 0.008150, 0.008430, 0.008256, 0.008119, 0.008453, 0.008447, 0.008021, 0.007938, 0.008025, 0.007718, 0.008127, 0.007651, 0.007590, 0.007316, 0.007839, 0.007504, 0.007341, 0.007527, 0.007263, 0.007668, 0.007306, 0.007271, 0.006910, 0.007257, 0.007260, 0.006810, 0.006967, 0.006887, 0.006867, 0.007202, 0.006829, 0.006370, 0.006710, 0.006417, 0.006361, 0.006800, 0.006410, 0.006323, 0.006790, 0.006322, 0.006673, 0.006547};
1615  for(Int_t i=0; i<400; i++){
1616  fHistoPtWeight->SetBinContent(i+1,binc[i]);
1617  }
1618  //SetWeightHistogram();
1619  fUseWeight=kTRUE;
1620 }
1621 
1622 //_________________________________________________________________________
1624  // weight function from the ratio of the LHC16i2a+b+c MC
1625  // and FONLL calculations for pp data
1626  // corrected by the BAMPS Raa calculation for 30-50% CC
1627  if(fHistoPtWeight) delete fHistoPtWeight;
1628  fHistoPtWeight = new TH1F("histoWeight","histoWeight",400,0.,40.);
1629  Float_t binc[400]={2.166180, 1.866117, 1.667595, 1.547176, 1.486661, 1.457891, 1.426949, 1.399055, 1.383278, 1.349383, 1.317009, 1.282321, 1.234257, 1.181136, 1.136655, 1.087523, 1.037912, 0.993256, 0.944746, 0.900948, 0.865869, 0.827193, 0.794424, 0.757723, 0.733020, 0.700164, 0.682189, 0.659872, 0.637918, 0.615749, 0.593020, 0.574402, 0.556158, 0.542663, 0.525494, 0.516038, 0.503629, 0.490980, 0.479143, 0.469005, 0.457749, 0.447668, 0.436803, 0.427073, 0.418282, 0.407867, 0.395093, 0.387861, 0.374742, 0.369462, 0.360146, 0.351991, 0.342990, 0.336259, 0.327730, 0.322382, 0.314602, 0.303874, 0.299820, 0.293049, 0.287539, 0.280329, 0.274866, 0.269939, 0.263299, 0.256057, 0.249215, 0.242170, 0.235704, 0.230709, 0.220529, 0.213921, 0.208394, 0.202424, 0.196700, 0.194943, 0.192620, 0.187894, 0.184411, 0.180204, 0.172915, 0.169077, 0.162201, 0.159636, 0.153904, 0.148296, 0.143282, 0.139306, 0.135561, 0.132342, 0.128696, 0.123444, 0.122873, 0.116544, 0.114197, 0.112878, 0.110018, 0.104547, 0.103222, 0.100707, 0.098622, 0.096513, 0.094295, 0.091334, 0.090122, 0.087870, 0.084894, 0.083729, 0.082265, 0.081404, 0.080323, 0.078750, 0.078132, 0.076781, 0.074823, 0.074050, 0.072614, 0.070093, 0.069828, 0.068907, 0.066189, 0.066054, 0.064600, 0.061757, 0.061986, 0.059862, 0.059656, 0.056807, 0.055956, 0.054386, 0.054507, 0.051629, 0.050358, 0.049702, 0.049331, 0.047814, 0.046476, 0.045762, 0.045142, 0.043224, 0.043484, 0.041282, 0.041794, 0.040809, 0.039985, 0.039439, 0.038181, 0.037782, 0.036831, 0.036264, 0.036790, 0.035535, 0.034173, 0.034409, 0.033659, 0.033308, 0.032290, 0.030981, 0.031121, 0.030361, 0.029708, 0.028653, 0.028461, 0.028449, 0.027208, 0.026697, 0.025623, 0.026069, 0.025279, 0.024332, 0.024341, 0.024629, 0.024677, 0.024117, 0.024490, 0.024257, 0.023804, 0.024537, 0.023692, 0.023502, 0.023888, 0.023673, 0.023193, 0.023684, 0.023429, 0.023521, 0.023014, 0.023346, 0.022544, 0.021866, 0.021477, 0.021224, 0.021089, 0.020972, 0.020515, 0.019739, 0.019982, 0.019328, 0.019719, 0.019387, 0.018833, 0.018227, 0.018558, 0.018276, 0.017738, 0.017460, 0.017365, 0.017178, 0.017033, 0.017478, 0.016817, 0.017119, 0.016463, 0.016802, 0.016711, 0.016475, 0.017083, 0.016441, 0.016548, 0.016320, 0.016786, 0.015804, 0.016153, 0.015668, 0.015843, 0.015810, 0.015651, 0.015454, 0.014981, 0.014376, 0.014089, 0.013906, 0.013818, 0.013549, 0.013580, 0.013160, 0.013040, 0.012566, 0.012324, 0.012353, 0.012582, 0.011915, 0.011401, 0.011112, 0.011008, 0.011046, 0.011119, 0.010954, 0.010439, 0.010604, 0.010179, 0.010163, 0.010507, 0.009981, 0.009771, 0.009846, 0.010134, 0.009798, 0.009991, 0.009869, 0.010005, 0.009295, 0.009438, 0.009557, 0.009210, 0.009088, 0.009057, 0.009412, 0.009306, 0.008899, 0.009009, 0.008952, 0.008764, 0.008926, 0.008842, 0.008924, 0.008634, 0.008322, 0.007920, 0.008205, 0.008000, 0.008151, 0.008438, 0.008037, 0.008472, 0.007886, 0.007835, 0.007621, 0.007675, 0.007707, 0.007452, 0.007489, 0.007841, 0.007308, 0.007497, 0.007248, 0.007348, 0.007367, 0.007227, 0.007097, 0.007179, 0.007209, 0.007115, 0.007059, 0.007588, 0.007058, 0.006862, 0.006945, 0.006965, 0.006856, 0.007075, 0.007209, 0.006925, 0.006830, 0.006672, 0.006645, 0.006923, 0.006615, 0.006982, 0.006622, 0.006666, 0.006579, 0.006823, 0.006673, 0.006786, 0.006740, 0.006440, 0.006606, 0.006650, 0.006568, 0.006206, 0.006646, 0.006305, 0.006468, 0.006442, 0.006486, 0.006080, 0.006291, 0.006622, 0.006113, 0.006506, 0.006254, 0.006114, 0.006161, 0.006002, 0.006211, 0.006146, 0.006012, 0.005902, 0.006264, 0.005996, 0.006271, 0.005793, 0.006043, 0.006067, 0.006177, 0.005842, 0.005991, 0.005872, 0.006102, 0.006003, 0.005930, 0.006201, 0.006224, 0.005937, 0.005901, 0.005992, 0.005788, 0.006121, 0.005787, 0.005766, 0.005582, 0.006006, 0.005774, 0.005672, 0.005841, 0.005660, 0.006000, 0.005741, 0.005737, 0.005475, 0.005773, 0.005799, 0.005462, 0.005610, 0.005569, 0.005574, 0.005871, 0.005589, 0.005234, 0.005535, 0.005314, 0.005288, 0.005676, 0.005371, 0.005319, 0.005734, 0.005360, 0.005679, 0.005593};
1630  for(Int_t i=0; i<400; i++){
1631  fHistoPtWeight->SetBinContent(i+1,binc[i]);
1632  }
1633  fUseWeight=kTRUE;
1634 }
1635 
1636 //_________________________________________________________________________
1638  // weight function from the ratio of the LHC16i2a+b+c MC
1639  // and FONLL calculations for pp data
1640  // corrected by the TAMU Raa calculation for 0-10% CC (not available in 30-50% CC)
1641  if(fHistoPtWeight) delete fHistoPtWeight;
1642  fHistoPtWeight = new TH1F("histoWeight","histoWeight",400,0.,40.);
1643  Float_t binc[400]={1.179906, 1.091249, 1.047774, 1.045579, 1.071679, 1.112413, 1.167414, 1.236240, 1.310301, 1.390289, 1.471711, 1.553389, 1.626886, 1.692115, 1.760647, 1.813658, 1.850817, 1.886699, 1.907671, 1.934832, 1.955433, 1.966727, 1.987262, 1.996316, 2.013326, 1.973926, 1.931144, 1.871654, 1.812942, 1.752718, 1.690846, 1.635303, 1.572611, 1.523510, 1.459790, 1.402510, 1.331908, 1.261575, 1.192241, 1.127915, 1.061798, 0.998830, 0.933514, 0.871774, 0.812936, 0.762844, 0.719340, 0.686587, 0.644108, 0.615714, 0.579512, 0.545254, 0.510508, 0.479884, 0.447423, 0.426154, 0.408934, 0.388264, 0.376424, 0.361389, 0.347757, 0.331685, 0.318029, 0.305285, 0.290922, 0.278523, 0.269807, 0.262025, 0.254878, 0.249325, 0.238179, 0.230899, 0.224792, 0.216253, 0.207879, 0.204465, 0.201153, 0.195373, 0.190926, 0.185773, 0.178589, 0.175371, 0.168959, 0.167004, 0.161705, 0.156809, 0.152788, 0.149806, 0.146429, 0.143478, 0.140037, 0.134813, 0.134679, 0.128205, 0.126078, 0.125038, 0.122214, 0.116329, 0.115044, 0.112427, 0.110279, 0.108098, 0.105784, 0.102628, 0.101429, 0.099101, 0.095464, 0.093631, 0.091491, 0.090045, 0.088374, 0.086188, 0.085067, 0.083168, 0.080636, 0.079414, 0.077610, 0.075013, 0.074825, 0.073932, 0.071106, 0.071050, 0.069574, 0.066593, 0.066924, 0.064876, 0.065064, 0.062345, 0.061980, 0.060859, 0.061616, 0.058952, 0.058079, 0.057894, 0.058031, 0.056604, 0.055180, 0.054490, 0.053909, 0.051768, 0.052210, 0.049552, 0.050152, 0.048955, 0.047953, 0.047224, 0.045588, 0.044985, 0.043728, 0.042934, 0.043434, 0.041834, 0.040118, 0.040281, 0.039348, 0.038987, 0.037793, 0.036258, 0.036420, 0.035528, 0.034761, 0.033524, 0.033296, 0.033280, 0.031825, 0.031351, 0.030329, 0.031103, 0.030401, 0.029481, 0.029247, 0.029352, 0.029174, 0.028286, 0.028500, 0.028017, 0.027293, 0.027932, 0.026779, 0.026379, 0.026628, 0.026211, 0.025508, 0.025877, 0.025433, 0.025328, 0.024636, 0.025069, 0.024282, 0.023625, 0.023278, 0.023074, 0.023000, 0.022943, 0.022514, 0.021767, 0.022180, 0.021594, 0.022175, 0.021944, 0.021456, 0.020901, 0.021419, 0.021230, 0.020738, 0.020322, 0.020055, 0.019686, 0.019371, 0.019725, 0.018835, 0.019029, 0.018163, 0.018398, 0.018163, 0.017719, 0.018126, 0.017208, 0.017086, 0.016622, 0.016865, 0.015663, 0.015791, 0.015108, 0.015069, 0.015033, 0.015006, 0.014940, 0.014604, 0.014133, 0.013968, 0.013904, 0.013934, 0.013780, 0.013930, 0.013727, 0.013940, 0.013763, 0.013826, 0.014192, 0.014801, 0.014347, 0.014048, 0.014009, 0.014197, 0.014571, 0.014999, 0.015030, 0.014491, 0.014891, 0.014456, 0.014596, 0.015256, 0.014648, 0.014492, 0.014756, 0.015344, 0.014986, 0.015433, 0.015394, 0.015756, 0.014778, 0.015145, 0.015478, 0.015051, 0.014986, 0.015067, 0.015793, 0.015748, 0.015188, 0.015502, 0.015533, 0.015340, 0.015759, 0.015745, 0.016026, 0.015635, 0.015194, 0.014579, 0.015225, 0.014963, 0.015365, 0.016030, 0.015387, 0.016341, 0.015327, 0.015340, 0.015030, 0.015246, 0.015420, 0.015015, 0.015195, 0.016021, 0.015034, 0.015528, 0.015114, 0.015423, 0.015564, 0.015348, 0.015107, 0.015314, 0.015411, 0.015243, 0.015154, 0.016324, 0.015215, 0.014823, 0.015030, 0.015104, 0.014896, 0.015400, 0.015721, 0.015131, 0.014951, 0.014630, 0.014597, 0.015235, 0.014583, 0.015418, 0.014648, 0.014769, 0.014601, 0.015167, 0.014857, 0.015134, 0.015053, 0.014405, 0.014800, 0.014921, 0.014760, 0.013966, 0.014979, 0.014230, 0.014620, 0.014581, 0.014701, 0.013799, 0.014299, 0.015071, 0.013931, 0.014846, 0.014290, 0.013988, 0.014113, 0.013767, 0.014263, 0.014131, 0.013840, 0.013604, 0.014456, 0.013853, 0.014505, 0.013416, 0.014010, 0.014081, 0.014352, 0.013589, 0.013952, 0.013690, 0.014241, 0.014024, 0.013868, 0.014517, 0.014587, 0.013927, 0.013857, 0.014084, 0.013619, 0.014417, 0.013644, 0.013607, 0.013185, 0.014200, 0.013665, 0.013437, 0.013849, 0.013431, 0.014252, 0.013648, 0.013652, 0.013039, 0.013761, 0.013836, 0.013043, 0.013408, 0.013319, 0.013344, 0.014065, 0.013400, 0.012560, 0.013294, 0.012773, 0.012721, 0.013663, 0.012939, 0.012823, 0.013835, 0.012942, 0.013723, 0.013525};
1644  for(Int_t i=0; i<400; i++){
1645  fHistoPtWeight->SetBinContent(i+1,binc[i]);
1646  }
1647  fUseWeight=kTRUE;
1648 }
1649 
1650 //_________________________________________________________________________
1652  // weight function from the ratio of the LHC16i2a MC
1653  // 2.5-14 GeV/c using data and 0-2.5, 14-50 GeV/c using FONLL calculations
1654 
1655  if(fHistoPtWeight) delete fHistoPtWeight;
1656  fHistoPtWeight = new TH1F("histoWeight","histoWeight",500,0.,50.);
1657  Float_t binc[500]={ 1.977386, 1.092380, 0.982069, 0.990772, 1.031869, 1.075578, 1.121814, 1.160738, 1.194926, 1.223790, 1.248790, 1.265487,
1658  1.280118, 1.292664, 1.302578, 1.308750, 1.316914, 1.321336, 1.325862, 1.335865, 1.330973, 1.338854, 1.347197, 1.355202,
1659  1.345868, 1.306835, 1.217713, 1.150661, 1.082328, 1.016336, 0.961361, 0.909377, 0.859229, 0.808615, 0.770923, 0.726400,
1660  0.690444, 0.656639, 0.626977, 0.601282, 0.565640, 0.541549, 0.517613, 0.492610, 0.467891, 0.450866, 0.427611, 0.405115,
1661  0.393432, 0.367097, 0.355256, 0.344176, 0.327230, 0.308159, 0.299667, 0.288000, 0.278949, 0.263341, 0.250445, 0.243064,
1662  0.232859, 0.221800, 0.214465, 0.207126, 0.197129, 0.188575, 0.186439, 0.179715, 0.170882, 0.164423, 0.158682, 0.154019,
1663  0.150277, 0.144272, 0.137206, 0.135669, 0.128931, 0.125974, 0.121932, 0.119566, 0.113806, 0.112343, 0.107325, 0.106804,
1664  0.104220, 0.098339, 0.095757, 0.095992, 0.092098, 0.089896, 0.087719, 0.086209, 0.085378, 0.082050, 0.078781, 0.078904,
1665  0.077688, 0.077198, 0.075539, 0.071257, 0.071342, 0.070415, 0.069445, 0.067272, 0.064635, 0.065670, 0.063817, 0.062011,
1666  0.060226, 0.058354, 0.058203, 0.057580, 0.055477, 0.055900, 0.054993, 0.053452, 0.052578, 0.051701, 0.050199, 0.049844,
1667  0.047829, 0.047402, 0.046873, 0.044984, 0.045633, 0.044068, 0.043317, 0.042371, 0.042091, 0.042391, 0.041007, 0.039471,
1668  0.038575, 0.038065, 0.039097, 0.037241, 0.035288, 0.035440, 0.035264, 0.033790, 0.033902, 0.033853, 0.032486, 0.031943,
1669  0.031140, 0.030939, 0.030288, 0.029462, 0.029969, 0.028097, 0.028703, 0.028627, 0.027646, 0.027564, 0.026505, 0.026356,
1670  0.025599, 0.026124, 0.025300, 0.024600, 0.024092, 0.024186, 0.023315, 0.023520, 0.023087, 0.022226, 0.022345, 0.021455,
1671  0.020492, 0.021519, 0.020416, 0.020084, 0.020114, 0.019717, 0.019508, 0.018334, 0.018877, 0.018658, 0.018210, 0.017702,
1672  0.018155, 0.017342, 0.016846, 0.017155, 0.016306, 0.016247, 0.016075, 0.015419, 0.015835, 0.016264, 0.015473, 0.015212,
1673  0.014994, 0.014338, 0.015062, 0.014039, 0.014740, 0.014412, 0.014111, 0.013556, 0.013372, 0.012951, 0.012977, 0.013086,
1674  0.012727, 0.012118, 0.012176, 0.012056, 0.012350, 0.011744, 0.011840, 0.011740, 0.012028, 0.011028, 0.010922, 0.011132,
1675  0.011492, 0.010939, 0.011151, 0.010446, 0.010507, 0.009898, 0.010788, 0.010553, 0.010305, 0.010137, 0.009395, 0.009406,
1676  0.009338, 0.009635, 0.009477, 0.009497, 0.008915, 0.009116, 0.009080, 0.009294, 0.008765, 0.008222, 0.008483, 0.008666,
1677  0.008659, 0.008378, 0.008100, 0.008121, 0.008041, 0.007868, 0.008032, 0.008100, 0.008079, 0.007581, 0.007421, 0.007118,
1678  0.007416, 0.007828, 0.007152, 0.007088, 0.007122, 0.007133, 0.006934, 0.007103, 0.006555, 0.007113, 0.006829, 0.006883,
1679  0.006288, 0.006291, 0.006312, 0.006090, 0.006457, 0.006410, 0.006449, 0.005728, 0.006082, 0.006032, 0.005872, 0.005989,
1680  0.005934, 0.005962, 0.005698, 0.005851, 0.005615, 0.005442, 0.005838, 0.005589, 0.005422, 0.005286, 0.005219, 0.005153,
1681  0.005222, 0.005520, 0.004971, 0.005049, 0.005134, 0.004912, 0.004870, 0.004990, 0.005039, 0.004782, 0.004498, 0.004962,
1682  0.004755, 0.004995, 0.004437, 0.004686, 0.004753, 0.004703, 0.004486, 0.004614, 0.004152, 0.004107, 0.004131, 0.004349,
1683  0.004254, 0.004112, 0.004103, 0.004045, 0.004095, 0.004148, 0.004417, 0.004104, 0.003765, 0.003868, 0.004080, 0.003937,
1684  0.004091, 0.003892, 0.003849, 0.003681, 0.003834, 0.003530, 0.003934, 0.003552, 0.003714, 0.003282, 0.003898, 0.003909,
1685  0.003685, 0.003800, 0.003469, 0.003311, 0.003483, 0.003242, 0.003083, 0.003145, 0.003158, 0.003073, 0.003331, 0.003388,
1686  0.003156, 0.002935, 0.003256, 0.003261, 0.002972, 0.002966, 0.003312, 0.003253, 0.003122, 0.003075, 0.002978, 0.003029,
1687  0.002883, 0.002793, 0.003039, 0.002905, 0.002511, 0.002779, 0.002964, 0.002755, 0.002747, 0.002863, 0.002777, 0.002514,
1688  0.002775, 0.002845, 0.002427, 0.002540, 0.002406, 0.002490, 0.002592, 0.002457, 0.002560, 0.002223, 0.002582, 0.002725,
1689  0.002456, 0.002258, 0.002419, 0.002630, 0.002263, 0.002158, 0.002518, 0.002364, 0.002034, 0.002077, 0.002132, 0.002602,
1690  0.002309, 0.002357, 0.002333, 0.002194, 0.002213, 0.002270, 0.002202, 0.002308, 0.002042, 0.002417, 0.002220, 0.002359,
1691  0.002305, 0.002082, 0.002036, 0.002075, 0.002176, 0.002291, 0.002174, 0.002057, 0.001983, 0.001972, 0.001997, 0.001875,
1692  0.001958, 0.001838, 0.001895, 0.001868, 0.001996, 0.001807, 0.001765, 0.002055, 0.001933, 0.001797, 0.001908, 0.001816,
1693  0.001790, 0.001774, 0.001731, 0.002141, 0.001511, 0.001603, 0.002065, 0.001799, 0.001736, 0.001954, 0.001836, 0.001729,
1694  0.001817, 0.001671, 0.001766, 0.001652, 0.001706, 0.001519, 0.001649, 0.001518, 0.001505, 0.001552, 0.001531, 0.001730,
1695  0.001717, 0.001442, 0.001626, 0.001668, 0.001591, 0.001509, 0.001313, 0.001555, 0.001393, 0.001587, 0.001363, 0.001360,
1696  0.001785, 0.001410, 0.001363, 0.001278, 0.001427, 0.001407, 0.001102, 0.001358, 0.001408, 0.001509, 0.001399, 0.001411,
1697  0.001391, 0.001284, 0.001641, 0.001205, 0.001172, 0.001277, 0.001163, 0.001321, 0.001243, 0.001284, 0.001353, 0.001219,
1698  0.001338, 0.001204, 0.001206, 0.001250, 0.001127, 0.001366, 0.001240, 0.001124 };
1699 
1700  for(Int_t i=0; i<500; i++){
1701  fHistoPtWeight->SetBinContent(i+1,binc[i]);
1702  }
1703  fUseWeight=kTRUE;
1704 }
1705 
1706 //_________________________________________________________________________
1708  // weight function from the ratio of the LHC13d3 MC
1709  // and FONLL calculations for pp data
1710  if(fFuncWeight) delete fFuncWeight;
1711  fFuncWeight=new TF1("funcWeight","([0]*x)/TMath::Power([2],(1+TMath::Power([3],x/[1])))+[4]*TMath::Exp([5]+[6]*x)+[7]*TMath::Exp([8]*x)",0.15,30.);
1712  fFuncWeight->SetParameters(2.94999e+00,3.47032e+00,2.81278e+00,2.5,1.93370e-02,3.86865e+00,-1.54113e-01,8.86944e-02,2.56267e-02);
1713  fUseWeight=kTRUE;
1714 }
1715 
1716 //_________________________________________________________________________
1718  // weight function from the ratio of the LHC10f6a MC
1719  // and FONLL calculations for pp data
1720  if(fFuncWeight) delete fFuncWeight;
1721  fFuncWeight=new TF1("funcWeight","([0]*x)/TMath::Power([2],(1+TMath::Power([3],x/[1])))+[4]*TMath::Exp([5]+[6]*x)+[7]*TMath::Exp([8]*x)",0.15,40.);
1722  fFuncWeight->SetParameters(2.41522e+01,4.92146e+00,6.72495e+00,2.5,6.15361e-03,4.78995e+00,-4.29135e-01,3.99421e-01,-1.57220e-02);
1723  fUseWeight=kTRUE;
1724 }
1725 
1726 //_________________________________________________________________________
1728  // weight function from the ratio of the LHC12a12 MC
1729  // and FONLL calculations for pp data
1730  if(fFuncWeight) delete fFuncWeight;
1731  fFuncWeight=new TF1("funcWeight","([0]*x)/TMath::Power([2],(1+TMath::Power([3],x/[1])))+[4]*TMath::Exp([5]+[6]*x)+[7]*TMath::Exp([8]*x+[9])",0.15,50.);
1732  fFuncWeight->SetParameters(1.31497e+01,3.30503e+00,3.45594e+00,2.5,2.28642e-02,1.42372e+00,2.32892e-04,5.21986e-02,-2.14236e-01,3.86200e+00);
1733  fUseWeight=kTRUE;
1734 }
1735 
1736 //_________________________________________________________________________
1738  // weight function from the ratio of the LHC12a12bis MC
1739  // and FONLL calculations for pp data
1740  if(fFuncWeight) delete fFuncWeight;
1741  fFuncWeight=new TF1("funcWeight","([0]*x)/TMath::Power([2],(1+TMath::Power([3],x/[1])))+[4]*TMath::Exp([5]+[6]*x)+[7]*TMath::Exp([8]*x+[9])",0.15,50.);
1742  fFuncWeight->SetParameters(6.54519e+00,2.74007e+00,2.48325e+00,2.5,1.61113e-01,-5.32546e-01,-3.75916e-04,2.38189e-01,-2.17561e-01,2.35975e+00);
1743  fUseWeight=kTRUE;
1744 }
1745 
1746 //_________________________________________________________________________
1748  // weight function from the ratio of the LHC13e2fix MC
1749  // and FONLL calculations for pp data
1750  if(fFuncWeight) delete fFuncWeight;
1751  fFuncWeight=new TF1("funcWeight","([0]*x)/TMath::Power([2],(1+TMath::Power([3],x/[1])))+[4]*TMath::Exp([5]+[6]*x)+[7]*TMath::Exp([8]*x+[9])",0.15,50.);
1752  fFuncWeight->SetParameters(1.85862e+01,2.48171e+00,3.39356e+00,2.5,1.70426e-02,2.28453e+00,-4.57749e-02,5.84585e-02,-3.19719e-01,4.16789e+00);
1753  fUseWeight=kTRUE;
1754 }
1755 
1756 //________________________________________________________________
1758  // weight function from the ratio of the LHC10f6a MC
1759  // and FONLL calculations for pp data
1760  if(fFuncWeight) delete fFuncWeight;
1761  fFuncWeight=new TF1("funcWeight","([0]*x)/TMath::Power([2],(1+TMath::Power([3],x/[1])))+[4]*TMath::Exp([5]+[6]*x)+[7]*TMath::Exp([8]*x)",0.15,40.);
1762  fFuncWeight->SetParameters(2.77730e+01,4.78942e+00,7.45378e+00,2.5,9.86255e-02,2.30120e+00,-4.16435e-01,3.43770e-01,-2.29380e-02);
1763  fUseWeight=kTRUE;
1764 }
1765 
1766 //________________________________________________________________
1768  // weight function from the ratio of the LHC10f6a MC
1769  // and FONLL calculations for pp data
1770  if(fFuncWeight) delete fFuncWeight;
1771  fFuncWeight=new TF1("funcWeight","([0]*x)/TMath::Power([2],(1+TMath::Power([3],x/[1])))+[4]*TMath::Exp([5]+[6]*x)+[7]*TMath::Exp([8]*x+[9])",0.15,40.);
1772  fFuncWeight->SetParameters(1.34412e+01,3.20068e+00,5.14481e+00,2.5,7.59405e-04,7.51821e+00,-3.93811e-01,2.16849e-02,-3.37768e-02,2.40308e+00);
1773  fUseWeight=kTRUE;
1774 }
1775 
1776 //_________________________________________________________________________
1778  // weight function from the ratio of the LHC13d3 MC
1779  // and FONLL calculations for pPb data
1780  // using Lc simulated pt distribution
1781  if(fFuncWeight) delete fFuncWeight;
1782  fFuncWeight=new TF1("funcWeight","([0]*x)/TMath::Power([2],(1+TMath::Power([3],x/[1])))+[4]*TMath::Exp([5]+[6]*x)+[7]*TMath::Exp([8]*x)",0.15,20.);
1783  fFuncWeight->SetParameters(5.94428e+01,1.63585e+01,9.65555e+00,6.71944e+00,8.88338e-02,2.40477e+00,-4.88649e-02,-6.78599e-01,-2.10951e-01);
1784  fUseWeight=kTRUE;
1785 }
1786 //_________________________________________________________________________
1788  // weight function from the ratio of the LHC16i6a MC
1789  // and FONLL calculations for pp data
1790  // using D0 simulated pt distribution
1791  if(fFuncWeight) delete fFuncWeight;
1792  fFuncWeight=new TF1("funcWeight","([0]*x)/TMath::Power([2],(1+TMath::Power([3],x/[1])))+[4]*TMath::Exp([5]+[6]*x)+[7]*TMath::Exp([8]*x)",0.2,20.);
1793  fFuncWeight->SetParameters(2.70821e+03,2.98122e+00,8.67776e+01,1.16611e+00,1.17276e-02,5.41670e+00,6.01099e-02,-2.04524e+00,6.69208e-02);
1794  fUseWeight=kTRUE;
1795 }
1796 
1797 //_________________________________________________________________________
1799  // weight function from the ratio of the LHC11b2 MC
1800  // and FONLL calculations for pp data
1801  // using Lc simulated pt distribution
1802  if(fFuncWeight) delete fFuncWeight;
1803  fFuncWeight=new TF1("funcWeight","([0]*x)/TMath::Power([2],(1+TMath::Power([3],x/[1])))+[4]*TMath::Exp([5]+[6]*x)+[7]*TMath::Exp([8]*x)",1.,20.);
1804  fFuncWeight->SetParameters(2.11879e+02,3.73290e+00,2.01235e+01,1.41508e+00,1.06268e-01,1.86285e+00,-4.52956e-02,-9.90631e-01,-1.31615e+00);
1805  fUseWeight=kTRUE;
1806 }
1807 
1808 //_________________________________________________________________________
1810  // weight function from the ratio of the LHC10f7a MC
1811  // and FONLL calculations for pp data
1812  // using Lc simulated pt distribution
1813  if(fFuncWeight) delete fFuncWeight;
1814  fFuncWeight=new TF1("funcWeight","([0]*x)/TMath::Power([2],(1+TMath::Power([3],x/[1])))+[4]*TMath::Exp([5]+[6]*x)+[7]*TMath::Exp([8]*x)",1.,20.);
1815  fFuncWeight->SetParameters(2.84268e+02,2.18850e+01,2.36298e+01,7.46144e+00,1.69747e-01,1.66993e+00,-5.54726e-02,-1.53869e+00,-1.18404e+00);
1816  fUseWeight=kTRUE;
1817 }
1818 
1819 
1820 //_________________________________________________________________________
1822  // weight function from the ratio of the LHC15l2a2 MC
1823  // and FONLL calculations for pp data
1824  // using D0 simulated pt distribution
1825  if(fFuncWeight) delete fFuncWeight;
1826  fFuncWeight=new TF1("funcWeight","(x<28.5)*(([0]*x)/TMath::Power([2],(1+TMath::Power([3],x/[1])))+[4]*TMath::Exp([5]+[6]*x)+[7]*TMath::Exp([8]*x))+(x>=28.5)*0.140023",0.15,40);
1827  fFuncWeight->SetParameters(4.66092e+01, 4.27321e+01, 4.46858e+01, 1.67788e+00, -2.88457e-02, 4.40656e+00, -7.31064e-01, 2.96431e+00, -2.79976e-01);
1828  fUseWeight=kTRUE;
1829 }
1830 
1831 
1832 //_________________________________________________________________________
1834  // weight function from the ratio of the LHC17c3a1-LHC17c3a2 MC
1835  // and FONLL calculations for pp data
1836  // using D0 simulated pt distribution
1837  if(fFuncWeight) delete fFuncWeight;
1838  fFuncWeight=new TF1("funcWeight","(x<10.71)*(([0]*x)/TMath::Power([2],(1+TMath::Power([3],x/[1])))+[4]*TMath::Exp([5]+[6]*x)+[7]*TMath::Exp([8]*x))+(x>=10.71)*2.192",0.15,40);
1839  fFuncWeight->SetParameters(-8.28294e+04,1.04367e+00,1.43041e+02,1.40041e+00,-7.23198e-03,4.71629e+00,-3.15545e+00,2.36495e+00,-7.08928e-03);
1840  fUseWeight=kTRUE;
1841 }
1842 
1843 
1844 //_________________________________________________________________________
1846 {
1847  //
1848  // calculating the weight to fill the container
1849  //
1850 
1851  // FNOLL central:
1852  // p0 = 1.63297e-01 --> 0.322643
1853  // p1 = 2.96275e+00
1854  // p2 = 2.30301e+00
1855  // p3 = 2.50000e+00
1856 
1857  // PYTHIA
1858  // p0 = 1.85906e-01 --> 0.36609
1859  // p1 = 1.94635e+00
1860  // p2 = 1.40463e+00
1861  // p3 = 2.50000e+00
1862 
1863  Double_t func1[4] = {0.322643,2.96275,2.30301,2.5};
1864  Double_t func2[4] = {0.36609,1.94635,1.40463,2.5};
1865 
1866  Double_t dndpt_func1 = dNdptFit(pt,func1);
1867  if(fUseFlatPtWeight) dndpt_func1 = 1./30.;
1868  Double_t dndpt_func2 = dNdptFit(pt,func2);
1869  AliDebug(2,Form("pt = %f, FONLL = %f, Pythia = %f, ratio = %f",pt,dndpt_func1,dndpt_func2,dndpt_func1/dndpt_func2));
1870  return dndpt_func1/dndpt_func2;
1871 }
1872 
1873 //__________________________________________________________________________________________________
1875 {
1876  //
1877  // calculating dNdpt
1878  //
1879 
1880  Double_t denom = TMath::Power((pt/par[1]), par[3] );
1881  Double_t dNdpt = par[0]*pt/TMath::Power(1.+denom, par[2]);
1882 
1883  return dNdpt;
1884 }
1885 
1886 //_________________________________________________________________________
1888 {
1889  //
1890  // Using an histogram as weight function
1891  // weight = 0 in the range outside the function
1892  //
1893  Double_t weight = 0.0;
1894  Int_t histoNbins = fHistoPtWeight->GetNbinsX();
1895  Int_t bin2 = fHistoPtWeight->FindBin(pt);
1896  if( (bin2>0) && (bin2<=histoNbins) ) {
1897  Int_t bin1=bin2-1;
1898  Int_t bin3=bin2+1;
1899  if(bin2==1) bin1=bin2+2;
1900  if(bin2==histoNbins) bin3=bin2-2;
1901  Float_t x_1=fHistoPtWeight->GetXaxis()->GetBinCenter(bin1);
1902  Float_t x_2=fHistoPtWeight->GetXaxis()->GetBinCenter(bin2);
1903  Float_t x_3=fHistoPtWeight->GetXaxis()->GetBinCenter(bin3);
1904  Float_t y_1=fHistoPtWeight->GetBinContent(bin1);
1905  Float_t y_2=fHistoPtWeight->GetBinContent(bin2);
1906  Float_t y_3=fHistoPtWeight->GetBinContent(bin3);
1907  Double_t a=( (y_3-y_2)*(x_1-x_2) - (y_1-y_2)*(x_3-x_2) )/( (x_3*x_3-x_2*x_2)*(x_1-x_2) - (x_1*x_1-x_2*x_2)*(x_3-x_2) );
1908  Double_t b=((y_1-y_2)-a*(x_1*x_1-x_2*x_2))/(x_1-x_2);
1909  Double_t c=y_3-a*(x_3*x_3)-b*x_3;
1910  weight = a*pt*pt+b*pt+c;
1911  }
1912  return weight;
1913 }
1914 
1915 //__________________________________________________________________________________________________
1917  //
1918  // calculating the z-vtx weight for the given run range
1919  //
1920 
1921  if(runnumber>146824 || runnumber<146803) return 1.0;
1922 
1923  Double_t func1[3] = {1.0, -0.5, 6.5 };
1924  Double_t func2[3] = {1.0, -0.5, 5.5 };
1925 
1926  Double_t dzFunc1 = DodzFit(z,func1);
1927  Double_t dzFunc2 = DodzFit(z,func2);
1928 
1929  return dzFunc1/dzFunc2;
1930 }
1931 
1932 //__________________________________________________________________________________________________
1934 
1935  //
1936  // Gaussian z-vtx shape
1937  //
1938  //gaussian = [0]/TMath::Sqrt(2.*TMath::Pi())/[2]*exp[-(x-[1])*(x-[1])/(2*[2]*[2])]
1939 
1940  Double_t value = par[0]/TMath::Sqrt(2.*TMath::Pi())/par[2]*TMath::Exp(-(z-par[1])*(z-par[1])/2./par[2]/par[2]);
1941 
1942  return value;
1943 }
1944 //__________________________________________________________________________________________________
1946  //
1947  // calculates the Nch weight using the measured and generateed Nch distributions
1948  //
1949  if(nch<=0) return 0.;
1950  if(!fHistoMeasNch || !fHistoMCNch) { AliError("Input histos to evaluate Nch weights missing"); return 0.; }
1951  Double_t pMeas=fHistoMeasNch->GetBinContent(fHistoMeasNch->FindBin(nch));
1952  Double_t pMC=fHistoMCNch->GetBinContent(fHistoMCNch->FindBin(nch));
1953  Double_t weight = pMC>0 ? pMeas/pMC : 0.;
1954  if(fUseMultRatioAsWeight) weight = pMC;
1955  return weight;
1956 }
1957 //__________________________________________________________________________________________________
1959  // creates historgam with measured multiplcity distribution in pp 7 TeV collisions (from Eur. Phys. J. C (2010) 68: 345–354)
1960  //
1961  // for Nch > 70 the points were obtained with a double NBD distribution fit
1962  // TF1 *fit1 = new TF1("fit1","[0]*(TMath::Gamma(x+[1])/(TMath::Gamma(x+1)*TMath::Gamma([1])))*(TMath::Power(([2]/[1]),x))*(TMath::Power((1+([2]/[1])),-x-[1]))"); fit1->SetParameter(0,1.);// normalization constant
1963  // fit1->SetParameter(1,1.63); // k parameter
1964  // fit1->SetParameter(2,12.8); // mean multiplicity
1965  //
1966  Double_t nchbins[82]={0.50,1.50,2.50,3.50,4.50,5.50,6.50,7.50,8.50,9.50,
1967  10.50,11.50,12.50,13.50,14.50,15.50,16.50,17.50,18.50,19.50,
1968  20.50,21.50,22.50,23.50,24.50,25.50,26.50,27.50,28.50,29.50,
1969  30.50,31.50,32.50,33.50,34.50,35.50,36.50,37.50,38.50,39.50,
1970  40.50,41.50,42.50,43.50,44.50,45.50,46.50,47.50,48.50,49.50,
1971  50.50,51.50,52.50,53.50,54.50,55.50,56.50,57.50,58.50,59.50,
1972  60.50,62.50,64.50,66.50,68.50,70.50,72.50,74.50,76.50,78.50,
1973  80.50,82.50,84.50,86.50,88.50,90.50,92.50,94.50,96.50,98.50,
1974  100.50,102.50};
1975  Double_t pch[81]={0.062011,0.072943,0.070771,0.067245,0.062834,0.057383,0.051499,0.04591,0.041109,0.036954,
1976  0.03359,0.030729,0.028539,0.026575,0.024653,0.0229,0.021325,0.019768,0.018561,0.017187,
1977  0.01604,0.014836,0.013726,0.012576,0.011481,0.010393,0.009502,0.008776,0.008024,0.007452,
1978  0.006851,0.006428,0.00594,0.005515,0.005102,0.00469,0.004162,0.003811,0.003389,0.003071,
1979  0.002708,0.002422,0.002184,0.001968,0.00186,0.00165,0.001577,0.001387,0.001254,0.001118,
1980  0.001037,0.000942,0.000823,0.000736,0.000654,0.000579,0.000512,0.00049,0.00045,0.000355,
1981  0.000296,0.000265,0.000193,0.00016,0.000126,0.0000851, 0.0000676,0.0000537,0.0000426, 0.0000338,
1982  0.0000268,0.0000213,0.0000166,0.0000133,0.0000106,0.00000837,0.00000662, 0.00000524,0.00000414, 0.00000327,
1983  0.00000258};
1984 
1985  if(fHistoMeasNch) delete fHistoMeasNch;
1986  fHistoMeasNch=new TH1F("hMeaseNch","",81,nchbins);
1987  for(Int_t i=0; i<81; i++){
1988  fHistoMeasNch->SetBinContent(i+1,pch[i]);
1989  fHistoMeasNch->SetBinError(i+1,0.);
1990  }
1991 }
1992 
1993 //__________________________________________________________________________________________________
1995  // processes output of Ds is selected
1996  Bool_t keep=kFALSE;
1997  if(recoAnalysisCuts > 0){
1998  Int_t isKKpi=recoAnalysisCuts&1;
1999  Int_t ispiKK=recoAnalysisCuts&2;
2000  Int_t isPhiKKpi=recoAnalysisCuts&4;
2001  Int_t isPhipiKK=recoAnalysisCuts&8;
2002  Int_t isK0starKKpi=recoAnalysisCuts&16;
2003  Int_t isK0starpiKK=recoAnalysisCuts&32;
2004  if(fDsOption==1){
2005  if(isKKpi && isPhiKKpi) keep=kTRUE;
2006  if(ispiKK && isPhipiKK) keep=kTRUE;
2007  }
2008  else if(fDsOption==2){
2009  if(isKKpi && isK0starKKpi) keep=kTRUE;
2010  if(ispiKK && isK0starpiKK) keep=kTRUE;
2011  }
2012  else if(fDsOption==3)keep=kTRUE;
2013  }
2014  return keep;
2015 }
2016 //__________________________________________________________________________________________________
2018 
2019  // processes output of Lc->V0+bnachelor is selected
2020 
2021  Bool_t keep=kFALSE;
2022 
2023  if (recoAnalysisCuts > 0){
2024 
2025  Int_t isK0Sp = recoAnalysisCuts&1;
2026  Int_t isLambdaBarpi = recoAnalysisCuts&2;
2027  Int_t isLambdapi = recoAnalysisCuts&4;
2028 
2029  if(fLctoV0bachelorOption == 1){
2030  if(isK0Sp) keep=kTRUE;
2031  }
2032  else if(fLctoV0bachelorOption == 2){
2033  if(isLambdaBarpi) keep=kTRUE;
2034  }
2035  else if(fLctoV0bachelorOption == 4){
2036  if(isLambdapi) keep=kTRUE;
2037  }
2038  else if(fLctoV0bachelorOption == 7) {
2039  if (isK0Sp || isLambdaBarpi || isLambdapi) keep=kTRUE;
2040  }
2041  }
2042  return keep;
2043 }
2044 
2045 //____________________________________________________________________________
2046 TProfile* AliCFTaskVertexingHF::GetEstimatorHistogram(const AliVEvent* event){
2047  // Get Estimator Histogram from period event->GetRunNumber();
2048  //
2049  // If you select SPD tracklets in |eta|<1 you should use type == 1
2050  //
2051 
2052  Int_t runNo = event->GetRunNumber();
2053  Int_t period = -1; // pp: 0-LHC10b, 1-LHC10c, 2-LHC10d, 3-LHC10e
2054  // pPb: 0-LHC13b, 1-LHC13c
2055 
2056  if (fIsPPbData) { // setting run numbers for LHC13 if pPb
2057  if (runNo>195343 && runNo<195484) period = 0;
2058  if (runNo>195528 && runNo<195678) period = 1;
2059  if (period<0 || period>1) return 0;
2060  } else { //else assume pp 2010
2061  if(runNo>114930 && runNo<117223) period = 0;
2062  if(runNo>119158 && runNo<120830) period = 1;
2063  if(runNo>122373 && runNo<126438) period = 2;
2064  if(runNo>127711 && runNo<130841) period = 3;
2065  if(period<0 || period>3) return 0;
2066  }
2067 
2068  return fMultEstimatorAvg[period];
2069 }
void SetCentralityValue(Float_t centValue)
virtual AliESDtrackCuts * GetTrackCutsV0daughters() const
Definition: AliRDHFCuts.h:254
void SetFillFromGenerated(Bool_t flag)
Double_t GetPtWeightFromHistogram(Float_t pt)
Bool_t fUseAdditionalCuts
flag for pPb data (used for multiplicity corrections)
Bool_t fUseZWeight
flag to decide to use a flat pt shape
AliCFTaskVertexingHF & operator=(const AliCFTaskVertexingHF &c)
Bool_t fFillFromGenerated
decay channel to configure the task
Double_t GetWeight(Float_t pt)
double Double_t
Definition: External.C:58
virtual AliESDtrackCuts * GetTrackCutsSoftPi() const
Definition: AliRDHFCuts.h:253
Int_t fCountAcc
MC particle found in limited acceptance that doesn't satisfy acceptance cuts.
void SetUseMCVertex()
Definition: AliRDHFCuts.h:353
Int_t fCountRefit
Reco particle found that satisfy vertex constrained.
Int_t MCcquarkCounting(AliAODMCParticle *mcPart) const
slow configuration, all variables
Class for HF corrections as a function of many variables and steps For D* and other cascades...
Int_t IsEventSelectedInCentrality(AliVEvent *event)
Int_t fCountReco
Reco particle found that satisfy kTPCrefit and kITSrefit.
Bool_t HasSelectionBit(Int_t i) const
UInt_t fPDGcode
flag to use selection bit
Class for HF corrections as a function of many variables and step.
Bool_t FillRecoContainer(Double_t *containerInput)
Int_t fCountGenLimAcc
MC particle found.
Bool_t fIsPPbData
flag for pp data (not checking centrality)
TH1F * fHistoPtWeight
user-defined function to be used to calculate weights
Bool_t fUseSelectionBit
Lc->V0+bachelor decay option (generation level)
char Char_t
Definition: External.C:18
AliCFTaskVertexingHF()
multiplicity estimators
Int_t fCountRecoITSClusters
Reco particle found that satisfy cuts in requested acceptance.
Int_t fNvar
flag to use directly the ratio of the distributions (fHistoMCNch) instead of computing it ...
void SetNVar(Int_t nVar)
void SetRejectCandidateIfNotFromQuark(Bool_t opt)
TCanvas * c
Definition: TestFitELoss.C:172
virtual Bool_t SetLabelArray()
Int_t fGenLctoV0bachelorOption
Lc->V0+bachelor decay option (selection level)
Double_t GetZWeight(Float_t z, Int_t runnumber)
void SetPtWeightsFromFONLL276andBAMPSoverLHC12a17b()
Bool_t FillRecoCand(AliVEvent *event, AliAODRecoDecayHF3Prong *rd3)
Int_t fCountGenLimAccNoAcc
MC particle found in limited acceptance.
Double_t dNdptFit(Float_t pt, Double_t *par)
Int_t GetNProngs() const
TString fPartName
number of variables for the container
Double_t GetMaxVtxZ() const
Definition: AliRDHFCuts.h:247
Bool_t FillRecoCasc(AliVEvent *event, AliAODRecoCascadeHF *rc, Bool_t isDStar, Bool_t recoSecVtx=kFALSE)
Double_t fRefMult
TProfile with mult vas. Z per period.
Bool_t ProcessDs(Int_t returnCodeDs) const
Float_t fCutOnMomConservation
flag to define which task to use for Lc –> K0S+p
Bool_t fZvtxCorrectedNtrkEstimator
refrence multiplcity (period b)
TList * fListProfiles
response matrix for unfolding
Class for cuts on AOD reconstructed D+->Kpipi.
Bool_t fAcceptanceUnf
flag to select D0 origins. 0 Only from charm 1 only from beauty 2 both from charm and beauty ...
static Int_t GetNumberOfTrackletsInEtaRange(AliAODEvent *ev, Double_t mineta, Double_t maxeta)
Bool_t fUseTrackletsWeight
flag to decide whether to use Ncharged weights != 1 when filling the container or not ...
int Int_t
Definition: External.C:63
Int_t fCountVertex
MC particle found that satisfy acceptance cuts.
Definition: External.C:204
void SetMinCentrality(Float_t minCentrality=0.)
Definition: AliRDHFCuts.h:51
Int_t GetIsFilled() const
float Float_t
Definition: External.C:68
Double_t DodzFit(Float_t z, Double_t *par)
Bool_t fUseCascadeTaskForLctoV0bachelor
these are the pre-selection cuts for the TMVA
Double_t GetNchWeight(Int_t nch)
UShort_t fOriginDselection
flag to indicate whether data container should be filled with generated values also for reconstructed...
Bool_t fUseFlatPtWeight
weight used to fill the container
Definition: External.C:212
AliAODVertex * GetOwnPrimaryVtx() const
Char_t fSign
daughter in fin state
AliESDtrackCuts * GetTrackCuts() const
Definition: AliRDHFCuts.h:252
Float_t GetCentrality(AliAODEvent *aodEvent)
Definition: AliRDHFCuts.h:248
AliRDHFCuts * fCuts
flag for unfolding before or after cuts.
Int_t fFakeSelection
flag to switch off the centrality selection
void SetFakeSelection(Int_t fakeSel)
TF1 * fFuncWeight
configuration (slow / fast) of the CF –> different variables will be allocated (all / reduced number)...
UInt_t fResonantDecay
histogram with Nch distribution from MC production
Bool_t fCentralitySelection
flag to decide wheter to keep D0 only (0), D0bar only (1), or both D0 and D0bar (2) ...
Int_t fCountRecoAcc
Reco particle found that satisfy cuts.
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)
Int_t fGenDsOption
Ds decay option (selection level)
void SetMaxCentrality(Float_t maxCentrality=100.)
Definition: AliRDHFCuts.h:52
Int_t colors[nPtBins]
void SetOwnPrimaryVtx(const AliAODVertex *vtx)
void SetRecoPrimVertex(Double_t zPrimVertex)
Bool_t fIsPPData
flag to use the z-vtx corrected (if not use uncorrected) multiplicity estimator
void SetMCCandidateParam(Int_t label)
Bool_t CheckMCPartFamily(AliAODMCParticle *, TClonesArray *) const
virtual Bool_t SetRecoCandidateParam(AliAODRecoDecayHF *)
static Double_t GetCorrectedNtracklets(TProfile *estimatorAvg, Double_t uncorrectedNacc, Double_t vtxZ, Double_t refMult)
Int_t fConfiguration
Ds decay option (generation level)
void SetPtWeightsFromFONLL5andDplusdataoverLHC16i2a()
Int_t CheckReflexion(Char_t isSign)
Bool_t IsEventSelected(AliVEvent *event)
Int_t fLctoV0bachelorOption
resonant deacy channel to be used if the CF should be run on resonant channels only ...
Bool_t fRejectIfNoQuark
selection flag for fakes tracks
void SetUsePID(Bool_t flag=kTRUE)
Definition: AliRDHFCuts.h:206
TH1I * fHistEventsProcessed
pointer to the CF manager
virtual void PrintAll() const
TString fDauNames
D meson name.
Bool_t RecoAcceptStep(AliESDtrackCuts **trackCuts) const
Int_t fCountRecoPID
Reco particle found that satisfy cuts in PPR.
Bool_t fUseMultRatioAsWeight
flag to decide whether to use Ncharged weights != 1 when filling the container or not ...
static Int_t GetGeneratedPhysicalPrimariesInEtaRange(TClonesArray *arrayMC, Double_t mineta, Double_t maxeta)
Bool_t IsSelected(TObject *obj)
Definition: AliRDHFCuts.h:281
Int_t fEvents
Reco PID step.
Bool_t MCRefitStep(AliAODEvent *aodEvent, AliESDtrackCuts **trackCuts) const
Bool_t fUseCutsForTMVA
flag to use additional cuts needed for Lc –> K0S + p, TMVA
Int_t fDecayChannel
n. of events
Bool_t GetIsUsePID() const
Definition: AliRDHFCuts.h:260
const char Option_t
Definition: External.C:48
void UserExec(Option_t *option)
Int_t fCountRecoPPR
Reco particle found that satisfy cuts in n. of ITS clusters.
Bool_t fUseMCVertex
flag to remove events not geenrated with PYTHIA
bool Bool_t
Definition: External.C:53
void SetTriggerClass(TString trclass0, TString trclass1="")
Definition: AliRDHFCuts.h:194
Int_t fDsOption
flag to use MC vertex (useful when runnign in pp)
Bool_t fUseNchWeight
flag to decide whether to use z-vtx weights != 1 when filling the container or not ...
Class to compute variables for correction framework // for 3-body decays of D mesons (D+...
virtual Bool_t IsInFiducialAcceptance(Double_t, Double_t) const
Definition: AliRDHFCuts.h:301
TProfile * GetEstimatorHistogram(const AliVEvent *event)
void SetConfiguration(Int_t configuration)
void SetMultiplicity(Double_t multiplicity)
void SetMCPrimaryVertex(Double_t zMCVertex)
Int_t fMultiplicityEstimator
PDG code.
void UserCreateOutputObjects()
ANALYSIS FRAMEWORK STUFF to loop on data and fill output objects.
TH1F * fHistoMCNch
histogram with measured Nch distribution (pp 7 TeV)
TProfile * fMultEstimatorAvg[4]
Definition of the multiplicity estimator: kNtrk10=0, kNtrk10to16=1, kVZERO=2.
Double_t fWeight
flag to decide whether to use pt-weights != 1 when filling the container or not
TH1F * fHistoMeasNch
user-defined histogram to calculate the Pt weights
Bool_t ProcessLctoV0Bachelor(Int_t returnCodeDs) const
Class for HF corrections as a function of many variables and step.
TList * OpenFile(const char *fname)
Definition: DrawAnaELoss.C:65