3 #include <AliRDHFCutsLctopKpi.h>
4 #include <AliAODPidHF.h>
5 #include <TClonesArray.h>
6 #include <TParameter.h>
11 //Set hard coded commentet with //set this!!
12 // root[] .L makeInput...C++
13 // root[] makeInputAliAnalysisTaskSE...()
14 //similar macros for the other D mesons
16 //Author: Rosa Romita, r.romita@gsi.de
19 //macro to make a .root file which contains an AliRDHFCutsLctopKpi for AliAnalysisTaskSELambdac task
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) {
31 nt+=AliPID::ParticleName(ispecies);
32 priors[ispecies]=new TH1F(nt,nt,100,0,10);
34 TFile *priorFile=TFile::Open(priorFileName);
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")));
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);
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
56 for (Int_t ispecies=0;ispecies<AliPID::kSPECIES;++ispecies) {
57 pid->SetPriorDistribution(static_cast<AliPID::EParticleType>(ispecies),priors[ispecies]);
60 for (Int_t ispecies=0;ispecies<AliPID::kSPECIES;++ispecies)
61 cutsObj->SetPIDThreshold(static_cast<AliPID::EParticleType>(ispecies),threshold);
66 void makeInputAliAnalysisTaskSELctopKpi(){
68 AliRDHFCutsLctopKpi* RDHFLctopKpiProd=new AliRDHFCutsLctopKpi();
69 RDHFLctopKpiProd->SetName("LctopKpiProdCuts");
70 RDHFLctopKpiProd->SetTitle("Production cuts for Lc analysis");
72 AliRDHFCutsLctopKpi* RDHFLctopKpiAn=new AliRDHFCutsLctopKpi();
73 RDHFLctopKpiAn->SetName("LctopKpiAnalysisCuts");
74 RDHFLctopKpiAn->SetTitle("Analysis cuts for Lc analysis");
76 AliESDtrackCuts* esdTrackCuts=new AliESDtrackCuts();
77 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
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);
90 RDHFLctopKpiProd->AddTrackCuts(esdTrackCuts);
91 RDHFLctopKpiAn->AddTrackCuts(esdTrackCuts);
95 const Int_t nptbins=4;
97 ptbins=new Float_t[nptbins+1];
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];
114 // d0K [cm] lower limit!
115 // d0Pi [cm] lower limit!
118 // dist prim-sec (cm)
119 // pM=Max{pT1,pT2,pT3} (GeV/c)
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;
139 RDHFLctopKpiProd->SetPtBins(nptbins+1,ptbins);
140 RDHFLctopKpiProd->SetCuts(nvars,nptbins,prodcutsval);
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;
162 anacutsval[1][0]=0.5;
163 anacutsval[1][1]=0.85;
164 anacutsval[1][2]=0.9;
165 anacutsval[1][3]=0.4;
167 anacutsval[2][0]=0.5;
168 anacutsval[2][1]=0.6;
169 anacutsval[2][2]=0.9;
170 anacutsval[2][3]=0.9;
173 anacutsval[12][0]=0.475;
174 anacutsval[12][1]=0.75;
175 anacutsval[12][2]=0.75;
176 anacutsval[12][3]=0.7;
178 anacutsval[5][0]=0.02;
179 anacutsval[5][1]=0.025;
180 anacutsval[5][2]=0.02;
181 anacutsval[5][3]=0.01;
183 anacutsval[7][0]=0.00625;
184 anacutsval[7][1]=0.0125;
185 anacutsval[7][2]=0.005;
186 anacutsval[7][3]=0.007;
188 anacutsval[9][0]=0.5;
189 anacutsval[9][1]=0.2;
190 anacutsval[9][2]=0.6;
193 anacutsval[10][0]=0.00125;
195 RDHFLctopKpiAn->SetPtBins(nptbins+1,ptbins);
196 RDHFLctopKpiAn->SetCuts(nvars,nptbins,anacutsval);
198 // RDHFLc->SetRecoKF(); //set this if you want to recompute the secondary vertex with the KF package
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);
212 RDHFLctopKpiProd->SetPidHF(pidObjK);
213 RDHFLctopKpiAn->SetPidHF(pidObjK);
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);
222 RDHFLctopKpiProd->SetPidpion(pidObjpi);
223 RDHFLctopKpiAn->SetPidpion(pidObjpi);
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);
237 RDHFLctopKpiProd->SetPidprot(pidObjp);
238 RDHFLctopKpiAn->SetPidprot(pidObjp);
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);
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
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;
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");
270 RDHFLctopKpiProd->Write();
271 RDHFLctopKpiAn->Write();
277 delete RDHFLctopKpiProd;
278 delete RDHFLctopKpiAn;
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
285 void makeInputAliAnalysisTaskSESignificanceMaximization(){
287 AliRDHFCutsLctopKpi* RDHFLctopKpi=new AliRDHFCutsLctopKpi();
288 RDHFLctopKpi->SetName("loosercuts");
289 RDHFLctopKpi->SetTitle("Cuts for significance maximization");
291 AliESDtrackCuts* esdTrackCuts=new AliESDtrackCuts();
292 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
294 esdTrackCuts->SetRequireTPCRefit(kTRUE);
295 esdTrackCuts->SetMinNClustersTPC(70);
296 esdTrackCuts->SetRequireITSRefit(kTRUE);
297 esdTrackCuts->SetMinNClustersITS(4);
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);
304 RDHFLctopKpi->AddTrackCuts(esdTrackCuts);
306 const Int_t nvars=13;
308 const Int_t nptbins=4; //change this when adding pt bins!
309 Float_t ptbins[nptbins+1];
316 RDHFLctopKpi->SetPtBins(nptbins+1,ptbins);
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];
324 //setting my cut values
328 // d0K [cm] lower limit!
329 // d0Pi [cm] lower limit!
332 // dist prim-sec (cm)
333 // pM=Max{pT1,pT2,pT3} (GeV/c)
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}};
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];
352 RDHFLctopKpi->SetCuts(nvars,nptbins,cutsMatrixTransposeStand);
355 Int_t nvarsforopt=RDHFLctopKpi->GetNVarsForOpt();
356 Int_t dim=4; //set this!!
358 boolforopt=new Bool_t[nvars];
360 cout<<"Number of variables for optimization has probably changed, check and edit accordingly"<<endl;
363 if(dim==nvarsforopt){
364 boolforopt=RDHFLctopKpi->GetVarsForOpt();
367 names=new TString[nvars];
370 names=RDHFLctopKpi->GetVarNames();
371 for(Int_t i=0;i<nvars;i++){
372 cout<<names[i]<<" for opt? (y/n)"<<endl;
378 else boolforopt[i]=kFALSE;
380 if (checktrue!=dim) {
381 cout<<"Error! You set "<<checktrue<<" kTRUE instead of "<<dim<<endl;
384 RDHFLctopKpi->SetVarsForOpt(dim,boolforopt);
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) <---
395 // {0.18,0.4,0.5,0.,0.,0.01 <--- ,0.06,0.005 <--- ,0.7,0. <--- ,0. <--- ,0.05 }
397 //number of steps for each variable is set in the AddTask arguments (default=8)
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;
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]);
420 Bool_t flagPID=kFALSE;
421 RDHFLctopKpi->SetUsePID(flagPID);
423 RDHFLctopKpi->PrintAll();
424 printf("Use PID? %s\n",flagPID ? "yes" : "no");
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);
440 RDHFLctopKpi->SetPidHF(pidObjK);
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);
449 RDHFLctopKpi->SetPidpion(pidObjpi);
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);
464 RDHFLctopKpi->SetPidprot(pidObjp);
466 //activate pileup rejection (for pp)
467 //RDHFLctopKpi->SetOptPileup(AliRDHFCuts::kRejectPileupEvent);
469 //Do not recalculate the vertex
470 RDHFLctopKpi->SetRemoveDaughtersFromPrim(kFALSE); //activate for pp
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
482 // RDHFLctopKpi->SetFixRefs();
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!!
487 RDHFLctopKpi->Write();