429dca1fa082d8637dc769d2196ef3046c1f32b8
[u/mrichter/AliRoot.git] / VZERO / AliVZEROTriggerData.cxx
1
2 /**************************************************************************
3  * Copyright(c) 1998-1999, 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 // Class AliVZEROTriggerData
18 // -------------------------
19 // Retrieves and hold the FEE parameters
20 // The parameters are recieved from the shuttle 
21 // AliVZEROTriggerData is then used in the AliVZEROTriggerSimulator
22 //
23
24 #include <TObjString.h>
25 #include <TMap.h>
26
27 #include "AliLog.h"
28 #include "AliDCSValue.h"
29 #include "AliVZEROTriggerData.h"
30
31 ClassImp(AliVZEROTriggerData)
32 //________________________________________________________________
33
34 AliVZEROTriggerData::AliVZEROTriggerData() :
35         TNamed(),
36         fBBAThreshold(0),
37         fBBCThreshold(0) ,  
38         fBGAThreshold(0) ,  
39         fBGCThreshold(0) ,  
40         fBBAForBGThreshold(0) ,  
41         fBBCForBGThreshold(0) ,  
42         fCentralityVOAThrLow(0) ,  
43         fCentralityVOAThrHigh(0) , 
44         fCentralityVOCThrLow(0) ,  
45         fCentralityVOCThrHigh(0) , 
46         fMultV0AThrLow(0) ,  
47         fMultV0AThrHigh(0) , 
48         fMultV0CThrLow(0) ,  
49         fMultV0CThrHigh(0),
50         fRun(0),
51         fStartTime(0),
52         fEndTime(0),
53         fIsProcessed(kFALSE)    
54
55 {
56         // default constructor
57         for(int i=0; i<kNCIUBoards ;i++) {
58                 fClk1Win1[i] = fClk1Win2[i] = 0;
59                 fDelayClk1Win1[i] = fDelayClk1Win2[i] = 0;
60                 fClk2Win1[i] = fClk2Win2[i] = 0;
61                 fDelayClk2Win1[i] = fDelayClk2Win2[i] = 0;
62                 fLatchWin1[i] = fLatchWin2[i] = 0;
63                 fResetWin1[i] = fResetWin2[i] = 0;
64                 fPedestalSubtraction[i] = kFALSE;
65                 for(Int_t j = 0; j < kNChannels; ++j) {
66                   fEnableCharge[i][j] = fEnableTiming[i][j] = kFALSE;
67                   fDiscriThr[i][j] = fDelayHit[i][j] = 0;
68                   fPedestalOdd[i][j] = fPedestalEven[i][j] = 0;
69                   fPedestalCutOdd[i][j] = fPedestalCutEven[i][j] = 0;
70                 }
71         }
72         for(Int_t i = 0; i < kNTriggerOutputs; ++i) fTriggerSelected[i] = 0;
73 }
74 //________________________________________________________________
75 AliVZEROTriggerData::AliVZEROTriggerData(Int_t nRun, UInt_t startTime, UInt_t endTime) :
76         TNamed(),
77         fBBAThreshold(0),
78         fBBCThreshold(0) ,  
79         fBGAThreshold(0) ,  
80         fBGCThreshold(0) ,  
81         fBBAForBGThreshold(0) ,  
82         fBBCForBGThreshold(0) ,  
83         fCentralityVOAThrLow(0) ,  
84         fCentralityVOAThrHigh(0) , 
85         fCentralityVOCThrLow(0) ,  
86         fCentralityVOCThrHigh(0) , 
87         fMultV0AThrLow(0) ,  
88         fMultV0AThrHigh(0) , 
89         fMultV0CThrLow(0) ,  
90         fMultV0CThrHigh(0),
91         fRun(nRun),
92         fStartTime(startTime),
93         fEndTime(endTime),
94         fIsProcessed(kFALSE)
95 {
96         // Constructor
97         for(int i=0; i<kNCIUBoards ;i++) {
98                 fClk1Win1[i] = fClk1Win2[i] = 0;
99                 fDelayClk1Win1[i] = fDelayClk1Win2[i] = 0;
100                 fClk2Win1[i] = fClk2Win2[i] = 0;
101                 fDelayClk2Win1[i] = fDelayClk2Win2[i] = 0;
102                 fLatchWin1[i] = fLatchWin2[i] = 0;
103                 fResetWin1[i] = fResetWin2[i] = 0;
104                 fPedestalSubtraction[i] = kFALSE;
105                 for(Int_t j = 0; j < kNChannels; ++j) {
106                   fEnableCharge[i][j] = fEnableTiming[i][j] = kFALSE;
107                   fDiscriThr[i][j] = fDelayHit[i][j] = 0;
108                   fPedestalOdd[i][j] = fPedestalEven[i][j] = 0;
109                   fPedestalCutOdd[i][j] = fPedestalCutEven[i][j] = 0;
110                 }
111         }
112         for(Int_t i = 0; i < kNTriggerOutputs; ++i) fTriggerSelected[i] = 0;
113
114         TString namst = "VZERO_Trigger_FEE";
115         SetName(namst.Data());
116         SetTitle(namst.Data());
117         
118 }
119
120 //________________________________________________________________
121 AliVZEROTriggerData::~AliVZEROTriggerData(){
122         // destructor
123 }
124 //_____________________________________________________________________________
125 void AliVZEROTriggerData::FillData(AliVZERODataFEE * data){
126         // Set all parameters from the data get by the shuttle
127         TMap * params = data->GetParameters();
128         TIter iter(params);     
129         TObjString* aliasName;
130         
131         while ((  aliasName = (TObjString*) iter.Next() ))  {
132                 AliDCSValue* aValue = (AliDCSValue*) params->GetValue(aliasName);
133                 Int_t val;
134                 if(aValue) {
135                         val = aValue->GetUInt();
136                         AliInfo(Form("%s : %d",aliasName->String().Data(), val));
137                         SetParameter(aliasName->String(),val);
138                 }
139         }       
140 }
141
142 //_____________________________________________________________________________
143 void AliVZEROTriggerData::SetParameter(TString name, Int_t val){
144         // Set given parameter
145         
146         Int_t iBoard = -1;
147         Int_t iChannel = -1;
148
149         TSeqCollection* nameSplit = name.Tokenize("/");
150         TObjString * boardName = (TObjString *)nameSplit->At(2);
151         if(!boardName->String().Contains("CCIU")) sscanf(boardName->String().Data(),"CIU%d",&iBoard);
152         
153         TString paramName = ((TObjString *)nameSplit->At(3))->String();
154         Char_t channel[2] ; channel[1] = '\0';
155         channel[0] = paramName[paramName.Sizeof()-2];
156         sscanf(channel,"%d",&iChannel);
157         
158         if(name.Contains("DelayClk1Win1")) SetDelayClk1Win1((UShort_t) val,iBoard);
159         else if(name.Contains("Clk1Win1")) SetClk1Win1((UShort_t) val,iBoard);
160         else if(name.Contains("DelayClk1Win2")) SetDelayClk1Win2((UShort_t) val,iBoard);
161         else if(name.Contains("Clk1Win2")) SetClk1Win2((UShort_t) val,iBoard);
162         else if(name.Contains("DelayClk2Win1")) SetDelayClk2Win1((UShort_t) val,iBoard);
163         else if(name.Contains("Clk2Win1")) SetClk2Win1((UShort_t) val,iBoard);
164         else if(name.Contains("DelayClk2Win2")) SetDelayClk2Win2((UShort_t) val,iBoard);
165         else if(name.Contains("Clk2Win2")) SetClk2Win2((UShort_t) val,iBoard);
166         else if(name.Contains("LatchWin1")) SetLatchWin1((UShort_t) val,iBoard);
167         else if(name.Contains("LatchWin2")) SetLatchWin2((UShort_t) val,iBoard);
168         else if(name.Contains("ResetWin1")) SetResetWin1((UShort_t) val,iBoard);
169         else if(name.Contains("ResetWin2")) SetResetWin2((UShort_t) val,iBoard);
170         else if(name.Contains("PedestalSubtraction")) SetPedestalSubtraction((Bool_t) val,iBoard);
171         else if(name.Contains("BBAThreshold")) SetBBAThreshold((UShort_t) val);
172         else if(name.Contains("BBCThreshold")) SetBBCThreshold((UShort_t) val);
173         else if(name.Contains("BGAThreshold")) SetBGAThreshold((UShort_t) val);
174         else if(name.Contains("BGCThreshold")) SetBGCThreshold((UShort_t) val);
175         else if(name.Contains("BBAForBGThreshold")) SetBBAForBGThreshold((UShort_t) val);
176         else if(name.Contains("BBCForBGThreshold")) SetBBCForBGThreshold((UShort_t) val);
177         else if(name.Contains("CentralityV0AThrLow")) SetCentralityV0AThrLow((UShort_t) val);
178         else if(name.Contains("CentralityV0AThrHigh")) SetCentralityV0AThrHigh((UShort_t) val);
179         else if(name.Contains("CentralityV0CThrLow")) SetCentralityV0CThrLow((UShort_t) val);
180         else if(name.Contains("CentralityV0CThrHigh")) SetCentralityV0CThrHigh((UShort_t) val);
181         else if(name.Contains("MultV0AThrLow")) SetMultV0AThrLow((UShort_t) val);
182         else if(name.Contains("MultV0AThrHigh")) SetMultV0AThrHigh((UShort_t) val);
183         else if(name.Contains("MultV0CThrLow")) SetMultV0CThrLow((UShort_t) val);
184         else if(name.Contains("MultV0CThrHigh")) SetMultV0CThrHigh((UShort_t) val);
185         else if(name.Contains("TriggerSelect")) SetTriggerSelected((UShort_t) val, iChannel-1 );
186         else if(name.Contains("EnableCharge")) SetEnableCharge((Bool_t) val, iBoard , iChannel-1);
187         else if(name.Contains("EnableTiming")) SetEnableTiming((Bool_t) val, iBoard , iChannel-1);
188         else if(name.Contains("DiscriThr")) SetDiscriThr((UShort_t) val, iBoard, iChannel-1);
189         else if(name.Contains("DelayHit")) SetDelayHit((UShort_t) val, iBoard, iChannel-1);
190         else if(name.Contains("PedOdd")) SetPedestal((UShort_t) val, 1, iBoard, iChannel-1);
191         else if(name.Contains("PedEven")) SetPedestal((UShort_t) val, 0, iBoard, iChannel-1);
192         else if(name.Contains("PedCutOdd")) SetPedestalCut((UShort_t) val, 1, iBoard, iChannel-1);
193         else if(name.Contains("PedCutEven")) SetPedestalCut((UShort_t) val, 0, iBoard, iChannel-1);
194         else AliError(Form("No Setter found for FEE parameter : %s",name.Data()));
195         //
196         delete nameSplit;
197 }
198 //________________________________________________________________
199 void AliVZEROTriggerData::SetPedestalCut(UShort_t val,Int_t integrator, Int_t board, Int_t channel)
200 {
201         // Set Pedestal Cut of individual channel 
202         if((board>=0 && board<kNCIUBoards) && (channel>=0 && channel<kNChannels)) {
203                 if(integrator) fPedestalCutOdd[board][channel] = val;
204                 else fPedestalCutEven[board][channel] = val;
205         } else AliError(Form("Impossible to write at : Board %d ; Channel %d",board,channel));
206 }
207 //________________________________________________________________
208 UShort_t AliVZEROTriggerData::GetPedestalCut(Int_t integrator, Int_t board, Int_t channel)
209 {
210         // Get Pedestal Cut of individual channel 
211         if((board>=0 && board<kNCIUBoards) && (channel>=0 && channel<kNChannels)) {
212                 if(integrator) return(fPedestalCutOdd[board][channel]);
213                 else return(fPedestalCutEven[board][channel]);
214         }else AliError(Form("Impossible to read at : Board %d ; Channel %d",board,channel));
215         return 0;
216 }
217 //________________________________________________________________
218 void AliVZEROTriggerData::SetPedestal(UShort_t val, Int_t integrator, Int_t board, Int_t channel)
219 {
220         // Set Pedestal of individual channel 
221         if((board>=0 && board<kNCIUBoards) && (channel>=0 && channel<kNChannels)) {
222                 if(integrator) fPedestalOdd[board][channel] = val;
223                 else fPedestalEven[board][channel] = val;
224         } else AliError(Form("Impossible to write at : Board %d ; Channel %d ; Integrator %d ",board,channel,integrator));
225 }
226 //________________________________________________________________
227 UShort_t AliVZEROTriggerData::GetPedestal(Int_t integrator, Int_t board, Int_t channel)
228 {
229         // Get Pedestal of individual channel 
230         if((board>=0 && board<kNCIUBoards) && (channel>=0 && channel<kNChannels)) {
231                 if(integrator) return(fPedestalOdd[board][channel]);
232                 else return(fPedestalEven[board][channel]);
233         } else AliError(Form("Impossible to read at : Board %d ; Channel %d",board,channel));
234         return 0;
235 }
236 //________________________________________________________________
237 void AliVZEROTriggerData::SetDelayHit(UShort_t val,Int_t board, Int_t channel)
238 {
239         // Set Delay of individual channel 
240         if((board>=0 && board<kNCIUBoards) && (channel>=0 && channel<kNChannels)) fDelayHit[board][channel] = val;
241         else AliError(Form("Impossible to write at : Board %d ; Channel %d",board,channel));
242 }
243 //________________________________________________________________
244 UShort_t AliVZEROTriggerData::GetDelayHit(Int_t board, Int_t channel)
245 {
246         // Get Delay of individual channel 
247         if((board>=0 && board<kNCIUBoards) && (channel>=0 && channel<kNChannels)) return(fDelayHit[board][channel]);
248         else AliError(Form("Impossible to read at : Board %d ; Channel %d",board,channel));
249         return 0;
250 }
251 //________________________________________________________________
252 void AliVZEROTriggerData::SetDiscriThr(UShort_t val,Int_t board, Int_t channel)
253 {
254         // Set discriminator threshold
255         if((board>=0 && board<kNCIUBoards) && (channel>=0 && channel<kNChannels)) fDiscriThr[board][channel] = val;
256         else AliError(Form("Impossible to write at : Board %d ; Channel %d",board,channel));
257 }
258 //________________________________________________________________
259 UShort_t AliVZEROTriggerData::GetDiscriThr(Int_t board, Int_t channel)
260 {
261         // Get discriminator threshold
262         if((board>=0 && board<kNCIUBoards) && (channel>=0 && channel<kNChannels)) return(fDiscriThr[board][channel]);
263         else AliError(Form("Impossible to read at : Board %d ; Channel %d",board,channel));
264         return 0;
265 }
266 //________________________________________________________________
267 void AliVZEROTriggerData::SetEnableCharge(Bool_t val,Int_t board, Int_t channel)
268 {
269         // Set the channels enabled for Charge triggers
270         if((board>=0 && board<kNCIUBoards) && (channel>=0 && channel<kNChannels)) fEnableCharge[board][channel] = val;
271         else AliError(Form("Impossible to write at : Board %d ; Channel %d",board,channel));
272 }
273 //________________________________________________________________
274 Bool_t AliVZEROTriggerData::GetEnableCharge(Int_t board, Int_t channel)
275 {
276         // Get the channels enabled for Charge triggers
277         if((board>=0 && board<kNCIUBoards) && (channel>=0 && channel<kNChannels)) return(fEnableCharge[board][channel]);
278         else AliError(Form("Impossible to read at : Board %d ; Channel %d",board,channel));
279         return kFALSE;
280 }
281 //________________________________________________________________
282 void AliVZEROTriggerData::SetEnableTiming(Bool_t val,Int_t board, Int_t channel)
283 {
284         // Set the channels enabled for Timing triggers
285         if((board>=0 && board<kNCIUBoards) && (channel>=0 && channel<kNChannels)) fEnableTiming[board][channel] = val;
286         else AliError(Form("Impossible to write at : Board %d ; Channel %d",board,channel));
287 }
288 //________________________________________________________________
289 Bool_t AliVZEROTriggerData::GetEnableTiming(Int_t board, Int_t channel)
290 {
291         // Get the channels enabled for Timing triggers
292         if((board>=0 && board<kNCIUBoards) && (channel>=0 && channel<kNChannels)) return(fEnableTiming[board][channel]);
293         else AliError(Form("Impossible to read at : Board %d ; Channel %d",board,channel));
294         return kFALSE;
295 }
296 //________________________________________________________________
297 void AliVZEROTriggerData::SetTriggerSelected(UShort_t trigger, Int_t output)
298 {
299         // Set the trigger selected on the outputs to CTP
300         if(output>=0 && output<kNTriggerOutputs) fTriggerSelected[output] = trigger;
301         else AliError(Form("Trigger output number %d not valid",output));
302 }
303
304 //________________________________________________________________
305 void AliVZEROTriggerData::SetClk1Win1(UShort_t* clks)
306 {
307         // Set Win clock of BB
308         if(clks) for(int t=0; t<kNCIUBoards; t++) SetClk1Win1(clks[t],t);
309         else AliError("Profil Clock1 Win1 Not defined.");
310 }
311 //________________________________________________________________
312 void AliVZEROTriggerData::SetClk2Win1(UShort_t* clks)
313 {
314         // Set Win clock of BB
315         if(clks) for(int t=0; t<kNCIUBoards; t++) SetClk2Win1(clks[t],t);
316         else AliError("Profil Clock2 Win1 Not defined.");
317 }
318 //________________________________________________________________
319 void AliVZEROTriggerData::SetClk1Win1(UShort_t clk, Int_t board)
320 {
321         // Set Win clock of BB
322         if((board>=0) && (board<kNCIUBoards)) {
323                 fClk1Win1[board] = clk;
324                 if(!IsClkValid(clk)) AliWarning(Form("Profil Clock1 Win1 of board %d is not valid : %d",board,clk));
325         }else {
326                 AliError(Form("Impossible to Write at Board %d",board));
327         }
328 }
329 //________________________________________________________________
330 void AliVZEROTriggerData::SetClk2Win1(UShort_t clk, Int_t board)
331 {
332         // Set Win clock of BB
333         if((board>=0) && (board<kNCIUBoards)) {
334                 fClk2Win1[board] = clk;
335                 if(!IsClkValid(clk)) AliWarning(Form("Profil Clock2 Win1 of board %d is not valid : %d",board,clk));
336         }else {
337                 AliError(Form("Impossible to Write at Board %d",board));
338         }
339 }
340 //________________________________________________________________
341 void AliVZEROTriggerData::SetClk1Win2(UShort_t* clks)
342 {
343         // Set Win clock of BG
344         if(clks) for(int t=0; t<kNCIUBoards; t++) SetClk1Win2(clks[t],t);
345         else AliError("Profil Clock1 Win2 Not defined.");
346 }
347 //________________________________________________________________
348 void AliVZEROTriggerData::SetClk2Win2(UShort_t* clks)
349 {
350         // Set Win clock of BG
351         if(clks) for(int t=0; t<kNCIUBoards; t++) SetClk2Win2(clks[t],t);
352         else AliError("Profil Clock2 Win2 Not defined.");
353 }
354 //________________________________________________________________
355 void AliVZEROTriggerData::SetClk1Win2(UShort_t clk, Int_t board)
356 {
357         // Set Win clock of BG
358         if((board>=0) && (board<kNCIUBoards)) {
359                 fClk1Win2[board] = clk;
360                 if(!IsClkValid(clk)) AliWarning(Form("Profil Clock1 Win2 of board %d is not valid : %d",board,clk));
361         }else {
362                 AliError(Form("Impossible to Write at Board %d",board));
363         }
364 }
365 //________________________________________________________________
366 void AliVZEROTriggerData::SetClk2Win2(UShort_t clk, Int_t board)
367 {
368         // Set Win clock of BG
369         if((board>=0) && (board<kNCIUBoards)) {
370                 fClk2Win2[board] = clk;
371                 if(!IsClkValid(clk)) AliWarning(Form("Profil Clock2 Win2 of board %d is not valid : %d",board,clk));
372         }else {
373                 AliError(Form("Impossible to Write at Board %d",board));
374         }
375 }
376 //________________________________________________________________
377 void AliVZEROTriggerData::SetDelayClk1Win1(UShort_t* delays)
378 {
379         // Set Delay for Win clock of BB
380         if(delays) for(int t=0; t<kNCIUBoards; t++) SetDelayClk1Win1(delays[t],t);
381         else AliError("Profil Clock1 Win1 Delays Not defined.");
382 }
383 //________________________________________________________________
384 void AliVZEROTriggerData::SetDelayClk1Win1(UShort_t delay, Int_t board)
385 {
386         // Set Delay for Win clock of BB
387         if(delay>1023){
388                 AliWarning(Form("Profil Clock1 Win1 Delay of board %d should be less 1023 is currently %d. Truncated to the first 10 bits",board, delay));
389                 delay = delay & 0x3FF;
390         }
391         if((board>=0) && (board<kNCIUBoards))   fDelayClk1Win1[board] = delay;
392         else AliError(Form("Trying to write out of the array Board = %d",board));
393 }
394 //________________________________________________________________
395 void AliVZEROTriggerData::SetDelayClk2Win1(UShort_t* delays)
396 {
397         // Set Delay for Win clock of BB
398         if(delays) for(int t=0; t<kNCIUBoards; t++) SetDelayClk2Win1(delays[t],t);
399         else AliError("Profil Clock2 Win1 Delays Not defined.");
400 }
401 //________________________________________________________________
402 void AliVZEROTriggerData::SetDelayClk2Win1(UShort_t delay, Int_t board)
403 {
404         // Set Delay for Win clock of BB
405         if(delay>1023){
406                 AliWarning(Form("Profil Clock2 Win1 Delay of board %d should be less 1023 is currently %d. Truncated to the first 10 bits",board, delay));
407                 delay = delay & 0x3FF;
408         }
409         if((board>=0) && (board<kNCIUBoards))   fDelayClk2Win1[board] = delay;
410         else AliError(Form("Trying to write out of the array Board = %d",board));
411 }
412 //________________________________________________________________
413 void AliVZEROTriggerData::SetDelayClk1Win2(UShort_t* delays)
414 {
415         // Set Delay for Win clock of BG
416         if(delays) for(int t=0; t<kNCIUBoards; t++) SetDelayClk1Win2(delays[t],t);
417         else AliError("Profil Clock1 Win2 Delays Not defined.");
418 }
419 //________________________________________________________________
420 void AliVZEROTriggerData::SetDelayClk1Win2(UShort_t delay, Int_t board)
421 {
422         // Set Delay for Win clock of BG
423         if(delay>1023){
424                 AliWarning(Form("Profil Clock1 Win2 Delay of board %d should be less 1023 is currently %d. Truncated to the first 10 bits",board, delay));
425                 delay = delay & 0x3FF;
426         }
427         if((board>=0) && (board<kNCIUBoards))   fDelayClk1Win2[board] = delay;
428         else AliError(Form("Trying to write out of the array Board = %d",board));
429 }
430 //________________________________________________________________
431 void AliVZEROTriggerData::SetDelayClk2Win2(UShort_t* delays)
432 {
433         // Set Delay for Win clock of BG
434         if(delays) for(int t=0; t<kNCIUBoards; t++) SetDelayClk2Win2(delays[t],t);
435         else AliError("Profil Clock2 Win2 Delays Not defined.");
436 }
437 //________________________________________________________________
438 void AliVZEROTriggerData::SetDelayClk2Win2(UShort_t delay, Int_t board)
439 {
440         // Set Delay for Win clock of BG
441         if(delay>1023){
442                 AliWarning(Form("Profil Clock2 Win2 Delay of board %d should be less 1023 is currently %d. Truncated to the first 10 bits",board, delay));
443                 delay = delay & 0x3FF;
444         }
445         if((board>=0) && (board<kNCIUBoards))   fDelayClk2Win2[board] = delay;
446         else AliError(Form("Trying to write out of the array Board = %d",board));
447 }
448 //________________________________________________________________
449 void AliVZEROTriggerData::SetLatchWin1(UShort_t *latchs){
450         // Set Latch Win clock for BB
451         if(latchs) for(int t=0; t<kNCIUBoards; t++) SetLatchWin1(latchs[t],t);
452         else AliError("Latch Win1 profil Not defined.");
453 }
454 //________________________________________________________________
455 void AliVZEROTriggerData::SetLatchWin1(UShort_t latch, Int_t board)
456 {
457         // Set Latch Win clock for BB
458         if((board>=0) && (board<kNCIUBoards)) {
459                 fLatchWin1[board] = latch;
460                 if(!IsClkValid(latch)) AliWarning(Form("Latch Win1 of board %d is not valid : %d",board,latch));
461         }else {
462                 AliError(Form("Impossible to Write at Board %d",board));
463         }
464 }
465 //________________________________________________________________
466 void AliVZEROTriggerData::SetLatchWin2(UShort_t *latchs){
467         // Set Latch Win clock for BG
468         if(latchs) for(int t=0; t<kNCIUBoards; t++) SetLatchWin2(latchs[t],t);
469         else AliError("Latch Win2 profil Not defined.");
470 }
471 //________________________________________________________________
472 void AliVZEROTriggerData::SetLatchWin2(UShort_t latch, Int_t board)
473 {
474         // Set Latch Win clock for BG
475         if((board>=0) && (board<kNCIUBoards)) {
476                 fLatchWin2[board] = latch;
477                 if(!IsClkValid(latch)) AliWarning(Form("Latch Win2 of board %d is not valid : %d",board,latch));
478         }else {
479                 AliError(Form("Impossible to Write at Board %d",board));
480         }
481 }
482 //________________________________________________________________
483 void AliVZEROTriggerData::SetResetWin1(UShort_t *resets){
484         // Set Reset Win clock for BB
485         if(resets) for(int t=0; t<kNCIUBoards; t++) SetResetWin1(resets[t],t);
486         else AliError("Reset Win1 profil Not defined.");
487 }
488 //________________________________________________________________
489 void AliVZEROTriggerData::SetResetWin1(UShort_t reset, Int_t board)
490 {
491         // Set Reset Win clock for BB
492         if((board>=0) && (board<kNCIUBoards)) {
493                 fResetWin1[board] = reset;
494                 if(!IsClkValid(reset)) AliWarning(Form("Reset Win1 of board %d is not valid : %d",board,reset));
495         }else {
496                 AliError(Form("Impossible to Write at Board %d",board));
497         }
498 }
499 //________________________________________________________________
500 void AliVZEROTriggerData::SetResetWin2(UShort_t *resets){
501         // Set Reset Win clock for BG
502         if(resets)  for(int t=0; t<kNCIUBoards; t++) SetResetWin2(resets[t],t);
503         else AliError("Reset Win2 profil Not defined.");
504 }
505 //________________________________________________________________
506 void AliVZEROTriggerData::SetResetWin2(UShort_t reset, Int_t board)
507 {
508         // Set Reset Win clock for BG
509         if((board>=0) && (board<kNCIUBoards)) {
510                 fResetWin2[board] = reset;
511                 if(!IsClkValid(reset)) AliWarning(Form("Reset Win2 of board %d is not valid : %d",board,reset));
512         }else {
513                 AliError(Form("Impossible to Write at Board %d",board));
514         }
515 }
516 //________________________________________________________________
517 void AliVZEROTriggerData::SetPedestalSubtraction(Bool_t *peds){
518         // Set Pedestal Subtraction Parameter
519         if(peds)  for(int t=0; t<kNCIUBoards; t++) SetPedestalSubtraction(peds[t],t);
520         else AliError("Pedestal Subtraction Not defined.");
521         
522 }
523 //________________________________________________________________
524 void AliVZEROTriggerData::SetPedestalSubtraction(Bool_t ped, Int_t board)
525 {
526         // Set Pedestal Subtraction Parameter
527         if((board>=0) && (board<kNCIUBoards)) fPedestalSubtraction[board] = ped;
528         else AliError(Form("Board %d is not valid",board));
529 }
530
531 //________________________________________________________________
532 Bool_t  AliVZEROTriggerData::IsClkValid(UShort_t clock) const {
533         // Check if the given clock has a valid profil.
534         Bool_t word[5];
535         Bool_t isValid = kTRUE;
536         Short_t risingEdge = 0;
537         Short_t fallingEdge = 0;
538         for(int i=0 ; i<5 ; i++) word[i] = (clock >> i) & 0x1;
539         
540         if(word[0] != word[4]){
541                 if(word[4]) fallingEdge++;
542                 else risingEdge++;
543         }       
544         for(int i=1 ; i<5 ; i++){
545                 if(word[i] != word[i-1]) {
546                         if(word[i-1]) fallingEdge++;
547                         else risingEdge++;
548                 }
549         }
550         if((fallingEdge>1)||(risingEdge>1)) isValid = kFALSE;
551         if(((risingEdge==0)&&(fallingEdge==0)) &&(!word[0]))  isValid = kFALSE;
552         return isValid;
553 }
554
555
556