1 //-------------------------------------------------------------------------
2 // Implementation of Class AliCollisionNormalization
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.
9 // Author: Michele Floris, CERN
10 //-------------------------------------------------------------------------
12 #include "AliCollisionNormalization.h"
13 #include "AliPhysicsSelection.h"
17 #include "AliGenPythiaEventHeader.h"
18 #include "AliGenDPMjetEventHeader.h"
19 #include "AliGenEventHeader.h"
20 #include "AliMCEvent.h"
22 ClassImp(AliCollisionNormalization)
24 const char * AliCollisionNormalization::fProcLabel[] = {"SD","DD","ND", "Unknown"};
26 AliCollisionNormalization::AliCollisionNormalization() :
45 fAllEventsZRangeMult1(0),
46 fAllEventsInBin0ZRange(0),
56 for(Int_t iproc = 0; iproc < kNProcs; iproc++){
57 fHistVzMCGen[iproc] = 0;
58 fHistVzMCRec[iproc] = 0;
59 fHistVzMCTrg[iproc] = 0;
66 AliCollisionNormalization::AliCollisionNormalization(Int_t nbinz, Float_t minz, Float_t maxz):
85 fAllEventsZRangeMult1(0),
86 fAllEventsInBin0ZRange(0),
90 // ctor, allows setting binning
95 for(Int_t iproc = 0; iproc < kNProcs; iproc++){
96 fHistVzMCGen[iproc] = 0;
97 fHistVzMCRec[iproc] = 0;
98 fHistVzMCTrg[iproc] = 0;
104 AliCollisionNormalization::AliCollisionNormalization(const char * dataFile, const char * dataListName,
105 const char * mcFile, const char * mcListName,
106 const char * eventStatFile) :
125 fAllEventsZRangeMult1(0),
126 fAllEventsInBin0ZRange(0),
131 // ctor, loads histograms from file
132 for(Int_t iproc = 0; iproc < kNProcs; iproc++){
133 fHistVzMCGen[iproc] = 0;
134 fHistVzMCRec[iproc] = 0;
135 fHistVzMCTrg[iproc] = 0;
139 TFile * fdata = new TFile (dataFile);
140 TFile * fmc = new TFile (mcFile );
141 TFile * fstat = new TFile(eventStatFile);
143 if (!fdata->IsOpen() || !fmc->IsOpen() || !fstat->IsOpen()) {
144 AliFatal("Cannot open input file(s)");
147 TList * ldata = (TList*) fdata->Get(dataListName);
148 TList * lmc = (TList*) fmc ->Get(mcListName );
150 AliCollisionNormalization * cndata = (AliCollisionNormalization*) ldata->FindObject("AliCollisionNormalization");
151 AliCollisionNormalization * cnmc = (AliCollisionNormalization*) lmc ->FindObject("AliCollisionNormalization");
154 // Assign or book all histos
155 for(Int_t iproc = 0; iproc < kNProcs; iproc++){
156 fHistVzMCGen[iproc]= cnmc->GetVzMCGen(iproc);
157 fHistVzMCRec[iproc]= cnmc->GetVzMCRec(iproc);
158 fHistVzMCTrg[iproc]= cnmc->GetVzMCTrg(iproc);
160 fHistVzData = cndata->GetVzData();
161 fHistProcTypes = cnmc->GetHistProcTypes();
163 fHistStatBin0 = (TH1F*) fstat->Get("fHistStatistics_Bin0");
164 fHistStat = (TH1F*) fstat->Get("fHistStatistics");
169 AliCollisionNormalization::~AliCollisionNormalization(){
172 for(Int_t iproc = 0; iproc < kNProcs; iproc++){
173 if(fHistVzMCGen[iproc]) { delete fHistVzMCGen[iproc] ; fHistVzMCGen[iproc] =0;}
174 if(fHistVzMCRec[iproc]) { delete fHistVzMCRec[iproc] ; fHistVzMCRec[iproc] =0;}
175 if(fHistVzMCTrg[iproc]) { delete fHistVzMCTrg[iproc] ; fHistVzMCTrg[iproc] =0;}
178 if(fHistVzData ) { delete fHistVzData ; fHistVzData =0;}
179 if(fHistStatBin0 ) { delete fHistStatBin0 ; fHistStatBin0 =0;}
180 if(fHistStat ) { delete fHistStat ; fHistStat =0;}
181 if(fHistProcTypes ) { delete fHistProcTypes ; fHistProcTypes =0;}
185 void AliCollisionNormalization::BookAllHistos(){
187 // Book histos of vz distributions vs multiplicity
188 // if vzOnly == kTRUE, it returns a 1d histo with vz dist only
190 // Do not attach histos to the current directory
191 Bool_t oldStatus = TH1::AddDirectoryStatus();
192 TH1::AddDirectory(kFALSE);
194 for(Int_t iproc = 0; iproc < kNProcs; iproc++){
195 fHistVzMCGen [iproc] = (TH2F*) BookVzHisto(TString("fHistVzMCGen")+ fProcLabel[iproc] ,"Vz distribution of generated events vs rec multiplicity ");
196 fHistVzMCRec [iproc] = (TH2F*) BookVzHisto(TString("fHistVzMCRec")+ fProcLabel[iproc] ,"Vz distribution of reconstructed events vs rec multiplicity");
197 fHistVzMCTrg [iproc] = (TH2F*) BookVzHisto(TString("fHistVzMCTrg")+ fProcLabel[iproc] ,"Vz distribution of triggered events vs rec multiplicity ");
199 fHistVzData = (TH2F*) BookVzHisto("fHistVzData" ,"Vz distribution of triggered events vs rec multiplicity ");
200 fHistProcTypes = new TH1F ("fHistProcTypes", "Number of events in the different process classes", kNProcs, -0.5 , kNProcs-0.5);
202 fHistProcTypes->GetXaxis()->SetBinLabel(kProcSD+1,"SD");
203 fHistProcTypes->GetXaxis()->SetBinLabel(kProcND+1,"ND");
204 fHistProcTypes->GetXaxis()->SetBinLabel(kProcDD+1,"DD");
205 fHistProcTypes->GetXaxis()->SetBinLabel(kProcUnknown+1,"Unknown");
207 TH1::AddDirectory(oldStatus);
211 TH1 * AliCollisionNormalization::BookVzHisto(const char * name , const char * title, Bool_t vzOnly) {
213 // Book histos of vz distributions vs multiplicity
214 // if vzOnly == kTRUE, it returns a 1d histo with vz dist only
217 // Do not attach histos to the current directory
218 Bool_t oldStatus = TH1::AddDirectoryStatus();
219 TH1::AddDirectory(kFALSE);
222 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};
224 h = new TH1F(name,title,22,binLimitsVtx);
226 h = new TH2F(name,title,22,binLimitsVtx,100,Double_t(-0.5),Double_t(99.5));
229 h->SetXTitle("V_{z} (cm)");
230 h->SetYTitle("n_{trk}");
233 TH1::AddDirectory(oldStatus);
239 TH2F * AliCollisionNormalization::GetVzMCGen (Int_t procType) {
241 // returns MC gen histo. If proc type < 0 sums over all proc types, reweighting the XS
243 if(procType>=0) return fHistVzMCGen[procType] ;
245 TH2F * sum = (TH2F*) fHistVzMCGen[kProcSD]->Clone();
248 for(Int_t iproc = 0; iproc < kProcUnknown; iproc++){
249 sum->Add(fHistVzMCGen[iproc],GetProcessWeight(iproc));
254 TH2F * AliCollisionNormalization::GetVzMCRec (Int_t procType) {
256 // returns MC rec histo. If proc type < 0 sums over all proc types, reweighting the XS
258 if(procType>=0) return fHistVzMCRec[procType] ;
260 TH2F * sum = (TH2F*) fHistVzMCRec[kProcSD]->Clone();
263 for(Int_t iproc = 0; iproc < kProcUnknown; iproc++){
264 sum->Add(fHistVzMCRec[iproc],GetProcessWeight(iproc));
272 TH2F * AliCollisionNormalization::GetVzMCTrg (Int_t procType) {
274 // returns MC trg histo. If proc type < 0 sums over all proc types, reweighting the XS
276 if(procType>=0) return fHistVzMCTrg[procType] ;
278 TH2F * sum = (TH2F*) fHistVzMCTrg[kProcSD]->Clone();
281 for(Int_t iproc = 0; iproc < kProcUnknown; iproc++){
282 sum->Add(fHistVzMCTrg[iproc],GetProcessWeight(iproc));
289 Double_t AliCollisionNormalization::ComputeNint() {
291 // Compute the number of collisions applying all corrections
292 // TODO: check error propagation
294 TH1 * hVzData = fHistVzData->ProjectionX("_px",2,-1,"E"); // Skip zero bin
295 Int_t allEventsWithVertex = (Int_t) fHistVzData->Integral(0, fHistVzData->GetNbinsX()+1,
296 2, fHistVzData->GetNbinsY()+1); // include under/overflow!, skip 0 bin
298 // Assign histos reweighted with measured XS
299 TH2F * histVzMCGen = GetVzMCGen(-1);
300 TH2F * histVzMCTrg = GetVzMCTrg(-1);
301 TH2F * histVzMCRec = GetVzMCRec(-1);
303 // Before we start: print number of input events to the physics
304 // selection: this allows to crosscheck that all runs were
305 // successfully processed (useful if running on grid: you may have a
306 // crash without noticing it).
308 fInputEvents = fHistStat->GetBinContent(1,1);
309 fPhysSelEvents = fHistStat->GetBinContent( fHistStat->GetNbinsX(),1);
311 AliInfo(Form("Input Events (No cuts: %d, After Phys. Sel.:%d)",
313 Int_t(fPhysSelEvents))); // Fixme: will this change with a different trigger scheme?
315 // Get or compute BG. This assumes the CINT1B suite
316 Double_t triggeredEventsWith0MultWithBG = fHistVzData->Integral(0, fHistVzData->GetNbinsX()+1,1, 1);
317 // Double_t bg = 0; // This will include beam gas + accidentals
318 if (fHistStatBin0->GetNbinsY() > 4) { // FIXME: we need a better criterion to decide...
319 AliInfo("Using BG computed by Physics Selection");
321 // CHECK IF THE COMPUTATION OF BG OFFSET IS STILL OK, IN CASE OF CHANGES TO THE PHYSICS SELECTION
323 Int_t nbiny = fHistStatBin0->GetNbinsY();
324 for(Int_t ibiny =1; ibiny <= nbiny; ibiny++){
326 printf("%d, %s\n", bgOffset, fHistStatBin0->GetYaxis()->GetBinLabel(ibiny) );
328 if(!strncmp("All B", fHistStatBin0->GetYaxis()->GetBinLabel(ibiny),5)) break;
329 if((ibiny+1)==nbiny) AliFatal("Cannot compute bg offset");
332 if(fVerbose > 2) AliInfo(Form("BG Offset: %d",bgOffset));
335 fBgEvents = fHistStatBin0->GetBinContent(fHistStatBin0->GetNbinsX(), bgOffset+AliPhysicsSelection::kStatRowBG);
336 fBgEvents += fHistStatBin0->GetBinContent(fHistStatBin0->GetNbinsX(),bgOffset+AliPhysicsSelection::kStatRowAcc);
337 Int_t cint1B = (Int_t) fHistStatBin0->GetBinContent(fHistStatBin0->GetNbinsX(),1);
338 if (cint1B != Int_t(triggeredEventsWith0MultWithBG)) {
339 AliWarning(Form("Events in bin0 from physics selection and local counter not consistent: %d - %d", cint1B, Int_t(triggeredEventsWith0MultWithBG)));
342 AliInfo("Computing BG using CINT1A/B/C/E, ignoring intensities");
343 AliError("This will only work for early runs!!! USE BG FROM PHYSICS SELECTION INSTEAD");
344 Int_t icol = fHistStatBin0->GetNbinsX();
345 Int_t cint1B = (Int_t) fHistStatBin0->GetBinContent(icol,1);
346 Int_t cint1A = (Int_t) fHistStatBin0->GetBinContent(icol,2);
347 Int_t cint1C = (Int_t) fHistStatBin0->GetBinContent(icol,3);
348 Int_t cint1E = (Int_t) fHistStatBin0->GetBinContent(icol,4);
349 fBgEvents = cint1A + cint1C-2*cint1E ; // FIXME: to be changed to take into account ratios of events
350 if (cint1B != triggeredEventsWith0MultWithBG) {
351 AliWarning(Form("Events in bin0 from physics selection and local counter not consistent: %d - %d", cint1B, (Int_t)triggeredEventsWith0MultWithBG));
355 Double_t triggeredEventsWith0Mult = triggeredEventsWith0MultWithBG - fBgEvents;
356 if(fVerbose > 0) AliInfo(Form("Measured events with vertex: %d",allEventsWithVertex));
357 Double_t bin0 = fHistVzData->Integral(0, fHistVzData->GetNbinsX()+1,
359 if(fVerbose > 0) AliInfo(Form("Zero Bin, Meas: %2.2f, BG: %2.2f, Meas - BG: %2.2f", bin0, fBgEvents, triggeredEventsWith0Mult));
361 // This pointers are here so that I use the same names used in Jan Fiete's code (allows for faster/easier comparison)
363 TH2* eTrig = histVzMCTrg;
364 TH2* eTrigVtx = histVzMCRec;
365 TH1* eTrigVtx_projx = eTrigVtx->ProjectionX("eTrigVtx_projx", 2, eTrigVtx->GetNbinsX()+1);
367 // compute trigger and vertex efficiency
368 TH2 * effVtxTrig = (TH2*) histVzMCRec->Clone("effVtxTrig");
370 effVtxTrig->Divide(histVzMCRec,histVzMCGen,1,1,"B");
371 // Apply correction to data to get corrected events
372 TH2 * correctedEvents = (TH2*) fHistVzData->Clone("correctedEvents");
373 correctedEvents->Divide(effVtxTrig);
375 // TH1 * correctedEvents = fHistVzData->ProjectionX("eTrigVtx_projx", 2, eTrigVtx->GetNbinsX()+1);
377 // loop over vertex bins
378 for (Int_t i = 1; i <= fHistVzData->GetNbinsX(); i++)
380 Double_t alpha = (Double_t) hVzData->GetBinContent(i) / allEventsWithVertex;
381 Double_t events = alpha * triggeredEventsWith0Mult;
383 // if (histVzMCRec->GetBinContent(i,1) == 0)
385 if (!eTrigVtx_projx->GetBinContent(i) || !eTrig->Integral(0, eTrig->GetNbinsX()+1, 1, 1))
388 Double_t fZ = eTrigVtx_projx->Integral(0, eTrigVtx_projx->GetNbinsX()+1) / eTrigVtx_projx->GetBinContent(i) *
389 eTrig->GetBinContent(i, 1) / eTrig->Integral(0, eTrig->GetNbinsX()+1, 1, 1);
393 // multiply with trigger correction
394 Double_t correction = histVzMCGen->GetBinContent(i,1)/histVzMCTrg->GetBinContent(i,1);
395 events *= correction;
397 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,
398 histVzMCTrg->GetBinContent(i,1));
399 correctedEvents->SetBinContent(i, 1, events);
404 // Integrate correctedEvents over full z range
405 fAllEvents = correctedEvents->Integral(0, correctedEvents->GetNbinsX()+1,0, correctedEvents->GetNbinsY()+1);
406 // Integrate correctedEvents over needed z range
407 fAllEventsZRange = correctedEvents->Integral(correctedEvents->GetXaxis()->FindBin(-fZRange), correctedEvents->GetXaxis()->FindBin(fZRange),
408 0, correctedEvents->GetNbinsY()+1);
410 fAllEventsZRangeMult1 = correctedEvents->Integral(correctedEvents->GetXaxis()->FindBin(-fZRange), correctedEvents->GetXaxis()->FindBin(fZRange),
411 2,correctedEvents->GetNbinsX()+1);
413 fAllEventsInBin0ZRange = correctedEvents->Integral(correctedEvents->GetXaxis()->FindBin(-fZRange), correctedEvents->GetXaxis()->FindBin(fZRange),1,1);
415 if(fVerbose > 1) AliInfo(Form("Results in |Vz| < %3.3f",fZRange));
416 if(fVerbose > 1) AliInfo(Form(" Events in Bin0: %2.2f, With > 1 track: %2.2f, All corrected: %2.2f",
417 fAllEventsInBin0ZRange,
418 fAllEventsZRangeMult1,
422 Int_t nbin = histVzMCTrg->GetNbinsX();
423 fTrigEffBin0 = histVzMCTrg->Integral(0,nbin+1,1,1)/histVzMCGen->Integral(0,nbin+1,1,1);
424 AliInfo(Form("Trigger Efficiency in the zero bin: %3.3f", fTrigEffBin0 ));
428 AliInfo(Form("Number of collisions in full phase space: %2.2f", fAllEvents));
429 // effVtxTrig->Draw();
431 // correctedEvents->Draw(); // FIXME: debug
436 Long64_t AliCollisionNormalization::Merge(TCollection* list)
438 // Merge a list of AliCollisionNormalization objects with this
439 // (needed for PROOF).
440 // Returns the number of merged objects (including this).
448 TIterator* iter = list->MakeIterator();
451 // collections of all histograms
452 const Int_t nHists = kNProcs*3+5;
453 TList collections[nHists];
456 while ((obj = iter->Next())) {
458 AliCollisionNormalization* entry = dynamic_cast<AliCollisionNormalization*> (obj);
463 for(Int_t iproc = 0; iproc < kNProcs; iproc++){
464 if (entry->fHistVzMCGen[iproc] ) collections[++ihist].Add(entry->fHistVzMCGen[iproc] );
465 if (entry->fHistVzMCRec[iproc] ) collections[++ihist].Add(entry->fHistVzMCRec[iproc] );
466 if (entry->fHistVzMCTrg[iproc] ) collections[++ihist].Add(entry->fHistVzMCTrg[iproc] );
468 if (entry->fHistVzData ) collections[++ihist].Add(entry->fHistVzData );
469 if (entry->fHistProcTypes ) collections[++ihist].Add(entry->fHistProcTypes );
470 if (entry->fHistStatBin0 ) collections[++ihist].Add(entry->fHistStatBin0 );
471 if (entry->fHistStat ) collections[++ihist].Add(entry->fHistStat );
477 for(Int_t iproc = 0; iproc < kNProcs; iproc++){
478 if (fHistVzMCGen[iproc] ) fHistVzMCGen[iproc] ->Merge(&collections[++ihist]);
479 if (fHistVzMCRec[iproc] ) fHistVzMCRec[iproc] ->Merge(&collections[++ihist]);
480 if (fHistVzMCTrg[iproc] ) fHistVzMCTrg[iproc] ->Merge(&collections[++ihist]);
483 if (fHistVzData ) fHistVzData ->Merge(&collections[++ihist]);
484 if (fHistProcTypes ) fHistProcTypes ->Merge(&collections[++ihist]);
485 if (fHistStatBin0 ) fHistStatBin0 ->Merge(&collections[++ihist]);
486 if (fHistStat ) fHistStat ->Merge(&collections[++ihist]);
494 void AliCollisionNormalization::FillVzMCGen(Float_t vz, Int_t ntrk, AliMCEvent * mcEvt) {
496 // Fill MC gen histo and the process types statistics
498 Int_t evtype = GetProcessType(mcEvt);
499 // When I fill gen histos, I also fill statistics of process types (used to detemine ratios afterwards).
500 fHistProcTypes->Fill(evtype);
501 fHistVzMCGen[evtype]->Fill(vz,ntrk);
504 void AliCollisionNormalization::FillVzMCRec(Float_t vz, Int_t ntrk, AliMCEvent * mcEvt){
507 Int_t evtype = GetProcessType(mcEvt);
508 fHistVzMCRec[evtype]->Fill(vz,ntrk);
511 void AliCollisionNormalization::FillVzMCTrg(Float_t vz, Int_t ntrk, AliMCEvent * mcEvt) {
514 Int_t evtype = GetProcessType(mcEvt);
515 fHistVzMCTrg[evtype]->Fill(vz,ntrk);
519 Int_t AliCollisionNormalization::GetProcessType(AliMCEvent * mcEvt) {
521 // Determine if the event was generated with pythia or phojet and return the process type
523 // Check if mcEvt is fine
525 AliFatal("NULL mc event");
528 // Determine if it was a pythia or phojet header, and return the correct process type
529 AliGenPythiaEventHeader * headPy = 0;
530 AliGenDPMjetEventHeader * headPho = 0;
531 AliGenEventHeader * htmp = mcEvt->GenEventHeader();
533 AliFatal("Cannot Get MC Header!!");
535 if( TString(htmp->IsA()->GetName()) == "AliGenPythiaEventHeader") {
536 headPy = (AliGenPythiaEventHeader*) htmp;
537 } else if (TString(htmp->IsA()->GetName()) == "AliGenDPMjetEventHeader") {
538 headPho = (AliGenDPMjetEventHeader*) htmp;
540 AliError("Unknown header");
543 // Determine process type
545 if(headPy->ProcessType() == 92 || headPy->ProcessType() == 93) {
548 } else if (headPy->ProcessType() == 94) {
549 // double diffractive
552 else if(headPy->ProcessType() != 92 && headPy->ProcessType() != 93 && headPy->ProcessType() != 94) {
556 } else if (headPho) {
557 if(headPho->ProcessType() == 5 || headPho->ProcessType() == 6 ) {
560 } else if (headPho->ProcessType() == 7) {
561 // double diffractive
563 } else if(headPho->ProcessType() != 5 && headPho->ProcessType() != 6 && headPho->ProcessType() != 7 ) {
570 // no process type found?
571 AliError(Form("Unknown header: %s", htmp->IsA()->GetName()));
575 Double_t AliCollisionNormalization::GetProcessWeight(Int_t proc) {
577 // Return a weight to be used when combining the MC histos to
578 // compute efficiency, defined as the ratio XS in generator / XS
581 Float_t ref_SD, ref_DD, ref_ND, error_SD, error_DD, error_ND;
582 GetRelativeFractions(fReferenceXS,ref_SD, ref_DD, ref_ND, error_SD, error_DD, error_ND);
584 static Double_t total = fHistProcTypes->Integral();
585 if (fHistProcTypes->GetBinContent(fHistProcTypes->FindBin(kProcUnknown)) > 0) {
586 AliError("There were unknown processes!!!");
588 static Double_t SD = fHistProcTypes->GetBinContent(fHistProcTypes->FindBin(kProcSD))/total;
589 static Double_t DD = fHistProcTypes->GetBinContent(fHistProcTypes->FindBin(kProcDD))/total;
590 static Double_t ND = fHistProcTypes->GetBinContent(fHistProcTypes->FindBin(kProcND))/total;
593 AliInfo(Form("Total MC evts: %f",total));
594 AliInfo(Form(" Frac SD %4.4f", SD));
595 AliInfo(Form(" Frac DD %4.4f", DD));
596 AliInfo(Form(" Frac ND %4.4f", ND));
610 AliError("Unknown process");
617 void 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)
619 // Returns fraction of XS (SD, ND, DD) and corresponding error
620 // Stolen from Jan Fiete's drawSystematics macro
623 // -1 = Pythia (test)
630 Double_t epsilon = 0.0001;
631 if(TMath::Abs(fEnergy-900)<epsilon) {
635 case -10: // Pythia default at 7 GeV, 50% error
636 AliInfo("PYTHIA x-sections");
637 ref_SD = 0.192637; error_SD = ref_SD * 0.5;
638 ref_DD = 0.129877; error_DD = ref_DD * 0.5;
639 ref_ND = 0.677486; error_ND = 0;
642 case -1: // Pythia default at 900 GeV, as test
643 AliInfo("PYTHIA x-sections");
650 AliInfo("UA5 x-sections a la first paper");
651 ref_SD = 0.153; error_SD = 0.05;
652 ref_DD = 0.080; error_DD = 0.05;
653 ref_ND = 0.767; error_ND = 0;
657 AliInfo("UA5 x-sections hadron level definition for Pythia");
658 // Fractions in Pythia with UA5 cuts selection for SD
660 // SD: 0.188588 --> this should be 15.3
662 ref_SD = 0.224 * 0.153 / 0.189; error_SD = 0.023 * 0.224 / 0.189;
663 ref_DD = 0.095; error_DD = 0.06;
664 ref_ND = 1.0 - ref_SD - ref_DD; error_ND = 0;
668 AliInfo("UA5 x-sections hadron level definition for Phojet");
669 // Fractions in Phojet with UA5 cuts selection for SD
671 // SD: 0.151601 --> this should be 15.3
673 ref_SD = 0.191 * 0.153 / 0.152; error_SD = 0.023 * 0.191 / 0.152;
674 ref_DD = 0.095; error_DD = 0.06;
675 ref_ND = 1.0 - ref_SD - ref_DD; error_ND = 0;
677 case 2: // tel-aviv model
678 AliInfo("Tel-aviv model x-sections");
681 ref_ND = 1 - ref_SD - ref_DD;
684 case 3: // durham model
685 AliInfo("Durham model x-sections");
688 ref_ND = 1 - ref_SD - ref_DD;
691 AliFatal(Form("Unknown origin %d, Energy %f", origin, fEnergy));
694 else if(TMath::Abs(fEnergy-1800)<epsilon) {
697 case 20: // E710, 1.8 TeV
698 AliInfo("E710 x-sections hadron level definition for Pythia");
700 // SD: 0.166590 --> this should be 15.9
702 ref_SD = 0.217 * 0.159 / 0.167; error_SD = 0.024 * 0.217 / 0.167;
703 ref_DD = 0.075 * 1.43; error_DD = 0.02 * 1.43;
704 ref_ND = 1.0 - ref_SD - ref_DD; error_ND = 0;
707 case 21: // E710, 1.8 TeV
708 AliInfo("E710 x-sections hadron level definition for Phojet");
710 // SD: 0.125506 --> this should be 15.9
712 ref_SD = 0.161 * 0.159 / 0.126; error_SD = 0.024 * 0.161 / 0.126;
713 ref_DD = 0.075 * 1.43; error_DD = 0.02 * 1.43;
714 ref_ND = 1.0 - ref_SD - ref_DD; error_ND = 0;
717 case 1: // data 1.8 TeV
718 AliInfo("??? x-sections");
721 ref_ND = 1 - ref_SD - ref_DD;
724 AliFatal(Form("Unknown origin %d, Energy %f", origin, fEnergy));
728 AliFatal(Form("Unknown energy %f", fEnergy));