]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGLF/SPECTRA/PiKaPr/TestAOD/AliSpectraAODEventCuts.cxx
Merge branch 'master' of https://git.cern.ch/reps/AliRoot
[u/mrichter/AliRoot.git] / PWGLF / SPECTRA / PiKaPr / TestAOD / AliSpectraAODEventCuts.cxx
1
2 /**************************************************************************
3  * Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
4  *                                                                        *
5  * Author: The ALICE Off-line Project.                                    *
6  * Contributors are mentioned in the code where appropriate.              *
7  *                                                                        *
8  * Permission to use, copy, modify and distribute this software and its   *
9  * documentation strictly for non-commercial purposes is hereby granted   *
10  * without fee, provided that the above copyright notice appears in all   *
11  * copies and that both the copyright notice and this permission notice   *
12  * appear in the supporting documentation. The authors make no claims     *
13  * about the suitability of this software for any purpose. It is          *
14  * provided "as is" without express or implied warranty.                  *
15  **************************************************************************/
16
17 //-----------------------------------------------------------------
18 //         AliSpectraAODEventCuts class
19 //-----------------------------------------------------------------
20
21 #include "TChain.h"
22 #include "TTree.h"
23 #include "TLegend.h"
24 #include "TH1F.h"
25 #include "TH1I.h"
26 #include "TH2F.h"
27 #include "TCanvas.h"
28 #include "TProfile.h"
29 #include "AliAnalysisTask.h"
30 #include "AliAnalysisManager.h"
31 #include "AliAODTrack.h"
32 #include "AliAODMCParticle.h"
33 #include "AliAODEvent.h"
34 #include "AliAODInputHandler.h"
35 #include "AliAnalysisTaskESDfilter.h"
36 #include "AliAnalysisDataContainer.h"
37 #include "AliESDVZERO.h"
38 #include "AliAODVZERO.h"
39 #include "AliSpectraAODEventCuts.h"
40 #include "AliSpectraAODTrackCuts.h"
41 #include <iostream>
42
43 using namespace std;
44
45 ClassImp(AliSpectraAODEventCuts)
46
47 AliSpectraAODEventCuts::AliSpectraAODEventCuts(const char *name) : 
48   TNamed(name, "AOD Event Cuts"),
49   fAOD(0),
50   fSelectBit(AliVEvent::kMB),
51   fCentralityMethod("V0M"),
52   fTrackBits(1),
53   fIsMC(0),
54   fIsLHC10h(1),
55   fTrackCuts(0),
56   fIsSelected(0),
57   fCentralityCutMin(0.),
58   fCentralityCutMax(999),
59   fQVectorCutMin(-999.),
60   fQVectorCutMax(999.),
61   fVertexCutMin(-10.),
62   fVertexCutMax(10.),
63   fMultiplicityCutMin(-999.),
64   fMultiplicityCutMax(99999.),
65   fqV0C(-999.),
66   fqV0A(-999.),
67   fqV0Cx(-999.),
68   fqV0Ax(-999.),
69   fqV0Cy(-999.),
70   fqV0Ay(-999.),
71   fPsiV0C(-999.),
72   fPsiV0A(-999.),
73   fCent(-999.),
74   fOutput(0),
75   fCalib(0),
76   fRun(-1),
77   fMultV0(0),
78   fV0Cpol1(-1),
79   fV0Cpol2(-1),
80   fV0Cpol3(-1),
81   fV0Cpol4(-1),
82   fV0Apol1(-1),
83   fV0Apol2(-1),
84   fV0Apol3(-1),
85   fV0Apol4(-1)
86 {
87   // Constructor
88   fOutput=new TList();
89   fOutput->SetOwner();
90   fOutput->SetName("fOutput");
91   
92   fCalib=new TList();
93   fCalib->SetOwner();
94   fCalib->SetName("fCalib");
95   
96   TH1I *fHistoCuts = new TH1I("fHistoCuts", "Event Cuts", kNVtxCuts, -0.5, kNVtxCuts - 0.5);
97   TH1F *fHistoVtxBefSel = new TH1F("fHistoVtxBefSel", "Vtx distr before event selection;z (cm)",500,-15,15);
98   TH1F *fHistoVtxAftSel = new TH1F("fHistoVtxAftSel", "Vtx distr after event selection;z (cm)",500,-15,15);
99   TH1F *fHistoEtaBefSel = new TH1F("fHistoEtaBefSel", "Eta distr before event selection;eta",500,-2,2);
100   TH1F *fHistoEtaAftSel = new TH1F("fHistoEtaAftSel", "Eta distr after event selection;eta",500,-2,2);
101   TH1F *fHistoNChAftSel = new TH1F("fHistoNChAftSel", "NCh distr after event selection;Nch",2000,-0.5,1999.5);
102   TH2F *fHistoQVector = new TH2F("fHistoQVector", "QVector with VZERO distribution;centrality;Q vector from EP task",20,0,100,100,0,10);
103   TH2F *fHistoEP = new TH2F("fHistoEP", "EP with VZERO distribution;centrality;Psi_{EP} from EP task",20,0,100,100,-2,2);
104   TH2F *fPsiACor = new TH2F("fPsiACor", "EP with VZERO A distribution;centrality;Psi_{EP} VZERO-A",20,0,100,100,-2,2);
105   TH2F *fPsiCCor = new TH2F("fPsiCCor", "EP with VZERO C distribution;centrality;Psi_{EP} VZERO-C",20,0,100,100,-2,2);
106   TH2F *fQVecACor = new TH2F("fQVecACor", "QVec VZERO A;centrality;Qvector VZERO-A",20,0,100,100,0,10);
107   TH2F *fQVecCCor = new TH2F("fQVecCCor", "QVec VZERO C;centrality;Qvector VZERO-C",20,0,100,100,0,10);
108   TH2F *fV0M = new TH2F("fV0M", "V0 Multiplicity, before correction;V0 sector",64,-.5,63.5,500,0,1000);
109   TH2F *fV0MCor = new TH2F("fV0MCor", "V0 Multiplicity, after correction;V0 sector",64,-.5,63.5,500,0,1000);
110   
111   fOutput->Add(fHistoCuts);
112   fOutput->Add(fHistoVtxBefSel);
113   fOutput->Add(fHistoVtxAftSel);
114   fOutput->Add(fHistoEtaBefSel);
115   fOutput->Add(fHistoEtaAftSel);
116   fOutput->Add(fHistoNChAftSel);
117   fOutput->Add(fHistoQVector);
118   fOutput->Add(fHistoEP);
119   fOutput->Add(fPsiACor);
120   fOutput->Add(fPsiCCor);
121   fOutput->Add(fQVecACor);
122   fOutput->Add(fQVecCCor);
123   fOutput->Add(fV0M);
124   fOutput->Add(fV0MCor);
125   
126   for (Int_t i = 0; i<10; i++){
127     fMeanQxa2[i] = -1;
128     fMeanQya2[i] = -1;
129     fMeanQxc2[i] = -1;
130     fMeanQyc2[i] = -1;   
131   }
132 }
133
134 //______________________________________________________
135 Bool_t AliSpectraAODEventCuts::IsSelected(AliAODEvent * aod,AliSpectraAODTrackCuts     *trackcuts)
136 {
137   // Returns true if Event Cuts are selected and applied
138   fAOD = aod;
139   fTrackCuts = trackcuts;
140   ((TH1I*)fOutput->FindObject("fHistoCuts"))->Fill(kProcessedEvents);
141   Bool_t IsPhysSel = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & fSelectBit);
142   if(!IsPhysSel)return IsPhysSel;
143   ((TH1I*)fOutput->FindObject("fHistoCuts"))->Fill(kPhysSelEvents);
144   //loop on tracks, before event selection, filling QA histos
145   AliAODVertex * vertex = fAOD->GetPrimaryVertex();//FIXME vertex is recreated
146   if(vertex)((TH1F*)fOutput->FindObject("fHistoVtxBefSel"))->Fill(vertex->GetZ());
147   fIsSelected =kFALSE;
148   if(CheckVtxRange() && CheckCentralityCut() && CheckMultiplicityCut()){ //selection on vertex and Centrality
149     fIsSelected=CheckQVectorCut(); // QVector is calculated only if the centrality and vertex are correct (performance)
150   }
151   if(fIsSelected){
152     ((TH1I*)fOutput->FindObject("fHistoCuts"))->Fill(kAcceptedEvents);
153     if(vertex)((TH1F*)fOutput->FindObject("fHistoVtxAftSel"))->Fill(vertex->GetZ());
154   }
155   Int_t Nch=0;
156   for (Int_t iTracks = 0; iTracks < fAOD->GetNumberOfTracks(); iTracks++) {
157     AliAODTrack* track = fAOD->GetTrack(iTracks);
158     if (!fTrackCuts->IsSelected(track,kFALSE)) continue;
159     ((TH1F*)fOutput->FindObject("fHistoEtaBefSel"))->Fill(track->Eta());
160     if(fIsSelected){
161       ((TH1F*)fOutput->FindObject("fHistoEtaAftSel"))->Fill(track->Eta());
162       Nch++;
163     }
164   }
165   if(fIsSelected)((TH1F*)fOutput->FindObject("fHistoNChAftSel"))->Fill(Nch);
166   return fIsSelected;
167 }
168
169 //______________________________________________________
170 Bool_t AliSpectraAODEventCuts::CheckVtxRange()
171 {
172   // reject events outside of range
173   AliAODVertex * vertex = fAOD->GetPrimaryVertex();
174   //when moving to 2011 wìone has to add a cut using SPD vertex.
175   //The point is that for events with |z|>20 the vertexer tracks is not working (only 2011!). One has to put a safety cut using SPD vertex large e.g. 15cm
176   if (!vertex)
177     {
178       ((TH1I*)fOutput->FindObject("fHistoCuts"))->Fill(kVtxNoEvent);
179       return kFALSE;
180     }
181   if (vertex->GetZ() > fVertexCutMin && vertex->GetZ() < fVertexCutMax)
182     {
183       return kTRUE;
184     }
185   ((TH1I*)fOutput->FindObject("fHistoCuts"))->Fill(kVtxRange);
186   return kFALSE;
187 }
188
189 //______________________________________________________
190 Bool_t AliSpectraAODEventCuts::CheckCentralityCut()
191 {
192   // Check centrality cut
193   fCent=-999.;
194   fCent=fAOD->GetCentrality()->GetCentralityPercentile(fCentralityMethod.Data());
195   if ( (fCent <= fCentralityCutMax)  &&  (fCent >= fCentralityCutMin) )  return kTRUE;   
196   ((TH1I*)fOutput->FindObject("fHistoCuts"))->Fill(kVtxCentral);
197   return kFALSE;
198 }
199
200 //______________________________________________________
201 Bool_t AliSpectraAODEventCuts::CheckMultiplicityCut()
202 {
203   // Check multiplicity cut
204   Int_t Ncharged=0;
205   for (Int_t iTracks = 0; iTracks < fAOD->GetNumberOfTracks(); iTracks++){
206     AliAODTrack* track = fAOD->GetTrack(iTracks);
207     if (!fTrackCuts->IsSelected(track,kFALSE)) continue;
208     Ncharged++;
209   }
210   if(Ncharged>fMultiplicityCutMin && Ncharged<fMultiplicityCutMax)return kTRUE;
211   
212   return kFALSE;
213 }
214
215 //______________________________________________________
216 Bool_t AliSpectraAODEventCuts::CheckQVectorCut()
217
218   Double_t qxEPVZERO = -999., qyEPVZERO = -999.;
219   Double_t qVZERO = -999.;
220   Double_t psi=-999.;
221   
222   if(fIsLHC10h){
223     qVZERO=CalculateQVectorLHC10h();
224     psi=fPsiV0A;
225   }else{
226     psi=fAOD->GetEventplane()->CalculateVZEROEventPlane(fAOD,10,2,qxEPVZERO,qyEPVZERO);//FIXME we can a flag for 2010 and 2011
227     qVZERO= TMath::Sqrt(qxEPVZERO*qxEPVZERO + qyEPVZERO*qyEPVZERO);
228   }
229   
230   //cut on q vector
231   if(qVZERO<fQVectorCutMin || qVZERO>fQVectorCutMax)return kFALSE;
232   Double_t cent=fAOD->GetCentrality()->GetCentralityPercentile(fCentralityMethod.Data());
233   ((TH2F*)fOutput->FindObject("fHistoQVector"))->Fill(cent,qVZERO);
234   ((TH2F*)fOutput->FindObject("fHistoEP"))->Fill(cent,psi);
235   ((TH1I*)fOutput->FindObject("fHistoCuts"))->Fill(kQVector);
236   
237
238   return kTRUE;
239 }
240
241 //______________________________________________________
242 Double_t AliSpectraAODEventCuts::CalculateQVectorLHC10h(){
243   
244   Int_t run = fAOD->GetRunNumber();
245   if(run != fRun){
246     // Load the calibrations run dependent
247     if(OpenInfoCalbration(run))fRun=run;
248     else{
249       fqV0C=-999.;
250       fqV0A=-999.;
251       return -999.;
252     }
253   }
254   
255   //V0 info    
256   Double_t Qxa2 = 0, Qya2 = 0;
257   Double_t Qxc2 = 0, Qyc2 = 0;
258   Double_t sumMc = 0, sumMa = 0;
259   
260   AliAODVZERO* aodV0 = fAOD->GetVZEROData();
261   
262   for (Int_t iv0 = 0; iv0 < 64; iv0++) {
263     
264     Double_t phiV0 = TMath::PiOver4()*(0.5 + iv0 % 8);
265     
266     Float_t multv0 = aodV0->GetMultiplicity(iv0);
267     ((TH2F*)fOutput->FindObject("fV0M"))->Fill(iv0,multv0);
268     
269     if (iv0 < 32){
270       
271       Double_t multCorC = -10;
272       
273       if (iv0 < 8)
274         multCorC = multv0*fV0Cpol1/fMultV0->GetBinContent(iv0+1);
275       else if (iv0 >= 8 && iv0 < 16)
276         multCorC = multv0*fV0Cpol2/fMultV0->GetBinContent(iv0+1);
277       else if (iv0 >= 16 && iv0 < 24)
278         multCorC = multv0*fV0Cpol3/fMultV0->GetBinContent(iv0+1);
279       else if (iv0 >= 24 && iv0 < 32)
280         multCorC = multv0*fV0Cpol4/fMultV0->GetBinContent(iv0+1);
281       
282       if (multCorC < 0){
283         cout<<"Problem with multiplicity in V0C"<<endl;
284         fqV0C=-999.;
285         fqV0A=-999.;
286         return -999.;
287       }
288       
289       Qxc2 += TMath::Cos(2*phiV0) * multCorC;
290       Qyc2 += TMath::Sin(2*phiV0) * multCorC;
291       
292       sumMc += multCorC;
293       ((TH2F*)fOutput->FindObject("fV0MCor"))->Fill(iv0,multCorC);
294       
295     } else {
296       
297       Double_t multCorA = -10;
298       
299       if (iv0 >= 32 && iv0 < 40)
300         multCorA = multv0*fV0Apol1/fMultV0->GetBinContent(iv0+1);
301       else if (iv0 >= 40 && iv0 < 48)
302         multCorA = multv0*fV0Apol2/fMultV0->GetBinContent(iv0+1);
303       else if (iv0 >= 48 && iv0 < 56)
304         multCorA = multv0*fV0Apol3/fMultV0->GetBinContent(iv0+1);
305       else if (iv0 >= 56 && iv0 < 64)
306         multCorA = multv0*fV0Apol4/fMultV0->GetBinContent(iv0+1);
307       
308       if (multCorA < 0){
309         cout<<"Problem with multiplicity in V0A"<<endl;
310         fqV0C=-999.;
311         fqV0A=-999.;
312         return -999.;
313       }
314       
315       Qxa2 += TMath::Cos(2*phiV0) * multCorA;
316       Qya2 += TMath::Sin(2*phiV0) * multCorA;
317       
318       sumMa += multCorA;
319       ((TH2F*)fOutput->FindObject("fV0MCor"))->Fill(iv0,multCorA);
320     }
321   }
322   
323   Short_t centrV0  = GetCentrCode(fAOD);
324   
325   Double_t Qxamean2 = 0.;
326   Double_t Qyamean2 = 0.;
327   Double_t Qxcmean2 = 0.;
328   Double_t Qycmean2 = 0.;
329   
330   if(centrV0!=-1){
331     Qxamean2 = fMeanQxa2[centrV0];
332     Qyamean2 = fMeanQya2[centrV0];
333     Qxcmean2 = fMeanQxc2[centrV0];
334     Qycmean2 = fMeanQyc2[centrV0];
335   }
336   
337   Double_t QxaCor2 = Qxa2 - Qxamean2*sumMa;
338   Double_t QyaCor2 = Qya2 - Qyamean2*sumMa;
339   Double_t QxcCor2 = Qxc2 - Qxcmean2*sumMc;
340   Double_t QycCor2 = Qyc2 - Qycmean2*sumMc;
341   
342   fPsiV0A = TMath::ATan2(QyaCor2, QxaCor2)/2.;
343   fPsiV0C = TMath::ATan2(QycCor2, QxcCor2)/2.;
344   
345   ((TH2F*)fOutput->FindObject("fPsiACor"))->Fill((Float_t)fAOD->GetCentrality()->GetCentralityPercentile("V0M"), fPsiV0A);
346   ((TH2F*)fOutput->FindObject("fPsiCCor"))->Fill((Float_t)fAOD->GetCentrality()->GetCentralityPercentile("V0M"), fPsiV0C);
347   
348   fqV0A = TMath::Sqrt((QxaCor2*QxaCor2 + QyaCor2*QyaCor2)/sumMa);
349   fqV0C = TMath::Sqrt((QxcCor2*QxcCor2 + QycCor2*QycCor2)/sumMc);
350   fqV0Ax = QxaCor2*TMath::Sqrt(1./sumMa);
351   fqV0Cx = QxcCor2*TMath::Sqrt(1./sumMc);
352   fqV0Ay = QyaCor2*TMath::Sqrt(1./sumMa);
353   fqV0Cy = QycCor2*TMath::Sqrt(1./sumMc);
354   
355   ((TH2F*)fOutput->FindObject("fQVecACor"))->Fill((Float_t)fAOD->GetCentrality()->GetCentralityPercentile("V0M"), fqV0A);
356   ((TH2F*)fOutput->FindObject("fQVecCCor"))->Fill((Float_t)fAOD->GetCentrality()->GetCentralityPercentile("V0M"), fqV0C);
357   
358   return fqV0A; //FIXME we have to combine VZERO-A and C
359 }
360
361 //______________________________________________________
362 Short_t AliSpectraAODEventCuts::GetCentrCode(AliVEvent* ev)
363 {
364   
365   Short_t centrCode = -1;
366   
367   AliCentrality* centrality = 0;
368   AliAODEvent* aod = (AliAODEvent*)ev;  
369   centrality = aod->GetHeader()->GetCentralityP();
370   
371   Float_t centV0 = centrality->GetCentralityPercentile("V0M");
372   Float_t centTrk = centrality->GetCentralityPercentile("TRK"); 
373   
374   
375   if (TMath::Abs(centV0 - centTrk) < 5.0 && centV0 <= 80 && centV0 > 0){  
376     
377      if ((centV0 > 0) && (centV0 <= 5.0))
378        centrCode = 0; 
379      else if ((centV0 > 5.0) && (centV0 <= 10.0))
380        centrCode = 1;
381      else if ((centV0 > 10.0) && (centV0 <= 20.0))
382        centrCode = 2;
383      else if ((centV0 > 20.0) && (centV0 <= 30.0))
384        centrCode = 3;   
385      else if ((centV0 > 30.0) && (centV0 <= 40.0))
386        centrCode = 4; 
387      else if ((centV0 > 40.0) && (centV0 <= 50.0))
388        centrCode = 5;  
389      else if ((centV0 > 50.0) && (centV0 <= 60.0))
390        centrCode = 6;
391      else if ((centV0 > 60.0) && (centV0 <= 70.0))
392        centrCode = 7;                                  
393      else if ((centV0 > 70.0) && (centV0 <= 80.0))
394        centrCode = 8;  
395   }
396   
397   return centrCode;
398   
399 }
400
401 //______________________________________________________
402 void AliSpectraAODEventCuts::PrintCuts()
403 {
404   // print info about event cuts
405   cout << "Event Stats" << endl;
406   cout << " > Trigger Selection: " << fSelectBit << endl;
407   cout << " > Centrality estimator: " << fCentralityMethod << endl;
408   cout << " > Number of accepted events: " << NumberOfEvents() << endl;
409   cout << " > Number of processed events: " << NumberOfProcessedEvents() << endl;
410   cout << " > Number of PhysSel events: " <<  NumberOfPhysSelEvents()  << endl;
411   cout << " > Vertex out of range: " << ((TH1I*)fOutput->FindObject("fHistoCuts"))->GetBinContent(kVtxRange + 1) << endl;
412   cout << " > Events cut by centrality: " << ((TH1I*)fOutput->FindObject("fHistoCuts"))->GetBinContent(kVtxCentral + 1) << endl;
413   cout << " > Events without vertex: " << ((TH1I*)fOutput->FindObject("fHistoCuts"))->GetBinContent(kVtxNoEvent + 1) << endl;
414   cout << " > QVector cut: " << ((TH1I*)fOutput->FindObject("fHistoCuts"))->GetBinContent(kQVector + 1) << endl;
415   cout << " > Track type used for the QVector calculation: " << fTrackBits << endl;
416   cout << " > QRange: [" << fQVectorCutMin <<"," <<fQVectorCutMax<<"]"<< endl;
417   cout << " > Vertex: [" << fVertexCutMin <<"," <<fVertexCutMax<<"]"<< endl;
418   cout << " > Multiplicity: [" << fMultiplicityCutMin <<"," <<fMultiplicityCutMax<<"]"<< endl;
419   cout << " > Centrality: [" << fCentralityCutMin <<"," <<fCentralityCutMax<<"]"<< endl;
420 }
421
422 //_____________________________________________________________________________
423 Bool_t AliSpectraAODEventCuts::OpenInfoCalbration(Int_t run)
424 {
425   
426   AliOADBContainer* cont = (AliOADBContainer*) fCalib->FindObject("hMultV0BefCorr");
427   if(!cont){
428     printf("OADB object hMultV0BefCorr is not available in the file\n");
429     return 0;   
430   }
431   
432   if(!(cont->GetObject(run))){
433     printf("OADB object hMultV0BefCorr is not available for run %i\n",run);
434     return 0;   
435   }
436   fMultV0 = ((TH2F*) cont->GetObject(run))->ProfileX();
437   
438   TF1* fpolc1 = new TF1("fpolc1","pol0", 0, 7); 
439   fMultV0->Fit(fpolc1, "RN");
440   fV0Cpol1 = fpolc1->GetParameter(0);
441   
442   TF1* fpolc2 = new TF1("fpolc2","pol0", 8, 15); 
443   fMultV0->Fit(fpolc2, "RN");
444   fV0Cpol2 = fpolc2->GetParameter(0);
445   
446   TF1* fpolc3 = new TF1("fpolc3","pol0", 16, 23); 
447   fMultV0->Fit(fpolc3, "RN");
448   fV0Cpol3 = fpolc3->GetParameter(0);
449   
450   TF1* fpolc4 = new TF1("fpolc4","pol0", 24, 31); 
451   fMultV0->Fit(fpolc4, "RN");
452   fV0Cpol4 = fpolc4->GetParameter(0);
453   
454   TF1* fpola1 = new TF1("fpola1","pol0", 32, 39);
455   fMultV0->Fit(fpola1, "RN");
456   fV0Apol1 = fpola1->GetParameter(0);
457
458   TF1* fpola2 = new TF1("fpola2","pol0", 40, 47);
459   fMultV0->Fit(fpola2, "RN");
460   fV0Apol2 = fpola2->GetParameter(0);
461   
462   TF1* fpola3 = new TF1("fpola3","pol0", 48, 55);
463   fMultV0->Fit(fpola3, "RN");
464   fV0Apol3 = fpola3->GetParameter(0);
465   
466   TF1* fpola4 = new TF1("fpola4","pol0", 56, 63);
467   fMultV0->Fit(fpola4, "RN");
468   fV0Apol4 = fpola4->GetParameter(0);
469
470   for(Int_t i=0; i < 10; i++){
471
472     char nameQxa2[100];
473     snprintf(nameQxa2,100, "hQxa2m_%i", i);
474
475     char nameQya2[100];
476     snprintf(nameQya2,100, "hQya2m_%i", i);
477
478     char nameQxc2[100];
479     snprintf(nameQxc2,100, "hQxc2m_%i", i);
480
481     char nameQyc2[100];
482     snprintf(nameQyc2,100, "hQyc2m_%i", i);
483         
484     AliOADBContainer* contQxa2 = (AliOADBContainer*) fCalib->FindObject(nameQxa2);
485     if(!contQxa2){
486       printf("OADB object %s is not available in the file\n", nameQxa2);
487       return 0; 
488     }
489         
490     if(!(contQxa2->GetObject(run))){
491       printf("OADB object %s is not available for run %i\n", nameQxa2, run);
492       return 0; 
493     }
494
495     fMeanQxa2[i] = ((TH1F*) contQxa2->GetObject(run))->GetMean();
496
497  
498     AliOADBContainer* contQya2 = (AliOADBContainer*) fCalib->FindObject(nameQya2);
499     if(!contQya2){
500       printf("OADB object %s is not available in the file\n", nameQya2);
501       return 0; 
502     }
503         
504     if(!(contQya2->GetObject(run))){
505       printf("OADB object %s is not available for run %i\n", nameQya2, run);
506       return 0; 
507     }
508
509     fMeanQya2[i] = ((TH1F*) contQya2->GetObject(run))->GetMean();
510
511
512     AliOADBContainer* contQxc2 = (AliOADBContainer*) fCalib->FindObject(nameQxc2);
513     if(!contQxc2){
514       printf("OADB object %s is not available in the file\n", nameQxc2);
515       return 0; 
516     }
517         
518     if(!(contQxc2->GetObject(run))){
519       printf("OADB object %s is not available for run %i\n", nameQxc2, run);
520       return 0; 
521     }
522
523     fMeanQxc2[i] = ((TH1F*) contQxc2->GetObject(run))->GetMean();
524  
525
526     AliOADBContainer* contQyc2 = (AliOADBContainer*) fCalib->FindObject(nameQyc2);
527     if(!contQyc2){
528       printf("OADB object %s is not available in the file\n", nameQyc2);
529       return 0; 
530     }
531         
532     if(!(contQyc2->GetObject(run))){
533       printf("OADB object %s is not available for run %i\n", nameQyc2, run);
534       return 0; 
535     }
536
537     fMeanQyc2[i] = ((TH1F*) contQyc2->GetObject(run))->GetMean();
538
539   }
540   return 1;
541 }
542
543 //______________________________________________________
544
545
546 Long64_t AliSpectraAODEventCuts::Merge(TCollection* list)
547 {
548   // Merge a list of AliSpectraAODEventCuts objects with this.
549   // Returns the number of merged objects (including this).
550   
551   AliInfo("Merging");
552   
553   if (!list)
554     return 0;
555
556   if (list->IsEmpty())
557     return 1;
558   
559   TIterator* iter = list->MakeIterator();
560   TObject* obj;
561   
562   // collections of all histograms
563   TList collections;
564   
565   Int_t count = 0;
566
567   while ((obj = iter->Next())) {
568     AliSpectraAODEventCuts* entry = dynamic_cast<AliSpectraAODEventCuts*> (obj);
569     if (entry == 0) 
570       continue;
571
572     TList * l = entry->GetOutputList();      
573     collections.Add(l);
574     count++;
575   }
576   
577   fOutput->Merge(&collections);
578   
579   delete iter;
580
581   return count+1;
582 }
583