]> git.uio.no Git - u/mrichter/AliRoot.git/blame - ANALYSIS/AliCollisionNormalization.cxx
ClasDef version increased.
[u/mrichter/AliRoot.git] / ANALYSIS / AliCollisionNormalization.cxx
CommitLineData
0d300b4f 1//-------------------------------------------------------------------------
2// Implementation of Class AliCollisionNormalization
3//
4// This class is used to store the vertex ditributions in the data
5// and in Monte Carlo, needed to compute the real number of
6// collisions a given sample is corresponding to.
7// The strategy matches what described in CERN-THESIS-2009-033 p 119.
8//
9// Author: Michele Floris, CERN
10//-------------------------------------------------------------------------
11
9b0cb3c3 12#include "AliCollisionNormalization.h"
13#include "AliPhysicsSelection.h"
14#include "AliLog.h"
15#include "TFile.h"
16#include "TCanvas.h"
17#include "AliGenPythiaEventHeader.h"
18#include "AliGenDPMjetEventHeader.h"
19#include "AliGenEventHeader.h"
20#include "AliMCEvent.h"
21
22ClassImp(AliCollisionNormalization)
23
24const char * AliCollisionNormalization::fProcLabel[] = {"SD","DD","ND", "Unknown"};
25
26AliCollisionNormalization::AliCollisionNormalization() :
27 TObject(),
28 fNbinsVz(0),
29 fMinVz(0),
30 fMaxVz(0),
31 fZRange(9.99),
32 fIsMC(0),
33 fReferenceXS(0),
34 fVerbose(0),
0d300b4f 35 fEnergy(900),
9b0cb3c3 36 fHistVzData (0),
37 fHistProcTypes (0),
0d300b4f 38 fHistStatBin0 (0),
39 fHistStat (0)
9b0cb3c3 40{
41
42 // ctor
43
44 fNbinsVz = 30;
45 fMinVz = -15;
46 fMaxVz = +15;
47
48 for(Int_t iproc = 0; iproc < kNProcs; iproc++){
49 fHistVzMCGen[iproc] = 0;
50 fHistVzMCRec[iproc] = 0;
51 fHistVzMCTrg[iproc] = 0;
52 }
53
54
55 BookAllHistos();
56}
57
58AliCollisionNormalization::AliCollisionNormalization(Int_t nbinz, Float_t minz, Float_t maxz):
59 TObject(),
60 fNbinsVz(0),
61 fMinVz(0),
62 fMaxVz(0),
63 fZRange(9.99),
64 fIsMC(0),
65 fReferenceXS(0),
66 fVerbose(0),
0d300b4f 67 fEnergy(900),
9b0cb3c3 68 fHistVzData (0),
69 fHistProcTypes (0),
0d300b4f 70 fHistStatBin0 (0),
71 fHistStat (0)
72
9b0cb3c3 73{
74
75 // ctor, allows setting binning
76 fNbinsVz = nbinz;
77 fMinVz = minz;
78 fMaxVz = maxz;
79
80 for(Int_t iproc = 0; iproc < kNProcs; iproc++){
81 fHistVzMCGen[iproc] = 0;
82 fHistVzMCRec[iproc] = 0;
83 fHistVzMCTrg[iproc] = 0;
84 }
85
86 BookAllHistos();
87}
88
89AliCollisionNormalization::AliCollisionNormalization(const char * dataFile, const char * dataListName,
90 const char * mcFile, const char * mcListName,
91 const char * eventStatFile) :
92 TObject(),
93 fNbinsVz(0),
94 fMinVz(0),
95 fMaxVz(0),
96 fZRange(9.99),
97 fIsMC(0),
98 fReferenceXS(0),
99 fVerbose(0),
0d300b4f 100 fEnergy(900),
9b0cb3c3 101 fHistVzData (0),
102 fHistProcTypes (0),
0d300b4f 103 fHistStatBin0 (0),
104 fHistStat (0)
105
9b0cb3c3 106{
107
108 // ctor, loads histograms from file
109 for(Int_t iproc = 0; iproc < kNProcs; iproc++){
110 fHistVzMCGen[iproc] = 0;
111 fHistVzMCRec[iproc] = 0;
112 fHistVzMCTrg[iproc] = 0;
113 }
114
115
116 TFile * fdata = new TFile (dataFile);
117 TFile * fmc = new TFile (mcFile );
0d300b4f 118 TFile * fstat = new TFile(eventStatFile);
119
120 if (!fdata->IsOpen() || !fmc->IsOpen() || !fstat->IsOpen()) {
121 AliFatal("Cannot open input file(s)");
122 }
9b0cb3c3 123
124 TList * ldata = (TList*) fdata->Get(dataListName);
125 TList * lmc = (TList*) fmc ->Get(mcListName );
126
127 AliCollisionNormalization * cndata = (AliCollisionNormalization*) ldata->FindObject("AliCollisionNormalization");
128 AliCollisionNormalization * cnmc = (AliCollisionNormalization*) lmc ->FindObject("AliCollisionNormalization");
129
130
131 // Assign or book all histos
132 for(Int_t iproc = 0; iproc < kNProcs; iproc++){
133 fHistVzMCGen[iproc]= cnmc->GetVzMCGen(iproc);
134 fHistVzMCRec[iproc]= cnmc->GetVzMCRec(iproc);
135 fHistVzMCTrg[iproc]= cnmc->GetVzMCTrg(iproc);
136 }
137 fHistVzData = cndata->GetVzData();
138 fHistProcTypes = cnmc->GetHistProcTypes();
139
9b0cb3c3 140 fHistStatBin0 = (TH1F*) fstat->Get("fHistStatistics_Bin0");
0d300b4f 141 fHistStat = (TH1F*) fstat->Get("fHistStatistics");
9b0cb3c3 142
143}
144
145
146AliCollisionNormalization::~AliCollisionNormalization(){
147
148 // dtor
149 for(Int_t iproc = 0; iproc < kNProcs; iproc++){
150 if(fHistVzMCGen[iproc]) { delete fHistVzMCGen[iproc] ; fHistVzMCGen[iproc] =0;}
151 if(fHistVzMCRec[iproc]) { delete fHistVzMCRec[iproc] ; fHistVzMCRec[iproc] =0;}
152 if(fHistVzMCTrg[iproc]) { delete fHistVzMCTrg[iproc] ; fHistVzMCTrg[iproc] =0;}
153 }
154
155 if(fHistVzData ) { delete fHistVzData ; fHistVzData =0;}
156 if(fHistStatBin0 ) { delete fHistStatBin0 ; fHistStatBin0 =0;}
0d300b4f 157 if(fHistStat ) { delete fHistStat ; fHistStat =0;}
9b0cb3c3 158 if(fHistProcTypes ) { delete fHistProcTypes ; fHistProcTypes =0;}
159
160}
161
162void AliCollisionNormalization::BookAllHistos(){
163 // books all histos
164 // Book histos of vz distributions vs multiplicity
165 // if vzOnly == kTRUE, it returns a 1d histo with vz dist only
166
167 // Do not attach histos to the current directory
168 Bool_t oldStatus = TH1::AddDirectoryStatus();
169 TH1::AddDirectory(kFALSE);
170
171 for(Int_t iproc = 0; iproc < kNProcs; iproc++){
172 fHistVzMCGen [iproc] = (TH2F*) BookVzHisto(TString("fHistVzMCGen")+ fProcLabel[iproc] ,"Vz distribution of generated events vs rec multiplicity ");
173 fHistVzMCRec [iproc] = (TH2F*) BookVzHisto(TString("fHistVzMCRec")+ fProcLabel[iproc] ,"Vz distribution of reconstructed events vs rec multiplicity");
174 fHistVzMCTrg [iproc] = (TH2F*) BookVzHisto(TString("fHistVzMCTrg")+ fProcLabel[iproc] ,"Vz distribution of triggered events vs rec multiplicity ");
175 }
176 fHistVzData = (TH2F*) BookVzHisto("fHistVzData" ,"Vz distribution of triggered events vs rec multiplicity ");
177 fHistProcTypes = new TH1F ("fHistProcTypes", "Number of events in the different process classes", kNProcs, -0.5 , kNProcs-0.5);
178
179 fHistProcTypes->GetXaxis()->SetBinLabel(kProcSD+1,"SD");
180 fHistProcTypes->GetXaxis()->SetBinLabel(kProcND+1,"ND");
181 fHistProcTypes->GetXaxis()->SetBinLabel(kProcDD+1,"DD");
182 fHistProcTypes->GetXaxis()->SetBinLabel(kProcUnknown+1,"Unknown");
183
184 TH1::AddDirectory(oldStatus);
185
186}
187
188TH1 * AliCollisionNormalization::BookVzHisto(const char * name , const char * title, Bool_t vzOnly) {
189
190 // Book histos of vz distributions vs multiplicity
191 // if vzOnly == kTRUE, it returns a 1d histo with vz dist only
192
193
194 // Do not attach histos to the current directory
195 Bool_t oldStatus = TH1::AddDirectoryStatus();
196 TH1::AddDirectory(kFALSE);
197
198 TH1 * h;
199 Double_t binLimitsVtx[] = {-30,-25,-20,-15,-10,-7,-5.5,-4,-3,-2,-1,0,1,2,3,4,5.5,7,10,15,20,25,30};
200 if (vzOnly) {
201 h = new TH1F(name,title,22,binLimitsVtx);
202 } else {
203 h = new TH2F(name,title,22,binLimitsVtx,100,Double_t(-0.5),Double_t(99.5));
204 }
205
206 h->SetXTitle("V_{z} (cm)");
207 h->SetYTitle("n_{trk}");
208 h->Sumw2();
209
210 TH1::AddDirectory(oldStatus);
211
212 return h;
213
214}
215
216TH2F * AliCollisionNormalization::GetVzMCGen (Int_t procType) {
217
218 // returns MC gen histo. If proc type < 0 sums over all proc types, reweighting the XS
219
220 if(procType>=0) return fHistVzMCGen[procType] ;
221
222 TH2F * sum = (TH2F*) fHistVzMCGen[kProcSD]->Clone();
223 sum->Reset();
224
225 for(Int_t iproc = 0; iproc < kProcUnknown; iproc++){
226 sum->Add(fHistVzMCGen[iproc],GetProcessWeight(iproc));
227 }
228
229 return sum;
230}
231TH2F * AliCollisionNormalization::GetVzMCRec (Int_t procType) {
232
233 // returns MC rec histo. If proc type < 0 sums over all proc types, reweighting the XS
234
235 if(procType>=0) return fHistVzMCRec[procType] ;
236
237 TH2F * sum = (TH2F*) fHistVzMCRec[kProcSD]->Clone();
238 sum->Reset();
239
240 for(Int_t iproc = 0; iproc < kProcUnknown; iproc++){
241 sum->Add(fHistVzMCRec[iproc],GetProcessWeight(iproc));
242 }
243
244 return sum;
245
246}
247
248
249TH2F * AliCollisionNormalization::GetVzMCTrg (Int_t procType) {
250
251 // returns MC trg histo. If proc type < 0 sums over all proc types, reweighting the XS
252
253 if(procType>=0) return fHistVzMCTrg[procType] ;
254
255 TH2F * sum = (TH2F*) fHistVzMCTrg[kProcSD]->Clone();
256 sum->Reset();
257
258 for(Int_t iproc = 0; iproc < kProcUnknown; iproc++){
259 sum->Add(fHistVzMCTrg[iproc],GetProcessWeight(iproc));
260 }
261
262 return sum;
263
264}
265
266Double_t AliCollisionNormalization::ComputeNint() {
267
268 // Compute the number of collisions applying all corrections
0d300b4f 269 // TODO: check error propagation
9b0cb3c3 270
271 TH1 * hVzData = fHistVzData->ProjectionX("_px",2,-1,"E"); // Skip zero bin
272 Int_t allEventsWithVertex = (Int_t) fHistVzData->Integral(0, fHistVzData->GetNbinsX()+1,
273 2, fHistVzData->GetNbinsY()+1); // include under/overflow!, skip 0 bin
274
275 // Assign histos reweighted with measured XS
276 TH2F * histVzMCGen = GetVzMCGen(-1);
277 TH2F * histVzMCTrg = GetVzMCTrg(-1);
278 TH2F * histVzMCRec = GetVzMCRec(-1);
279
0d300b4f 280 // Before we start: print number of input events to the physics
281 // selection: this allows to crosscheck that all runs were
282 // successfully processed (useful if running on grid: you may have a
283 // crash without noticing it).
284 AliInfo(Form("Input Events (No cuts: %d, After Phys. Sel.:%d)",
285 Int_t(fHistStat->GetBinContent(1,1)),
286 Int_t(fHistStat->GetBinContent(fHistStat->GetNbinsX(),1)))); // Fixme: will this change with a different trigger scheme?
287
9b0cb3c3 288 // Get or compute BG. This assumes the CINT1B suite
289 Double_t triggeredEventsWith0MultWithBG = fHistVzData->Integral(0, fHistVzData->GetNbinsX()+1,1, 1);
290 Double_t bg = 0; // This will include beam gas + accidentals
291 if (fHistStatBin0->GetNbinsY() > 4) { // FIXME: we need a better criterion to decide...
292 AliInfo("Using BG computed by Physics Selection");
46918b3b 293 // WARNING
294 // CHECK IF THE COMPUTATION OF BG OFFSET IS STILL OK, IN CASE OF CHANGES TO THE PHYSICS SELECTION
295 Int_t bgOffset = 0;
296 Int_t nbiny = fHistStatBin0->GetNbinsY();
297 for(Int_t ibiny =1; ibiny <= nbiny; ibiny++){
298 bgOffset++;
299 printf("%d, %s\n", bgOffset, fHistStatBin0->GetYaxis()->GetBinLabel(ibiny) );
300
301 if(!strncmp("All B", fHistStatBin0->GetYaxis()->GetBinLabel(ibiny),5)) break;
302 if((ibiny+1)==nbiny) AliFatal("Cannot compute bg offset");
303 }
304
305 if(fVerbose > 2) AliInfo(Form("BG Offset: %d",bgOffset));
306
307
308 bg = fHistStatBin0->GetBinContent(fHistStatBin0->GetNbinsX(), bgOffset+AliPhysicsSelection::kStatRowBG);
309 bg += fHistStatBin0->GetBinContent(fHistStatBin0->GetNbinsX(),bgOffset+AliPhysicsSelection::kStatRowAcc);
0d300b4f 310 Int_t cint1B = (Int_t) fHistStatBin0->GetBinContent(fHistStatBin0->GetNbinsX(),1);
311 if (cint1B != Int_t(triggeredEventsWith0MultWithBG)) {
312 AliWarning(Form("Events in bin0 from physics selection and local counter not consistent: %d - %d", cint1B, Int_t(triggeredEventsWith0MultWithBG)));
313 }
9b0cb3c3 314 } else {
315 AliInfo("Computing BG using CINT1A/B/C/E, ignoring intensities");
46918b3b 316 AliError("This will only work for early runs!!! USE BG FROM PHYSICS SELECTION INSTEAD");
9b0cb3c3 317 Int_t icol = fHistStatBin0->GetNbinsX();
318 Int_t cint1B = (Int_t) fHistStatBin0->GetBinContent(icol,1);
319 Int_t cint1A = (Int_t) fHistStatBin0->GetBinContent(icol,2);
320 Int_t cint1C = (Int_t) fHistStatBin0->GetBinContent(icol,3);
321 Int_t cint1E = (Int_t) fHistStatBin0->GetBinContent(icol,4);
46918b3b 322 bg = cint1A + cint1C-2*cint1E ; // FIXME: to be changed to take into account ratios of events
9b0cb3c3 323 if (cint1B != triggeredEventsWith0MultWithBG) {
e8b839ab 324 AliWarning(Form("Events in bin0 from physics selection and local counter not consistent: %d - %d", cint1B, (Int_t)triggeredEventsWith0MultWithBG));
9b0cb3c3 325 }
326 }
327
328 Double_t triggeredEventsWith0Mult = triggeredEventsWith0MultWithBG - bg;
329 if(fVerbose > 0) AliInfo(Form("Measured events with vertex: %d",allEventsWithVertex));
330 Double_t bin0 = fHistVzData->Integral(0, fHistVzData->GetNbinsX()+1,
331 1, 1);
332 if(fVerbose > 0) AliInfo(Form("Zero Bin, Meas: %2.2f, BG: %2.2f, Meas - BG: %2.2f", bin0, bg, triggeredEventsWith0Mult));
333
334 // This pointers are here so that I use the same names used in Jan Fiete's code (allows for faster/easier comparison)
335
336 TH2* eTrig = histVzMCTrg;
337 TH2* eTrigVtx = histVzMCRec;
338 TH1* eTrigVtx_projx = eTrigVtx->ProjectionX("eTrigVtx_projx", 2, eTrigVtx->GetNbinsX()+1);
339
340 // compute trigger and vertex efficiency
341 TH2 * effVtxTrig = (TH2*) histVzMCRec->Clone("effVtxTrig");
342 effVtxTrig->Reset();
343 effVtxTrig->Divide(histVzMCRec,histVzMCGen,1,1,"B");
344 // Apply correction to data to get corrected events
345 TH2 * correctedEvents = (TH2*) fHistVzData->Clone("correctedEvents");
346 correctedEvents->Divide(effVtxTrig);
347
348 // TH1 * correctedEvents = fHistVzData->ProjectionX("eTrigVtx_projx", 2, eTrigVtx->GetNbinsX()+1);
349
350 // loop over vertex bins
351 for (Int_t i = 1; i <= fHistVzData->GetNbinsX(); i++)
352 {
353 Double_t alpha = (Double_t) hVzData->GetBinContent(i) / allEventsWithVertex;
354 Double_t events = alpha * triggeredEventsWith0Mult;
355
356 if (histVzMCRec->GetBinContent(i,1) == 0)
357 continue;
358
359 Double_t fZ = eTrigVtx_projx->Integral(0, eTrigVtx_projx->GetNbinsX()+1) / eTrigVtx_projx->GetBinContent(i) *
360 eTrig->GetBinContent(i, 1) / eTrig->Integral(0, eTrig->GetNbinsX()+1, 1, 1);
361
362 events *= fZ;
363
364 // multiply with trigger correction
365 Double_t correction = histVzMCGen->GetBinContent(i,1)/histVzMCTrg->GetBinContent(i,1);
366 events *= correction;
367
368 if (fVerbose > 1) Printf(" Bin %d, alpha is %.2f%%, fZ is %.3f, number of events with 0 mult.: %.2f (MC comparison: %.2f)", i, alpha * 100., fZ, events,
369 histVzMCRec->GetBinContent(i,1));
370 correctedEvents->SetBinContent(i, 1, events);
371 }
372
373
374
375 // Integrate correctedEvents over full z range
376 Double_t allEvents = correctedEvents->Integral(0, correctedEvents->GetNbinsX()+1,0, correctedEvents->GetNbinsY()+1);
377 // Integrate correctedEvents over needed z range
378 Double_t allEventsZrange = correctedEvents->Integral(correctedEvents->GetXaxis()->FindBin(-fZRange), correctedEvents->GetXaxis()->FindBin(fZRange),
379 0, correctedEvents->GetNbinsY()+1);
380
381 if(fVerbose > 1) AliInfo(Form("Results in |Vz| < %3.3f",fZRange));
382 if(fVerbose > 1) AliInfo(Form(" Events in Bin0: %2.2f, With > 1 track: %2.2f, All corrected: %2.2f",
383 correctedEvents->Integral(correctedEvents->GetXaxis()->FindBin(-fZRange), correctedEvents->GetXaxis()->FindBin(fZRange),1,1),
384 correctedEvents->Integral(correctedEvents->GetXaxis()->FindBin(-fZRange), correctedEvents->GetXaxis()->FindBin(fZRange),
385 2,correctedEvents->GetNbinsX()+1),
386 allEventsZrange));
387 if(fVerbose > 1) {
388 Int_t nbin = histVzMCRec->GetNbinsX();
389 AliInfo(Form("Efficiency in the zero bin: %3.3f", histVzMCRec->Integral(0,nbin+1,1,1)/histVzMCGen->Integral(0,nbin+1,1,1) ));
390 }
391
0d300b4f 392
9b0cb3c3 393 AliInfo(Form("Number of collisions in full phase space: %2.2f", allEvents));
0d300b4f 394// effVtxTrig->Draw();
395// new TCanvas();
396// correctedEvents->Draw(); // FIXME: debug
9b0cb3c3 397
398 return allEvents;
399}
400
401Long64_t AliCollisionNormalization::Merge(TCollection* list)
402{
403 // Merge a list of AliCollisionNormalization objects with this
404 // (needed for PROOF).
405 // Returns the number of merged objects (including this).
406
407 if (!list)
408 return 0;
409
410 if (list->IsEmpty())
411 return 1;
412
413 TIterator* iter = list->MakeIterator();
414 TObject* obj;
415
416 // collections of all histograms
0d300b4f 417 const Int_t nHists = kNProcs*3+5;
9b0cb3c3 418 TList collections[nHists];
419
420 Int_t count = 0;
421 while ((obj = iter->Next())) {
422
423 AliCollisionNormalization* entry = dynamic_cast<AliCollisionNormalization*> (obj);
424 if (entry == 0)
425 continue;
426 Int_t ihist = -1;
427
428 for(Int_t iproc = 0; iproc < kNProcs; iproc++){
429 if (entry->fHistVzMCGen[iproc] ) collections[++ihist].Add(entry->fHistVzMCGen[iproc] );
430 if (entry->fHistVzMCRec[iproc] ) collections[++ihist].Add(entry->fHistVzMCRec[iproc] );
431 if (entry->fHistVzMCTrg[iproc] ) collections[++ihist].Add(entry->fHistVzMCTrg[iproc] );
432 }
433 if (entry->fHistVzData ) collections[++ihist].Add(entry->fHistVzData );
434 if (entry->fHistProcTypes ) collections[++ihist].Add(entry->fHistProcTypes );
435 if (entry->fHistStatBin0 ) collections[++ihist].Add(entry->fHistStatBin0 );
0d300b4f 436 if (entry->fHistStat ) collections[++ihist].Add(entry->fHistStat );
9b0cb3c3 437
438 count++;
439 }
440
441 Int_t ihist = -1;
442 for(Int_t iproc = 0; iproc < kNProcs; iproc++){
443 if (fHistVzMCGen[iproc] ) fHistVzMCGen[iproc] ->Merge(&collections[++ihist]);
444 if (fHistVzMCRec[iproc] ) fHistVzMCRec[iproc] ->Merge(&collections[++ihist]);
445 if (fHistVzMCTrg[iproc] ) fHistVzMCTrg[iproc] ->Merge(&collections[++ihist]);
446
447 }
448 if (fHistVzData ) fHistVzData ->Merge(&collections[++ihist]);
449 if (fHistProcTypes ) fHistProcTypes ->Merge(&collections[++ihist]);
450 if (fHistStatBin0 ) fHistStatBin0 ->Merge(&collections[++ihist]);
0d300b4f 451 if (fHistStat ) fHistStat ->Merge(&collections[++ihist]);
9b0cb3c3 452
453
454 delete iter;
455
456 return count+1;
457}
458
459void AliCollisionNormalization::FillVzMCGen(Float_t vz, Int_t ntrk, AliMCEvent * mcEvt) {
460
461 // Fill MC gen histo and the process types statistics
462
463 Int_t evtype = GetProcessType(mcEvt);
464 // When I fill gen histos, I also fill statistics of process types (used to detemine ratios afterwards).
465 fHistProcTypes->Fill(evtype);
466 fHistVzMCGen[evtype]->Fill(vz,ntrk);
467}
468
469void AliCollisionNormalization::FillVzMCRec(Float_t vz, Int_t ntrk, AliMCEvent * mcEvt){
470
471 // Fill MC rec histo
472 Int_t evtype = GetProcessType(mcEvt);
473 fHistVzMCRec[evtype]->Fill(vz,ntrk);
474
475}
476void AliCollisionNormalization::FillVzMCTrg(Float_t vz, Int_t ntrk, AliMCEvent * mcEvt) {
477
478 // Fill MC trg histo
479 Int_t evtype = GetProcessType(mcEvt);
480 fHistVzMCTrg[evtype]->Fill(vz,ntrk);
481}
482
483
484Int_t AliCollisionNormalization::GetProcessType(AliMCEvent * mcEvt) {
485
486 // Determine if the event was generated with pythia or phojet and return the process type
487
488 // Check if mcEvt is fine
489 if (!mcEvt) {
490 AliFatal("NULL mc event");
491 }
492
493 // Determine if it was a pythia or phojet header, and return the correct process type
494 AliGenPythiaEventHeader * headPy = 0;
495 AliGenDPMjetEventHeader * headPho = 0;
496 AliGenEventHeader * htmp = mcEvt->GenEventHeader();
497 if(!htmp) {
498 AliFatal("Cannot Get MC Header!!");
499 }
500 if( TString(htmp->IsA()->GetName()) == "AliGenPythiaEventHeader") {
501 headPy = (AliGenPythiaEventHeader*) htmp;
502 } else if (TString(htmp->IsA()->GetName()) == "AliGenDPMjetEventHeader") {
503 headPho = (AliGenDPMjetEventHeader*) htmp;
504 } else {
505 AliError("Unknown header");
506 }
507
508 // Determine process type
509 if(headPy) {
510 if(headPy->ProcessType() == 92 || headPy->ProcessType() == 93) {
511 // single difractive
512 return kProcSD;
513 } else if (headPy->ProcessType() == 94) {
514 // double diffractive
515 return kProcDD;
516 }
517 else if(headPy->ProcessType() != 92 && headPy->ProcessType() != 93 && headPy->ProcessType() != 94) {
518 // non difractive
519 return kProcND;
520 }
521 } else if (headPho) {
522 if(headPho->ProcessType() == 5 || headPho->ProcessType() == 6 ) {
523 // single difractive
524 return kProcSD;
525 } else if (headPho->ProcessType() == 7) {
526 // double diffractive
527 return kProcDD;
528 } else if(headPho->ProcessType() != 5 && headPho->ProcessType() != 6 && headPho->ProcessType() != 7 ) {
529 // non difractive
530 return kProcND;
531 }
532 }
533
534
535 // no process type found?
536 AliError(Form("Unknown header: %s", htmp->IsA()->GetName()));
537 return kProcUnknown;
538}
539
540Double_t AliCollisionNormalization::GetProcessWeight(Int_t proc) {
541
542 // Return a weight to be used when combining the MC histos to
0d300b4f 543 // compute efficiency, defined as the ratio XS in generator / XS
544 // measured
9b0cb3c3 545
546 Float_t ref_SD, ref_DD, ref_ND, error_SD, error_DD, error_ND;
547 GetRelativeFractions(fReferenceXS,ref_SD, ref_DD, ref_ND, error_SD, error_DD, error_ND);
548
549 static Double_t total = fHistProcTypes->Integral();
550 if (fHistProcTypes->GetBinContent(fHistProcTypes->FindBin(kProcUnknown)) > 0) {
551 AliError("There were unknown processes!!!");
552 }
553 static Double_t SD = fHistProcTypes->GetBinContent(fHistProcTypes->FindBin(kProcSD))/total;
554 static Double_t DD = fHistProcTypes->GetBinContent(fHistProcTypes->FindBin(kProcDD))/total;
555 static Double_t ND = fHistProcTypes->GetBinContent(fHistProcTypes->FindBin(kProcND))/total;
556
557 if (fVerbose > 2) {
558 AliInfo(Form("Total MC evts: %f",total));
559 AliInfo(Form(" Frac SD %4.4f", SD));
560 AliInfo(Form(" Frac DD %4.4f", DD));
561 AliInfo(Form(" Frac ND %4.4f", ND));
562 }
563
564 switch(proc) {
565 case kProcSD:
566 return ref_SD/SD;
567 break;
568 case kProcDD:
569 return ref_DD/DD;
570 break;
571 case kProcND:
572 return ref_ND/ND;
573 break;
574 default:
575 AliError("Unknown process");
576 }
577
578 return 0;
579
580}
581
582void AliCollisionNormalization::GetRelativeFractions(Int_t origin, Float_t& ref_SD, Float_t& ref_DD, Float_t& ref_ND, Float_t& error_SD, Float_t& error_DD, Float_t& error_ND)
583{
584 // Returns fraction of XS (SD, ND, DD) and corresponding error
585 // Stolen from Jan Fiete's drawSystematics macro
586
587 // origin:
588 // -1 = Pythia (test)
589 // 0 = UA5
590 // 1 = Data 1.8 TeV
591 // 2 = Tel-Aviv
592 // 3 = Durham
593 //
594
0d300b4f 595 Double_t epsilon = 0.0001;
596 if(TMath::Abs(fEnergy-900)<epsilon) {
597
598 switch (origin)
599 {
600 case -10: // Pythia default at 7 GeV, 50% error
601 AliInfo("PYTHIA x-sections");
602 ref_SD = 0.192637; error_SD = ref_SD * 0.5;
603 ref_DD = 0.129877; error_DD = ref_DD * 0.5;
604 ref_ND = 0.677486; error_ND = 0;
605 break;
606
607 case -1: // Pythia default at 900 GeV, as test
608 AliInfo("PYTHIA x-sections");
9b0cb3c3 609 ref_SD = 0.223788;
610 ref_DD = 0.123315;
611 ref_ND = 0.652897;
612 break;
613
0d300b4f 614 case 0: // UA5
615 AliInfo("UA5 x-sections a la first paper");
616 ref_SD = 0.153; error_SD = 0.05;
617 ref_DD = 0.080; error_DD = 0.05;
618 ref_ND = 0.767; error_ND = 0;
619 break;
620
621 case 10: // UA5
622 AliInfo("UA5 x-sections hadron level definition for Pythia");
623 // Fractions in Pythia with UA5 cuts selection for SD
624 // ND: 0.688662
625 // SD: 0.188588 --> this should be 15.3
626 // DD: 0.122750
627 ref_SD = 0.224 * 0.153 / 0.189; error_SD = 0.023 * 0.224 / 0.189;
628 ref_DD = 0.095; error_DD = 0.06;
629 ref_ND = 1.0 - ref_SD - ref_DD; error_ND = 0;
630 break;
631
632 case 11: // UA5
633 AliInfo("UA5 x-sections hadron level definition for Phojet");
634 // Fractions in Phojet with UA5 cuts selection for SD
635 // ND: 0.783573
636 // SD: 0.151601 --> this should be 15.3
637 // DD: 0.064827
638 ref_SD = 0.191 * 0.153 / 0.152; error_SD = 0.023 * 0.191 / 0.152;
639 ref_DD = 0.095; error_DD = 0.06;
640 ref_ND = 1.0 - ref_SD - ref_DD; error_ND = 0;
641 break;
642 case 2: // tel-aviv model
643 AliInfo("Tel-aviv model x-sections");
644 ref_SD = 0.171;
645 ref_DD = 0.094;
646 ref_ND = 1 - ref_SD - ref_DD;
647 break;
648
649 case 3: // durham model
650 AliInfo("Durham model x-sections");
651 ref_SD = 0.190;
652 ref_DD = 0.125;
653 ref_ND = 1 - ref_SD - ref_DD;
9b0cb3c3 654 break;
0d300b4f 655 default:
656 AliFatal(Form("Unknown origin %d, Energy %f", origin, fEnergy));
657 }
658 }
659 else if(TMath::Abs(fEnergy-1800)<epsilon) {
660 switch (origin)
661 {
662 case 20: // E710, 1.8 TeV
9b0cb3c3 663 AliInfo("E710 x-sections hadron level definition for Pythia");
664 // ND: 0.705709
665 // SD: 0.166590 --> this should be 15.9
666 // DD: 0.127701
667 ref_SD = 0.217 * 0.159 / 0.167; error_SD = 0.024 * 0.217 / 0.167;
668 ref_DD = 0.075 * 1.43; error_DD = 0.02 * 1.43;
669 ref_ND = 1.0 - ref_SD - ref_DD; error_ND = 0;
670 break;
671
0d300b4f 672 case 21: // E710, 1.8 TeV
673 AliInfo("E710 x-sections hadron level definition for Phojet");
674 // ND: 0.817462
675 // SD: 0.125506 --> this should be 15.9
676 // DD: 0.057032
677 ref_SD = 0.161 * 0.159 / 0.126; error_SD = 0.024 * 0.161 / 0.126;
678 ref_DD = 0.075 * 1.43; error_DD = 0.02 * 1.43;
679 ref_ND = 1.0 - ref_SD - ref_DD; error_ND = 0;
680 break;
681
682 case 1: // data 1.8 TeV
683 AliInfo("??? x-sections");
684 ref_SD = 0.152;
685 ref_DD = 0.092;
686 ref_ND = 1 - ref_SD - ref_DD;
687 break;
688 default:
689 AliFatal(Form("Unknown origin %d, Energy %f", origin, fEnergy));
690 }
691 }
692 else {
e8b839ab 693 AliFatal(Form("Unknown energy %f", fEnergy));
9b0cb3c3 694 }
0d300b4f 695
9b0cb3c3 696}
697
0d300b4f 698