next50 trigger mask in AliHLTGlobalEsdConverterComponent
[u/mrichter/AliRoot.git] / TRD / AliTRDptrgCBAC.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 /* $Id$ */
17
18 ////////////////////////////////////////////////////////////////////////////
19 //                                                                        //
20 //  Pre-Trigger Control-Box A or C for simulation                         //
21 //                                                                        //
22 //  Authors: F. Reidt (Felix.Reidt@cern.ch)                               //
23 //                                                                        //
24 ////////////////////////////////////////////////////////////////////////////
25
26 #include <stdio.h>
27
28 #include "AliRun.h"
29 #include "AliRunLoader.h"
30
31 #include "AliLog.h"
32
33 #include "AliTRDptrgParam.h"
34 #include "AliTRDptrgFEB.h"
35 #include "AliTRDptrgLUT.h"
36
37 #include "AliTRDptrgCBAC.h"
38
39 ClassImp(AliTRDptrgCBAC)
40
41 //______________________________________________________________________________
42 AliTRDptrgCBAC::AliTRDptrgCBAC(AliRunLoader *rl) 
43   : TObject(),
44   fRunLoader(rl),
45   fLUTArray(),
46   fFEBArray(),
47   fPosition(AliTRDptrgParam::kUnknown),
48   fOperatingMode(AliTRDptrgParam::kDigits),
49   fParam(0x0)
50 {
51   //
52   // ctor
53   //
54
55   AliError("default ctor - usage not recommended");
56
57 }
58
59 //______________________________________________________________________________
60 AliTRDptrgCBAC::AliTRDptrgCBAC(AliRunLoader *rl, 
61                                AliTRDptrgParam::AliTRDptrgFEBPosition_t position,
62                                AliTRDptrgParam::AliTRDptrgOperatingMode_t operatingMode,
63                                AliTRDptrgParam *param) 
64   : TObject(),
65   fRunLoader(rl),
66   fLUTArray(),
67   fFEBArray(),
68   fPosition(position),
69   fOperatingMode(operatingMode),
70   fParam(param)
71 {
72   //
73   // ctor  
74   //
75
76   this->LoadParams(); // load parameters
77  
78   // T0
79   AliTRDptrgFEB *FEB = new AliTRDptrgFEB(this->fRunLoader, AliTRDptrgParam::kTZERO, 
80                                          this->fOperatingMode, this->fPosition,
81                                          0, this->fParam);
82   this->fFEBArray.AddLast(FEB);
83
84   // V0-1
85   FEB = new AliTRDptrgFEB(this->fRunLoader, AliTRDptrgParam::kVZERO, this->fOperatingMode, 
86                           this->fPosition, 1, this->fParam);
87   this->fFEBArray.AddLast(FEB);
88
89   // V0-2
90   FEB = new AliTRDptrgFEB(this->fRunLoader, AliTRDptrgParam::kVZERO, this->fOperatingMode, 
91                           this->fPosition, 2, this->fParam);
92   this->fFEBArray.AddLast(FEB);
93
94   // V0-3
95   FEB = new AliTRDptrgFEB(this->fRunLoader, AliTRDptrgParam::kVZERO, this->fOperatingMode, 
96                           this->fPosition, 3, this->fParam);
97   this->fFEBArray.AddLast(FEB);
98
99   // V0-4
100   FEB = new AliTRDptrgFEB(this->fRunLoader, AliTRDptrgParam::kVZERO, this->fOperatingMode, 
101                           this->fPosition, 4, this->fParam);
102   this->fFEBArray.AddLast(FEB);
103
104 }
105
106 //______________________________________________________________________________
107 Bool_t AliTRDptrgCBAC::LoadParams() 
108 {
109   //
110   // Load configuration parameters
111   //
112
113   if (this->fParam != 0x0) {
114     // read AliTRDptrgParam
115
116     // get LUTs
117     AliTRDptrgLUT* lut = 0x0;
118     // 0
119     lut = new AliTRDptrgLUT();
120     lut->InitTable(10, 10, this->fParam->GetCBLUT(this->fPosition, 0), kFALSE); 
121     // do not copy table data 
122     this->fLUTArray.AddLast(lut);
123     // 1
124     lut = new AliTRDptrgLUT();
125     lut->InitTable(10, 10, this->fParam->GetCBLUT(this->fPosition, 1), kFALSE); 
126     // do not copy table data 
127     this->fLUTArray.AddLast(lut);
128   }
129   else {
130     // load default parameters 
131     AliTRDptrgLUT* lut = new AliTRDptrgLUT();
132     this->fLUTArray.AddLast(lut);
133     lut = new AliTRDptrgLUT();
134     this->fLUTArray.AddLast(lut);
135     // the following lines are only needed for test reasons
136     lut = dynamic_cast<AliTRDptrgLUT*>(this->fLUTArray.At(0));
137     if (lut) {
138       Int_t* initData = new Int_t[1024]; // 2^10
139       for (Int_t i = 0; i < 1024; i++ ) {
140         initData[i] = i;
141       }
142       lut->InitTable(10, 10, initData, kTRUE); // copy initData
143       lut = dynamic_cast<AliTRDptrgLUT*>(this->fLUTArray.At(1));
144       if (lut) {
145         for (Int_t i = 1023; i >= 0; i--) {
146           initData[31 - i] = i;  // inverse ramp
147         }
148         lut->InitTable(10, 10, initData, kTRUE); // copy initData
149       }
150     }
151   }  
152
153   return false;
154
155 }
156
157 //______________________________________________________________________________
158 AliTRDptrgCBAC::~AliTRDptrgCBAC() 
159 {
160   //
161   // Destructor
162   //
163
164   this->fLUTArray.Delete();
165   this->fFEBArray.Delete();
166
167 }
168
169 //______________________________________________________________________________
170 Int_t* AliTRDptrgCBAC::Simulate()
171
172   //
173   // Simulate the CBAC behavior of event
174   //
175
176   Int_t nFEBs = this->fFEBArray.GetEntries();
177   Int_t nLUTs = this->fLUTArray.GetEntries();
178
179   Int_t inputVector = 0x0;
180
181   Int_t** partResults = 0x0;  
182   partResults = new Int_t* [nFEBs];
183
184   for (Int_t iFEB = 0; iFEB < nFEBs; iFEB++) {
185     AliTRDptrgFEB *feb = 0x0;
186     if ((feb = dynamic_cast<AliTRDptrgFEB*>(this->fFEBArray.At(iFEB)))) {
187       partResults[iFEB] = feb->Simulate();
188     }
189   }
190   
191   // combine partResults and create inputVector  
192   Int_t iBit = 0;
193   Int_t mask = 0x1;
194   for (Int_t iFEB = 0; iFEB < nFEBs ; iFEB++) {
195     for (Int_t j = 1; j <= partResults[iFEB][0]; j++) {
196       AliTRDptrgLUT *lut0 = dynamic_cast<AliTRDptrgLUT*>(this->fLUTArray[0]);
197       AliTRDptrgLUT *lut1 = dynamic_cast<AliTRDptrgLUT*>(this->fLUTArray[1]);
198       if (lut0 && lut1) {
199         if ((iBit > lut0->GetInputWidth()) 
200          || (iBit > lut1->GetInputWidth())) {
201           AliError("FEB result width does not match CB-A/C input with!");
202         }
203       }
204       iBit++;
205       if (partResults[iFEB][j] > 0) {
206         inputVector |= mask; // Add bit to the corresponding inputVector
207         mask <<= 1;
208       } 
209     }
210   }
211
212   AliDebug(5, Form("Inputvector: 0x%x", inputVector));
213     
214   // perform look up
215   Int_t* result = new Int_t[nLUTs + 1]; // generate new return array
216   result[0] = nLUTs; // storage array length in the first array value
217   for (Int_t iLUT = 0; iLUT < nLUTs; iLUT++) { 
218     // process the return value for each LUT and store the result in the array
219     AliTRDptrgLUT *lutTmp = 0x0;
220     if ((lutTmp = dynamic_cast<AliTRDptrgLUT*>(this->fLUTArray[iLUT]))) {
221       result[iLUT + 1] = lutTmp->LookUp(inputVector);
222     }
223     AliDebug(4, Form("CBAC result[%d] = 0x%x",(iLUT + 1),result[iLUT + 1])); 
224   }
225
226   // Clean up
227   delete [] partResults;
228
229   return result;
230
231 }
232
233
234