]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG3/vertexingHF/macros/AddTaskCFVertexingHFCascade.C
Update (Chiara Z)
[u/mrichter/AliRoot.git] / PWG3 / vertexingHF / macros / AddTaskCFVertexingHFCascade.C
CommitLineData
367e9aa3 1//DEFINITION OF A FEW CONSTANTS
2const Double_t ymin = -2.1 ;
3const Double_t ymax = 2.1 ;
4const Double_t cosmin = -1.05;
5const Double_t cosmax = 1.05;
6const Double_t cTmin = 0; // micron
7const Double_t cTmax = 500; // micron
8const Double_t dcamin = 0; // micron
9const Double_t dcamax = 500; // micron
10const Double_t d0min = -1000; // micron
11const Double_t d0max = 1000; // micron
12const Double_t d0xd0min = -100000; // micron
13const Double_t d0xd0max = 100000; // micron
14const Double_t phimin = 0.0;
15const Int_t mintrackrefsTPC = 2 ;
16const Int_t mintrackrefsITS = 3 ;
17const Int_t charge = 1 ;
18const Int_t minclustersTPC = 50 ;
19// cuts
20const Double_t ptmin = 0.1;
21const Double_t ptmax = 9999.;
22const Double_t etamin = -0.9;
23const Double_t etamax = 0.9;
24const Double_t zmin = -15;
25const Double_t zmax = 15;
26const Int_t minITSClusters = 1;
27
28//----------------------------------------------------
29
30AliCFTaskVertexingHF *AddTaskCFVertexingHFCascade(const char* cutFile = "./DStartoKpipiCuts.root",Bool_t isKeepDfromB=kFALSE, Bool_t isKeepDfromBOnly=kFALSE, Int_t pdgCode = 413, Char_t isSign = 2)
31{
32 printf("Addig CF task using cuts from file %s\n",cutFile);
33
34 // isSign = 0 --> D0 only
35 // isSign = 1 --> D0bar only
36 // isSign = 2 --> D0 + D0bar
37
38 TString expected;
39 if (isSign == 0 && pdgCode < 0){
40 AliError(Form("Error setting PDG code (%d) and sign (0 --> D0 only): they are not compatible, returning"));
41 return 0x0;
42 }
43 else if (isSign == 1 && pdgCode > 0){
44 AliError(Form("Error setting PDG code (%d) and sign (1 --> D0bar only): they are not compatible, returning"));
45 return 0x0;
46 }
47 else if (isSign > 2 || isSign < 0){
48 AliError(Form("Sign not valid (%d, possible values are 0, 1, 2), returning"));
49 return 0x0;
50 }
51
52 TFile* fileCuts = new TFile(cutFile);
53 AliRDHFCutsDStartoKpipi *cutsD0toKpi = (AliRDHFCutsDStartoKpipi*)fileCuts->Get("DStartoKpipiCuts");
54
55 // check that the fKeepD0fromB flag is set to true when the fKeepD0fromBOnly flag is true
56 // for now the binning is the same than for all D's
57 if(isKeepDfromBOnly) isKeepDfromB = true;
58
59 Double_t ptmin_0_6;
60 Double_t ptmax_0_6;
61 Double_t ptmin_6_8;
62 Double_t ptmax_6_8;
63 Double_t ptmin_8_16;
64 Double_t ptmax_8_16;
65 Double_t ptmin_16_24;
66 Double_t ptmax_16_24;
67
68 ptmin_0_6 = 0.0 ;
69 ptmax_0_6 = 6.0 ;
70 ptmin_6_8 = 6.0 ;
71 ptmax_6_8 = 8.0 ;
72 ptmin_8_16 = 8.0 ;
73 ptmax_8_16 = 16.0 ;
74 ptmin_16_24 = 16.0 ;
75 ptmax_16_24 = 24.0 ;
76
77 //CONTAINER DEFINITION
78 Info("AliCFTaskVertexingHF","SETUP CONTAINER");
79 //the sensitive variables, their indices
80 UInt_t ipt = 0;
81 UInt_t iy = 1;
82 UInt_t icosThetaStar = 2;
83 UInt_t ipTpi = 3;
84 UInt_t ipTk = 4;
85 UInt_t icT = 5;
86 UInt_t idca = 6;
87 UInt_t id0pi = 7;
88 UInt_t id0K = 8;
89 UInt_t id0xd0 = 9;
90 UInt_t ipointing = 10;
91 UInt_t iphi = 11;
92 UInt_t iz = 12;
93
94 const Double_t phimax = 2*TMath::Pi();
95
96 //Setting up the container grid...
97 UInt_t nstep = 10;
98 const Int_t nvar = 13;
99
100 //arrays for the number of bins in each dimension
101 Int_t iBin[nvar];
102
103 //OPTION 1: defining the pt, ptPi, ptK bins by hand...
104 const Int_t nbin0_0_6 = 6 ; //bins in pt from 0 to 6 GeV
105 const Int_t nbin0_6_8 = 1 ; //bins in pt from 6 to 8 GeV
106 const Int_t nbin0_8_16 = 2 ; //bins in pt from 8 to 16 GeV
107 const Int_t nbin0_16_24 = 1 ; //bins in pt from 16 to 24 GeV
108 const Int_t nbin3_0_6 = 6 ; //bins in ptPi from 0 to 6 GeV
109 const Int_t nbin3_6_8 = 1 ; //bins in ptPi from 6 to 8 GeV
110 const Int_t nbin3_8_16 = 2 ; //bins in ptPi from 8 to 16 GeV
111 const Int_t nbin3_16_24 = 1 ; //bins in ptPi from 16 to 24 GeV
112 const Int_t nbin4_0_6 = 6 ; //bins in ptK from 0 to 6 GeV
113 const Int_t nbin4_6_8 = 1 ; //bins in ptK from 6 to 8 GeV
114 const Int_t nbin4_8_16 = 2 ; //bins in ptK from 8 to 16 GeV
115 const Int_t nbin4_16_24 = 1 ; //bins in ptK from 16 to 24 GeV
116 iBin[0]=nbin0_0_6+nbin0_6_8+nbin0_8_16+nbin0_16_24;
117 iBin[3]=nbin3_0_6+nbin3_6_8+nbin3_8_16+nbin3_16_24;
118 iBin[4]=nbin4_0_6+nbin4_6_8+nbin4_8_16+nbin4_16_24;
119 Double_t *binLim0=new Double_t[iBin[0]+1];
120 Double_t *binLim3=new Double_t[iBin[3]+1];
121 Double_t *binLim4=new Double_t[iBin[4]+1];
122
123 // values for bin lower bounds
124 // pt
125 for(Int_t i=0; i<=nbin0_0_6; i++) binLim0[i]=(Double_t)ptmin_0_6 + (ptmax_0_6-ptmin_0_6)/nbin0_0_6*(Double_t)i ;
126 if (binLim0[nbin0_0_6] != ptmin_6_8) {
127 Error("AliCFHeavyFlavourTaskMultiVarMultiStep","Calculated bin lim for pt - 1st range - differs from expected!\n");
128 }
129 for(Int_t i=0; i<=nbin0_6_8; i++) binLim0[i+nbin0_0_6]=(Double_t)ptmin_6_8 + (ptmax_6_8-ptmin_6_8)/nbin0_6_8*(Double_t)i ;
130 if (binLim0[nbin0_0_6+nbin0_6_8] != ptmin_8_16) {
131 Error("AliCFHeavyFlavourTaskMultiVarMultiStep","Calculated bin lim for pt - 2nd range - differs from expected!\n");
132 }
133 for(Int_t i=0; i<=nbin0_8_16; i++) binLim0[i+nbin0_0_6+nbin0_6_8]=(Double_t)ptmin_8_16 + (ptmax_8_16-ptmin_8_16)/nbin0_8_16*(Double_t)i ;
134 if (binLim0[nbin0_0_6+nbin0_6_8+nbin0_8_16] != ptmin_16_24) {
135 Error("AliCFHeavyFlavourTaskMultiVarMultiStep","Calculated bin lim for pt - 2nd range - differs from expected!\n");
136 }
137 for(Int_t i=0; i<=nbin0_16_24; i++) binLim0[i+nbin0_0_6+nbin0_6_8+nbin0_8_16]=(Double_t)ptmin_16_24 + (ptmax_16_24-ptmin_16_24)/nbin0_16_24*(Double_t)i ;
138
139 // ptPi
140 for(Int_t i=0; i<=nbin3_0_6; i++) binLim3[i]=(Double_t)ptmin_0_6 + (ptmax_0_6-ptmin_0_6)/nbin3_0_6*(Double_t)i ;
141 if (binLim3[nbin3_0_6] != ptmin_6_8) {
142 Error("AliCFHeavyFlavourTaskMultiVarMultiStep","Calculated bin lim for pt - 1st range - differs from expected!\n");
143 }
144 for(Int_t i=0; i<=nbin3_6_8; i++) binLim3[i+nbin3_0_6]=(Double_t)ptmin_6_8 + (ptmax_6_8-ptmin_6_8)/nbin3_6_8*(Double_t)i ;
145 if (binLim3[nbin3_0_6+nbin3_6_8] != ptmin_8_16) {
146 Error("AliCFHeavyFlavourTaskMultiVarMultiStep","Calculated bin lim for pt - 2nd range - differs from expected!\n");
147 }
148 for(Int_t i=0; i<=nbin3_8_16; i++) binLim3[i+nbin3_0_6+nbin0_6_8]=(Double_t)ptmin_8_16 + (ptmax_8_16-ptmin_8_16)/nbin3_8_16*(Double_t)i ;
149 if (binLim3[nbin3_0_6+nbin3_6_8+nbin3_8_16] != ptmin_16_24) {
150 Error("AliCFHeavyFlavourTaskMultiVarMultiStep","Calculated bin lim for pt - 2nd range - differs from expected!\n");
151 }
152 for(Int_t i=0; i<=nbin3_16_24; i++) binLim3[i+nbin3_0_6+nbin3_6_8+nbin3_8_16]=(Double_t)ptmin_16_24 + (ptmax_16_24-ptmin_16_24)/nbin3_16_24*(Double_t)i ;
153
154 // ptKa
155 for(Int_t i=0; i<=nbin4_0_6; i++) binLim4[i]=(Double_t)ptmin_0_6 + (ptmax_0_6-ptmin_0_6)/nbin4_0_6*(Double_t)i ;
156 if (binLim4[nbin4_0_6] != ptmin_6_8) {
157 Error("AliCFHeavyFlavourTaskMultiVarMultiStep","Calculated bin lim for pt - 1st range - differs from expected!\n");
158 }
159 for(Int_t i=0; i<=nbin4_6_8; i++) binLim4[i+nbin4_0_6]=(Double_t)ptmin_6_8 + (ptmax_6_8-ptmin_6_8)/nbin4_6_8*(Double_t)i ;
160 if (binLim4[nbin4_0_6+nbin4_6_8] != ptmin_8_16) {
161 Error("AliCFHeavyFlavourTaskMultiVarMultiStep","Calculated bin lim for pt - 2nd range - differs from expected!\n");
162 }
163 for(Int_t i=0; i<=nbin4_8_16; i++) binLim4[i+nbin4_0_6+nbin0_6_8]=(Double_t)ptmin_8_16 + (ptmax_8_16-ptmin_8_16)/nbin4_8_16*(Double_t)i ;
164 if (binLim4[nbin4_0_6+nbin4_6_8+nbin4_8_16] != ptmin_16_24) {
165 Error("AliCFHeavyFlavourTaskMultiVarMultiStep","Calculated bin lim for pt - 2nd range - differs from expected!\n");
166 }
167 for(Int_t i=0; i<=nbin4_16_24; i++) binLim4[i+nbin4_0_6+nbin4_6_8+nbin4_8_16]=(Double_t)ptmin_16_24 + (ptmax_16_24-ptmin_16_24)/nbin4_16_24*(Double_t)i ;
168
169 //OPTION 2: ...or from the cuts file
170
171 //const Int_t nbin0 = cutsD0toKpi->GetNPtBins(); // bins in pT
172 //iBin[0]=nbin0;
173 //iBin[3]=nbin0;
174 //iBin[4]=nbin0;
175 // values for bin lower bounds
176 //Float_t* floatbinLim0 = cutsD0toKpi->GetPtBinLimits();
177 //for (Int_t ibin0 = 0 ; ibin0<iBin[0]+1; ibin0++){
178 // binLim0[ibin0] = (Double_t)floatbinLim0[ibin0];
179 // binLim3[ibin0] = (Double_t)floatbinLim0[ibin0];
180 // binLim4[ibin0] = (Double_t)floatbinLim0[ibin0];
181 //}
182 //for(Int_t i=0; i<=nbin0; i++) printf("binLim0[%d]=%f\n",i,binLim0[i]);
183
184 //printf("pT: nbin (from cuts file) = %d\n",nbin0);
185
186 // defining now the binning for the other variables:
187
188 const Int_t nbin1 = 42 ; //bins in y
189 const Int_t nbin2 = 42 ; //bins in cosThetaStar
190 const Int_t nbin5 = 24 ; //bins in cT
191 const Int_t nbin6 = 24 ; //bins in dca
192 const Int_t nbin7 = 100 ; //bins in d0pi
193 const Int_t nbin8 = 100 ; //bins in d0K
194 const Int_t nbin9 = 80 ; //bins in d0xd0
195 const Int_t nbin10 = 1050 ; //bins in cosPointingAngle
196 const Int_t nbin11 = 20 ; //bins in Phi
197 const Int_t nbin12 = 60 ; //bins in z vertex
198
199 iBin[1]=nbin1;
200 iBin[2]=nbin2;
201 iBin[5]=nbin5;
202 iBin[6]=nbin6;
203 iBin[7]=nbin7;
204 iBin[8]=nbin8;
205 iBin[9]=nbin9;
206 iBin[10]=nbin10;
207 iBin[11]=nbin11;
208 iBin[12]=nbin12;
209
210 //arrays for lower bounds :
211 Double_t *binLim1=new Double_t[iBin[1]+1];
212 Double_t *binLim2=new Double_t[iBin[2]+1];
213 Double_t *binLim5=new Double_t[iBin[5]+1];
214 Double_t *binLim6=new Double_t[iBin[6]+1];
215 Double_t *binLim7=new Double_t[iBin[7]+1];
216 Double_t *binLim8=new Double_t[iBin[8]+1];
217 Double_t *binLim9=new Double_t[iBin[9]+1];
218 Double_t *binLim10=new Double_t[iBin[10]+1];
219 Double_t *binLim11=new Double_t[iBin[11]+1];
220 Double_t *binLim12=new Double_t[iBin[12]+1];
221
222 // y
223 for(Int_t i=0; i<=nbin1; i++) binLim1[i]=(Double_t)ymin + (ymax-ymin) /nbin1*(Double_t)i ;
224
225 // cosThetaStar
226 for(Int_t i=0; i<=nbin2; i++) binLim2[i]=(Double_t)cosmin + (cosmax-cosmin) /nbin2*(Double_t)i ;
227
228 // cT
229 for(Int_t i=0; i<=nbin5; i++) binLim5[i]=(Double_t)cTmin + (cTmax-cTmin) /nbin5*(Double_t)i ;
230
231 // dca
232 for(Int_t i=0; i<=nbin6; i++) binLim6[i]=(Double_t)dcamin + (dcamax-dcamin) /nbin6*(Double_t)i ;
233
234 // d0pi
235 for(Int_t i=0; i<=nbin7; i++) binLim7[i]=(Double_t)d0min + (d0max-d0min) /nbin7*(Double_t)i ;
236
237 // d0K
238 for(Int_t i=0; i<=nbin8; i++) binLim8[i]=(Double_t)d0min + (d0max-d0min) /nbin8*(Double_t)i ;
239
240 // d0xd0
241 for(Int_t i=0; i<=nbin9; i++) binLim9[i]=(Double_t)d0xd0min + (d0xd0max-d0xd0min) /nbin9*(Double_t)i ;
242
243 // cosPointingAngle
244 for(Int_t i=0; i<=nbin10; i++) binLim10[i]=(Double_t)cosmin + (cosmax-cosmin) /nbin10*(Double_t)i ;
245
246 // Phi
247 for(Int_t i=0; i<=nbin11; i++) binLim11[i]=(Double_t)phimin + (phimax-phimin) /nbin11*(Double_t)i ;
248
249 // z Primary Vertex
250 for(Int_t i=0; i<=nbin12; i++) {
251 binLim12[i]=(Double_t)zmin + (zmax-zmin) /nbin12*(Double_t)i ;
252 }
253
254 //one "container" for MC
255 TString nameContainer="";
256 if(!isKeepDfromB) {
257 nameContainer="CFHFccontainer0_CommonFramework";
258 }
259 else if(isKeepDfromBOnly){
260 nameContainer="CFHFccontainer0DfromB_CommonFramework";
261 }
262 else {
263 nameContainer="CFHFccontainer0allD_CommonFramework";
264 }
265
266 AliCFContainer* container = new AliCFContainer(nameContainer,"container for tracks",nstep,nvar,iBin);
267 //setting the bin limits
268 printf("pt\n");
269 container -> SetBinLimits(ipt,binLim0);
270 printf("y\n");
271 container -> SetBinLimits(iy,binLim1);
272 printf("cts\n");
273 container -> SetBinLimits(icosThetaStar,binLim2);
274 printf("ptPi\n");
275 container -> SetBinLimits(ipTpi,binLim3);
276 printf("ptK\n");
277 container -> SetBinLimits(ipTk,binLim4);
278 printf("cT\n");
279 container -> SetBinLimits(icT,binLim5);
280 printf("dca\n");
281 container -> SetBinLimits(idca,binLim6);
282 printf("d0Pi\n");
283 container -> SetBinLimits(id0pi,binLim7);
284 printf("d0K\n");
285 container -> SetBinLimits(id0K,binLim8);
286 printf("d0xd0\n");
287 container -> SetBinLimits(id0xd0,binLim9);
288 printf("pointing\n");
289 container -> SetBinLimits(ipointing,binLim10);
290 printf("phi\n");
291 container -> SetBinLimits(iphi,binLim11);
292 printf("z\n");
293 container -> SetBinLimits(iz,binLim12);
294
295 container -> SetStepTitle(0, "MCLimAcc");
296 container -> SetStepTitle(1, "MC");
297 container -> SetStepTitle(2, "MCAcc");
298 container -> SetStepTitle(3, "RecoVertex");
299 container -> SetStepTitle(4, "RecoRefit");
300 container -> SetStepTitle(5, "Reco");
301 container -> SetStepTitle(6, "RecoAcc");
302 container -> SetStepTitle(7, "RecoITSCluster");
303 container -> SetStepTitle(8, "RecoCuts");
304 container -> SetStepTitle(8, "RecoPID");
305
306 container -> SetVarTitle(ipt,"pt");
307 container -> SetVarTitle(iy,"y");
308 container -> SetVarTitle(icosThetaStar, "cosThetaStar");
309 container -> SetVarTitle(ipTpi, "ptpi");
310 container -> SetVarTitle(ipTk, "ptK");
311 container -> SetVarTitle(icT, "ct");
312 container -> SetVarTitle(idca, "dca");
313 container -> SetVarTitle(id0pi, "d0pi");
314 container -> SetVarTitle(id0K, "d0K");
315 container -> SetVarTitle(id0xd0, "d0xd0");
316 container -> SetVarTitle(ipointing, "piointing");
317 container -> SetVarTitle(iphi, "phi");
318 container -> SetVarTitle(iz, "z");
319
320
321 //CREATE THE CUTS -----------------------------------------------
322
323 // Gen-Level kinematic cuts
324 AliCFTrackKineCuts *mcKineCuts = new AliCFTrackKineCuts("mcKineCuts","MC-level kinematic cuts");
325
326 //Particle-Level cuts:
327 AliCFParticleGenCuts* mcGenCuts = new AliCFParticleGenCuts("mcGenCuts","MC particle generation cuts");
328 Bool_t useAbsolute = kTRUE;
329 if (isSign != 2){
330 useAbsolute = kFALSE;
331 }
332 mcGenCuts->SetRequirePdgCode(pdgCode, useAbsolute); // kTRUE set in order to include D0_bar
333 mcGenCuts->SetAODMC(1); //special flag for reading MC in AOD tree (important)
334
335 // Acceptance cuts:
336 AliCFAcceptanceCuts* accCuts = new AliCFAcceptanceCuts("accCuts", "Acceptance cuts");
337 AliCFTrackKineCuts *kineAccCuts = new AliCFTrackKineCuts("kineAccCuts","Kine-Acceptance cuts");
338 kineAccCuts->SetPtRange(ptmin,ptmax);
339 kineAccCuts->SetEtaRange(etamin,etamax);
340
341 // Rec-Level kinematic cuts
342 AliCFTrackKineCuts *recKineCuts = new AliCFTrackKineCuts("recKineCuts","rec-level kine cuts");
343
344 AliCFTrackQualityCuts *recQualityCuts = new AliCFTrackQualityCuts("recQualityCuts","rec-level quality cuts");
345
346 AliCFTrackIsPrimaryCuts *recIsPrimaryCuts = new AliCFTrackIsPrimaryCuts("recIsPrimaryCuts","rec-level isPrimary cuts");
347
348 printf("CREATE MC KINE CUTS\n");
349 TObjArray* mcList = new TObjArray(0) ;
350 mcList->AddLast(mcKineCuts);
351 mcList->AddLast(mcGenCuts);
352
353 printf("CREATE ACCEPTANCE CUTS\n");
354 TObjArray* accList = new TObjArray(0) ;
355 accList->AddLast(kineAccCuts);
356
357 printf("CREATE RECONSTRUCTION CUTS\n");
358 TObjArray* recList = new TObjArray(0) ; // not used!!
359 recList->AddLast(recKineCuts);
360 recList->AddLast(recQualityCuts);
361 recList->AddLast(recIsPrimaryCuts);
362
363 TObjArray* emptyList = new TObjArray(0);
364
365 //CREATE THE INTERFACE TO CORRECTION FRAMEWORK USED IN THE TASK
366 printf("CREATE INTERFACE AND CUTS\n");
367 AliCFManager* man = new AliCFManager() ;
368 man->SetParticleContainer(container);
369 man->SetParticleCutsList(0 , mcList); // MC, Limited Acceptance
370 man->SetParticleCutsList(1 , mcList); // MC
371 man->SetParticleCutsList(2 , accList); // Acceptance
372 man->SetParticleCutsList(3 , emptyList); // Vertex
373 man->SetParticleCutsList(4 , emptyList); // Refit
374 man->SetParticleCutsList(5 , emptyList); // AOD
375 man->SetParticleCutsList(6 , emptyList); // AOD in Acceptance
376 man->SetParticleCutsList(7 , emptyList); // AOD with required n. of ITS clusters
377 man->SetParticleCutsList(8 , emptyList); // AOD Reco (PPR cuts implemented in Task)
378 man->SetParticleCutsList(9 , emptyList); // AOD Reco PID
379
380 // Get the pointer to the existing analysis manager via the static access method.
381 //==============================================================================
382 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
383 if (!mgr) {
384 ::Error("AddTaskCompareHF", "No analysis manager to connect to.");
385 return NULL;
386 }
387 //CREATE THE TASK
388 printf("CREATE TASK\n");
389
390 // create the task
391 AliCFTaskVertexingHF *task = new AliCFTaskVertexingHF("AliCFTaskVertexingHF",cutsD0toKpi);
392 task->SetFillFromGenerated(kFALSE);
393 task->SetCFManager(man); //here is set the CF manager
394 task->SetDecayChannel(21);
395 task->SetUseWeight(kFALSE);
396 task->SetSign(isSign);
397 task->SetDebugLevel(10);
398 if (isKeepDfromB && !isKeepDfromBOnly) task->SetDselection(2);
399 if (isKeepDfromB && isKeepDfromBOnly) task->SetDselection(1);
400
401 Printf("***************** CONTAINER SETTINGS *****************");
402 Printf("decay channel = %d",(Int_t)task->GetDecayChannel());
403 Printf("FillFromGenerated = %d",(Int_t)task->GetFillFromGenerated());
404 Printf("Dselection = %d",(Int_t)task->GetDselection());
405 Printf("UseWeight = %d",(Int_t)task->GetUseWeight());
406 Printf("Sign = %d",(Int_t)task->GetSign());
407 Printf("***************END CONTAINER SETTINGS *****************\n");
408
409 //-----------------------------------------------------------//
410 // create correlation matrix for unfolding - only eta-pt //
411 //-----------------------------------------------------------//
412
413 Bool_t AcceptanceUnf = kTRUE; // unfold at acceptance level, otherwise PPR
414
415 Int_t thnDim[4];
416
417 //first half : reconstructed
418 //second half : MC
419
420 thnDim[0] = iBin[0];
421 thnDim[2] = iBin[0];
422 thnDim[1] = iBin[1];
423 thnDim[3] = iBin[1];
424
425 TString nameCorr="";
426 if(!isKeepDfromB) {
427 nameCorr="CFHFcorr0_CommonFramework";
428 }
429 else if(isKeepDfromBOnly){
430 nameCorr= "CFHFcorr0KeepDfromBOnly_CommonFramework";
431 }
432 else {
433 nameCorr="CFHFcorr0allD_CommonFramework";
434
435 }
436
437 THnSparseD* correlation = new THnSparseD(nameCorr,"THnSparse with correlations",4,thnDim);
438 Double_t** binEdges = new Double_t[2];
439
440 // set bin limits
441
442 binEdges[0]= binLim0;
443 binEdges[1]= binLim1;
444
445 correlation->SetBinEdges(0,binEdges[0]);
446 correlation->SetBinEdges(2,binEdges[0]);
447
448 correlation->SetBinEdges(1,binEdges[1]);
449 correlation->SetBinEdges(3,binEdges[1]);
450
451 correlation->Sumw2();
452
453 // correlation matrix ready
454 //------------------------------------------------//
455
456 task->SetCorrelationMatrix(correlation); // correlation matrix for unfolding
457
458 // Create and connect containers for input/output
459
460 // ------ input data ------
461 AliAnalysisDataContainer *cinput0 = mgr->GetCommonInputContainer();
462
463 // ----- output data -----
464
465 TString outputfile = AliAnalysisManager::GetCommonFileName();
466 TString output1name="", output2name="", output3name="",output4name="";
467 output2name=nameContainer;
468 output3name=nameCorr;
469 if(!isKeepDfromB) {
470 outputfile += ":PWG3_D2H_CFtaskD0toKpi_CommonFramework";
471 output1name="CFHFchist0_CommonFramework";
472 }
473 else if(isKeepDfromBOnly){
474 outputfile += ":PWG3_D2H_CFtaskD0toKpiKeepDfromBOnly_CommonFramework";
475 output1name="CFHFchist0DfromB_CommonFramework";
476 }
477 else{
478 outputfile += ":PWG3_D2H_CFtaskD0toKpiKeepDfromB_CommonFramework";
479 output1name="CFHFchist0allD_CommonFramework";
480 }
481 output4name= "Cuts_CommonFramework";
482
483 //now comes user's output objects :
484 // output TH1I for event counting
485 AliAnalysisDataContainer *coutput1 = mgr->CreateContainer(output1name, TH1I::Class(),AliAnalysisManager::kOutputContainer,outputfile.Data());
486 // output Correction Framework Container (for acceptance & efficiency calculations)
487 AliAnalysisDataContainer *coutput2 = mgr->CreateContainer(output2name, AliCFContainer::Class(),AliAnalysisManager::kOutputContainer,outputfile.Data());
488 // Unfolding - correlation matrix
489 AliAnalysisDataContainer *coutput3 = mgr->CreateContainer(output3name, THnSparseD::Class(),AliAnalysisManager::kOutputContainer,outputfile.Data());
490 // cuts
491 AliAnalysisDataContainer *coutput4 = mgr->CreateContainer(output4name, AliRDHFCuts::Class(),AliAnalysisManager::kOutputContainer, outputfile.Data());
492
493 mgr->AddTask(task);
494
495 mgr->ConnectInput(task,0,mgr->GetCommonInputContainer());
496 mgr->ConnectOutput(task,1,coutput1);
497 mgr->ConnectOutput(task,2,coutput2);
498 mgr->ConnectOutput(task,3,coutput3);
499 mgr->ConnectOutput(task,4,coutput4);
500 return task;
501}
502