Number of sigma pedestal cut increased to 4
[u/mrichter/AliRoot.git] / STEER / ESD / AliESDHeader.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
16 //-------------------------------------------------------------------------
17 //                      Implementation of   Class AliESDHeader
18 //   Header data
19 //   for the ESD   
20 //   Origin: Christian Klein-Boesing, CERN, Christian.Klein-Boesing@cern.ch 
21 //-------------------------------------------------------------------------
22
23 #include "AliESDHeader.h"
24 #include "AliTriggerScalersESD.h"
25 #include "AliTriggerScalersRecordESD.h"
26 #include "AliTriggerIR.h"
27 //#include "AliTriggerConfiguration.h"
28 #include "AliLog.h" 
29
30 ClassImp(AliESDHeader)
31
32 //______________________________________________________________________________
33 AliESDHeader::AliESDHeader() :
34   AliVHeader(),
35   fTriggerMask(0),
36   fOrbitNumber(0),
37   fTimeStamp(0),
38   fEventType(0),
39   fEventSpecie(0),
40   fPeriodNumber(0),
41   fEventNumberInFile(0),
42   fBunchCrossNumber(0),
43   fTriggerCluster(0),
44   fL0TriggerInputs(0),
45   fL1TriggerInputs(0),
46   fL2TriggerInputs(0),
47   fTriggerScalers(),
48   fTriggerScalersDeltaEvent(),
49   fTriggerScalersDeltaRun(),
50   fTriggerInputsNames(kNTriggerInputs),
51   fCTPConfig(NULL)
52 {
53   // default constructor
54
55   SetName("AliESDHeader");
56   for(Int_t i = 0; i<kNMaxIR ; i++) fIRArray[i] = 0;
57   fTriggerInputsNames.SetOwner(kTRUE);
58 }
59
60 AliESDHeader::~AliESDHeader() 
61 {
62   // destructor
63   for(Int_t i=0;i<kNMaxIR;i++)if(fIRArray[i])delete fIRArray[i];
64   delete fCTPConfig;
65 }
66
67
68 AliESDHeader::AliESDHeader(const AliESDHeader &header) :
69   AliVHeader(header),
70   fTriggerMask(header.fTriggerMask),
71   fOrbitNumber(header.fOrbitNumber),
72   fTimeStamp(header.fTimeStamp),
73   fEventType(header.fEventType),
74   fEventSpecie(header.fEventSpecie),
75   fPeriodNumber(header.fPeriodNumber),
76   fEventNumberInFile(header.fEventNumberInFile),
77   fBunchCrossNumber(header.fBunchCrossNumber),
78   fTriggerCluster(header.fTriggerCluster),
79   fL0TriggerInputs(header.fL0TriggerInputs),
80   fL1TriggerInputs(header.fL1TriggerInputs),
81   fL2TriggerInputs(header.fL2TriggerInputs),
82   fTriggerScalers(header.fTriggerScalers),
83   fTriggerScalersDeltaEvent(header.fTriggerScalersDeltaEvent),
84   fTriggerScalersDeltaRun(header.fTriggerScalersDeltaRun),
85   fTriggerInputsNames(TObjArray(kNTriggerInputs)),
86   fCTPConfig(header.fCTPConfig)
87 {
88   // copy constructor
89   SetName(header.fName);
90   SetTitle(header.fTitle);
91   for(Int_t i = 0; i<kNMaxIR ; i++) {
92     if(header.fIRArray[i])fIRArray[i] = new AliTriggerIR(*header.fIRArray[i]);
93     else fIRArray[i]=0;
94   }
95   for(Int_t i = 0; i < kNTriggerInputs; i++) {
96     TNamed *str = (TNamed *)((header.fTriggerInputsNames).At(i));
97     if (str) fTriggerInputsNames.AddAt(new TNamed(*str),i);
98   }
99 }
100
101 AliESDHeader& AliESDHeader::operator=(const AliESDHeader &header)
102
103   // assigment operator
104   if(this!=&header) {
105     AliVHeader::operator=(header);
106     fTriggerMask = header.fTriggerMask;
107     fOrbitNumber = header.fOrbitNumber;
108     fTimeStamp = header.fTimeStamp;
109     fEventType = header.fEventType;
110     fEventSpecie = header.fEventSpecie;
111     fPeriodNumber = header.fPeriodNumber;
112     fEventNumberInFile = header.fEventNumberInFile;
113     fBunchCrossNumber = header.fBunchCrossNumber;
114     fTriggerCluster = header.fTriggerCluster;
115     fL0TriggerInputs = header.fL0TriggerInputs;
116     fL1TriggerInputs = header.fL1TriggerInputs;
117     fL2TriggerInputs = header.fL2TriggerInputs;
118     fTriggerScalers = header.fTriggerScalers;
119     fTriggerScalersDeltaEvent = header.fTriggerScalersDeltaEvent;
120     fTriggerScalersDeltaRun = header.fTriggerScalersDeltaRun;
121     fCTPConfig = header.fCTPConfig;
122
123     fTriggerInputsNames.Clear();
124     for(Int_t i = 0; i < kNTriggerInputs; i++) {
125       TNamed *str = (TNamed *)((header.fTriggerInputsNames).At(i));
126       if (str) fTriggerInputsNames.AddAt(new TNamed(*str),i);
127     }
128     for(Int_t i = 0; i<kNMaxIR ; i++) {
129        if(header.fIRArray[i])fIRArray[i] = new AliTriggerIR(*header.fIRArray[i]);
130        else fIRArray[i]=0;
131     }
132     SetName(header.fName);
133     SetTitle(header.fTitle);
134   }
135   return *this;
136 }
137
138 void AliESDHeader::Copy(TObject &obj) const 
139 {  
140   // this overwrites the virtual TOBject::Copy()
141   // to allow run time copying without casting
142   // in AliESDEvent
143
144   if(this==&obj)return;
145   AliESDHeader *robj = dynamic_cast<AliESDHeader*>(&obj);
146   if(!robj)return; // not an AliESDHeader
147   *robj = *this;
148
149 }
150 //______________________________________________________________________________
151 void AliESDHeader::Reset()
152 {
153   // reset all data members
154   fTriggerMask       = 0;
155   fOrbitNumber       = 0;
156   fTimeStamp         = 0;
157   fEventType         = 0;
158   fEventSpecie       = 0;
159   fPeriodNumber      = 0;
160   fEventNumberInFile = 0;
161   fBunchCrossNumber  = 0;
162   fTriggerCluster    = 0;
163   fL0TriggerInputs   = 0;
164   fL1TriggerInputs   = 0;
165   fL2TriggerInputs   = 0;
166   fTriggerScalers.Reset();
167   fTriggerScalersDeltaEvent.Reset();
168   fTriggerScalersDeltaRun.Reset();
169   fTriggerInputsNames.Clear();
170   delete fCTPConfig;
171   fCTPConfig = 0;
172   for(Int_t i=0;i<kNMaxIR;i++)if(fIRArray[i]){
173    delete fIRArray[i];
174    fIRArray[i]=0;
175   }
176 }
177 //______________________________________________________________________________
178 Bool_t AliESDHeader::AddTriggerIR(const AliTriggerIR* ir)
179 {
180  // Adds trigger interaction record to array
181  for(Int_t i=0;i<kNMaxIR;i++){
182   if(!fIRArray[i]){
183     fIRArray[i]=new AliTriggerIR(*ir);
184     return 0;
185   }
186  }
187  //AliErrorClass("Attempt to add # of IRs > kNMaxIR \n");
188  return 1;
189 }
190 //______________________________________________________________________________
191 void AliESDHeader::Print(const Option_t *) const
192 {
193   // Print some data members
194   printf("Event # %d in file Bunch crossing # %d Orbit # %d Trigger %lld \n",
195          GetEventNumberInFile(),
196          GetBunchCrossNumber(),
197          GetOrbitNumber(),
198          GetTriggerMask());
199          printf("List of the active trigger inputs: ");
200          for(Int_t i = 0; i < kNTriggerInputs; i++) {
201            TNamed *str = (TNamed *)((fTriggerInputsNames).At(i));
202            if (str) printf("%s ",str->GetName());
203          }
204          printf("\n");
205 }
206
207 //______________________________________________________________________________
208 void AliESDHeader::SetActiveTriggerInputs(const char*name, Int_t index)
209 {
210   // Fill the active trigger inputs names
211   // into the corresponding fTriggerInputsNames (TObjArray of TNamed)
212   if (index >= kNTriggerInputs || index < 0) {
213     AliError(Form("Index (%d) is outside the allowed range (0,59)!",index));
214     return;
215   }
216
217   fTriggerInputsNames.AddAt(new TNamed(name,NULL),index);
218 }
219 //______________________________________________________________________________
220 const char* AliESDHeader::GetTriggerInputName(Int_t index, Int_t trglevel) const
221 {
222   // Get the trigger input name
223   // at the specified position in the trigger mask and trigger level (0,1,2)
224   TNamed *trginput = 0;
225   if (trglevel == 0) trginput = (TNamed *)fTriggerInputsNames.At(index);
226   if (trglevel == 1) trginput = (TNamed *)fTriggerInputsNames.At(index+24);  
227   if (trglevel == 2) trginput = (TNamed *)fTriggerInputsNames.At(index+48); 
228   if (trginput) return trginput->GetName();
229   else return "";
230 }
231 //______________________________________________________________________________
232 TString AliESDHeader::GetActiveTriggerInputs() const
233 {
234   // Returns the list with the names of the active trigger inputs
235   TString trginputs;
236   for(Int_t i = 0; i < kNTriggerInputs; i++) {
237     TNamed *str = (TNamed *)((fTriggerInputsNames).At(i));
238     if (str) {
239       trginputs += " ";
240       trginputs += str->GetName();
241       trginputs += " ";
242     }
243   }
244
245   return trginputs;
246 }
247 //______________________________________________________________________________
248 TString AliESDHeader::GetFiredTriggerInputs() const
249 {
250   // Returns the list with the names of the fired trigger inputs
251   TString trginputs;
252   for(Int_t i = 0; i < kNTriggerInputs; i++) {
253       TNamed *str = (TNamed *)((fTriggerInputsNames.At(i)));
254       if (i < 24 && (fL0TriggerInputs & (1 << i))) {
255         if (str) {
256           trginputs += " ";
257           trginputs += str->GetName();
258           trginputs += " ";
259         }
260       }
261       if (i >= 24 && i < 48 && (fL1TriggerInputs & (1 << (i-24)))) {
262         if (str) {
263           trginputs += " ";
264           trginputs += str->GetName();
265           trginputs += " ";
266         }
267       }
268       if (i >= 48 && (fL2TriggerInputs & (1 << (i-48)))) {
269         if (str) {
270           trginputs += " ";
271           trginputs += str->GetName();
272           trginputs += " ";
273         }
274       }
275
276   }
277   return trginputs;
278 }
279 //______________________________________________________________________________
280 Bool_t AliESDHeader::IsTriggerInputFired(const char *name) const
281 {
282   // Checks if the trigger input is fired 
283  
284   TNamed *trginput = (TNamed *)fTriggerInputsNames.FindObject(name);
285   if (!trginput) return kFALSE;
286
287   Int_t inputIndex = fTriggerInputsNames.IndexOf(trginput);
288   if (inputIndex < 0) return kFALSE;
289   
290   if (fL0TriggerInputs & (1 << inputIndex)) return kTRUE;
291   else if (fL1TriggerInputs & (1 << (inputIndex-24))) return kTRUE;
292   else if (fL2TriggerInputs & (1 << (inputIndex-48))) return kTRUE;
293   else return kFALSE;
294 }