]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGPP/VZERO/AliAnaVZEROEPFlatenning.cxx
Reading PMT gains from an external file
[u/mrichter/AliRoot.git] / PWGPP / VZERO / AliAnaVZEROEPFlatenning.cxx
CommitLineData
345e2385 1#include <stdio.h>
2#include <stdlib.h>
3
4#include "TH2F.h"
5#include "TFile.h"
6#include "TProfile.h"
7#include "TList.h"
8#include "TChain.h"
9
10#include "AliAnalysisTask.h"
11#include "AliAnalysisManager.h"
12
6b4456fd 13#include "AliVEvent.h"
345e2385 14#include "AliESDEvent.h"
6b4456fd 15#include "AliAODEvent.h"
16#include "AliInputEventHandler.h"
345e2385 17#include "AliAnaVZEROEPFlatenning.h"
18#include "AliCentrality.h"
19#include "AliEventplane.h"
20
21// VZERO includes
6b4456fd 22#include "AliVVZERO.h"
345e2385 23
24ClassImp(AliAnaVZEROEPFlatenning)
25
26AliAnaVZEROEPFlatenning::AliAnaVZEROEPFlatenning()
6b4456fd 27 : AliAnalysisTaskSE("AliAnaVZEROEPFlatenning"), fEvent(0), fOutputList(0),
345e2385 28 fMBTrigName("CPBI"),
fe509094 29 fUsePhysSel(kFALSE),
30 fPsiAC(NULL),
31 fPsiACOrg(NULL)
345e2385 32{
33 // Default constructor
34 // Init pointers
35 for(Int_t i = 0; i < 8; ++i) fX2[i] = fY2[i] = fX2Y2[i] = fCos8Psi[i] = NULL;
36 for(Int_t i = 0; i < 8; ++i) fX2In[i] = fY2In[i] = fX2Y2In[i] = fCos8PsiIn[i] = NULL;
37 for(Int_t i = 0; i < 8; ++i) fPsiRingRawCentr[i] = fPsiRingFlatCentr[i] = fPsiRingFlatFinalCentr[i] = NULL;
fe509094 38 for(Int_t i = 0; i < 8; ++i) fC2[i] = fS2[i] = fC4[i] = fS4[i] = NULL;
345e2385 39 // Define input and output slots here
40 // Input slot #0 works with a TChain
41 DefineInput(0, TChain::Class());
42 // Output slot #0 id reserved by the base class for AOD
43 // Output slot #1 writes into a TH1 container
44 DefineOutput(1, TList::Class());
45}
46
47//________________________________________________________________________
48AliAnaVZEROEPFlatenning::AliAnaVZEROEPFlatenning(const char *name)
6b4456fd 49 : AliAnalysisTaskSE(name), fEvent(0), fOutputList(0),
345e2385 50 fMBTrigName("CPBI"),
fe509094 51 fUsePhysSel(kFALSE),
52 fPsiAC(NULL),
53 fPsiACOrg(NULL)
345e2385 54{
55 // Constructor
56 // Init pointers
57 for(Int_t i = 0; i < 8; ++i) fX2[i] = fY2[i] = fX2Y2[i] = fCos8Psi[i] = NULL;
58 for(Int_t i = 0; i < 8; ++i) fX2In[i] = fY2In[i] = fX2Y2In[i] = fCos8PsiIn[i] = NULL;
59 for(Int_t i = 0; i < 8; ++i) fPsiRingRawCentr[i] = fPsiRingFlatCentr[i] = fPsiRingFlatFinalCentr[i] = NULL;
fe509094 60 for(Int_t i = 0; i < 8; ++i) fC2[i] = fS2[i] = fC4[i] = fS4[i] = NULL;
345e2385 61 // Define input and output slots here
62 // Input slot #0 works with a TChain
63 DefineInput(0, TChain::Class());
64 // Output slot #0 id reserved by the base class for AOD
65 // Output slot #1 writes into a TH1 container
66 DefineOutput(1, TList::Class());
67}
68
69//________________________________________________________________________
70void AliAnaVZEROEPFlatenning::SetInput(const char *filename)
71{
72 // Read recentering
73 // parameters from an input file
74
75 AliInfo(Form("Reading input histograms from %s",filename));
76 TFile *f = TFile::Open(filename);
77 TList *list = (TList*)f->Get("coutput");
78
79 for(Int_t i = 0; i < 8; ++i) {
80 fX2In[i] = (TProfile*)list->FindObject(Form("fX2_%d",i))->Clone(Form("fX2In_%d",i));
81 fX2In[i]->SetDirectory(0);
82 fY2In[i] = (TProfile*)list->FindObject(Form("fY2_%d",i))->Clone(Form("fY2In_%d",i));
83 fY2In[i]->SetDirectory(0);
84 fX2Y2In[i] = (TProfile*)list->FindObject(Form("fX2Y2_%d",i))->Clone(Form("fX2Y2In_%d",i));
85 fX2Y2In[i]->SetDirectory(0);
86 fCos8PsiIn[i] = (TProfile*)list->FindObject(Form("fCos8Psi_%d",i))->Clone(Form("fCos8PsiIn_%d",i));
87 fCos8PsiIn[i]->SetDirectory(0);
88 }
89 f->Close();
90}
91
92//________________________________________________________________________
93void AliAnaVZEROEPFlatenning::UserCreateOutputObjects()
94{
95 // Create histograms
96 // Called once
97
98 fOutputList = new TList();
99 fOutputList->SetOwner(kTRUE);
100
101 for(Int_t i = 0; i < 8; ++i) {
102 fX2[i] = new TProfile(Form("fX2_%d",i),"",21,0,105,"s");
103 fOutputList->Add(fX2[i]);
104 fY2[i] = new TProfile(Form("fY2_%d",i),"",21,0,105,"s");
105 fOutputList->Add(fY2[i]);
106 fX2Y2[i] = new TProfile(Form("fX2Y2_%d",i),"",21,0,105,"s");
107 fOutputList->Add(fX2Y2[i]);
108 fCos8Psi[i] = new TProfile(Form("fCos8Psi_%d",i),"",21,0,105,"s");
109 fOutputList->Add(fCos8Psi[i]);
110 }
111
112 for(Int_t i = 0; i < 8; ++i) {
113 fPsiRingRawCentr[i] = new TH2F(Form("fPsiRingRawCentr_%d",i),"",105,0,105,100,-TMath::Pi()/2,TMath::Pi()/2);
114 fOutputList->Add(fPsiRingRawCentr[i]);
115 fPsiRingFlatCentr[i] = new TH2F(Form("fPsiRingFlatCentr_%d",i),"",105,0,105,100,-TMath::Pi()/2,TMath::Pi()/2);
116 fOutputList->Add(fPsiRingFlatCentr[i]);
117 fPsiRingFlatFinalCentr[i] = new TH2F(Form("fPsiRingFlatFinalCentr_%d",i),"",105,0,105,100,-TMath::Pi()/2,TMath::Pi()/2);
118 fOutputList->Add(fPsiRingFlatFinalCentr[i]);
119 }
120
fe509094 121 for(Int_t i = 0; i < 8; ++i) {
122 fC2[i] = new TProfile(Form("fC2_%d",i),"",21,0,105,"s");
123 fOutputList->Add(fC2[i]);
124 fS2[i] = new TProfile(Form("fS2_%d",i),"",21,0,105,"s");
125 fOutputList->Add(fS2[i]);
126 fC4[i] = new TProfile(Form("fC4_%d",i),"",21,0,105,"s");
127 fOutputList->Add(fC4[i]);
128 fS4[i] = new TProfile(Form("fS4_%d",i),"",21,0,105,"s");
129 fOutputList->Add(fS4[i]);
130 }
131
132 fPsiAC = new TH2F("fPsiAC","",100,-TMath::Pi()/2,TMath::Pi()/2,100,-TMath::Pi()/2,TMath::Pi()/2);
133 fOutputList->Add(fPsiAC);
134 fPsiACOrg = new TH2F("fPsiACOrg","",100,-TMath::Pi()/2,TMath::Pi()/2,100,-TMath::Pi()/2,TMath::Pi()/2);
135 fOutputList->Add(fPsiACOrg);
136
345e2385 137 PostData(1, fOutputList);
138}
139
140//________________________________________________________________________
141void AliAnaVZEROEPFlatenning::Init()
142{
143 // Nothing here
144 // ....
145}
146
147//________________________________________________________________________
148void AliAnaVZEROEPFlatenning::UserExec(Option_t *)
149{
150 // Main loop
151 // Called for each event
152
153
6b4456fd 154 fEvent = InputEvent();
155 if (!fEvent) {
156 printf("ERROR: fEvent not available\n");
345e2385 157 return;
158 }
159
6b4456fd 160 AliVVZERO* esdV0 = fEvent->GetVZEROData();
345e2385 161 if (!esdV0) {
6b4456fd 162 Printf("ERROR: esd/aod V0 not available");
345e2385 163 return;
164 }
165
345e2385 166 // Phys sel
167 Bool_t goodEvent = kTRUE;
168 Bool_t isSelected;
169 if (fUsePhysSel)
6b4456fd 170 isSelected = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & (AliVEvent::kMB | AliVEvent::kSemiCentral));
345e2385 171 else
172 isSelected = ((esdV0->GetV0ADecision()==1) && (esdV0->GetV0CDecision()==1));
173
174 if (!isSelected) goodEvent = kFALSE;
175
6b4456fd 176 AliCentrality *centrality = fEvent->GetCentrality();
345e2385 177 // Float_t percentile = centrality->GetCentralityPercentile("V0M");
178 Float_t spdPercentile = centrality->GetCentralityPercentile("CL1");
179
6b4456fd 180 TString inputDataType = AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()->GetDataType(); // can be "ESD" or "AOD"
181 if (inputDataType == "ESD") {
182 AliESDEvent* esdEvent = static_cast<AliESDEvent*>(fEvent);
183 // Trigger
184 TString trigStr(esdEvent->GetFiredTriggerClasses());
185 if (!trigStr.Contains("-B-")) return;
186 if (!trigStr.Contains(fMBTrigName.Data())) return;
187
188 const AliESDVertex *primaryVtx = esdEvent->GetPrimaryVertexSPD();
189 if (!primaryVtx) goodEvent = kFALSE;
190 if (!primaryVtx->GetStatus()) goodEvent = kFALSE;
191 Double_t tPrimaryVtxPosition[3];
192 primaryVtx->GetXYZ(tPrimaryVtxPosition);
193 if (TMath::Abs(tPrimaryVtxPosition[2]) > 10.0) goodEvent = kFALSE;
194 }
195 else if (inputDataType == "AOD") {
196 AliAODEvent* aodEvent = static_cast<AliAODEvent*>(fEvent);
197 // Trigger
198 TString trigStr(aodEvent->GetHeader()->GetFiredTriggerClasses());
199 if (!trigStr.Contains("-B-")) return;
200 if (!trigStr.Contains(fMBTrigName.Data())) return;
201
202 const AliAODVertex *primaryVtx = aodEvent->GetPrimaryVertexSPD();
203 if (!primaryVtx) goodEvent = kFALSE;
204 if (primaryVtx->GetNContributors()==0) goodEvent = kFALSE;
205 Double_t tPrimaryVtxPosition[3];
206 primaryVtx->GetXYZ(tPrimaryVtxPosition);
207 if (TMath::Abs(tPrimaryVtxPosition[2]) > 10.0) goodEvent = kFALSE;
208 }
209 else {
210 AliFatal("Trying to get the vertex from neither ESD nor AOD event!");
211 return;
212 }
345e2385 213
214 if (goodEvent) {
fe509094 215 Double_t qxTierce[8],qyTierce[8];
345e2385 216 for(Int_t iring = 0; iring < 8; ++iring) {
fe509094 217 qxTierce[iring] = qyTierce[iring] = 0.;
345e2385 218 Double_t c2 = 0;
219 Double_t s2 = 0;
345e2385 220 Double_t totMult = 0;
221 for(Int_t iCh = iring*8; iCh < (iring+1)*8; ++iCh) {
222 Double_t phi = TMath::Pi()/8. + TMath::Pi()/4.*(iCh%8);
6b4456fd 223 c2 += fEvent->GetVZEROEqMultiplicity(iCh)*TMath::Cos(2.*phi);
224 s2 += fEvent->GetVZEROEqMultiplicity(iCh)*TMath::Sin(2.*phi);
225 if (fEvent->GetVZEROEqMultiplicity(iCh) > 1e-6) {
226 fC2[iring]->Fill(spdPercentile,TMath::Cos(2.*phi),fEvent->GetVZEROEqMultiplicity(iCh));
227 fS2[iring]->Fill(spdPercentile,TMath::Sin(2.*phi),fEvent->GetVZEROEqMultiplicity(iCh));
228 fC4[iring]->Fill(spdPercentile,TMath::Cos(4.*phi),fEvent->GetVZEROEqMultiplicity(iCh));
229 fS4[iring]->Fill(spdPercentile,TMath::Sin(4.*phi),fEvent->GetVZEROEqMultiplicity(iCh));
fe509094 230 }
6b4456fd 231 totMult += fEvent->GetVZEROEqMultiplicity(iCh);
345e2385 232 }
233 if (totMult < 1e-6) continue;
234
235 fX2[iring]->Fill(spdPercentile,c2);
236 fY2[iring]->Fill(spdPercentile,s2);
237 fX2Y2[iring]->Fill(spdPercentile,c2*s2);
238
fe509094 239 Double_t qxOut = 0, qyOut = 0;
6b4456fd 240 Double_t psiRingRaw = fEvent->GetEventplane()->CalculateVZEROEventPlane(fEvent,iring,iring,2,qxOut,qyOut);
345e2385 241 fPsiRingRawCentr[iring]->Fill(spdPercentile,psiRingRaw);
6b4456fd 242 Double_t psiRingFlat2 = CalculateVZEROEventPlane(fEvent,iring,spdPercentile,qxTierce[iring],qyTierce[iring]);
345e2385 243 fPsiRingFlatCentr[iring]->Fill(spdPercentile,psiRingFlat2);
244 fCos8Psi[iring]->Fill(spdPercentile, 2./4.*TMath::Cos(2.*4.*psiRingFlat2));
245 Int_t ibin = fCos8PsiIn[iring]->FindBin(spdPercentile);
246 Double_t psiRingFlatFinal = psiRingFlat2 + (fCos8PsiIn[iring]->GetBinContent(ibin)*TMath::Sin(2.*4.*psiRingFlat2))/2.;
247 if (psiRingFlatFinal > TMath::Pi()/2) psiRingFlatFinal -= TMath::Pi();
248 if (psiRingFlatFinal <-TMath::Pi()/2) psiRingFlatFinal += TMath::Pi();
249 fPsiRingFlatFinalCentr[iring]->Fill(spdPercentile,psiRingFlatFinal);
250 }
fe509094 251 Double_t qxA = qxTierce[4] + qxTierce[5] + qxTierce[6] + qxTierce[7];
252 Double_t qyA = qyTierce[4] + qyTierce[5] + qyTierce[6] + qyTierce[7];
253 Double_t qxC = qxTierce[0] + qxTierce[1] + qxTierce[2] + qxTierce[3];
254 Double_t qyC = qyTierce[0] + qyTierce[1] + qyTierce[2] + qyTierce[3];
255 Double_t psiA = TMath::ATan2(qyA,qxA)/2.;
256 Double_t psiC = TMath::ATan2(qyC,qxC)/2.;
257
258 fPsiAC->Fill(psiA,psiC);
6b4456fd 259 Double_t psiAOrg = fEvent->GetEventplane()->GetEventplane("V0A",fEvent,2);
260 Double_t psiCOrg = fEvent->GetEventplane()->GetEventplane("V0C",fEvent,2);
fe509094 261 fPsiACOrg->Fill(psiAOrg,psiCOrg);
345e2385 262 }
263
264 PostData(1, fOutputList);
265}
266
267//________________________________________________________________________
268void AliAnaVZEROEPFlatenning::Terminate(Option_t *)
269{
270 // Check the output list and store output config file
271 // Called once at the end of the query
272
273 fOutputList = dynamic_cast<TList*> (GetOutputData(1));
274 if (!fOutputList) {
275 printf("ERROR: Output list not available\n");
276 return;
277 }
278}
279
fe509094 280Double_t AliAnaVZEROEPFlatenning::CalculateVZEROEventPlane(const AliVEvent * event, Int_t ring, Float_t centrality, Double_t &qxTierce, Double_t &qyTierce) const
345e2385 281{
282 // Calculate the VZERO event plane
283 // taking into account the recentering/twist and rescaling
284 // of the cumulants
fe509094 285 qxTierce = qyTierce = 0.;
345e2385 286 if(!event) {
287 AliError("No Event received");
288 return -1000.;
289 }
290 AliVVZERO *vzeroData = event->GetVZEROData();
291 if(!vzeroData) {
292 AliError("Enable to get VZERO Data");
293 return -1000.;
294 }
295
296 Int_t ibin = fX2In[ring]->FindBin(centrality);
297 Double_t meanX2 = fX2In[ring]->GetBinContent(ibin);
298 Double_t meanY2 = fY2In[ring]->GetBinContent(ibin);
299 Double_t sigmaX2 = fX2In[ring]->GetBinError(ibin);
300 Double_t sigmaY2 = fY2In[ring]->GetBinError(ibin);
301 Double_t rho = (fX2Y2In[ring]->GetBinContent(ibin)-meanX2*meanY2)/sigmaX2/sigmaY2;
302
303 Double_t b = rho*sigmaX2*sigmaY2*
304 TMath::Sqrt(2.*(sigmaX2*sigmaX2+sigmaY2*sigmaY2-2.*sigmaX2*sigmaY2*TMath::Sqrt(1.-rho*rho))/
305 ((sigmaX2*sigmaX2-sigmaY2*sigmaY2)*(sigmaX2*sigmaX2-sigmaY2*sigmaY2)+
306 4.*sigmaX2*sigmaX2*sigmaY2*sigmaY2*rho*rho));
307 Double_t aPlus = TMath::Sqrt(2.*sigmaX2*sigmaX2-b*b);
308 Double_t aMinus= TMath::Sqrt(2.*sigmaY2*sigmaY2-b*b);
309
310 Double_t lambdaPlus = b/aPlus;
311 Double_t lambdaMinus = b/aMinus;
312
313 Double_t trans[2][2];
314 trans[0][0] = 1./(1.-lambdaPlus*lambdaMinus);
315 trans[0][1] = -lambdaMinus/(1.-lambdaPlus*lambdaMinus);
316 trans[1][0] = -lambdaPlus/(1.-lambdaPlus*lambdaMinus);
317 trans[1][1] = 1./(1.-lambdaPlus*lambdaMinus);
318
319 Double_t qx=0., qy=0.;
320 for(Int_t iCh = ring*8; iCh < (ring+1)*8; ++iCh) {
321 Double_t phi = TMath::Pi()/8. + TMath::Pi()/4.*(iCh%8);
322 Double_t mult = event->GetVZEROEqMultiplicity(iCh);
323 qx += mult*TMath::Cos(2.*phi);
324 qy += mult*TMath::Sin(2.*phi);
325 }
326 // Recentering
327 Double_t qxPrime = qx - meanX2;
328 Double_t qyPrime = qy - meanY2;
329 // Twist
330 Double_t qxSeconde = trans[0][0]*qxPrime + trans[0][1]*qyPrime;
331 Double_t qySeconde = trans[1][0]*qxPrime + trans[1][1]*qyPrime;
332 // Rescaling
fe509094 333 qxTierce = qxSeconde/aPlus;
334 qyTierce = qySeconde/aMinus;
345e2385 335
336 return (TMath::ATan2(qyTierce,qxTierce)/2.);
337}