]> git.uio.no Git - u/mrichter/AliRoot.git/blob - STEER/AOD/AliAODHeader.cxx
Fix for track vertices without constraint
[u/mrichter/AliRoot.git] / STEER / AOD / AliAODHeader.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-2007, 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
16 /* $Id$ */
17
18 //-------------------------------------------------------------------------
19 //     AOD event base class
20 //     Author: Markus Oldenburg, CERN
21 //-------------------------------------------------------------------------
22
23 #include "AliAODHeader.h"
24 #include "AliCentrality.h"
25 #include "AliEventplane.h"
26 #include <TGeoMatrix.h>
27 #include <TObjString.h>
28
29 ClassImp(AliAODHeader)
30
31 //______________________________________________________________________________
32 AliAODHeader::AliAODHeader() : 
33   AliVHeader(),
34   fMagneticField(-999.),
35   fMuonMagFieldScale(-999.),
36   fCentrality(-999.),
37   fEventplane(-999.),
38   fEventplaneMag(-999.),
39   fZDCN1Energy(-999.),
40   fZDCP1Energy(-999.),
41   fZDCN2Energy(-999.),
42   fZDCP2Energy(-999.),
43   fNQTheta(0),
44   fQTheta(0x0),
45   fTriggerMask(0),
46   fFiredTriggers(),
47   fRunNumber(-999),  
48   fRefMult(-999),
49   fRefMultPos(-999),
50   fRefMultNeg(-999),
51   fNMuons(0),
52   fNDimuons(0),
53   fEventType(0),
54   fOrbitNumber(0),
55   fPeriodNumber(0),
56   fBunchCrossNumber(0),
57   fRefMultComb05(-999),
58   fRefMultComb08(-999),
59   fTriggerCluster(0), 
60   fDiamondZ(0.), 
61   fDiamondSig2Z(0.),
62   fOfflineTrigger(0),
63   fESDFileName(""),
64   fEventNumberESDFile(-1),
65   fL0TriggerInputs(0),
66   fL1TriggerInputs(0),
67   fL2TriggerInputs(0),
68   fTPConlyRefMult(-1), 
69   fCentralityP(0),
70   fEventplaneP(0),
71   fIRInt2InteractionsMap(0),
72   fIRInt1InteractionsMap(0)
73 {
74   // default constructor
75
76   SetName("header");
77   for(int j=0; j<2; j++) fZDCEMEnergy[j] = -999.;
78   for(Int_t i=0; i<2; i++) fDiamondXY[i]=0.;
79   fDiamondCovXY[0]=fDiamondCovXY[2]=3.*3.;
80   fDiamondCovXY[1]=0.;
81   for (Int_t m=0; m<kNPHOSMatrix; m++) fPHOSMatrix[m]=NULL;
82   for (Int_t sm=0; sm<kNEMCALMatrix; sm++) fEMCALMatrix[sm]=NULL;
83   for (Int_t i = 0; i < 6; i++)  fITSClusters[i] = 0;
84   for (Int_t j=0; j<64; ++j) fVZEROEqFactors[j]=-1;
85   for (Int_t i=0; i<kT0SpreadSize;i++) fT0spread[i]=0;
86 }
87
88 //______________________________________________________________________________
89 AliAODHeader::AliAODHeader(Int_t nRun, 
90                            UShort_t nBunchX,
91                            UInt_t nOrbit,
92                            UInt_t nPeriod,
93                            const Char_t *title) :
94   AliVHeader(),
95   fMagneticField(-999.),
96   fMuonMagFieldScale(-999.),
97   fCentrality(-999.),
98   fEventplane(-999.),
99   fEventplaneMag(-999.),
100   fZDCN1Energy(-999.),
101   fZDCP1Energy(-999.),
102   fZDCN2Energy(-999.),
103   fZDCP2Energy(-999.),
104   fNQTheta(0),
105   fQTheta(0x0),
106   fTriggerMask(0),
107   fFiredTriggers(),
108   fRunNumber(nRun),
109   fRefMult(-999),
110   fRefMultPos(-999),
111   fRefMultNeg(-999),
112   fNMuons(0),
113   fNDimuons(0),
114   fEventType(0),
115   fOrbitNumber(nOrbit),
116   fPeriodNumber(nPeriod),
117   fBunchCrossNumber(nBunchX),
118   fRefMultComb05(-999),
119   fRefMultComb08(-999),
120   fTriggerCluster(0), 
121   fDiamondZ(0.), 
122   fDiamondSig2Z(0.),
123   fOfflineTrigger(0),
124   fESDFileName(""),
125   fEventNumberESDFile(-1),
126   fL0TriggerInputs(0),
127   fL1TriggerInputs(0),
128   fL2TriggerInputs(0),
129   fTPConlyRefMult(-1), 
130   fCentralityP(0),
131   fEventplaneP(0),
132   fIRInt2InteractionsMap(0),
133   fIRInt1InteractionsMap(0)
134 {
135   // constructor
136
137   SetName("header");
138   SetTitle(title);
139   for(int j=0; j<2; j++) fZDCEMEnergy[j] = -999.;
140   for(Int_t i=0; i<2; i++) fDiamondXY[i]=0.;
141   fDiamondCovXY[0]=fDiamondCovXY[2]=3.*3.;
142   fDiamondCovXY[1]=0.;
143   for (Int_t m=0; m<kNPHOSMatrix; m++) fPHOSMatrix[m]=NULL;
144   for (Int_t sm=0; sm<kNEMCALMatrix; sm++) fEMCALMatrix[sm]=NULL;
145   for (Int_t j=0; j<64; ++j) fVZEROEqFactors[j]=-1;
146   for (Int_t i=0; i<kT0SpreadSize;i++) fT0spread[i]=0;
147 }
148
149 //______________________________________________________________________________
150 AliAODHeader::AliAODHeader(Int_t nRun, 
151                            UShort_t nBunchX,
152                            UInt_t nOrbit,
153                            UInt_t nPeriod,
154                            Int_t refMult,
155                            Int_t refMultPos,
156                            Int_t refMultNeg,
157                            Int_t refMultComb05,
158                            Int_t refMultComb08,
159                            Double_t magField,
160                            Double_t muonMagFieldScale,
161                            Double_t cent,
162                            Double_t eventplane,
163                            Double_t n1Energy,
164                            Double_t p1Energy,
165                            Double_t n2Energy,
166                            Double_t p2Energy,
167                            Double_t *emEnergy,
168                            ULong64_t trigMask,
169                            UChar_t trigClus,
170                            UInt_t evttype,
171                            const Float_t *vzeroEqFactors,
172                            const Char_t *title,
173                            Int_t nMuons,
174                            Int_t nDimuons) :
175   AliVHeader(),
176   fMagneticField(magField),
177   fMuonMagFieldScale(muonMagFieldScale),
178   fCentrality(cent),
179   fEventplane(eventplane),
180   fEventplaneMag(0),
181   fZDCN1Energy(n1Energy),
182   fZDCP1Energy(p1Energy),
183   fZDCN2Energy(n2Energy),
184   fZDCP2Energy(p2Energy),
185   fNQTheta(0),
186   fQTheta(0x0),
187   fTriggerMask(trigMask),
188   fFiredTriggers(),
189   fRunNumber(nRun),  
190   fRefMult(refMult),
191   fRefMultPos(refMultPos),
192   fRefMultNeg(refMultNeg),
193   fNMuons(nMuons),
194   fNDimuons(nDimuons),
195   fEventType(evttype),
196   fOrbitNumber(nOrbit),
197   fPeriodNumber(nPeriod),
198   fBunchCrossNumber(nBunchX),
199   fRefMultComb05(refMultComb05),
200   fRefMultComb08(refMultComb08),
201   fTriggerCluster(trigClus),
202   fDiamondZ(0.), 
203   fDiamondSig2Z(0.),
204   fOfflineTrigger(0),
205   fESDFileName(""),
206   fEventNumberESDFile(-1),
207   fL0TriggerInputs(0),
208   fL1TriggerInputs(0),
209   fL2TriggerInputs(0),
210   fTPConlyRefMult(-1), 
211   fCentralityP(0),
212   fEventplaneP(0),
213   fIRInt2InteractionsMap(0),
214   fIRInt1InteractionsMap(0)
215 {
216   // constructor
217
218   SetName("header");
219   SetTitle(title);
220   for(int j=0; j<2; j++) fZDCEMEnergy[j] = emEnergy[j];
221   for(Int_t i=0; i<2; i++) fDiamondXY[i]=0.;
222   fDiamondCovXY[0]=fDiamondCovXY[2]=3.*3.;
223   fDiamondCovXY[1]=0.;
224   for (Int_t m=0; m<kNPHOSMatrix; m++) fPHOSMatrix[m]=NULL;
225   for (Int_t sm=0; sm<kNEMCALMatrix; sm++) fEMCALMatrix[sm]=NULL;
226   for (Int_t i = 0; i < 6; i++)  fITSClusters[i] = 0;
227   if (vzeroEqFactors) for (Int_t j=0; j<64; ++j) fVZEROEqFactors[j] = vzeroEqFactors[j];
228   for (Int_t i=0; i<kT0SpreadSize;i++) fT0spread[i]=0;
229 }
230
231 //______________________________________________________________________________
232 AliAODHeader::~AliAODHeader() 
233 {
234   // destructor
235   delete fCentralityP;
236   delete fEventplaneP;
237   RemoveQTheta();
238 }
239
240 //______________________________________________________________________________
241 AliAODHeader::AliAODHeader(const AliAODHeader& hdr) :
242   AliVHeader(hdr),
243   fMagneticField(hdr.fMagneticField),
244   fMuonMagFieldScale(hdr.fMuonMagFieldScale),
245   fCentrality(hdr.fCentrality),
246   fEventplane(hdr.fEventplane),
247   fEventplaneMag(hdr.fEventplaneMag),
248   fZDCN1Energy(hdr.fZDCN1Energy),
249   fZDCP1Energy(hdr.fZDCP1Energy),
250   fZDCN2Energy(hdr.fZDCN2Energy),
251   fZDCP2Energy(hdr.fZDCP2Energy),
252   fNQTheta(0),
253   fQTheta(0x0),
254   fTriggerMask(hdr.fTriggerMask),
255   fFiredTriggers(hdr.fFiredTriggers),
256   fRunNumber(hdr.fRunNumber),  
257   fRefMult(hdr.fRefMult), 
258   fRefMultPos(hdr.fRefMultPos), 
259   fRefMultNeg(hdr.fRefMultNeg),
260   fNMuons(hdr.fNMuons),
261   fNDimuons(hdr.fNDimuons),
262   fEventType(hdr.fEventType),
263   fOrbitNumber(hdr.fOrbitNumber),
264   fPeriodNumber(hdr.fPeriodNumber),
265   fBunchCrossNumber(hdr.fBunchCrossNumber),
266   fRefMultComb05(hdr.fRefMultComb05), 
267   fRefMultComb08(hdr.fRefMultComb08), 
268   fTriggerCluster(hdr.fTriggerCluster), 
269   fDiamondZ(hdr.fDiamondZ), 
270   fDiamondSig2Z(hdr.fDiamondSig2Z),
271   fOfflineTrigger(hdr.fOfflineTrigger),
272   fESDFileName(hdr.fESDFileName),
273   fEventNumberESDFile(hdr.fEventNumberESDFile),
274   fL0TriggerInputs(hdr.fL0TriggerInputs),
275   fL1TriggerInputs(hdr.fL1TriggerInputs),
276   fL2TriggerInputs(hdr.fL2TriggerInputs),
277   fTPConlyRefMult(hdr.fTPConlyRefMult), 
278   fCentralityP(new AliCentrality(*hdr.fCentralityP)),
279   fEventplaneP(new AliEventplane(*hdr.fEventplaneP)),
280   fIRInt2InteractionsMap(hdr.fIRInt2InteractionsMap),
281   fIRInt1InteractionsMap(hdr.fIRInt1InteractionsMap)
282 {
283   // Copy constructor.
284   
285   SetName(hdr.fName);
286   SetTitle(hdr.fTitle);
287   SetQTheta(hdr.fQTheta, hdr.fNQTheta);
288   SetZDCEMEnergy(hdr.fZDCEMEnergy[0], hdr.fZDCEMEnergy[1]);
289   for(Int_t i=0; i<2; i++) fDiamondXY[i]=hdr.fDiamondXY[i];
290   for(Int_t i=0; i<3; i++) fDiamondCovXY[i]=hdr.fDiamondCovXY[i];
291
292
293   for(Int_t m=0; m<kNPHOSMatrix; m++){
294       if(hdr.fPHOSMatrix[m])
295           fPHOSMatrix[m]=new TGeoHMatrix(*(hdr.fPHOSMatrix[m])) ;
296       else
297           fPHOSMatrix[m]=0;
298   }
299   
300   for(Int_t sm=0; sm<kNEMCALMatrix; sm++){
301       if(hdr.fEMCALMatrix[sm])
302           fEMCALMatrix[sm]=new TGeoHMatrix(*(hdr.fEMCALMatrix[sm])) ;
303       else
304           fEMCALMatrix[sm]=0;
305   }
306   for (Int_t i = 0; i < 6; i++)  fITSClusters[i] = hdr.fITSClusters[i];
307   for (Int_t j=0; j<64; ++j) fVZEROEqFactors[j]=hdr.fVZEROEqFactors[j];
308   for (Int_t i=0; i<kT0SpreadSize;i++) fT0spread[i]=hdr.fT0spread[i];
309
310 }
311
312 //______________________________________________________________________________
313 AliAODHeader& AliAODHeader::operator=(const AliAODHeader& hdr)
314 {
315   // Assignment operator
316   if(this!=&hdr) {
317     
318      AliVHeader::operator=(hdr);
319     
320     fMagneticField    = hdr.fMagneticField;
321     fMuonMagFieldScale= hdr.fMuonMagFieldScale;
322     fCentrality       = hdr.fCentrality;
323     fEventplane       = hdr.fEventplane;
324     fEventplaneMag    = hdr.fEventplaneMag;
325     fZDCN1Energy      = hdr.fZDCN1Energy;
326     fZDCP1Energy      = hdr.fZDCP1Energy;
327     fZDCN2Energy      = hdr.fZDCN2Energy;
328     fZDCP2Energy      = hdr.fZDCP2Energy;
329     fTriggerMask      = hdr.fTriggerMask;
330     fFiredTriggers    = hdr.fFiredTriggers;
331     fRunNumber        = hdr.fRunNumber;
332     fRefMult          = hdr.fRefMult;
333     fRefMultPos       = hdr.fRefMultPos;
334     fRefMultNeg       = hdr.fRefMultNeg;
335     fEventType        = hdr.fEventType;
336     fOrbitNumber      = hdr.fOrbitNumber;
337     fPeriodNumber     = hdr.fPeriodNumber;
338     fBunchCrossNumber = hdr.fBunchCrossNumber;
339     fRefMultComb05    = hdr.fRefMultComb05;
340     fRefMultComb08    = hdr.fRefMultComb08;
341
342     fTriggerCluster   = hdr.fTriggerCluster;
343     fNMuons           = hdr.fNMuons;
344     fNDimuons         = hdr.fNDimuons;
345     fDiamondZ         = hdr.fDiamondZ;
346     fDiamondSig2Z     = hdr.fDiamondSig2Z;
347     fOfflineTrigger   = hdr.fOfflineTrigger;
348     fESDFileName      = hdr.fESDFileName;
349     fEventNumberESDFile = hdr.fEventNumberESDFile;
350     fL0TriggerInputs    = hdr.fL0TriggerInputs;
351     fL1TriggerInputs    = hdr.fL1TriggerInputs;
352     fL2TriggerInputs    = hdr.fL2TriggerInputs;
353     fTPConlyRefMult     = hdr.fTPConlyRefMult;
354
355     fIRInt2InteractionsMap  = hdr.fIRInt2InteractionsMap;
356     fIRInt1InteractionsMap  = hdr.fIRInt1InteractionsMap;
357
358     if(hdr.fEventplaneP){
359       if(fEventplaneP)*fEventplaneP = *hdr.fEventplaneP;
360       else fEventplaneP = new AliEventplane(*hdr.fEventplaneP);
361     }
362
363     if(hdr.fCentralityP){
364       if(fCentralityP)*fCentralityP = *hdr.fCentralityP;
365       else fCentralityP = new AliCentrality(*hdr.fCentralityP);
366     }
367
368     SetName(hdr.fName);
369     SetTitle(hdr.fTitle);
370     SetQTheta(hdr.fQTheta, hdr.fNQTheta);
371     SetZDCEMEnergy(hdr.fZDCEMEnergy[0], hdr.fZDCEMEnergy[1]);
372     for(Int_t i=0; i<2; i++) fDiamondXY[i]=hdr.fDiamondXY[i];
373     for(Int_t i=0; i<3; i++) fDiamondCovXY[i]=hdr.fDiamondCovXY[i];
374
375     for(Int_t m=0; m<kNPHOSMatrix; m++){
376       if(hdr.fPHOSMatrix[m]){
377         if(fPHOSMatrix[m])delete fPHOSMatrix[m];
378         fPHOSMatrix[m]=new TGeoHMatrix(*(hdr.fPHOSMatrix[m])) ;
379       }
380       else
381         fPHOSMatrix[m]=0;
382     }
383     
384     for(Int_t sm=0; sm<kNEMCALMatrix; sm++){
385       if(hdr.fEMCALMatrix[sm]){
386         if(fEMCALMatrix[sm])delete fEMCALMatrix[sm];
387         fEMCALMatrix[sm]=new TGeoHMatrix(*(hdr.fEMCALMatrix[sm])) ;
388       }
389       else
390         fEMCALMatrix[sm]=0;
391     }
392     
393   }
394
395   for (Int_t i = 0; i < 6; i++)  fITSClusters[i] = hdr.fITSClusters[i];
396   for (Int_t j=0; j<64; ++j) fVZEROEqFactors[j] = hdr.fVZEROEqFactors[j];
397   for (Int_t i=0; i<kT0SpreadSize;i++) fT0spread[i]=hdr.fT0spread[i];
398
399   return *this;
400 }
401
402 //______________________________________________________________________________
403 void AliAODHeader::SetQTheta(Double_t *QTheta, UInt_t size) 
404 {
405   if (QTheta && size>0) {
406     if (size != (UInt_t)fNQTheta) {
407       RemoveQTheta();
408       fNQTheta = size;
409       fQTheta = new Double_t[fNQTheta];
410     }
411     
412     for (Int_t i = 0; i < fNQTheta; i++) {
413       fQTheta[i] = QTheta[i];
414     }
415   } else {
416     RemoveQTheta();
417   }
418
419   return;
420 }
421
422 //______________________________________________________________________________
423 Double_t AliAODHeader::GetQTheta(UInt_t i) const
424 {
425   if (fQTheta && i < (UInt_t)fNQTheta) {
426     return fQTheta[i];
427   } else {
428     return -999.;
429   }
430 }
431
432 //______________________________________________________________________________
433 void AliAODHeader::RemoveQTheta()
434 {
435   delete[] fQTheta;
436   fQTheta = 0x0;
437   fNQTheta = 0;
438
439   return;
440 }
441
442 void AliAODHeader::Clear(Option_t* /*opt*/)
443 {
444 // Clear memory
445   RemoveQTheta();
446   if (fCentralityP){
447     delete fCentralityP;
448     fCentralityP = 0;
449     fCentrality = -999;
450   }
451   if (fEventplaneP){
452     delete fEventplaneP;
453     fEventplaneP = 0;
454     fEventplane = -999;
455     fEventplaneMag = -999.;
456   }
457   return;
458 }
459
460 //______________________________________________________________________________
461 void AliAODHeader::Print(Option_t* /*option*/) const 
462 {
463   // prints event information
464
465   printf("Run #                   : %d\n", fRunNumber);
466   printf("Bunch Crossing  #       : %d\n", fBunchCrossNumber);
467   printf("Orbit Number #          : %d\n", fOrbitNumber);
468   printf("Period Number #         : %d\n", fPeriodNumber);
469   printf("Trigger mask            : %lld\n", fTriggerMask);
470   printf("Trigger cluster         : %d\n", fTriggerCluster);
471   printf("Event Type              : %d\n", fEventType);
472   printf("Magnetic field          : %f\n", fMagneticField);
473   printf("Muon mag. field scale   : %f\n", fMuonMagFieldScale);
474   
475   printf("Centrality              : %f\n", fCentrality);
476   printf("Event plane             : %f\n", fEventplane);
477   printf("Event plane             : %f\n", fEventplaneMag);
478   printf("ZDC N1 Energy           : %f\n", fZDCN1Energy);
479   printf("ZDC P1 Energy           : %f\n", fZDCP1Energy);
480   printf("ZDC N2 Energy           : %f\n", fZDCN2Energy);
481   printf("ZDC P2 Energy           : %f\n", fZDCP2Energy);
482   printf("ZDC EM1 Energy          : %f\n", fZDCEMEnergy[0]);
483   printf("ZDC EM2 Energy          : %f\n", fZDCEMEnergy[1]);
484   printf("ref. Multiplicity       : %d\n", fRefMult);
485   printf("ref. Multiplicity (pos) : %d\n", fRefMultPos);
486   printf("ref. Multiplicity (neg) : %d\n", fRefMultNeg);
487   printf("ref. Mult.Comb |eta|<.5 : %d\n", fRefMultComb05);
488   printf("ref. Mult.Comb |eta|<.8 : %d\n", fRefMultComb08);
489   printf("number of muons         : %d\n", fNMuons);
490   printf("number of dimuons       : %d\n", fNDimuons);
491   printf("offline trigger         : %u\n", fOfflineTrigger);
492
493   if (fQTheta) {
494     for (UInt_t i = 0; i<(UInt_t)fNQTheta; i++) {
495       printf("QTheta[%d]              : %13.3e\n", i, GetQTheta(i));
496     }
497   }
498   printf("V0 Eq factors: ");
499   for (Int_t j=0; j<64; ++j) printf(" %.3f",fVZEROEqFactors[j]);
500   printf("\n");
501
502   return;
503 }
504
505 //__________________________________________________________________________
506 Int_t AliAODHeader::FindIRIntInteractionsBXMap(Int_t difference)
507 {
508   //
509   // The mapping is of 181 bits, from -90 to +90
510   //
511   Int_t bin=-1;
512
513   if(difference<-90 || difference>90) return bin;
514   else { bin = 90 + difference; }
515   
516   return bin;
517 }
518
519 //__________________________________________________________________________
520 Int_t AliAODHeader::GetIRInt2ClosestInteractionMap()
521 {
522   //
523   // Calculation of the closest interaction
524   //
525   Int_t firstNegative=100;
526   for(Int_t item=-1; item>=-90; item--) {
527     Int_t bin = FindIRIntInteractionsBXMap(item);
528     Bool_t isFired = fIRInt2InteractionsMap.TestBitNumber(bin);
529     if(isFired) {
530       firstNegative = item;
531       break;
532     }
533   }
534   Int_t firstPositive=100;
535   for(Int_t item=1; item<=90; item++) {
536     Int_t bin = FindIRIntInteractionsBXMap(item);
537     Bool_t isFired = fIRInt2InteractionsMap.TestBitNumber(bin);
538     if(isFired) {
539       firstPositive = item;
540       break;
541     }
542   }
543
544   Int_t closest = firstPositive < TMath::Abs(firstNegative) ? firstPositive : TMath::Abs(firstNegative);
545   if(firstPositive==100 && firstNegative==100) closest=0;
546   return closest;
547 }
548
549 //__________________________________________________________________________
550 Int_t AliAODHeader::GetIRInt2LastInteractionMap()
551 {
552   //
553   // Calculation of the last interaction
554   //
555   Int_t lastNegative=0;
556   for(Int_t item=-90; item<=-1; item++) {
557     Int_t bin = FindIRIntInteractionsBXMap(item);
558     Bool_t isFired = fIRInt2InteractionsMap.TestBitNumber(bin);
559     if(isFired) {
560       lastNegative = item;
561       break;
562     }
563   }
564   Int_t lastPositive=0;
565   for(Int_t item=90; item>=1; item--) {
566     Int_t bin = FindIRIntInteractionsBXMap(item);
567     Bool_t isFired = fIRInt2InteractionsMap.TestBitNumber(bin);
568     if(isFired) {
569       lastPositive = item;
570       break;
571     }
572   }
573
574   Int_t last = lastPositive > TMath::Abs(lastNegative) ? lastPositive : TMath::Abs(lastNegative);
575   return last;
576 }