3 #include <AliRDHFCutsD0toKpi.h>
4 #include <TClonesArray.h>
5 #include <TParameter.h>
9 //Set hard coded commentet with //set this!!
10 // root[] .L makeInputD0tasks.C++
11 // root[] makeInputAliAnalysisTaskSED0Mass()
12 // root[] makeInputAliAnalysisTaskSESignificanceMaximization()
13 //similar macros for the other D mesons
15 //Author: Chiara Bianchin, cbianchi@pd.infn.it
18 //macro to make a .root file which contains an AliRDHFCutsD0toKpi for AliAnalysisTaskSED0Mass task
19 void ModifyFromStandardCuts(Int_t system=1 /*0=pp, 1=PbPb, 2=pp 2.76TeV*/){
20 AliRDHFCutsD0toKpi* RDHFD0toKpi=new AliRDHFCutsD0toKpi();
21 TString info="",cent="";
24 RDHFD0toKpi->SetStandardCutsPP2010();
28 RDHFD0toKpi->SetStandardCutsPbPb2010();
29 //Change centrality if needed
31 Float_t minc=20,maxc=80;
32 RDHFD0toKpi->SetMinCentrality(minc);
33 RDHFD0toKpi->SetMaxCentrality(maxc);
35 RDHFD0toKpi->SetUseCentrality(AliRDHFCuts::kCentOff); //kCentOff,kCentV0M,kCentTRK,kCentTKL,kCentCL1,kCentInvalid
37 cent=Form("%.0f%.0f",RDHFD0toKpi->GetMinCentrality(),RDHFD0toKpi->GetMaxCentrality());
42 RDHFD0toKpi->SetStandardCutsPP2011_276TeV();
46 RDHFD0toKpi->SetName("D0toKpiCuts");
47 RDHFD0toKpi->SetTitle("Cuts for D0 analysis");
50 //here add what you need! Find examples below
54 RDHFD0toKpi->SetTriggerMask(0);
55 RDHFD0toKpi->SetTriggerMask(AliVEvent::kEMC1 | AliVEvent::kEMC7);
56 RDHFD0toKpi->SetTriggerClass("CEMC");
62 RDHFD0toKpi->SetUsePhysicsSelection(kFALSE);
65 cout<<"This is the odject I'm going to save:"<<endl;
67 RDHFD0toKpi->PrintAll();
68 TFile* fout=new TFile(Form("D0toKpiCuts%s%sRecVtx%sPileupRej%s.root", RDHFD0toKpi->GetUseCentrality()==0 ? "" : cent.Data(),RDHFD0toKpi->GetIsPrimaryWithoutDaughters() ? "" : "No",RDHFD0toKpi->GetOptPileUp() ? "" : "No",info.Data()),"recreate"); //set this!!
76 void makeInputAliAnalysisTaskSED0Mass(){
78 AliRDHFCutsD0toKpi* RDHFD0toKpi=new AliRDHFCutsD0toKpi();
79 RDHFD0toKpi->SetName("D0toKpiCuts");
80 RDHFD0toKpi->SetTitle("Cuts for D0 analysis");
82 AliESDtrackCuts* esdTrackCuts=new AliESDtrackCuts();
83 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
85 esdTrackCuts->SetRequireTPCRefit(kTRUE);
86 esdTrackCuts->SetRequireITSRefit(kTRUE);
87 esdTrackCuts->SetEtaRange(-0.8,0.8);
88 //esdTrackCuts->SetMinNClustersITS(4); // default is 5
89 //esdTrackCuts->SetMinNClustersTPC(120);
90 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
91 AliESDtrackCuts::kAny);
92 // default is kBoth, otherwise kAny
93 esdTrackCuts->SetMinDCAToVertexXY(0.);
94 esdTrackCuts->SetPtRange(0.8,1.e10);
97 RDHFD0toKpi->AddTrackCuts(esdTrackCuts);
101 const Int_t nptbins=13;
103 ptbins=new Float_t[nptbins+1];
119 RDHFD0toKpi->SetPtBins(nptbins+1,ptbins);
122 Float_t** rdcutsvalmine;
123 rdcutsvalmine=new Float_t*[nvars];
124 for(Int_t iv=0;iv<nvars;iv++){
125 rdcutsvalmine[iv]=new Float_t[nptbins];
128 //setting my cut values
130 // printf(" |M-MD0| [GeV] < %f\n",fD0toKpiCuts[0]);
131 // printf(" dca [cm] < %f\n",fD0toKpiCuts[1]);
132 // printf(" cosThetaStar < %f\n",fD0toKpiCuts[2]);
133 // printf(" pTK [GeV/c] > %f\n",fD0toKpiCuts[3]);
134 // printf(" pTpi [GeV/c] > %f\n",fD0toKpiCuts[4]);
135 // printf(" |d0K| [cm] < %f\n",fD0toKpiCuts[5]);
136 // printf(" |d0pi| [cm] < %f\n",fD0toKpiCuts[6]);
137 // printf(" d0d0 [cm^2] < %f\n",fD0toKpiCuts[7]);
138 // printf(" cosThetaPoint > %f\n",fD0toKpiCuts[8]);
139 // printf(" |cosThetaPointXY| < %f\n",fD0toKpiCuts[9]);
140 // printf(" NormDecayLenghtXY > %f\n",fD0toKpiCuts[10]);
143 Double_t arrcuts[11]={0.3,0.03,0.8,0.8,0.8,0.1,0.1,-0.0004,0.9,0.998,5.}; //put the last 2 values at 0. for pp
145 //setting my cut values
147 for(Int_t ic=0;ic<nvars;ic++) rdcutsvalmine[ic][0]=arrcuts[ic];
150 for(Int_t ic=0;ic<nvars;ic++) rdcutsvalmine[ic][1]=arrcuts[ic];
153 arrcuts[1]=0.025; arrcuts[7]=-0.0003;
154 for(Int_t ic=0;ic<nvars;ic++) rdcutsvalmine[ic][2]=arrcuts[ic];
159 for(Int_t ic=0;ic<nvars;ic++) rdcutsvalmine[ic][3]=arrcuts[ic];
162 arrcuts[7]=-0.00015; arrcuts[8]=0.85;
163 for(Int_t ic=0;ic<nvars;ic++) rdcutsvalmine[ic][4]=arrcuts[ic];
166 for(Int_t ic=0;ic<nvars;ic++) rdcutsvalmine[ic][5]=arrcuts[ic];
169 arrcuts[7]=-0.0001; arrcuts[8]=0.85;
170 for(Int_t ic=0;ic<nvars;ic++) rdcutsvalmine[ic][6]=arrcuts[ic];
174 for(Int_t ic=0;ic<nvars;ic++) rdcutsvalmine[ic][7]=arrcuts[ic];
178 for(Int_t ic=0;ic<nvars;ic++) rdcutsvalmine[ic][8]=arrcuts[ic];
182 for(Int_t ic=0;ic<nvars;ic++) rdcutsvalmine[ic][9]=arrcuts[ic];
186 for(Int_t ic=0;ic<nvars;ic++) rdcutsvalmine[ic][10]=arrcuts[ic];
189 for(Int_t ic=0;ic<nvars;ic++) rdcutsvalmine[ic][11]=arrcuts[ic];
192 for(Int_t ic=0;ic<nvars;ic++) rdcutsvalmine[ic][12]=arrcuts[ic];
194 RDHFD0toKpi->SetCuts(nvars,nptbins,rdcutsvalmine);
196 Bool_t pidflag=kTRUE;
197 RDHFD0toKpi->SetUsePID(pidflag);
198 if(pidflag) cout<<"PID is used"<<endl;
199 else cout<<"PID is not used"<<endl;
202 AliAODPidHF* pidObj=new AliAODPidHF();
203 //pidObj->SetName("pid4D0");
206 Double_t plims[nlims]={0.6,0.8}; //TPC limits in momentum [GeV/c]
207 Bool_t compat=kTRUE; //effective only for this mode
209 Double_t sigmas[5]={2.,1.,0.,3.,0.}; //to be checked and to be modified with new implementation of setters by Rossella
210 pidObj->SetAsym(asym);// if you want to use the asymmetric bands in TPC
211 pidObj->SetMatch(mode);
212 pidObj->SetPLimit(plims,nlims);
213 pidObj->SetSigma(sigmas);
214 pidObj->SetCompat(compat);
215 pidObj->SetTPC(kTRUE);
216 pidObj->SetTOF(kTRUE);
217 RDHFD0toKpi->SetPidHF(pidObj);
219 RDHFD0toKpi->SetUseDefaultPID(kFALSE); //to use the AliAODPidHF
221 //activate pileup rejection (for pp)
222 //RDHFD0toKpi->SetOptPileup(AliRDHFCuts::kRejectPileupEvent);
224 //Do not recalculate the vertex
225 RDHFD0toKpi->SetRemoveDaughtersFromPrim(kFALSE); //activate for pp
228 //centrality selection (Pb-Pb)
229 Float_t minc=20,maxc=80;
230 RDHFD0toKpi->SetMinCentrality(minc);
231 RDHFD0toKpi->SetMaxCentrality(maxc);
232 cent=Form("%.0f%.0f",minc,maxc);
233 RDHFD0toKpi->SetUseCentrality(AliRDHFCuts::kCentV0M); //kCentOff,kCentV0M,kCentTRK,kCentTKL,kCentCL1,kCentInvalid
236 //RDHFD0toKpi->SetFixRefs();
238 cout<<"This is the odject I'm going to save:"<<endl;
239 RDHFD0toKpi->PrintAll();
240 TFile* fout=new TFile(Form("D0toKpiCuts%s%s%sRecVtx%sPileupRej.root", RDHFD0toKpi->GetUseCentrality()==0 ? "pp" : "PbPb",cent.Data(),RDHFD0toKpi->GetIsPrimaryWithoutDaughters() ? "" : "No",RDHFD0toKpi->GetOptPileUp() ? "" : "No"),"recreate"); //set this!!
243 RDHFD0toKpi->Write();
248 //macro to make a .root file (for significance maximization) which contains an AliRDHFCutsD0toKpi with loose set of cuts and TParameter with the tighest value of these cuts
250 void makeInputAliAnalysisTaskSESignificanceMaximization(){
252 AliRDHFCutsD0toKpi* RDHFD0toKpi=new AliRDHFCutsD0toKpi();
253 RDHFD0toKpi->SetName("loosercuts");
254 RDHFD0toKpi->SetTitle("Cuts for significance maximization");
256 AliESDtrackCuts* esdTrackCuts=new AliESDtrackCuts();
257 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
259 esdTrackCuts->SetRequireTPCRefit(kTRUE);
260 esdTrackCuts->SetRequireITSRefit(kTRUE);
261 //esdTrackCuts->SetMinNClustersITS(4);
262 //esdTrackCuts->SetMinNClustersTPC(120);
264 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kAny);
265 esdTrackCuts->SetMinDCAToVertexXY(0.);
266 esdTrackCuts->SetEtaRange(-0.8,0.8);
267 esdTrackCuts->SetPtRange(0.8,1.e10);
269 RDHFD0toKpi->AddTrackCuts(esdTrackCuts);
271 const Int_t nvars=11;
273 const Int_t nptbins=14; //change this when adding pt bins!
274 Float_t ptbins[nptbins+1];
291 RDHFD0toKpi->SetPtBins(nptbins+1,ptbins);
293 Float_t** rdcutsvalmine;
294 rdcutsvalmine=new Float_t*[nvars];
295 for(Int_t iv=0;iv<nvars;iv++){
296 rdcutsvalmine[iv]=new Float_t[nptbins];
299 //setting my cut values
301 // printf(" |M-MD0| [GeV] < %f\n",fD0toKpiCuts[0]);
302 // printf(" dca [cm] < %f\n",fD0toKpiCuts[1]);
303 // printf(" cosThetaStar < %f\n",fD0toKpiCuts[2]);
304 // printf(" pTK [GeV/c] > %f\n",fD0toKpiCuts[3]);
305 // printf(" pTpi [GeV/c] > %f\n",fD0toKpiCuts[4]);
306 // printf(" |d0K| [cm] < %f\n",fD0toKpiCuts[5]);
307 // printf(" |d0pi| [cm] < %f\n",fD0toKpiCuts[6]);
308 // printf(" d0d0 [cm^2] < %f\n",fD0toKpiCuts[7]);
309 // printf(" cosThetaPoint > %f\n",fD0toKpiCuts[8]);
310 // printf(" |cosThetaPointXY| < %f\n",fD0toKpiCuts[9]);
311 // printf(" NormDecayLenghtXY > %f\n",fD0toKpiCuts[10]);
314 Float_t cutsMatrixD0toKpiStand[nptbins][nvars]={{0.400,400.*1E-4,0.8,0.3,0.3,1000.*1E-4,1000.*1E-4,-40000.*1E-8,0.75,0.,2.},/* pt<0.5*/
315 {0.400,400.*1E-4,0.8,0.3,0.3,1000.*1E-4,1000.*1E-4,-40000.*1E-8,0.75,0.,2.},/* 0.5<pt<1*/
316 {0.400,400.*1E-4,0.8,0.4,0.4,1000.*1E-4,1000.*1E-4,-33000.*1E-8,0.75,0.,2.},/* 1<pt<2 */
317 {0.400,250.*1E-4,0.8,0.7,0.7,1000.*1E-4,1000.*1E-4,-30000.*1E-8,0.85,0.994,2.},/* 2<pt<3 */
318 {0.400,250.*1E-4,0.8,0.7,0.7,1000.*1E-4,1000.*1E-4,-26000.*1E-8,0.85,0.994,2.},/* 3<pt<4 */
319 {0.400,250.*1E-4,0.8,0.7,0.7,1000.*1E-4,1000.*1E-4,-15000.*1E-8,0.85,0.994,2.},/* 4<pt<5 */
320 {0.400,250.*1E-4,0.8,0.7,0.7,1000.*1E-4,1000.*1E-4,-11000.*1E-8,0.82,0.994,2.},/* 5<pt<6 */
321 {0.400,270.*1E-4,0.8,0.7,0.7,1000.*1E-4,1000.*1E-4,-10000.*1E-8,0.78,0.994,2.},/* 6<pt<8 */
322 {0.400,300.*1E-4,0.8,0.7,0.7,1000.*1E-4,1000.*1E-4,-1000.*1E-8,0.7,0.994,2.},/* 8<pt<10 */
323 {0.400,300.*1E-4,0.8,0.7,0.7,1000.*1E-4,1000.*1E-4,-1000.*1E-8,0.7,0.994,2.},/* 10<pt<12 */
324 {0.400,350.*1E-4,1.0,0.7,0.7,1000.*1E-4,1000.*1E-4,-500.*1E-8,0.7,0.994,2.},/* 12<pt<16 */
325 {0.400,400.*1E-4,1.0,0.7,0.7,1000.*1E-4,1000.*1E-4,-500.*1E-8,0.7,0.994,2.},/* 16<pt<20 */
326 {0.400,400.*1E-4,1.0,0.7,0.7,1000.*1E-4,1000.*1E-4,-500.*1E-8,0.7,0.994,2.},/* 20<pt<24 */
327 {0.400,400.*1E-4,1.0,0.7,0.7,1000.*1E-4,1000.*1E-4,-500.*1E-8,0.7,0.994,2.}};/* pt>24 */
329 //CREATE TRANSPOSE MATRIX...REVERSE INDICES as required by AliRDHFCuts
330 Float_t **cutsMatrixTransposeStand=new Float_t*[nvars];
331 for(Int_t iv=0;iv<nvars;iv++)cutsMatrixTransposeStand[iv]=new Float_t[nptbins];
332 for (Int_t ibin=0;ibin<nptbins;ibin++){
333 for (Int_t ivar = 0; ivar<nvars; ivar++){
334 cutsMatrixTransposeStand[ivar][ibin]=cutsMatrixD0toKpiStand[ibin][ivar];
337 RDHFD0toKpi->SetCuts(nvars,nptbins,cutsMatrixTransposeStand);
340 Bool_t stdvaropt=kFALSE;
341 Int_t dim=4; //set this!!
343 boolforopt=new Bool_t[nvars];
345 boolforopt=RDHFD0toKpi->GetVarsForOpt();
348 names=new TString[nvars];
351 names=RDHFD0toKpi->GetVarNames();
352 for(Int_t i=0;i<nvars;i++){
353 cout<<names[i]<<" for opt? (y/n)"<<endl;
359 else boolforopt[i]=kFALSE;
361 if (checktrue!=dim) {
362 cout<<"Error! You set "<<checktrue<<" kTRUE instead of "<<dim<<endl;
365 RDHFD0toKpi->SetVarsForOpt(dim,boolforopt);
369 Float_t tighterval[dim][nptbins];
373 //costhetapoint <-this
374 //cosThetaPointXY <-this
375 //NormDecayLength <-this
377 //number of steps for each variable is set in the AddTask arguments (default=8)
380 tighterval[0][0]=-0.00065;
382 tighterval[2][0]=0.4;
386 tighterval[0][1]=-0.00065;
388 tighterval[2][1]=0.4;
392 tighterval[0][2]=-0.00065;
394 tighterval[2][2]=0.4;
398 tighterval[0][3]=-0.0006;
404 tighterval[0][4]=-0.00046;
410 tighterval[0][5]=-0.00045;
416 tighterval[0][6]=-0.00031;
422 tighterval[0][7]=-0.00021;
423 tighterval[1][7]=0.98;
428 tighterval[0][8]=-0.0001;
429 tighterval[1][8]=0.98;
434 tighterval[0][9]=-0.0001;
435 tighterval[1][9]=0.9;
440 tighterval[0][10]=-0.00005;
441 tighterval[1][10]=0.9;
442 tighterval[2][10]=1.;
443 tighterval[3][10]=6.;
446 tighterval[0][11]=-0.00005;
447 tighterval[1][11]=0.9;
448 tighterval[2][11]=1.;
449 tighterval[3][11]=6.;
452 tighterval[0][12]=-0.00005;
453 tighterval[1][12]=0.9;
454 tighterval[2][12]=1.;
455 tighterval[3][12]=6.;
458 tighterval[0][13]=-0.00005;
459 tighterval[1][13]=0.9;
460 tighterval[2][13]=1.;
461 tighterval[3][13]=6.;
465 Int_t arrdim=dim*nptbins;
466 cout<<"Will save "<<arrdim<<" TParameter<float>"<<endl;
467 TClonesArray max("TParameter<float>",arrdim);
468 for(Int_t ival=0;ival<dim;ival++){
469 for(Int_t jpt=0;jpt<nptbins;jpt++){
470 name=Form("par%dptbin%d",ival,jpt);
471 cout<<"Setting "<<name.Data()<<" to "<<tighterval[ival][jpt]<<endl;
472 new(max[jpt*dim+ival])TParameter<float>(name.Data(),tighterval[ival][jpt]);
476 Bool_t flagPID=kTRUE;
477 RDHFD0toKpi->SetUsePID(flagPID);
479 RDHFD0toKpi->PrintAll();
480 printf("Use PID? %s\n",flagPID ? "yes" : "no");
483 AliAODPidHF* pidObj=new AliAODPidHF();
484 //pidObj->SetName("pid4D0");
487 Double_t plims[nlims]={0.6,0.8}; //TPC limits in momentum [GeV/c]
488 Bool_t compat=kTRUE; //effective only for this mode
490 Double_t sigmas[5]={2.,1.,0.,3.,0.}; //to be checked and to be modified with new implementation of setters by Rossella
491 pidObj->SetAsym(asym);// if you want to use the asymmetric bands in TPC
492 pidObj->SetMatch(mode);
493 pidObj->SetPLimit(plims,nlims);
494 pidObj->SetSigma(sigmas);
495 pidObj->SetCompat(compat);
496 pidObj->SetTPC(kTRUE);
497 pidObj->SetTOF(kTRUE);
498 RDHFD0toKpi->SetPidHF(pidObj);
500 RDHFD0toKpi->SetUseDefaultPID(kFALSE); //to use the AliAODPidHF
502 //activate pileup rejection (for pp)
503 //RDHFD0toKpi->SetOptPileup(AliRDHFCuts::kRejectPileupEvent);
505 //Do not recalculate the vertex
506 RDHFD0toKpi->SetRemoveDaughtersFromPrim(kFALSE); //activate for pp
509 //centrality selection (Pb-Pb)
510 Float_t minc=20,maxc=80;
511 RDHFD0toKpi->SetMinCentrality(minc);
512 RDHFD0toKpi->SetMaxCentrality(maxc);
513 cent=Form("%.0f%.0f",minc,maxc);
514 RDHFD0toKpi->SetUseCentrality(AliRDHFCuts::kCentV0M); //kCentOff,kCentV0M,kCentTRK,kCentTKL,kCentCL1,kCentInvalid
517 RDHFD0toKpi->SetFixRefs();
519 TFile* fout=new TFile(Form("cuts4SignifMaxim%s%s%sRecVtx%sPileupRej.root", RDHFD0toKpi->GetUseCentrality()==0 ? "pp" : "PbPb",cent.Data(),RDHFD0toKpi->GetIsPrimaryWithoutDaughters() ? "" : "No",RDHFD0toKpi->GetOptPileUp() ? "" : "No"),"recreate"); //set this!!
522 RDHFD0toKpi->Write();