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