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 "AliTriggerAnalysis.h"
36 #include "AliPhysicsSelection.h"
37 #include "AliBackgroundSelection.h"
38 #include "AliMultiplicity.h"
39 #include "AliESDEvent.h"
40 #include "AliESDVertex.h"
42 //====================================================================
43 ClassImp(AliFMDAnaParameters)
45 ; // This is here to keep Emacs for indenting the next line
48 //const char* AliFMDAnaParameters::fgkBackgroundCorrection = "FMD/Correction/Background";
49 //const char* AliFMDAnaParameters::fgkEnergyDists = "FMD/Correction/EnergyDistribution";
50 const char* AliFMDAnaParameters::fgkBackgroundID = "background";
51 const char* AliFMDAnaParameters::fgkEnergyDistributionID = "energydistributions";
52 const char* AliFMDAnaParameters::fgkEventSelectionEffID = "eventselectionefficiency";
53 const char* AliFMDAnaParameters::fgkSharingEffID = "sharingefficiency";
54 //____________________________________________________________________
55 AliFMDAnaParameters* AliFMDAnaParameters::fgInstance = 0;
57 //____________________________________________________________________
60 AliFMDAnaParameters::Instance()
62 // Get static instance
63 if (!fgInstance) fgInstance = new AliFMDAnaParameters;
67 //____________________________________________________________________
68 AliFMDAnaParameters::AliFMDAnaParameters() :
71 fEnergyDistribution(0),
72 fEventSelectionEfficiency(0),
73 fSharingEfficiency(0),
74 fCorner1(4.2231, 26.6638),
75 fCorner2(1.8357, 27.9500),
76 fEnergyPath("$ALICE_ROOT/PWG2/FORWARD/corrections/EnergyDistribution"),
77 fBackgroundPath("$ALICE_ROOT/PWG2/FORWARD/corrections/Background"),
78 fEventSelectionEffPath("$ALICE_ROOT/PWG2/FORWARD/corrections/EventSelectionEfficiency"),
79 fSharingEffPath("$ALICE_ROOT/PWG2/FORWARD/corrections/SharingEfficiency"),
80 fProcessPrimary(kFALSE),
89 fSPDhighLimit(999999999),
90 fCentralSelection(kFALSE)
92 fPhysicsSelection = new AliPhysicsSelection;
93 AliBackgroundSelection* backgroundSelection = new AliBackgroundSelection("bg","bg");
95 fPhysicsSelection->AddBackgroundIdentification(backgroundSelection);
96 //fPhysicsSelection->Initialize(104792);
97 // Do not use this - it is only for IO
99 // Default constructor
101 //____________________________________________________________________
102 char* AliFMDAnaParameters::GetPath(const char* species) {
106 if(species == fgkBackgroundID)
107 path = Form("%s/%s_%d_%d_%d_%d_%d_%d.root",
108 fBackgroundPath.Data(),
116 if(species == fgkEnergyDistributionID)
117 path = Form("%s/%s_%d_%d_%d_%d_%d_%d.root",
119 fgkEnergyDistributionID,
126 if(species == fgkEventSelectionEffID)
127 path = Form("%s/%s_%d_%d_%d_%d_%d_%d.root",
128 fEventSelectionEffPath.Data(),
129 fgkEventSelectionEffID,
136 if(species == fgkSharingEffID)
137 path = Form("%s/%s_%d_%d_%d_%d_%d_%d.root",
138 fSharingEffPath.Data(),
149 //____________________________________________________________________
150 void AliFMDAnaParameters::Init(Bool_t forceReInit, UInt_t what)
152 // Initialize the parameters manager. We need to get stuff from the
154 if (forceReInit) fIsInit = kFALSE;
156 if (what & kBackgroundCorrection) InitBackground();
157 if (what & kEnergyDistributions) InitEnergyDists();
158 if (what & kEventSelectionEfficiency) InitEventSelectionEff();
159 if (what & kSharingEfficiency) InitSharingEff();
165 //____________________________________________________________________
167 void AliFMDAnaParameters::InitBackground() {
169 //AliCDBEntry* background = GetEntry(fgkBackgroundCorrection);
171 TFile* fin = TFile::Open(GetPath(fgkBackgroundID));
175 fBackground = dynamic_cast<AliFMDAnaCalibBackgroundCorrection*>(fin->Get(fgkBackgroundID));
176 if (!fBackground) AliFatal("Invalid background object from CDB");
180 //____________________________________________________________________
182 void AliFMDAnaParameters::InitEnergyDists() {
184 TFile* fin = TFile::Open(GetPath(fgkEnergyDistributionID));
185 //AliCDBEntry* edist = GetEntry(fgkEnergyDists);
188 fEnergyDistribution = dynamic_cast<AliFMDAnaCalibEnergyDistribution*>(fin->Get(fgkEnergyDistributionID));
190 if (!fEnergyDistribution) AliFatal("Invalid background object from CDB");
194 //____________________________________________________________________
196 void AliFMDAnaParameters::InitEventSelectionEff() {
198 //AliCDBEntry* background = GetEntry(fgkBackgroundCorrection);
199 TFile* fin = TFile::Open(GetPath(fgkEventSelectionEffID));
203 fEventSelectionEfficiency = dynamic_cast<AliFMDAnaCalibEventSelectionEfficiency*>(fin->Get(fgkEventSelectionEffID));
204 if (!fEventSelectionEfficiency) AliFatal("Invalid background object from CDB");
207 //____________________________________________________________________
209 void AliFMDAnaParameters::PrintStatus() const
212 TString energystring;
215 energystring.Form("900 GeV"); break;
217 energystring.Form("7000 GeV"); break;
219 energystring.Form("10000 GeV"); break;
221 energystring.Form("14000 GeV"); break;
223 energystring.Form("invalid energy"); break;
225 TString triggerstring;
228 triggerstring.Form("Minimum bias 1"); break;
230 triggerstring.Form("Minimum bias 2"); break;
232 triggerstring.Form("SPD FAST OR"); break;
234 triggerstring.Form("NO TRIGGER TEST"); break;
236 energystring.Form("invalid trigger"); break;
241 magstring.Form("5 kGaus"); break;
243 magstring.Form("0 kGaus"); break;
245 magstring.Form("invalid mag field"); break;
247 TString collsystemstring;
250 collsystemstring.Form("p+p"); break;
252 collsystemstring.Form("Pb+Pb"); break;
254 collsystemstring.Form("invalid collision system"); break;
258 std::cout<<"Energy = "<<energystring.Data()<<std::endl;
259 std::cout<<"Trigger = "<<triggerstring.Data()<<std::endl;
260 std::cout<<"Mag Field = "<<magstring.Data()<<std::endl;
261 std::cout<<"Coll System = "<<collsystemstring.Data()<<std::endl;
267 //____________________________________________________________________
269 void AliFMDAnaParameters::InitSharingEff() {
271 //AliCDBEntry* background = GetEntry(fgkBackgroundCorrection);
272 TFile* fin = TFile::Open(GetPath(fgkSharingEffID));
276 fSharingEfficiency = dynamic_cast<AliFMDAnaCalibSharingEfficiency*>(fin->Get(fgkSharingEffID));
277 if (!fSharingEfficiency) AliFatal("Invalid background object from CDB");
280 //____________________________________________________________________
281 Float_t AliFMDAnaParameters::GetVtxCutZ() {
284 AliWarning("Not initialized yet. Call Init() to remedy");
288 return fBackground->GetVtxCutZ();
291 //____________________________________________________________________
292 Int_t AliFMDAnaParameters::GetNvtxBins() {
295 AliWarning("Not initialized yet. Call Init() to remedy");
299 return fBackground->GetNvtxBins();
301 //____________________________________________________________________
302 TH1F* AliFMDAnaParameters::GetEnergyDistribution(Int_t det, Char_t ring, Float_t eta) {
304 return fEnergyDistribution->GetEnergyDistribution(det, ring, eta);
306 //____________________________________________________________________
307 TH1F* AliFMDAnaParameters::GetEmptyEnergyDistribution(Int_t det, Char_t ring) {
309 return fEnergyDistribution->GetEmptyEnergyDistribution(det, ring);
311 //____________________________________________________________________
312 TH1F* AliFMDAnaParameters::GetRingEnergyDistribution(Int_t det, Char_t ring) {
314 return fEnergyDistribution->GetRingEnergyDistribution(det, ring);
316 //____________________________________________________________________
317 Float_t AliFMDAnaParameters::GetSigma(Int_t det, Char_t ring, Float_t eta) {
320 AliWarning("Not initialized yet. Call Init() to remedy");
324 TH1F* hEnergyDist = GetEnergyDistribution(det,ring, eta);
325 TF1* fitFunc = hEnergyDist->GetFunction("FMDfitFunc");
327 //AliWarning(Form("No function for FMD%d%c, eta %f",det,ring,eta));
330 Float_t sigma = fitFunc->GetParameter(2);
335 //____________________________________________________________________
336 Float_t AliFMDAnaParameters::GetMPV(Int_t det, Char_t ring, Float_t eta) {
339 AliWarning("Not initialized yet. Call Init() to remedy");
342 //AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
343 TH1F* hEnergyDist = GetEnergyDistribution(det,ring,eta);
344 TF1* fitFunc = hEnergyDist->GetFunction("FMDfitFunc");
346 AliWarning(Form("No function for FMD%d%c, eta %f",det,ring,eta));
347 std::cout<<hEnergyDist->GetEntries()<<" "<<GetEtaBin(eta)<<std::endl;
351 Float_t mpv = fitFunc->GetParameter(1);
354 //____________________________________________________________________
355 Float_t AliFMDAnaParameters::GetConstant(Int_t det, Char_t ring, Float_t eta) {
358 AliWarning("Not initialized yet. Call Init() to remedy");
362 TH1F* hEnergyDist = GetEnergyDistribution(det,ring,eta);
363 TF1* fitFunc = hEnergyDist->GetFunction("FMDfitFunc");
365 AliWarning(Form("No function for FMD%d%c, eta %f",det,ring,eta));
369 Float_t mpv = fitFunc->GetParameter(0);
372 //____________________________________________________________________
373 Float_t AliFMDAnaParameters::Get2MIPWeight(Int_t det, Char_t ring, Float_t eta) {
376 AliWarning("Not initialized yet. Call Init() to remedy");
380 TH1F* hEnergyDist = GetEnergyDistribution(det,ring,eta);
381 TF1* fitFunc = hEnergyDist->GetFunction("FMDfitFunc");
382 if(!fitFunc) return 0;
383 Float_t twoMIPweight = fitFunc->GetParameter(3);
387 if(twoMIPweight < 1e-05)
392 //____________________________________________________________________
393 Float_t AliFMDAnaParameters::Get3MIPWeight(Int_t det, Char_t ring, Float_t eta) {
396 AliWarning("Not initialized yet. Call Init() to remedy");
400 TH1F* hEnergyDist = GetEnergyDistribution(det,ring,eta);
401 TF1* fitFunc = hEnergyDist->GetFunction("FMDfitFunc");
402 if(!fitFunc) return 0;
403 Float_t threeMIPweight = fitFunc->GetParameter(4);
405 if(threeMIPweight < 1e-05)
408 Float_t twoMIPweight = fitFunc->GetParameter(3);
410 if(twoMIPweight < 1e-05)
413 return threeMIPweight;
415 //____________________________________________________________________
416 Int_t AliFMDAnaParameters::GetNetaBins() {
417 return GetBackgroundCorrection(1,'I',0)->GetNbinsX();
420 //____________________________________________________________________
421 Float_t AliFMDAnaParameters::GetEtaMin() {
423 return GetBackgroundCorrection(1,'I',0)->GetXaxis()->GetXmin();
425 //____________________________________________________________________
426 Float_t AliFMDAnaParameters::GetEtaMax() {
428 return GetBackgroundCorrection(1,'I',0)->GetXaxis()->GetXmax();
431 //____________________________________________________________________
432 Int_t AliFMDAnaParameters::GetEtaBin(Float_t eta) {
433 TAxis testaxis(GetNetaBins(),GetEtaMin(),GetEtaMax());
434 Int_t binnumber = testaxis.FindBin(eta) ;
439 //____________________________________________________________________
441 TH2F* AliFMDAnaParameters::GetBackgroundCorrection(Int_t det,
446 AliWarning("Not initialized yet. Call Init() to remedy");
452 if(vtxbin > fBackground->GetNvtxBins()) {
453 AliWarning(Form("No background object for vertex bin %d", vtxbin));
457 return fBackground->GetBgCorrection(det,ring,vtxbin);
459 //____________________________________________________________________
461 TH1F* AliFMDAnaParameters::GetDoubleHitCorrection(Int_t det,
465 AliWarning("Not initialized yet. Call Init() to remedy");
469 return fBackground->GetDoubleHitCorrection(det,ring);
471 //_____________________________________________________________________
472 Float_t AliFMDAnaParameters::GetEventSelectionEfficiency(Int_t vtxbin) {
474 AliWarning("Not initialized yet. Call Init() to remedy");
477 return fEventSelectionEfficiency->GetCorrection(vtxbin);
480 //_____________________________________________________________________
481 TH1F* AliFMDAnaParameters::GetSharingEfficiency(Int_t det, Char_t ring, Int_t vtxbin) {
483 AliWarning("Not initialized yet. Call Init() to remedy");
487 return fSharingEfficiency->GetSharingEff(det,ring,vtxbin);
490 //_____________________________________________________________________
491 TH1F* AliFMDAnaParameters::GetSharingEfficiencyTrVtx(Int_t det, Char_t ring, Int_t vtxbin) {
493 AliWarning("Not initialized yet. Call Init() to remedy");
497 return fSharingEfficiency->GetSharingEffTrVtx(det,ring,vtxbin);
500 //_____________________________________________________________________
501 Float_t AliFMDAnaParameters::GetMaxR(Char_t ring) const{
508 AliWarning("Unknown ring - must be I or O!");
512 //_____________________________________________________________________
513 Float_t AliFMDAnaParameters::GetMinR(Char_t ring) const{
520 AliWarning("Unknown ring - must be I or O!");
525 //_____________________________________________________________________
526 void AliFMDAnaParameters::SetCorners(Char_t ring) {
529 fCorner1.Set(4.9895, 15.3560);
530 fCorner2.Set(1.8007, 17.2000);
533 fCorner1.Set(4.2231, 26.6638);
534 fCorner2.Set(1.8357, 27.9500);
538 //_____________________________________________________________________
539 Float_t AliFMDAnaParameters::GetPhiFromSector(UShort_t det, Char_t ring, UShort_t sec) const
541 Int_t nsec = (ring == 'I' ? 20 : 40);
544 basephi = 1.72787594;
545 if(det == 2 && ring == 'I')
546 basephi = 0.15707963;
547 if(det == 2 && ring == 'O')
548 basephi = 0.078539818;
549 if(det == 3 && ring == 'I')
550 basephi = 2.984513044;
551 if(det == 3 && ring == 'O')
552 basephi = 3.06305289;
554 Float_t step = 2*TMath::Pi() / nsec;
557 phi = basephi - sec*step;
559 phi = basephi + sec*step;
562 phi = phi +2*TMath::Pi();
563 if(phi > 2*TMath::Pi() )
564 phi = phi - 2*TMath::Pi();
568 //_____________________________________________________________________
569 Float_t AliFMDAnaParameters::GetEtaFromStrip(UShort_t det, Char_t ring, UShort_t sec, UShort_t strip, Float_t zvtx) const
571 // AliFMDRing fmdring(ring);
573 Float_t rad = GetMaxR(ring)-GetMinR(ring);
574 Float_t nStrips = (ring == 'I' ? 512 : 256);
575 Float_t segment = rad / nStrips;
576 Float_t r = GetMinR(ring) + segment*strip;
578 Int_t hybrid = sec / 2;
581 if(!(hybrid%2)) z = 320.266; else z = 319.766;
583 if(det == 2 && ring == 'I' ) {
584 if(!(hybrid%2)) z = 83.666; else z = 83.166;
586 if(det == 2 && ring == 'O' ) {
587 if(!(hybrid%2)) z = 74.966; else z = 75.466;
589 if(det == 3 && ring == 'I' ) {
590 if(!(hybrid%2)) z = -63.066; else z = -62.566;
592 if(det == 3 && ring == 'O' ) {
593 if(!(hybrid%2)) z = -74.966; else z = -75.466;
596 //std::cout<<det<<" "<<ring<<" "<<sec<<" "<<hybrid<<" "<<z<<std::endl;
598 // Float_t r = TMath::Sqrt(TMath::Power(x,2)+TMath::Power(y,2));
599 Float_t theta = TMath::ATan2(r,z-zvtx);
600 Float_t eta = -1*TMath::Log(TMath::Tan(0.5*theta));
605 //_____________________________________________________________________
607 Bool_t AliFMDAnaParameters::GetVertex(const AliESDEvent* esd, Double_t* vertexXYZ)
609 const AliESDVertex* vertex = 0;
610 vertex = esd->GetPrimaryVertexSPD();
613 vertex->GetXYZ(vertexXYZ);
615 //if(vertexXYZ[0] == 0 || vertexXYZ[1] == 0 )
618 if(vertex->GetNContributors() <= 0)
621 if(vertex->GetZRes() > 0.1 )
624 return vertex->GetStatus();
627 //____________________________________________________________________
628 Bool_t AliFMDAnaParameters::IsEventTriggered(const AliESDEvent *esd, Trigger trig) {
630 Trigger old = fTrigger;
632 Bool_t retval = IsEventTriggered(esd);
637 //____________________________________________________________________
638 Bool_t AliFMDAnaParameters::IsEventTriggered(const AliESDEvent *esd) const {
639 // check if the event was triggered
641 if (fCentralSelection) return kTRUE;
642 ULong64_t triggerMask = esd->GetTriggerMask();
644 TString triggers = esd->GetFiredTriggerClasses();
646 //if(triggers.Contains("CINT1B-ABCE-NOPF-ALL") || triggers.Contains("CINT1B-E-NOPF-ALL")) return kTRUE;
647 //else return kFALSE;
648 //if(triggers.Contains("CINT1B-E-NOPF-ALL")) return kFALSE;
650 // if(triggers.Contains("CINT1A-ABCE-NOPF-ALL")) return kFALSE;
651 // if(triggers.Contains("CINT1C-ABCE-NOPF-ALL")) return kFALSE;
653 // definitions from p-p.cfg
654 ULong64_t spdFO = (1 << 14);
655 ULong64_t v0left = (1 << 11);
656 ULong64_t v0right = (1 << 12);
657 AliTriggerAnalysis tAna;
659 //REMOVE WHEN FINISHED PLAYING WITH TRIGGERS!
660 //fPhysicsSelection->IsCollisionCandidate(esd);
666 if( fPhysicsSelection->IsCollisionCandidate(esd))
670 if (triggerMask & spdFO || ((triggerMask & v0left) || (triggerMask & v0right)))
676 if (triggerMask & spdFO && ((triggerMask & v0left) || (triggerMask & v0right)))
681 if (triggerMask & spdFO)
690 const AliMultiplicity* testmult = esd->GetMultiplicity();
691 Int_t nTrackLets = testmult->GetNumberOfTracklets();
692 Int_t nClusters = testmult->GetNumberOfSingleClusters();
693 Int_t fastOR = tAna.SPDFiredChips(esd, 0);
695 const AliESDVertex* vertex = 0;
696 vertex = esd->GetPrimaryVertexSPD();
697 Bool_t vtxstatus = vertex->GetStatus();
698 if(vertex->GetNContributors() <= 0)
701 if(vertex->GetZRes() > 0.1 )
704 Bool_t v0ABG = tAna.IsOfflineTriggerFired(esd, AliTriggerAnalysis::kV0ABG);
706 Bool_t v0CBG = tAna.IsOfflineTriggerFired(esd, AliTriggerAnalysis::kV0CBG);
707 Bool_t v0A = tAna.IsOfflineTriggerFired(esd, AliTriggerAnalysis::kV0A);
708 Bool_t v0C = tAna.IsOfflineTriggerFired(esd, AliTriggerAnalysis::kV0C);
709 if(triggers.Contains("CINT1A-ABCE-NOPF-ALL") || triggers.Contains("CINT1C-ABCE-NOPF-ALL"))
719 //____________________________________________________________________
721 AliFMDAnaParameters::GetStripLength(Char_t ring, UShort_t strip)
723 //AliFMDRing fmdring(ring);
726 Float_t rad = GetMaxR(ring)-GetMinR(ring);
727 Float_t nStrips = (ring == 'I' ? 512 : 256);
728 Float_t segment = rad / nStrips;
730 //TVector2* corner1 = fmdring.GetVertex(2);
731 // TVector2* corner2 = fmdring.GetVertex(3);
735 std::cout<<GetMaxR(ring)<<" "<<fmdring.GetMaxR()<<std::endl;
736 std::cout<<GetMinR(ring)<<" "<<fmdring.GetMinR()<<std::endl;
737 std::cout<<corner1->X()<<" "<<fCorner1.X()<<std::endl;
738 std::cout<<corner2->X()<<" "<<fCorner2.X()<<std::endl;
739 std::cout<<corner1->Y()<<" "<<fCorner1.Y()<<std::endl;
740 std::cout<<corner2->Y()<<" "<<fCorner2.Y()<<std::endl;*/
741 Float_t slope = (fCorner1.Y() - fCorner2.Y()) / (fCorner1.X() - fCorner2.X());
742 Float_t constant = (fCorner2.Y()*fCorner1.X()-(fCorner2.X()*fCorner1.Y())) / (fCorner1.X() - fCorner2.X());
743 Float_t radius = GetMinR(ring) + strip*segment;
745 Float_t d = TMath::Power(TMath::Abs(radius*slope),2) + TMath::Power(radius,2) - TMath::Power(constant,2);
747 Float_t arclength = GetBaseStripLength(ring,strip);
750 Float_t x = (-1*TMath::Sqrt(d) -slope*constant) / (1+TMath::Power(slope,2));
751 Float_t y = slope*x + constant;
752 Float_t theta = TMath::ATan2(x,y);
754 if(x < fCorner1.X() && y > fCorner1.Y()) {
755 arclength = radius*theta; //One sector since theta is by definition half-hybrid
765 //____________________________________________________________________
767 AliFMDAnaParameters::GetBaseStripLength(Char_t ring, UShort_t strip)
769 // AliFMDRing fmdring(ring);
771 Float_t rad = GetMaxR(ring)-GetMinR(ring);
772 Float_t nStrips = (ring == 'I' ? 512 : 256);
773 Float_t nSec = (ring == 'I' ? 20 : 40);
774 Float_t segment = rad / nStrips;
775 Float_t basearc = 2*TMath::Pi() / (0.5*nSec); // One hybrid: 36 degrees inner, 18 outer
776 Float_t radius = GetMinR(ring) + strip*segment;
777 Float_t basearclength = 0.5*basearc * radius; // One sector
779 return basearclength;
781 //____________________________________________________________________