1 //====================================================================
3 // Base class for classes that calculate the multiplicity in the
4 // central region event-by-event
10 // - AliAODCentralMult
15 #include "AliCentralMultiplicityTask.h"
16 #include "AliForwardCorrectionManager.h"
17 #include "AliForwardUtil.h"
19 #include "AliAODHandler.h"
20 #include "AliInputEventHandler.h"
21 #include "AliESDInputHandler.h"
22 #include "AliAnalysisManager.h"
23 #include "AliESDEvent.h"
24 #include "AliMultiplicity.h"
31 //====================================================================
32 AliCentralMultiplicityTask::AliCentralMultiplicityTask(const char* name)
33 : AliAnalysisTaskSE(name),
40 DefineOutput(1, TList::Class());
42 //____________________________________________________________________
43 void AliCentralMultiplicityTask::UserCreateOutputObjects()
46 AliAnalysisManager* am = AliAnalysisManager::GetAnalysisManager();
48 dynamic_cast<AliAODHandler*>(am->GetOutputEventHandler());
49 if (!ah) AliFatal("No AOD output handler set in analysis manager");
52 TObject* obj = &fAODCentral;
53 ah->AddBranch("AliAODCentralMult", &obj);
59 //____________________________________________________________________
60 void AliCentralMultiplicityTask::UserExec(Option_t* /*option*/)
63 AliESDInputHandler* eventHandler =
64 dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()
65 ->GetInputEventHandler());
67 AliWarning("No inputhandler found for this event!");
70 AliESDEvent* esd = eventHandler->GetEvent();
72 //Selecting only events with |valid vertex| < 10 cm
73 const AliESDVertex* vertex = esd->GetPrimaryVertexSPD();
75 if(!(vertex->GetStatus())) return;
76 if(vertex->GetNContributors() <= 0) return ;
77 if(vertex->GetZRes() > 0.1 ) return;
78 Double_t vertexXYZ[3]={0,0,0};
79 vertex->GetXYZ(vertexXYZ);
80 if(TMath::Abs(vertexXYZ[2]) > 10) return;
83 Double_t vertexBinDouble = (vertexXYZ[2] + 10) / delta;
84 //HHD: The vtxbins are 1-10, not 0-9
85 Int_t vtxbin = Int_t(vertexBinDouble + 1) ;
87 // Make sure AOD is filled
88 AliAnalysisManager* am = AliAnalysisManager::GetAnalysisManager();
90 dynamic_cast<AliAODHandler*>(am->GetOutputEventHandler());
92 AliFatal("No AOD output handler set in analysis manager");
94 ah->SetFillAOD(kTRUE);
97 fAODCentral.Clear("");
98 TH2D *aodHist = &(fAODCentral.GetHistogram());
100 const AliMultiplicity* spdmult = esd->GetMultiplicity();
101 //Filling clusters in layer 1 used for tracklets...
102 for(Int_t j = 0; j< spdmult->GetNumberOfTracklets();j++)
103 aodHist->Fill(spdmult->GetEta(j),spdmult->GetPhi(j));
105 //...and then the unused ones in layer 1
106 for(Int_t j = 0; j< spdmult->GetNumberOfSingleClusters();j++)
107 aodHist->Fill(-TMath::Log(TMath::Tan(spdmult->GetThetaSingle(j)/2.)),
108 spdmult->GetPhiSingle(j));
112 TH2D* hSecMap = fManager.GetSecMapCorrection(vtxbin);
113 TH1D* hAcceptance = fManager.GetAcceptanceCorrection(vtxbin);
114 if (!hSecMap) AliFatal("No secondary map!");
115 if (!hAcceptance) AliFatal("No acceptance!");
117 aodHist->Divide(hSecMap);
119 for(Int_t nx = 1; nx <= aodHist->GetNbinsX(); nx++) {
120 Float_t acccor = hAcceptance->GetBinContent(nx);
122 Bool_t etabinSeen = kFALSE;
123 for(Int_t ny = 1; ny <= aodHist->GetNbinsY(); ny++) {
124 Float_t aodvalue = aodHist->GetBinContent(nx,ny);
125 Float_t seccor = hSecMap->GetBinContent(nx,ny);
126 if(seccor > 0.5) etabinSeen = kTRUE;
127 if(aodvalue < 0.000001) { aodHist->SetBinContent(nx,ny, 0); continue; }
129 Float_t aodnew = aodvalue / acccor ;
130 aodHist->SetBinContent(nx,ny, aodnew);
131 Float_t aodErr = aodHist->GetBinError(nx,ny);
132 Float_t accErr = hAcceptance->GetBinError(nx);
133 Float_t error = aodnew *TMath::Sqrt(TMath::Power(aodErr/aodvalue,2) +
134 TMath::Power(accErr/acccor,2) );
135 aodHist->SetBinError(nx,ny,error);
138 //Filling underflow bin if we eta bin is in range
139 if(etabinSeen) aodHist->SetBinContent(nx,0, 1.);
144 //____________________________________________________________________
145 void AliCentralMultiplicityTask::Terminate(Option_t* /*option*/)
148 //____________________________________________________________________
150 AliCentralMultiplicityTask::Print(Option_t* /*option*/) const
153 //====================================================================
154 AliCentralMultiplicityTask::Manager::Manager() :
155 fAcceptancePath("$ALICE_ROOT/PWG2/FORWARD/corrections/CentralAcceptance"),
156 fSecMapPath("$ALICE_ROOT/PWG2/FORWARD/corrections/CentralSecMap"),
159 fAcceptanceName("centralacceptance"),
160 fSecMapName("centralsecmap")
165 //____________________________________________________________________
166 AliCentralMultiplicityTask::Manager::Manager(const Manager& o)
167 :fAcceptancePath(o.fAcceptancePath),
168 fSecMapPath(o.fSecMapPath),
169 fAcceptance(o.fAcceptance),
171 fAcceptanceName(o.fAcceptanceName),
172 fSecMapName(o.fSecMapName)
174 //____________________________________________________________________
175 AliCentralMultiplicityTask::Manager&
176 AliCentralMultiplicityTask::Manager::operator=(const Manager& o)
178 fAcceptancePath = o.fAcceptancePath;
179 fSecMapPath = o.fSecMapPath;
180 fAcceptance = o.fAcceptance;
182 fAcceptanceName = o.fAcceptanceName;
183 fSecMapName = o.fSecMapName;
187 //____________________________________________________________________
189 AliCentralMultiplicityTask::Manager::GetFullFileName(UShort_t what,
195 what == 0 ? GetSecMapPath() : GetAcceptancePath(),
196 GetFileName(what, sys, sNN, field));
199 //____________________________________________________________________
201 AliCentralMultiplicityTask::Manager::GetFileName(UShort_t what ,
206 // Must be static - otherwise the data may disappear on return from
207 // this member function
208 static TString fname = "";
212 case 0: fname.Append(fSecMapName.Data()); break;
213 case 1: fname.Append(fAcceptanceName.Data()); break;
215 ::Error("GetFileName",
216 "Invalid indentifier %d for central object, must be 0 or 1!", what);
219 fname.Append(Form("_%s_%04dGeV_%c%1dkG.root",
220 AliForwardUtil::CollisionSystemString(sys),
221 sNN, (field < 0 ? 'm' : 'p'), TMath::Abs(field)));
226 //____________________________________________________________________
228 AliCentralMultiplicityTask::Manager::GetSecMapCorrection(UShort_t vtxbin) const
231 ::Warning("GetSecMapCorrection","No secondary map defined");
234 return fSecmap->GetCorrection(vtxbin);
236 //____________________________________________________________________
238 AliCentralMultiplicityTask::Manager::GetAcceptanceCorrection(UShort_t vtxbin)
242 ::Warning("GetAcceptanceCorrection","No acceptance map defined");
245 return fAcceptance->GetCorrection(vtxbin);
248 //____________________________________________________________________
250 AliCentralMultiplicityTask::Manager::Init(UShort_t sys,
254 TFile fsec(GetFullFileName(0,sys,sNN,field));
256 dynamic_cast<AliCentralCorrSecondaryMap*>(fsec.Get(fSecMapName.Data()));
258 ::Error("Init", "no central Secondary Map found!") ;
261 TFile facc(GetFullFileName(1,sys,sNN,field));
263 dynamic_cast<AliCentralCorrAcceptance*>(facc.Get(fAcceptanceName.Data()));
265 ::Error("Init", "no central Acceptance found!") ;