23f6f4588a5011ffb6337839fd0ca6800ce90742
[u/mrichter/AliRoot.git] / CORRFW / AliCFEventClassCuts.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
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  **************************************************************************/
15 // To select on the Event Class: look at the Trigger mask and the ZDC info.
16 // Only pp-running trigger types implemented so far
17 // handles all masks for the trigger description
18 // and some general combinations like MB1,MB2,MB3,MB4 and MB5.
19 // The argument of IsSelected member function (passed object) is cast into 
20 // an AliVEvent, but cuts have a true meaning only for AliESD(AOD)Event 
21 // type objects.
22 // The class derives from AliCFCutBase
23 // Author:S.Arcelli Silvia.Arcelli@cern.ch
24 //
25 //
26 #include "TH1F.h"
27 #include "TList.h"
28 #include "AliLog.h"
29 #include "TMath.h"
30 #include "AliVEvent.h"
31 #include "AliCFEventClassCuts.h"
32 ClassImp(AliCFEventClassCuts) 
33 //____________________________________________________________________
34 AliCFEventClassCuts::AliCFEventClassCuts() : 
35   AliCFCutBase(),
36   fTriggerType(0),
37   fTriggerAND(kFALSE),
38   fZDCN1EnergyMin(-1.e99),  
39   fZDCP1EnergyMin(-1.e99),  
40   fZDCN2EnergyMin(-1.e99),  
41   fZDCP2EnergyMin(-1.e99),  
42   fZDCEM1EnergyMin(-1.e99),  
43   fZDCEM2EnergyMin(-1.e99),  
44   fZDCN1EnergyMax(1.e99),  
45   fZDCP1EnergyMax(1.e99),  
46   fZDCN2EnergyMax(1.e99),  
47   fZDCP2EnergyMax(1.e99),  
48   fZDCEM1EnergyMax(1.e99),  
49   fZDCEM2EnergyMax(1.e99),
50   fBitMap(0x0),
51   fhNBinsTrigger(0),
52   fhBinLimTrigger(0),
53   fhNBinsZDCEnN1(0),
54   fhBinLimZDCEnN1(0),
55   fhNBinsZDCEnP1(0),
56   fhBinLimZDCEnP1(0),
57   fhNBinsZDCEnN2(0),
58   fhBinLimZDCEnN2(0),
59   fhNBinsZDCEnP2(0),
60   fhBinLimZDCEnP2(0),
61   fhNBinsZDCEnEM1(0),
62   fhBinLimZDCEnEM1(0),
63   fhNBinsZDCEnEM2(0),
64   fhBinLimZDCEnEM2(0)
65 {
66   //
67   //ctor
68   //  
69
70   fBitMap=new TBits(0);
71   Initialise();
72 }
73
74 //____________________________________________________________________
75 AliCFEventClassCuts::AliCFEventClassCuts(Char_t* name, Char_t* title) : 
76   AliCFCutBase(name,title),
77   fTriggerType(0),
78   fTriggerAND(kFALSE),
79   fZDCN1EnergyMin(-1.e99),  
80   fZDCP1EnergyMin(-1.e99),  
81   fZDCN2EnergyMin(-1.e99),  
82   fZDCP2EnergyMin(-1.e99),  
83   fZDCEM1EnergyMin(-1.e99),  
84   fZDCEM2EnergyMin(-1.e99),  
85   fZDCN1EnergyMax(1.e99),  
86   fZDCP1EnergyMax(1.e99),  
87   fZDCN2EnergyMax(1.e99),  
88   fZDCP2EnergyMax(1.e99),  
89   fZDCEM1EnergyMax(1.e99),  
90   fZDCEM2EnergyMax(1.e99), 
91   fBitMap(0x0),
92   fhNBinsTrigger(0),
93   fhBinLimTrigger(0),
94   fhNBinsZDCEnN1(0),
95   fhBinLimZDCEnN1(0),
96   fhNBinsZDCEnP1(0),
97   fhBinLimZDCEnP1(0),
98   fhNBinsZDCEnN2(0),
99   fhBinLimZDCEnN2(0),
100   fhNBinsZDCEnP2(0),
101   fhBinLimZDCEnP2(0),
102   fhNBinsZDCEnEM1(0),
103   fhBinLimZDCEnEM1(0),
104   fhNBinsZDCEnEM2(0),
105   fhBinLimZDCEnEM2(0)
106 {
107   //
108   //ctor
109   //
110   fBitMap=new TBits(0);
111   Initialise();
112  }
113
114 //_____________________________________________________________________________
115 AliCFEventClassCuts::AliCFEventClassCuts(const AliCFEventClassCuts& c) : 
116   AliCFCutBase(c),
117   fTriggerType(c.fTriggerType),
118   fTriggerAND(c.fTriggerAND),
119   fZDCN1EnergyMin(c.fZDCN1EnergyMin),  
120   fZDCP1EnergyMin(c.fZDCP1EnergyMin),  
121   fZDCN2EnergyMin(c.fZDCN2EnergyMin),  
122   fZDCP2EnergyMin(c.fZDCP2EnergyMin),  
123   fZDCEM1EnergyMin(c.fZDCEM1EnergyMin),  
124   fZDCEM2EnergyMin(c.fZDCEM2EnergyMin),  
125   fZDCN1EnergyMax(c.fZDCN1EnergyMax),  
126   fZDCP1EnergyMax(c.fZDCP1EnergyMax),  
127   fZDCN2EnergyMax(c.fZDCN2EnergyMax),  
128   fZDCP2EnergyMax(c.fZDCP2EnergyMax),  
129   fZDCEM1EnergyMax(c.fZDCEM1EnergyMax), 
130   fZDCEM2EnergyMax(c.fZDCEM2EnergyMax),
131   fBitMap(c.fBitMap),
132   fhNBinsTrigger(c.fhNBinsTrigger),
133   fhBinLimTrigger(c.fhBinLimTrigger ),
134   fhNBinsZDCEnN1(c.fhNBinsZDCEnN1),
135   fhBinLimZDCEnN1(c.fhBinLimZDCEnN1),
136   fhNBinsZDCEnP1(c.fhNBinsZDCEnP1),
137   fhBinLimZDCEnP1(c.fhBinLimZDCEnP1),
138   fhNBinsZDCEnN2(c.fhNBinsZDCEnN2),
139   fhBinLimZDCEnN2(c.fhBinLimZDCEnN2),
140   fhNBinsZDCEnP2(c.fhNBinsZDCEnP2),
141   fhBinLimZDCEnP2(c.fhBinLimZDCEnP2),
142   fhNBinsZDCEnEM1(c.fhNBinsZDCEnEM1),
143   fhBinLimZDCEnEM1(c.fhBinLimZDCEnEM1),
144   fhNBinsZDCEnEM2(c.fhNBinsZDCEnEM2),
145   fhBinLimZDCEnEM2(c.fhBinLimZDCEnEM2)
146
147 {
148   //
149   //copy constructor
150   //
151 }
152
153 //_____________________________________________________________________________
154 AliCFEventClassCuts& AliCFEventClassCuts::operator=(const AliCFEventClassCuts& c){
155   //
156   // Assignment operator
157   //
158   if (this != &c) {
159     AliCFCutBase::operator=(c) ;
160     fTriggerType = c.fTriggerType ;
161     fTriggerAND = c.fTriggerAND ;
162     fZDCN1EnergyMin = c.fZDCN1EnergyMin;  
163     fZDCP1EnergyMin = c.fZDCP1EnergyMin;  
164     fZDCN2EnergyMin = c.fZDCN2EnergyMin;  
165     fZDCP2EnergyMin = c.fZDCP2EnergyMin;  
166     fZDCEM1EnergyMin = c.fZDCEM1EnergyMin;  
167     fZDCEM2EnergyMin = c.fZDCEM2EnergyMin;  
168     fZDCN1EnergyMax = c.fZDCN1EnergyMax;  
169     fZDCP1EnergyMax = c.fZDCP1EnergyMax;  
170     fZDCN2EnergyMax = c.fZDCN2EnergyMax;  
171     fZDCP2EnergyMax = c.fZDCP2EnergyMax;  
172     fZDCEM1EnergyMax = c.fZDCEM1EnergyMax;  
173     fZDCEM2EnergyMax = c.fZDCEM2EnergyMax;  
174     fBitMap          = c.fBitMap;
175     fhNBinsTrigger = c.fhNBinsTrigger;
176     fhBinLimTrigger = c.fhBinLimTrigger ;
177     fhNBinsZDCEnN1 = c.fhNBinsZDCEnN1;
178     fhBinLimZDCEnN1 = c.fhBinLimZDCEnN1;
179     fhNBinsZDCEnP1 = c.fhNBinsZDCEnP1;
180     fhBinLimZDCEnP1 = c.fhBinLimZDCEnP1;
181     fhNBinsZDCEnN2 = c.fhNBinsZDCEnN2;
182     fhBinLimZDCEnN2 = c.fhBinLimZDCEnN2;
183     fhNBinsZDCEnP2 = c.fhNBinsZDCEnP2;
184     fhBinLimZDCEnP2 = c.fhBinLimZDCEnP2;
185     fhNBinsZDCEnEM1 = c.fhNBinsZDCEnEM1;
186     fhBinLimZDCEnEM1 = c.fhBinLimZDCEnEM1;
187     fhNBinsZDCEnEM2 = c.fhNBinsZDCEnEM2;
188     fhBinLimZDCEnEM2 = c.fhBinLimZDCEnEM2;
189   }
190
191
192   for (Int_t i=0; i<c.kNCuts; i++){
193     for (Int_t j=0; j<c.kNStepQA; j++){
194       if(c.fhQA[i][j]) fhQA[i][j] = (TH1F*)c.fhQA[i][j]->Clone();
195     }
196   }
197
198   return *this ;
199 }
200
201 //_____________________________________________________________________________
202 AliCFEventClassCuts::~AliCFEventClassCuts()
203 {
204   //
205   // destructor
206   //
207   for (Int_t i=0; i<kNCuts; i++){
208     for (Int_t j=0; j<kNStepQA; j++){
209       if(fhQA[i][j]) delete fhQA[i][j];
210     }
211   }
212
213   if(fBitMap)delete fBitMap;
214   if(fhBinLimTrigger)delete fhBinLimTrigger;
215   if(fhBinLimZDCEnN1)delete fhBinLimZDCEnN1;
216   if(fhBinLimZDCEnP1)delete fhBinLimZDCEnP1;
217   if(fhBinLimZDCEnN2)delete fhBinLimZDCEnN2;
218   if(fhBinLimZDCEnP2)delete fhBinLimZDCEnP2;
219   if(fhBinLimZDCEnEM1)delete fhBinLimZDCEnEM1;
220   if(fhBinLimZDCEnEM2)delete fhBinLimZDCEnEM2;
221
222 }
223
224 //_____________________________________________________________________________
225 void AliCFEventClassCuts::Init() {
226   //
227   // initialises all QA histograms 
228   //
229   if(fIsQAOn)
230     DefineHistograms();
231 }
232
233 //_____________________________________________________________________________
234 void AliCFEventClassCuts::Initialise()
235 {
236   //
237   //initialization
238   //
239
240
241   //
242   // sets pointers to histos to zero
243   //
244
245   for(Int_t i=0; i<kNCuts; i++){
246     for(Int_t j =0; j<kNStepQA; j++){
247       fhQA[i][j]=0x0;
248     }
249   }
250
251   //set default bin number/ranges for QA histograms
252
253   SetHistogramBins(kTrigger,23,-0.5,22.5);
254   SetHistogramBins(kZDCEnergyN1,800,-500,7500);
255   SetHistogramBins(kZDCEnergyP1,800,-500,7500);
256   SetHistogramBins(kZDCEnergyN2,800,-500,7500);
257   SetHistogramBins(kZDCEnergyP2,800,-500,7500);
258   SetHistogramBins(kZDCEnergyEM1,800,-500,7500);
259   SetHistogramBins(kZDCEnergyEM2,800,-500,7500);
260
261 }
262
263 //____________________________________________________________________
264 Bool_t AliCFEventClassCuts::IsSelected(TObject* obj) {
265   //
266   //Check if the requested cuts are passed
267   //
268
269   TBits* bitmap = SelectionBitMap(obj);
270
271   Bool_t isSelected = kTRUE;
272
273   for (UInt_t icut=0; icut<bitmap->GetNbits();icut++)
274         if(!bitmap->TestBitNumber(icut)) isSelected = kFALSE;
275
276   return isSelected;
277 }
278
279 //____________________________________________________________________
280 TBits *AliCFEventClassCuts::SelectionBitMap(TObject* obj) {
281   //
282   //cut on trigger type (just pp running trigger types implemented so far)
283   //and on the energy observed in the ZDC. The argument is cast into 
284   //an AliVEvent, but has true meaning only for AliESDEvent type objects.
285   //Check if the requested cuts are passed and return a bitmap
286   //
287
288   for(Int_t j=0;j<kNCuts;j++)fBitMap->SetBitNumber(j,kFALSE);
289   AliVEvent* esd = dynamic_cast<AliVEvent *>(obj);
290   if (!esd ) return fBitMap ;
291
292
293   //now start checking the cuts
294   //first assume the event will be accepted: 
295   for(Int_t j=0;j<kNCuts;j++)fBitMap->SetBitNumber(j,kTRUE);
296
297
298   //Check the trigger:
299
300   //look at the Trigger mask in current event
301   TBits *triggerBitMap=new TBits(0);
302   TriggerBitMap(esd,triggerBitMap); 
303   //now compare to what was requested as a Trigger:  
304   if(fTriggerType.GetNbits()>0)fBitMap->SetBitNumber(0,kFALSE); //trigger required, initialize to false
305   for(Int_t j=0;j<kNTriggers+kNTriggersMB;j++){
306     if(fTriggerType.TestBitNumber(j)){
307       if(!fTriggerAND){
308         if(triggerBitMap->TestBitNumber(j) == fTriggerType.TestBitNumber(j)){
309           fBitMap->SetBitNumber(0,kTRUE); 
310
311           break;// @least one requested bit fired, ok
312         }
313       }else{
314         if(!triggerBitMap->TestBitNumber(j)){
315           break;
316         }       
317       }
318     }
319   }
320   
321   delete triggerBitMap;
322   //Then, cut on the energy observed in the ZDC 
323   
324   if( esd->GetZDCN1Energy()<fZDCN1EnergyMin || esd->GetZDCN1Energy()>fZDCN1EnergyMax)fBitMap->SetBitNumber(1,kFALSE); 
325   if( esd->GetZDCP1Energy()<fZDCP1EnergyMin || esd->GetZDCP1Energy()>fZDCP1EnergyMax)fBitMap->SetBitNumber(2,kFALSE); 
326   if( esd->GetZDCN2Energy()<fZDCN2EnergyMin || esd->GetZDCN2Energy()>fZDCN2EnergyMax)fBitMap->SetBitNumber(3,kFALSE);
327   if( esd->GetZDCP2Energy()<fZDCP2EnergyMin || esd->GetZDCP2Energy()>fZDCP2EnergyMax)fBitMap->SetBitNumber(4,kFALSE); 
328   if( esd->GetZDCEMEnergy(0)<fZDCEM1EnergyMin || esd->GetZDCEMEnergy(0)>fZDCEM1EnergyMax)fBitMap->SetBitNumber(5,kFALSE); 
329   if( esd->GetZDCEMEnergy(1)<fZDCEM2EnergyMin || esd->GetZDCEMEnergy(1)>fZDCEM2EnergyMax)fBitMap->SetBitNumber(6,kFALSE); 
330   return fBitMap;
331
332 }
333
334 //_____________________________________________________________________________
335 Bool_t AliCFEventClassCuts::IsTriggered(AliVEvent* ev, TriggerType trigger) {
336   //
337   //look at the Trigger mask in current event
338   TBits *triggerBitMap=new TBits(0);
339   TriggerBitMap(ev,triggerBitMap); 
340   Bool_t isTriggered=kFALSE;  
341   if(triggerBitMap->TestBitNumber(trigger))isTriggered=kTRUE;
342   delete triggerBitMap;
343   return isTriggered;
344
345 }
346
347 //_____________________________________________________________________________
348 void AliCFEventClassCuts::TriggerBitMap(AliVEvent* ev, TBits *bitmapT ) {
349   //
350
351   for(Int_t itrig=0;itrig<kNTriggers+kNTriggersMB;itrig++)bitmapT->SetBitNumber(itrig,kFALSE);
352   if (!ev ) return;
353
354   ULong64_t triggerMask = ev->GetTriggerMask();
355   //run over the different triggers in the mask, and check which bits have fired    
356   for(Int_t itrig=0;itrig<kNTriggers;itrig++){
357     bitmapT->SetBitNumber(itrig,kFALSE);
358     if (triggerMask&(0x1 <<itrig)){
359       bitmapT->SetBitNumber(itrig,kTRUE);
360     }
361   }
362
363   //Trigger combinations, Minimum bias triggers
364
365   //MB1 case: (GFO || V0OR) && !BG
366   if((bitmapT->TestBitNumber(5) || (bitmapT->TestBitNumber(0) || bitmapT->TestBitNumber(1))) && !bitmapT->TestBitNumber(2)) bitmapT->SetBitNumber(17,kTRUE); 
367  
368   //MB2 case: (GFO && V0OR) && !BG
369   if((bitmapT->TestBitNumber(5) && (bitmapT->TestBitNumber(0) || bitmapT->TestBitNumber(1))) && !bitmapT->TestBitNumber(2)) bitmapT->SetBitNumber(18,kTRUE); 
370
371   //MB3 case : (GFO && V0AND) && !BG
372   if((bitmapT->TestBitNumber(5) && (bitmapT->TestBitNumber(0) && bitmapT->TestBitNumber(1))) && !bitmapT->TestBitNumber(2)) bitmapT->SetBitNumber(19,kTRUE); 
373
374   //MB4 case: (GFO || V0AND) && !BG
375   if((bitmapT->TestBitNumber(5) || (bitmapT->TestBitNumber(0) && bitmapT->TestBitNumber(1))) &&  !bitmapT->TestBitNumber(2)) bitmapT->SetBitNumber(20,kTRUE); 
376
377   //MB5 case:: GFO && !BG
378   if(bitmapT->TestBitNumber(5) && !bitmapT->TestBitNumber(2)) bitmapT->SetBitNumber(21,kTRUE); 
379
380   return;
381
382
383 //_____________________________________________________________________________
384 void AliCFEventClassCuts::GetBitMap(TObject* obj, TBits* bitmap){
385   //
386   // retrieve the pointer to the bitmap
387   //
388
389   bitmap = SelectionBitMap(obj);
390
391 }
392
393 //_____________________________________________________________________________
394 void AliCFEventClassCuts::SetHistogramBins(Int_t index, Int_t nbins, Double_t *bins)
395 {
396   //
397   // QA histogram axis parameters
398   // variable bin size:user inputs nbins and the vector of bin limits
399   //
400
401   switch(index){
402   case kTrigger:
403     fhNBinsTrigger=nbins+1;
404     fhBinLimTrigger=new Double_t[nbins+1];
405     for(Int_t i=0;i<nbins+1;i++)fhBinLimTrigger[i]=bins[i];
406     break;
407     
408   case kZDCEnergyN1:
409     fhNBinsZDCEnN1=nbins+1;
410     fhBinLimZDCEnN1=new Double_t[nbins+1];
411     for(Int_t i=0;i<nbins+1;i++)fhBinLimZDCEnN1[i]=bins[i];
412     break;
413
414   case kZDCEnergyP1:
415     fhNBinsZDCEnP1=nbins+1;
416     fhBinLimZDCEnP1=new Double_t[nbins+1];
417     for(Int_t i=0;i<nbins+1;i++)fhBinLimZDCEnP1[i]=bins[i];
418     break;
419
420   case kZDCEnergyN2:
421     fhNBinsZDCEnN2=nbins+1;
422     fhBinLimZDCEnN2=new Double_t[nbins+1];
423     for(Int_t i=0;i<nbins+1;i++)fhBinLimZDCEnN2[i]=bins[i];
424     break;
425
426   case kZDCEnergyP2:
427     fhNBinsZDCEnP2=nbins+1;
428     fhBinLimZDCEnP2=new Double_t[nbins+1];
429     for(Int_t i=0;i<nbins+1;i++)fhBinLimZDCEnP2[i]=bins[i];
430     break;
431
432   case kZDCEnergyEM1:
433     fhNBinsZDCEnEM1=nbins+1;
434     fhBinLimZDCEnEM1=new Double_t[nbins+1];
435     for(Int_t i=0;i<nbins+1;i++)fhBinLimZDCEnEM1[i]=bins[i];
436     break;
437
438   case kZDCEnergyEM2:
439     fhNBinsZDCEnEM2=nbins+1;
440     fhBinLimZDCEnEM2=new Double_t[nbins+1];
441     for(Int_t i=0;i<nbins+1;i++)fhBinLimZDCEnEM2[i]=bins[i];
442     break;
443
444   }
445
446 }
447
448 //_____________________________________________________________________________
449 void AliCFEventClassCuts::SetHistogramBins(Int_t index, Int_t nbins, Double_t xmin, Double_t xmax)
450 {
451   //
452   // QA histogram axis parameters
453   // fixed bin size: user inputs nbins, xmin and xmax
454   //
455   switch(index){
456   case kTrigger:
457     fhNBinsTrigger=nbins+1;
458     fhBinLimTrigger=new Double_t[nbins+1];
459     for(Int_t i=0;i<nbins+1;i++)fhBinLimTrigger[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
460     break;
461     
462   case kZDCEnergyN1:
463     fhNBinsZDCEnN1=nbins+1;
464     fhBinLimZDCEnN1=new Double_t[nbins+1];
465     for(Int_t i=0;i<nbins+1;i++)fhBinLimZDCEnN1[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
466     break;
467
468   case kZDCEnergyP1:
469     fhNBinsZDCEnP1=nbins+1;
470     fhBinLimZDCEnP1=new Double_t[nbins+1];
471     for(Int_t i=0;i<nbins+1;i++)fhBinLimZDCEnP1[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
472     break;
473
474   case kZDCEnergyN2:
475     fhNBinsZDCEnN2=nbins+1;
476     fhBinLimZDCEnN2=new Double_t[nbins+1];
477     for(Int_t i=0;i<nbins+1;i++)fhBinLimZDCEnN2[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
478     break;
479
480   case kZDCEnergyP2:
481     fhNBinsZDCEnP2=nbins+1;
482     fhBinLimZDCEnP2=new Double_t[nbins+1];
483     for(Int_t i=0;i<nbins+1;i++)fhBinLimZDCEnP2[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
484     break;
485
486   case kZDCEnergyEM1:
487     fhNBinsZDCEnEM1=nbins+1;
488     fhBinLimZDCEnEM1=new Double_t[nbins+1];
489     for(Int_t i=0;i<nbins+1;i++)fhBinLimZDCEnEM1[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
490     break;
491
492   case kZDCEnergyEM2:
493     fhNBinsZDCEnEM2=nbins+1;
494     fhBinLimZDCEnEM2=new Double_t[nbins+1];
495     for(Int_t i=0;i<nbins+1;i++)fhBinLimZDCEnEM2[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
496     break;
497   }
498 }
499
500 //_____________________________________________________________________________
501  void AliCFEventClassCuts::DefineHistograms() {
502   //
503   // histograms for cut variables
504   //
505   Int_t color = 2;
506
507   if(!fIsQAOn) {
508     AliInfo(Form("Nn QA histos requested, Please first set the QA flag on!"));
509     return;
510   }  
511   
512   // book QA histograms
513
514   Char_t str[256];
515   for (Int_t i=0; i<kNStepQA; i++) {
516     if (i==0) sprintf(str," ");
517     else sprintf(str,"_cut");
518
519     fhQA[kTrigger][i]   = new  TH1F(Form("%s_TriggerBits%s",GetName(),str),                     "",fhNBinsTrigger-1,fhBinLimTrigger);
520     fhQA[kZDCEnergyN1][i]       = new  TH1F(Form("%s_ZDC_Energy_N1%s",GetName(),str),           "",fhNBinsZDCEnN1-1,fhBinLimZDCEnN1);
521     fhQA[kZDCEnergyP1][i]       = new  TH1F(Form("%s_ZDC_Energy_P1%s",GetName(),str),           "",fhNBinsZDCEnP1-1,fhBinLimZDCEnP1);
522     fhQA[kZDCEnergyN2][i]       = new  TH1F(Form("%s_ZDC_Energy_N2%s",GetName(),str),           "",fhNBinsZDCEnN2-1,fhBinLimZDCEnN2);
523     fhQA[kZDCEnergyP2][i]       = new  TH1F(Form("%s_ZDC_Energy_P2%s",GetName(),str),           "",fhNBinsZDCEnP2-1,fhBinLimZDCEnP2);
524     fhQA[kZDCEnergyEM1][i]      = new  TH1F(Form("%s_ZDC_Energy_EM1%s",GetName(),str),          "",fhNBinsZDCEnEM1-1,fhBinLimZDCEnEM1);
525     fhQA[kZDCEnergyEM2][i]      = new  TH1F(Form("%s_ZDC_Energy_EM2%s",GetName(),str),          "",fhNBinsZDCEnEM2-1,fhBinLimZDCEnEM2);
526
527
528     fhQA[kTrigger][i]           ->SetXTitle("Trigger Bits");
529     fhQA[kZDCEnergyN1][i]       ->SetXTitle("ZDC Energy N1 (GeV)");
530     fhQA[kZDCEnergyP1][i]       ->SetXTitle("ZDC Energy P1 (GeV)");
531     fhQA[kZDCEnergyN2][i]       ->SetXTitle("ZDC Energy N2 (GeV)");
532     fhQA[kZDCEnergyP2][i]       ->SetXTitle("ZDC Energy P2 (GeV)");
533     fhQA[kZDCEnergyEM1][i]      ->SetXTitle("ZDC Energy EM1 (GeV)");
534     fhQA[kZDCEnergyEM2][i]      ->SetXTitle("ZDC Energy EM2 (GeV)");
535
536   }
537
538   for(Int_t i=0; i<kNCuts; i++) fhQA[i][1]->SetLineColor(color);
539
540 }
541
542 //_____________________________________________________________________________
543 void AliCFEventClassCuts::FillHistograms(TObject* obj, Bool_t b)
544 {
545   //
546   // fill the QA histograms
547   //
548   if(!fIsQAOn) return;
549
550   // cast TObject into VParticle
551   AliVEvent* esd = dynamic_cast<AliVEvent *>(obj);
552   if (!esd ) return  ;
553
554   // index = 0: fill histograms before cuts
555   // index = 1: fill histograms after cuts
556   Int_t index = -1;
557   index = ((b) ? 1 : 0);
558
559
560   //look at the Trigger mask in current event
561   TBits *triggerBitMap=new TBits(0);
562   TriggerBitMap(esd, triggerBitMap); 
563   
564   //trigger Mask
565   for(Int_t itrig=0;itrig<kNTriggers+kNTriggersMB;itrig++){
566     if(triggerBitMap->TestBitNumber(itrig)){
567       fhQA[kTrigger][index]->Fill(itrig);
568     }
569   }   
570
571   delete triggerBitMap;
572
573   //ZDC Quantities
574   fhQA[kZDCEnergyN1][index]->Fill(esd->GetZDCN1Energy());
575   fhQA[kZDCEnergyP1][index]->Fill(esd->GetZDCP1Energy());
576   fhQA[kZDCEnergyN2][index]->Fill(esd->GetZDCN2Energy());
577   fhQA[kZDCEnergyP2][index]->Fill(esd->GetZDCP2Energy());
578   fhQA[kZDCEnergyEM1][index]->Fill(esd->GetZDCEMEnergy(0));
579   fhQA[kZDCEnergyEM2][index]->Fill(esd->GetZDCEMEnergy(1));
580
581 }
582
583 //_____________________________________________________________________________
584 void AliCFEventClassCuts::AddQAHistograms(TList *list) const {
585   //
586   // saves the histograms in a TList
587   //
588   if(!fIsQAOn) return;  
589
590   for (Int_t j=0; j<kNStepQA; j++) {
591     for(Int_t i=0; i<kNCuts; i++)
592         list->Add(fhQA[i][j]);
593   }
594 }