1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
16 //The design of this class is based on the AliFMDParameters class. Its purpose
17 //is to hold parameters for the analysis such as background correction and
20 //Author: Hans Hjersing Dalsgaard, NBI, hans.dalsgaard@cern.ch
23 #include "AliFMDDebug.h" // ALILOG_H
24 #include "AliFMDAnaParameters.h" // ALIFMDPARAMETERS_H
25 //#include <AliCDBManager.h> // ALICDBMANAGER_H
26 //#include <AliCDBEntry.h> // ALICDBMANAGER_H
27 //#include "AliFMDRing.h"
29 #include <Riostream.h>
35 #include "AliESDEvent.h"
36 #include "AliESDVertex.h"
38 //====================================================================
39 ClassImp(AliFMDAnaParameters)
41 ; // This is here to keep Emacs for indenting the next line
44 //const char* AliFMDAnaParameters::fgkBackgroundCorrection = "FMD/Correction/Background";
45 //const char* AliFMDAnaParameters::fgkEnergyDists = "FMD/Correction/EnergyDistribution";
46 const char* AliFMDAnaParameters::fgkBackgroundID = "background";
47 const char* AliFMDAnaParameters::fgkEnergyDistributionID = "energydistributions";
48 const char* AliFMDAnaParameters::fgkEventSelectionEffID = "eventselectionefficiency";
49 const char* AliFMDAnaParameters::fgkSharingEffID = "sharingefficiency";
50 //____________________________________________________________________
51 AliFMDAnaParameters* AliFMDAnaParameters::fgInstance = 0;
53 //____________________________________________________________________
56 AliFMDAnaParameters::Instance()
58 // Get static instance
59 if (!fgInstance) fgInstance = new AliFMDAnaParameters;
63 //____________________________________________________________________
64 AliFMDAnaParameters::AliFMDAnaParameters() :
67 fEnergyDistribution(0),
68 fEventSelectionEfficiency(0),
69 fSharingEfficiency(0),
70 fCorner1(4.2231, 26.6638),
71 fCorner2(1.8357, 27.9500),
72 fEnergyPath("$ALICE_ROOT/PWG2/FORWARD/corrections/EnergyDistribution"),
73 fBackgroundPath("$ALICE_ROOT/PWG2/FORWARD/corrections/Background"),
74 fEventSelectionEffPath("$ALICE_ROOT/PWG2/FORWARD/corrections/EventSelectionEfficiency"),
75 fSharingEffPath("$ALICE_ROOT/PWG2/FORWARD/corrections/SharingEfficiency"),
76 fProcessPrimary(kFALSE),
85 //fVerticies.Add(new TVector2(4.2231, 26.6638));
86 // fVerticies.Add(new TVector2(1.8357, 27.9500));
87 // Default constructor
89 //____________________________________________________________________
90 char* AliFMDAnaParameters::GetPath(const char* species) {
94 if(species == fgkBackgroundID)
95 path = Form("%s/%s_%d_%d_%d_%d_%d_%d.root",
96 fBackgroundPath.Data(),
104 if(species == fgkEnergyDistributionID)
105 path = Form("%s/%s_%d_%d_%d_%d_%d_%d.root",
107 fgkEnergyDistributionID,
114 if(species == fgkEventSelectionEffID)
115 path = Form("%s/%s_%d_%d_%d_%d_%d_%d.root",
116 fEventSelectionEffPath.Data(),
117 fgkEventSelectionEffID,
124 if(species == fgkSharingEffID)
125 path = Form("%s/%s_%d_%d_%d_%d_%d_%d.root",
126 fSharingEffPath.Data(),
137 //____________________________________________________________________
138 void AliFMDAnaParameters::Init(Bool_t forceReInit, UInt_t what)
140 // Initialize the parameters manager. We need to get stuff from the
142 if (forceReInit) fIsInit = kFALSE;
144 if (what & kBackgroundCorrection) InitBackground();
145 if (what & kEnergyDistributions) InitEnergyDists();
146 if (what & kEventSelectionEfficiency) InitEventSelectionEff();
147 if (what & kSharingEfficiency) InitSharingEff();
151 //____________________________________________________________________
153 void AliFMDAnaParameters::InitBackground() {
155 //AliCDBEntry* background = GetEntry(fgkBackgroundCorrection);
157 TFile* fin = TFile::Open(GetPath(fgkBackgroundID));
161 fBackground = dynamic_cast<AliFMDAnaCalibBackgroundCorrection*>(fin->Get(fgkBackgroundID));
162 if (!fBackground) AliFatal("Invalid background object from CDB");
166 //____________________________________________________________________
168 void AliFMDAnaParameters::InitEnergyDists() {
170 TFile* fin = TFile::Open(GetPath(fgkEnergyDistributionID));
171 //AliCDBEntry* edist = GetEntry(fgkEnergyDists);
174 fEnergyDistribution = dynamic_cast<AliFMDAnaCalibEnergyDistribution*>(fin->Get(fgkEnergyDistributionID));
176 if (!fEnergyDistribution) AliFatal("Invalid background object from CDB");
180 //____________________________________________________________________
182 void AliFMDAnaParameters::InitEventSelectionEff() {
184 //AliCDBEntry* background = GetEntry(fgkBackgroundCorrection);
185 TFile* fin = TFile::Open(GetPath(fgkEventSelectionEffID));
189 fEventSelectionEfficiency = dynamic_cast<AliFMDAnaCalibEventSelectionEfficiency*>(fin->Get(fgkEventSelectionEffID));
190 if (!fEventSelectionEfficiency) AliFatal("Invalid background object from CDB");
193 //____________________________________________________________________
195 void AliFMDAnaParameters::PrintStatus() {
197 TString energystring;
200 energystring.Form("900 GeV"); break;
202 energystring.Form("7000 GeV"); break;
204 energystring.Form("10000 GeV"); break;
206 energystring.Form("14000 GeV"); break;
208 energystring.Form("invalid energy"); break;
210 TString triggerstring;
213 triggerstring.Form("Minimum bias 1"); break;
215 triggerstring.Form("Minimum bias 2"); break;
217 triggerstring.Form("SPD FAST OR"); break;
219 triggerstring.Form("NO TRIGGER TEST"); break;
221 energystring.Form("invalid trigger"); break;
226 magstring.Form("5 kGaus"); break;
228 magstring.Form("0 kGaus"); break;
230 magstring.Form("invalid mag field"); break;
232 TString collsystemstring;
235 collsystemstring.Form("p+p"); break;
237 collsystemstring.Form("Pb+Pb"); break;
239 collsystemstring.Form("invalid collision system"); break;
243 std::cout<<"Energy = "<<energystring.Data()<<std::endl;
244 std::cout<<"Trigger = "<<triggerstring.Data()<<std::endl;
245 std::cout<<"Mag Field = "<<magstring.Data()<<std::endl;
246 std::cout<<"Coll System = "<<collsystemstring.Data()<<std::endl;
252 //____________________________________________________________________
254 void AliFMDAnaParameters::InitSharingEff() {
256 //AliCDBEntry* background = GetEntry(fgkBackgroundCorrection);
257 TFile* fin = TFile::Open(GetPath(fgkSharingEffID));
261 fSharingEfficiency = dynamic_cast<AliFMDAnaCalibSharingEfficiency*>(fin->Get(fgkSharingEffID));
262 if (!fSharingEfficiency) AliFatal("Invalid background object from CDB");
265 //____________________________________________________________________
266 Float_t AliFMDAnaParameters::GetVtxCutZ() {
269 AliWarning("Not initialized yet. Call Init() to remedy");
273 return fBackground->GetVtxCutZ();
276 //____________________________________________________________________
277 Int_t AliFMDAnaParameters::GetNvtxBins() {
280 AliWarning("Not initialized yet. Call Init() to remedy");
284 return fBackground->GetNvtxBins();
286 //____________________________________________________________________
287 TH1F* AliFMDAnaParameters::GetEnergyDistribution(Int_t det, Char_t ring, Float_t eta) {
289 return fEnergyDistribution->GetEnergyDistribution(det, ring, eta);
291 //____________________________________________________________________
292 Float_t AliFMDAnaParameters::GetSigma(Int_t det, Char_t ring, Float_t eta) {
295 AliWarning("Not initialized yet. Call Init() to remedy");
299 TH1F* hEnergyDist = GetEnergyDistribution(det,ring, eta);
300 TF1* fitFunc = hEnergyDist->GetFunction("FMDfitFunc");
302 AliWarning(Form("No function for FMD%d%c, eta %f",det,ring,eta));
305 Float_t sigma = fitFunc->GetParameter(2);
310 //____________________________________________________________________
311 Float_t AliFMDAnaParameters::GetMPV(Int_t det, Char_t ring, Float_t eta) {
314 AliWarning("Not initialized yet. Call Init() to remedy");
318 TH1F* hEnergyDist = GetEnergyDistribution(det,ring,eta);
319 TF1* fitFunc = hEnergyDist->GetFunction("FMDfitFunc");
321 AliWarning(Form("No function for FMD%d%c, eta %f",det,ring,eta));
325 Float_t mpv = fitFunc->GetParameter(1);
328 //____________________________________________________________________
329 Float_t AliFMDAnaParameters::Get2MIPWeight(Int_t det, Char_t ring, Float_t eta) {
332 AliWarning("Not initialized yet. Call Init() to remedy");
336 TH1F* hEnergyDist = GetEnergyDistribution(det,ring,eta);
337 TF1* fitFunc = hEnergyDist->GetFunction("FMDfitFunc");
338 if(!fitFunc) return 0;
339 Float_t twoMIPweight = fitFunc->GetParameter(3);
343 if(twoMIPweight < 1e-05)
348 //____________________________________________________________________
349 Float_t AliFMDAnaParameters::Get3MIPWeight(Int_t det, Char_t ring, Float_t eta) {
352 AliWarning("Not initialized yet. Call Init() to remedy");
356 TH1F* hEnergyDist = GetEnergyDistribution(det,ring,eta);
357 TF1* fitFunc = hEnergyDist->GetFunction("FMDfitFunc");
358 if(!fitFunc) return 0;
359 Float_t threeMIPweight = fitFunc->GetParameter(4);
361 if(threeMIPweight < 1e-05)
364 Float_t twoMIPweight = fitFunc->GetParameter(3);
366 if(twoMIPweight < 1e-05)
369 return threeMIPweight;
371 //____________________________________________________________________
372 Int_t AliFMDAnaParameters::GetNetaBins() {
373 return GetBackgroundCorrection(1,'I',0)->GetNbinsX();
376 //____________________________________________________________________
377 Float_t AliFMDAnaParameters::GetEtaMin() {
379 return GetBackgroundCorrection(1,'I',0)->GetXaxis()->GetXmin();
381 //____________________________________________________________________
382 Float_t AliFMDAnaParameters::GetEtaMax() {
384 return GetBackgroundCorrection(1,'I',0)->GetXaxis()->GetXmax();
387 //____________________________________________________________________
389 TH2F* AliFMDAnaParameters::GetBackgroundCorrection(Int_t det,
394 AliWarning("Not initialized yet. Call Init() to remedy");
400 if(vtxbin > fBackground->GetNvtxBins()) {
401 AliWarning(Form("No background object for vertex bin %d", vtxbin));
405 return fBackground->GetBgCorrection(det,ring,vtxbin);
407 //____________________________________________________________________
409 TH1F* AliFMDAnaParameters::GetDoubleHitCorrection(Int_t det,
413 AliWarning("Not initialized yet. Call Init() to remedy");
417 return fBackground->GetDoubleHitCorrection(det,ring);
419 //_____________________________________________________________________
420 Float_t AliFMDAnaParameters::GetEventSelectionEfficiency(Int_t vtxbin) {
422 AliWarning("Not initialized yet. Call Init() to remedy");
425 return fEventSelectionEfficiency->GetCorrection(vtxbin);
428 //_____________________________________________________________________
429 TH1F* AliFMDAnaParameters::GetSharingEfficiency(Int_t det, Char_t ring, Int_t vtxbin) {
431 AliWarning("Not initialized yet. Call Init() to remedy");
435 return fSharingEfficiency->GetSharingEff(det,ring,vtxbin);
438 //_____________________________________________________________________
439 TH1F* AliFMDAnaParameters::GetSharingEfficiencyTrVtx(Int_t det, Char_t ring, Int_t vtxbin) {
441 AliWarning("Not initialized yet. Call Init() to remedy");
445 return fSharingEfficiency->GetSharingEffTrVtx(det,ring,vtxbin);
448 //_____________________________________________________________________
449 Float_t AliFMDAnaParameters::GetMaxR(Char_t ring) const{
456 AliWarning("Unknown ring - must be I or O!");
460 //_____________________________________________________________________
461 Float_t AliFMDAnaParameters::GetMinR(Char_t ring) const{
468 AliWarning("Unknown ring - must be I or O!");
473 //_____________________________________________________________________
474 void AliFMDAnaParameters::SetCorners(Char_t ring) {
477 fCorner1.Set(4.9895, 15.3560);
478 fCorner2.Set(1.8007, 17.2000);
481 fCorner1.Set(4.2231, 26.6638);
482 fCorner2.Set(1.8357, 27.9500);
486 //_____________________________________________________________________
487 Float_t AliFMDAnaParameters::GetPhiFromSector(UShort_t det, Char_t ring, UShort_t sec) const
489 Int_t nsec = (ring == 'I' ? 20 : 40);
492 basephi = 1.72787594;
493 if(det == 2 && ring == 'I')
494 basephi = 0.15707963;
495 if(det == 2 && ring == 'O')
496 basephi = 0.078539818;
497 if(det == 3 && ring == 'I')
498 basephi = 2.984513044;
499 if(det == 3 && ring == 'O')
500 basephi = 3.06305289;
502 Float_t step = 2*TMath::Pi() / nsec;
505 phi = basephi - sec*step;
507 phi = basephi + sec*step;
510 phi = phi +2*TMath::Pi();
511 if(phi > 2*TMath::Pi() )
512 phi = phi - 2*TMath::Pi();
516 //_____________________________________________________________________
517 Float_t AliFMDAnaParameters::GetEtaFromStrip(UShort_t det, Char_t ring, UShort_t sec, UShort_t strip, Float_t zvtx) const
519 // AliFMDRing fmdring(ring);
521 Float_t rad = GetMaxR(ring)-GetMinR(ring);
522 Float_t nStrips = (ring == 'I' ? 512 : 256);
523 Float_t segment = rad / nStrips;
524 Float_t r = GetMinR(ring) + segment*strip;
526 Int_t hybrid = sec / 2;
529 if(!(hybrid%2)) z = 320.266; else z = 319.766;
531 if(det == 2 && ring == 'I' ) {
532 if(!(hybrid%2)) z = 83.666; else z = 83.166;
534 if(det == 2 && ring == 'O' ) {
535 if(!(hybrid%2)) z = 74.966; else z = 75.466;
537 if(det == 3 && ring == 'I' ) {
538 if(!(hybrid%2)) z = -63.066; else z = -62.566;
540 if(det == 3 && ring == 'O' ) {
541 if(!(hybrid%2)) z = -74.966; else z = -75.466;
544 //std::cout<<det<<" "<<ring<<" "<<sec<<" "<<hybrid<<" "<<z<<std::endl;
546 // Float_t r = TMath::Sqrt(TMath::Power(x,2)+TMath::Power(y,2));
547 Float_t theta = TMath::ATan2(r,z-zvtx);
548 Float_t eta = -1*TMath::Log(TMath::Tan(0.5*theta));
553 //_____________________________________________________________________
555 void AliFMDAnaParameters::GetVertex(AliESDEvent* esd, Double_t* vertexXYZ)
557 const AliESDVertex* vertex = 0;
558 vertex = esd->GetPrimaryVertex();
559 if(!vertex || (vertex->GetXv() < 0.0001 && vertex->GetYv() < 0.0001 && vertex->GetZv() < 0.0001))
560 vertex = esd->GetPrimaryVertexSPD();
561 if(!vertex || (vertex->GetXv() < 0.0001 && vertex->GetYv() < 0.0001 && vertex->GetZv() < 0.0001))
562 vertex = esd->GetPrimaryVertexTPC();
563 if(!vertex || (vertex->GetXv() < 0.0001 && vertex->GetYv() < 0.0001 && vertex->GetZv() < 0.0001))
564 vertex = esd->GetVertex();
565 if (vertex && (vertex->GetXv() > 0.0001 || vertex->GetYv() > 0.0001 || vertex->GetZv() > 0.0010)) {
566 vertex->GetXYZ(vertexXYZ);
569 else { //no valid vertex
581 //____________________________________________________________________
582 Bool_t AliFMDAnaParameters::IsEventTriggered(AliESDEvent *esd) const {
583 // check if the event was triggered
584 ULong64_t triggerMask = esd->GetTriggerMask();
586 // definitions from p-p.cfg
587 ULong64_t spdFO = (1 << 14);
588 ULong64_t v0left = (1 << 11);
589 ULong64_t v0right = (1 << 12);
593 if (triggerMask & spdFO || ((triggerMask & v0left) || (triggerMask & v0right)))
598 if (triggerMask & spdFO && ((triggerMask & v0left) || (triggerMask & v0right)))
603 if (triggerMask & spdFO)
616 //____________________________________________________________________
618 AliFMDAnaParameters::GetStripLength(Char_t ring, UShort_t strip)
620 //AliFMDRing fmdring(ring);
623 Float_t rad = GetMaxR(ring)-GetMinR(ring);
624 Float_t nStrips = (ring == 'I' ? 512 : 256);
625 Float_t segment = rad / nStrips;
627 //TVector2* corner1 = fmdring.GetVertex(2);
628 // TVector2* corner2 = fmdring.GetVertex(3);
632 std::cout<<GetMaxR(ring)<<" "<<fmdring.GetMaxR()<<std::endl;
633 std::cout<<GetMinR(ring)<<" "<<fmdring.GetMinR()<<std::endl;
634 std::cout<<corner1->X()<<" "<<fCorner1.X()<<std::endl;
635 std::cout<<corner2->X()<<" "<<fCorner2.X()<<std::endl;
636 std::cout<<corner1->Y()<<" "<<fCorner1.Y()<<std::endl;
637 std::cout<<corner2->Y()<<" "<<fCorner2.Y()<<std::endl;*/
638 Float_t slope = (fCorner1.Y() - fCorner2.Y()) / (fCorner1.X() - fCorner2.X());
639 Float_t constant = (fCorner2.Y()*fCorner1.X()-(fCorner2.X()*fCorner1.Y())) / (fCorner1.X() - fCorner2.X());
640 Float_t radius = GetMinR(ring) + strip*segment;
642 Float_t d = TMath::Power(TMath::Abs(radius*slope),2) + TMath::Power(radius,2) - TMath::Power(constant,2);
644 Float_t arclength = GetBaseStripLength(ring,strip);
647 Float_t x = (-1*TMath::Sqrt(d) -slope*constant) / (1+TMath::Power(slope,2));
648 Float_t y = slope*x + constant;
649 Float_t theta = TMath::ATan2(x,y);
651 if(x < fCorner1.X() && y > fCorner1.Y()) {
652 arclength = radius*theta; //One sector since theta is by definition half-hybrid
662 //____________________________________________________________________
664 AliFMDAnaParameters::GetBaseStripLength(Char_t ring, UShort_t strip)
666 // AliFMDRing fmdring(ring);
668 Float_t rad = GetMaxR(ring)-GetMinR(ring);
669 Float_t nStrips = (ring == 'I' ? 512 : 256);
670 Float_t nSec = (ring == 'I' ? 20 : 40);
671 Float_t segment = rad / nStrips;
672 Float_t basearc = 2*TMath::Pi() / (0.5*nSec); // One hybrid: 36 degrees inner, 18 outer
673 Float_t radius = GetMinR(ring) + strip*segment;
674 Float_t basearclength = 0.5*basearc * radius; // One sector
676 return basearclength;
678 //____________________________________________________________________