]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGHF/vertexingHF/macros/makeTFile4CutsLctopKpi.C
Updates to run with deltas (L. Cunqueiro)
[u/mrichter/AliRoot.git] / PWGHF / vertexingHF / macros / makeTFile4CutsLctopKpi.C
1 #include <Riostream.h>
2 #include <TFile.h>
3 #include <AliRDHFCutsLctopKpi.h>
4 #include <AliAODPidHF.h>
5 #include <TClonesArray.h>
6 #include <TParameter.h>
7 #include <TF1.h>
8
9
10 //Use:
11 //Set hard coded commentet with //set this!!
12 // root[] .L makeInput...C++
13 // root[] makeInputAliAnalysisTaskSE...()
14 //similar macros for the other D mesons
15
16 //Author: Rosa Romita, r.romita@gsi.de
17
18
19 //macro to make a .root file which contains an AliRDHFCutsLctopKpi for AliAnalysisTaskSELambdac task
20
21 void SetupCombinedPID(AliRDHFCutsLctopKpi *cutsObj,Double_t threshold,TString priorFileName="noferini-priors.root") {
22   AliPIDCombined *pid=cutsObj->GetPidHF()->GetPidCombined();
23   pid->SetSelectedSpecies(AliPID::kSPECIES);
24   pid->SetDetectorMask(AliPIDResponse::kDetITS
25                        |AliPIDResponse::kDetTPC
26                        |AliPIDResponse::kDetTOF);
27   TH1F *priors[5]; // 5 to make PROOF happy
28   for (Int_t ispecies=0;ispecies<AliPID::kSPECIES;++ispecies) {
29     TString nt ="name";
30     nt+="_prior_";
31     nt+=AliPID::ParticleName(ispecies);
32     priors[ispecies]=new TH1F(nt,nt,100,0,10);
33   }
34   TFile *priorFile=TFile::Open(priorFileName);
35   if (priorFile) {
36     priors[AliPID::kProton]->Add(static_cast<TH1*>(priorFile->Get("priors3step9")));
37     priors[AliPID::kKaon  ]->Add(static_cast<TH1*>(priorFile->Get("priors2step9")));
38     priors[AliPID::kPion  ]->Add(static_cast<TH1*>(priorFile->Get("priors1step9")));
39     delete priorFile;
40     TF1 *salt=new TF1("salt","1.e-10",0,10);
41     priors[AliPID::kProton]->Add(salt);
42     priors[AliPID::kKaon  ]->Add(salt);
43     priors[AliPID::kPion  ]->Add(salt);
44     delete salt;
45   }
46   else {
47     TF1 *flat=new TF1("flat","1",0,10);
48     priors[AliPID::kProton]->Add(flat,1.0); // ... who likes 
49     priors[AliPID::kKaon  ]->Add(flat,1.0); //  these priors
50     priors[AliPID::kPion  ]->Add(flat,1.0); //   anyways?? - Rossella
51     //    priors[AliPID::kProton]->Add(flat,0.162); // from 900 GeV identified particle 
52     //    priors[AliPID::kKaon  ]->Add(flat,0.366); // paper (pp)
53     //    priors[AliPID::kPion  ]->Add(flat,2.977); // dN/dy
54     delete flat;
55   }
56   for (Int_t ispecies=0;ispecies<AliPID::kSPECIES;++ispecies) {
57     pid->SetPriorDistribution(static_cast<AliPID::EParticleType>(ispecies),priors[ispecies]);
58   }
59
60   for (Int_t ispecies=0;ispecies<AliPID::kSPECIES;++ispecies)
61     cutsObj->SetPIDThreshold(static_cast<AliPID::EParticleType>(ispecies),threshold);
62 }
63
64
65
66 void makeInputAliAnalysisTaskSELctopKpi(){
67
68   AliRDHFCutsLctopKpi* RDHFLctopKpiProd=new AliRDHFCutsLctopKpi();
69   RDHFLctopKpiProd->SetName("LctopKpiProdCuts");
70   RDHFLctopKpiProd->SetTitle("Production cuts for Lc analysis");
71
72   AliRDHFCutsLctopKpi* RDHFLctopKpiAn=new AliRDHFCutsLctopKpi();
73   RDHFLctopKpiAn->SetName("LctopKpiAnalysisCuts");
74   RDHFLctopKpiAn->SetTitle("Analysis cuts for Lc analysis");
75
76   AliESDtrackCuts* esdTrackCuts=new AliESDtrackCuts();
77   esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
78   //default
79   esdTrackCuts->SetRequireTPCRefit(kTRUE);
80   esdTrackCuts->SetRequireITSRefit(kTRUE);
81   esdTrackCuts->SetMinNClustersITS(4); // default is 5
82   esdTrackCuts->SetMinNClustersTPC(70);
83   esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
84                                          AliESDtrackCuts::kAny); 
85  // default is kBoth, otherwise kAny
86   esdTrackCuts->SetMinDCAToVertexXY(0.);
87   esdTrackCuts->SetPtRange(0.3,1.e10);
88
89
90   RDHFLctopKpiProd->AddTrackCuts(esdTrackCuts);
91   RDHFLctopKpiAn->AddTrackCuts(esdTrackCuts);
92
93   const Int_t nvars=13;
94
95   const Int_t nptbins=4;
96   Float_t* ptbins;
97   ptbins=new Float_t[nptbins+1];
98   ptbins[0]=0.;
99   ptbins[1]=2.;
100   ptbins[2]=3.;
101   ptbins[3]=4.;
102   ptbins[4]=12.;
103   
104
105   Float_t** prodcutsval;
106   prodcutsval=new Float_t*[nvars];
107   for(Int_t iv=0;iv<nvars;iv++){
108     prodcutsval[iv]=new Float_t[nptbins];
109   }
110
111   //  inv. mass [GeV]
112   // pTK [GeV/c]
113   // pTPi [GeV/c]
114   // d0K [cm]   lower limit!
115   // d0Pi [cm]  lower limit!
116   // dist12 (cm)
117   // sigmavert (cm)
118   // dist prim-sec (cm)
119   // pM=Max{pT1,pT2,pT3} (GeV/c)
120   // cosThetaPoint
121   // Sum d0^2 (cm^2)
122   // dca cut (cm)
123   for(Int_t ipt=0;ipt<nptbins;ipt++){
124     prodcutsval[0][ipt]=0.18;
125     prodcutsval[1][ipt]=0.4;
126     prodcutsval[2][ipt]=0.5;
127     prodcutsval[3][ipt]=0.;
128     prodcutsval[4][ipt]=0.;
129     prodcutsval[5][ipt]=0.01;
130     prodcutsval[6][ipt]=0.06;
131     prodcutsval[7][ipt]=0.005;
132     prodcutsval[8][ipt]=0.7;
133     prodcutsval[9][ipt]=0.;
134     prodcutsval[10][ipt]=0.;
135     prodcutsval[11][ipt]=0.05;
136     prodcutsval[12][ipt]=0.4;
137   }
138
139   RDHFLctopKpiProd->SetPtBins(nptbins+1,ptbins);
140   RDHFLctopKpiProd->SetCuts(nvars,nptbins,prodcutsval);
141
142   Float_t** anacutsval;
143   anacutsval=new Float_t*[nvars];
144   for(Int_t ic=0;ic<nvars;ic++){anacutsval[ic]=new Float_t[nptbins];}
145   for(Int_t ipt2=0;ipt2<nptbins;ipt2++){
146    anacutsval[0][ipt2]=0.18;
147    anacutsval[1][ipt2]=0.4;
148    anacutsval[2][ipt2]=0.5;
149    anacutsval[3][ipt2]=0.;
150    anacutsval[4][ipt2]=0.;
151    anacutsval[5][ipt2]=0.01;
152    anacutsval[6][ipt2]=0.06;
153    anacutsval[7][ipt2]=0.005;
154    anacutsval[8][ipt2]=0.7;
155    anacutsval[9][ipt2]=0.;
156    anacutsval[10][ipt2]=0.;
157    anacutsval[11][ipt2]=0.05;
158    anacutsval[12][ipt2]=0.4;
159   }
160
161   // pt kaon
162   anacutsval[1][0]=0.5;
163   anacutsval[1][1]=0.85;
164   anacutsval[1][2]=0.9;
165   anacutsval[1][3]=0.4;
166   //pt proton
167   anacutsval[2][0]=0.5;
168   anacutsval[2][1]=0.6;
169   anacutsval[2][2]=0.9;
170   anacutsval[2][3]=0.9;
171
172   //pt pion
173   anacutsval[12][0]=0.475;
174   anacutsval[12][1]=0.75;
175   anacutsval[12][2]=0.75;
176   anacutsval[12][3]=0.7;
177
178   anacutsval[5][0]=0.02;
179   anacutsval[5][1]=0.025;
180   anacutsval[5][2]=0.02;
181   anacutsval[5][3]=0.01;
182
183   anacutsval[7][0]=0.00625;
184   anacutsval[7][1]=0.0125;
185   anacutsval[7][2]=0.005;
186   anacutsval[7][3]=0.007;
187
188   anacutsval[9][0]=0.5;
189   anacutsval[9][1]=0.2;
190   anacutsval[9][2]=0.6;
191   anacutsval[9][3]=0.;
192
193   anacutsval[10][0]=0.00125;
194
195   RDHFLctopKpiAn->SetPtBins(nptbins+1,ptbins);
196   RDHFLctopKpiAn->SetCuts(nvars,nptbins,anacutsval);
197
198  //  RDHFLc->SetRecoKF(); //set this if you want to recompute the secondary vertex with the KF package
199     //pid settings
200     //1. kaon: default one
201   AliAODPidHF* pidObjK=new AliAODPidHF();
202   Double_t sigmasK[5]={3.,1.,1.,3.,2.};
203   pidObjK->SetSigma(sigmasK);
204   pidObjK->SetAsym(kTRUE);
205   pidObjK->SetMatch(1);
206   pidObjK->SetTPC(kTRUE);
207   pidObjK->SetTOF(kTRUE);
208   Double_t plimK[2]={0.5,0.8};
209   pidObjK->SetPLimit(plimK,2);
210   pidObjK->SetTOFdecide(kTRUE);
211   
212   RDHFLctopKpiProd->SetPidHF(pidObjK);
213   RDHFLctopKpiAn->SetPidHF(pidObjK);
214
215     //2. pion 
216   AliAODPidHF* pidObjpi=new AliAODPidHF();
217   pidObjpi->SetTPC(kTRUE);
218   Double_t sigmaspi[5]={3.,0.,0.,0.,0.};
219   pidObjpi->SetSigma(sigmaspi);
220 //  pidObjpi->SetTOFdecide(kTRUE);
221
222   RDHFLctopKpiProd->SetPidpion(pidObjpi);
223   RDHFLctopKpiAn->SetPidpion(pidObjpi);
224
225   // 3. proton
226   AliAODPidHF* pidObjp=new AliAODPidHF();
227   Double_t sigmasp[5]={3.,1.,1.,3.,2.};
228   pidObjp->SetSigma(sigmasp);
229   pidObjp->SetAsym(kTRUE);
230   pidObjp->SetMatch(1);
231   pidObjp->SetTPC(kTRUE);
232   pidObjp->SetTOF(kTRUE);
233   Double_t plimp[2]={1.,2.};
234   pidObjp->SetPLimit(plimp,2);
235   pidObjp->SetTOFdecide(kTRUE);
236
237   RDHFLctopKpiProd->SetPidprot(pidObjp);
238   RDHFLctopKpiAn->SetPidprot(pidObjp);
239
240   // uncomment these lines for Baysian PID:
241   // Double_t threshold=0.3;
242   // SetupCombinedPID(RDHFLctopKpiAn  ,threshold);
243   // SetupCombinedPID(RDHFLctopKpiProd,threshold);
244   // RDHFLctopKpiAn  ->SetPIDStrategy(AliRDHFCutsLctopKpi::kCombined);
245   // RDHFLctopKpiProd->SetPIDStrategy(AliRDHFCutsLctopKpi::kCombined);
246   //
247
248
249   //uncomment these lines to apply cuts with the KF package
250   //RDHFLctopKpiAn  ->SetCutsStrategy(AliRDHFCutsLctopKpi::kKF);
251   //RDHFLctopKpiProd->SetCutsStrategy(AliRDHFCutsLctopKpi::kKF);
252   //for(Int_t ipt2=0;ipt2<nptbins;ipt2++){
253   //   anacutsval[0][ipt2]=1.;  //if <0., no topological constraint
254   //   anacutsval[1][ipt2]=2.;  //cut on the Chi2/Ndf
255   //   prodcutsval[0][ipt2]=1.;  //if <0., no topological constraint
256   //   prodcutsval[1][ipt2]=2.;  //cut on the Chi2/Ndf
257   // }
258
259   Bool_t pidflag=kTRUE;
260   RDHFLctopKpiAn->SetUsePID(pidflag);
261   RDHFLctopKpiProd->SetUsePID(pidflag);
262   if(pidflag) cout<<"PID is used"<<endl;
263   else cout<<"PID is not used"<<endl;
264
265   cout<<"This is the object I'm going to save:"<<endl;
266   RDHFLctopKpiProd->PrintAll();
267   RDHFLctopKpiAn->PrintAll();
268   TFile* fout=new TFile("cuts4LctopKpi.root","RECREATE"); 
269   fout->cd();
270   RDHFLctopKpiProd->Write();
271   RDHFLctopKpiAn->Write();
272   fout->Close();
273   delete fout;
274   delete pidObjp;
275   delete pidObjpi;
276   delete pidObjK;
277   delete RDHFLctopKpiProd;
278   delete RDHFLctopKpiAn;
279
280 }
281
282
283 //macro to make a .root file (for significance maximization) which contains an AliRDHFCutsLctopKpi with loose set of cuts  and TParameter with the tighest value of these cuts
284
285 void makeInputAliAnalysisTaskSESignificanceMaximization(){
286
287   AliRDHFCutsLctopKpi* RDHFLctopKpi=new AliRDHFCutsLctopKpi();
288   RDHFLctopKpi->SetName("loosercuts");
289   RDHFLctopKpi->SetTitle("Cuts for significance maximization");
290
291   AliESDtrackCuts* esdTrackCuts=new AliESDtrackCuts();
292   esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
293   //default
294   esdTrackCuts->SetRequireTPCRefit(kTRUE);
295   esdTrackCuts->SetMinNClustersTPC(70);
296   esdTrackCuts->SetRequireITSRefit(kTRUE);
297   esdTrackCuts->SetMinNClustersITS(4);
298
299   esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kAny);
300   esdTrackCuts->SetMinDCAToVertexXY(0.);
301   esdTrackCuts->SetEtaRange(-0.8,0.8);
302   esdTrackCuts->SetPtRange(0.3,1.e10);
303   
304   RDHFLctopKpi->AddTrackCuts(esdTrackCuts);
305
306   const Int_t nvars=13;
307
308   const Int_t nptbins=4; //change this when adding pt bins!
309   Float_t ptbins[nptbins+1];
310   ptbins[0]=0.;
311   ptbins[1]=2.;
312   ptbins[2]=3.;
313   ptbins[3]=4.;
314   ptbins[4]=12.;
315
316   RDHFLctopKpi->SetPtBins(nptbins+1,ptbins);
317
318   Float_t** rdcutsvalmine;
319   rdcutsvalmine=new Float_t*[nvars];
320   for(Int_t iv=0;iv<nvars;iv++){
321     rdcutsvalmine[iv]=new Float_t[nptbins];
322   }
323
324   //setting my cut values
325   //  inv. mass [GeV]
326   // pTK [GeV/c]
327   // pTP [GeV/c]
328   // d0K [cm]   lower limit!
329   // d0Pi [cm]  lower limit!
330   // dist12 (cm)
331   // sigmavert (cm)
332   // dist prim-sec (cm)
333   // pM=Max{pT1,pT2,pT3} (GeV/c)
334   // cosThetaPoint
335   // Sum d0^2 (cm^2)
336   // dca cut (cm)
337   // pt pion
338   Float_t cutsMatrixLctopKpiStand[nptbins][nvars]=
339   {{0.18,0.4,0.5,0.,0.,0.01,0.06,0.005,0.7,0.,0.,0.05,0.4},
340    {0.18,0.4,0.5,0.,0.,0.01,0.06,0.005,0.7,0.,0.,0.05,0.4},
341    {0.18,0.4,0.5,0.,0.,0.01,0.06,0.005,0.7,0.,0.,0.05,0.4},
342    {0.18,0.4,0.5,0.,0.,0.01,0.06,0.005,0.7,0.,0.,0.05,0.4}};
343
344   //CREATE TRANSPOSE MATRIX...REVERSE INDICES as required by AliRDHFCuts
345   Float_t **cutsMatrixTransposeStand=new Float_t*[nvars];
346   for(Int_t iv=0;iv<nvars;iv++)cutsMatrixTransposeStand[iv]=new Float_t[nptbins];
347   for (Int_t ibin=0;ibin<nptbins;ibin++){
348     for (Int_t ivar = 0; ivar<nvars; ivar++){
349       cutsMatrixTransposeStand[ivar][ibin]=cutsMatrixLctopKpiStand[ibin][ivar];
350     }
351   }
352   RDHFLctopKpi->SetCuts(nvars,nptbins,cutsMatrixTransposeStand);
353
354
355   Int_t nvarsforopt=RDHFLctopKpi->GetNVarsForOpt();
356   Int_t dim=4; //set this!!
357   Bool_t *boolforopt;
358   boolforopt=new Bool_t[nvars];
359   if(dim>nvarsforopt){
360     cout<<"Number of variables for optimization has probably changed, check and edit accordingly"<<endl;
361     return;
362   } else {
363     if(dim==nvarsforopt){
364       boolforopt=RDHFLctopKpi->GetVarsForOpt();
365     }else{
366       TString *names;
367       names=new TString[nvars];
368       TString answer="";
369       Int_t checktrue=0;
370       names=RDHFLctopKpi->GetVarNames();
371       for(Int_t i=0;i<nvars;i++){
372         cout<<names[i]<<" for opt? (y/n)"<<endl;
373         cin>>answer;
374         if(answer=="y") {
375           boolforopt[i]=kTRUE;
376           checktrue++;
377         }
378         else boolforopt[i]=kFALSE;
379       }
380       if (checktrue!=dim) {
381         cout<<"Error! You set "<<checktrue<<" kTRUE instead of "<<dim<<endl;
382         return;
383       }
384       RDHFLctopKpi->SetVarsForOpt(dim,boolforopt);
385     }
386   }
387
388
389   Float_t tighterval[dim][nptbins];
390   // 5 dist12 (cm)        <---
391   // 7 dist prim-sec (cm) <---
392   // 9 cosThetaPoint      <---
393   // 10 Sum d0^2 (cm^2)   <---
394   // 11 dca cut (cm)      
395   // {0.18,0.4,0.5,0.,0.,0.01 <--- ,0.06,0.005 <--- ,0.7,0. <--- ,0. <--- ,0.05 }
396
397   //number of steps for each variable is set in the AddTask arguments (default=8)
398   //set this!!
399   for(Int_t ipt=0;ipt<nptbins;ipt++){
400     tighterval[0][ipt]=0.03;
401     tighterval[1][ipt]=0.02;
402     tighterval[2][ipt]=1.;
403     tighterval[3][ipt]=0.01;
404   }
405
406
407
408   TString name=""; 
409   Int_t arrdim=dim*nptbins;
410   cout<<"Will save "<<arrdim<<" TParameter<float>"<<endl;
411   TClonesArray max("TParameter<float>",arrdim);
412   for(Int_t ival=0;ival<dim;ival++){
413     for(Int_t jpt=0;jpt<nptbins;jpt++){
414       name=Form("par%dptbin%d",ival,jpt);
415       cout<<"Setting "<<name.Data()<<" to "<<tighterval[ival][jpt]<<endl;
416       new(max[jpt*dim+ival])TParameter<float>(name.Data(),tighterval[ival][jpt]);
417     }
418   }
419
420   Bool_t flagPID=kFALSE;
421   RDHFLctopKpi->SetUsePID(flagPID);
422
423   RDHFLctopKpi->PrintAll();
424   printf("Use PID? %s\n",flagPID ? "yes" : "no");
425
426     //pid settings
427     //1. kaon: default one
428   AliAODPidHF* pidObjK=new AliAODPidHF();
429   Double_t sigmasK[5]={3.,1.,1.,3.,2.};
430   pidObjK->SetSigma(sigmasK);
431   pidObjK->SetAsym(kTRUE);
432   pidObjK->SetMatch(1);
433   pidObjK->SetTPC(kTRUE);
434   pidObjK->SetTOF(kTRUE);
435   pidObjK->SetITS(kTRUE);
436   Double_t plimK[2]={0.5,0.8};
437   pidObjK->SetPLimit(plimK,2);
438   pidObjK->SetTOFdecide(kTRUE);
439   
440   RDHFLctopKpi->SetPidHF(pidObjK);
441
442     //2. pion 
443   AliAODPidHF* pidObjpi=new AliAODPidHF();
444   pidObjpi->SetTPC(kTRUE);
445   Double_t sigmaspi[5]={3.,0.,0.,0.,0.};
446   pidObjpi->SetSigma(sigmaspi);
447   pidObjpi->SetTOFdecide(kTRUE);
448
449   RDHFLctopKpi->SetPidpion(pidObjpi);
450
451   // 3. proton
452   AliAODPidHF* pidObjp=new AliAODPidHF();
453   Double_t sigmasp[5]={3.,1.,1.,3.,2.};
454   pidObjp->SetSigma(sigmasp);
455   pidObjp->SetAsym(kTRUE);
456   pidObjp->SetMatch(1);
457   pidObjp->SetTPC(kTRUE);
458   pidObjp->SetTOF(kTRUE);
459   pidObjp->SetITS(kTRUE);
460   Double_t plimp[2]={1.,2.};
461   pidObjp->SetPLimit(plimp,2);
462   pidObjp->SetTOFdecide(kTRUE);
463
464   RDHFLctopKpi->SetPidprot(pidObjp);
465
466   //activate pileup rejection (for pp)
467   //RDHFLctopKpi->SetOptPileup(AliRDHFCuts::kRejectPileupEvent);
468
469   //Do not recalculate the vertex
470   RDHFLctopKpi->SetRemoveDaughtersFromPrim(kFALSE); //activate for pp
471
472   TString cent="";
473   //centrality selection (Pb-Pb)
474   Float_t minc=20,maxc=80;
475   RDHFLctopKpi->SetMinCentrality(minc);
476   RDHFLctopKpi->SetMaxCentrality(maxc);
477   cent=Form("%.0f%.0f",minc,maxc);
478   //  RDHFLctopKpi->SetUseCentrality(AliRDHFCuts::kCentV0M); //kCentOff,kCentV0M,kCentTRK,kCentTKL,kCentCL1,kCentInvalid
479   RDHFLctopKpi->SetUseCentrality(AliRDHFCuts::kCentOff); //kCentOff,kCentV0M,kCentTRK,kCentTKL,kCentCL1,kCentInvalid
480
481   //temporary
482   //  RDHFLctopKpi->SetFixRefs();
483
484   TFile* fout=new TFile(Form("cuts4SignifMaxim%s%s%sRecVtx%sPileupRej.root", RDHFLctopKpi->GetUseCentrality()==0 ? "pp" : "PbPb",cent.Data(),RDHFLctopKpi->GetIsPrimaryWithoutDaughters() ? "" : "No",RDHFLctopKpi->GetOptPileUp() ? "" : "No"),"recreate");   //set this!! 
485
486   fout->cd();
487   RDHFLctopKpi->Write();
488   max.Write();
489   fout->Close();
490  
491 }
492