2 * @brief The Altro class implements the Altro digital Chain in C++
4 * This Class represents a C++ version of the ALTRO. For a complete Documentation of the Altro
5 * Look at : http://ep-ed-alice-tpc.web.cern.ch/ep-ed-alice-tpc/altro_chip.htm\n
6 * Due to the fact that the real ALTRO constantly samples in between the recorded events,
7 * it has the knowledge on what happened in the period. This affects the BSL1, TCF and BSL2 module.
8 * In the BSL1 the ALTRO follows slow baseline drifts e.g. temperature change, the TCF has a infinite
9 * (IIR Filter) memory of "old samples" i.e. a cluster at the start of a readout cycle will be treated
10 * differently, and the BSL2 has a 8 step pipeline. The ALTRO Class can't emulate this behavior,
11 * since the data is not recorded.\n
13 * @author Roland Bramm
14 * @version $LastChangedRevision: 688 $
15 * @date $LastChangedDate: 2005-12-16 14:07:11 +0100 (Fri, 16 Dec 2005) $
17 * \verbinclude Altro/Altro.C.log
20 /////////////////////////////////////////////////////////////////////////////////////////////////////
21 // Class for emulation of the ALTRO chip (Altro digital Chain) in C++ //
22 // Author: Roland Bramm //
24 // NOTE: This class has been modified to be conform with the coding conventions of the //
25 // ALICE Off-line Project. Keywords for setting the mode of BSC1 were modified //
26 // and are shown in the header file ... //
27 // Stefan Rossegger, 8th february 2008 //
28 /////////////////////////////////////////////////////////////////////////////////////////////////////
30 #include <AliTPCAltroEmulator.h>
35 #include <AliRawReader.h>
36 #include <AliRawVEvent.h>
37 #include <AliRawData.h>
38 #include <AliRawVEquipment.h>
39 #include <AliRawEquipmentHeader.h>
40 #include <AliTPCRawStreamV3.h>
44 /** @brief Consturctor of Altro Class
46 * Consturctor of Altro Class, some variables are set.\n
47 * The input Data is altered, so after running the complete emulation you have the
48 * Altro Processed Data in the Channel Pointer.\n
50 * @param timebins an <tt> int </tt> sets the length of the input Data (Channel)
51 * @param Channel an <tt> short* </tt> Pointer to a 1d Short_tArray with the input Data
55 ClassImp(AliTPCAltroEmulator)
57 AliTPCAltroEmulator::AliTPCAltroEmulator(Int_t timebins, short* Channel) :
60 // fChannelIn(Channel),
61 fChannelShort(Channel),
69 fConfiguredAltro(0), // ConfiguredAltro
70 fConfiguredBSL1(0), // ConfiguredBSL1
71 fConfiguredTCF(0), // ConfiguredTCF
72 fConfiguredTCFraw(0), // ConfiguredTCF
73 fConfiguredBSL2(0), // ConfiguredBSL2
74 fConfiguredZSU(0), // ConfiguredZSU
75 fBSL1mode(0), // BSL1mode
76 fBSL1ValuePeDestal(0), // BSL1ValuePeDestal
77 fBSL1PedestalMem(0), // BSL1PedestalMem
78 fBSL1polarity(0), // BSL1polarity
87 fTCFK1Int(0), // K1Int
88 fTCFK2Int(0), // K2Int
89 fTCFK3Int(0), // K3Int
90 fTCFL1Int(0), // L1Int
91 fTCFL2Int(0), // L2Int
92 fTCFL3Int(0), // L3Int
94 fBSL2HighThreshold(0), // BSL2HighThreshold
95 fBSL2LowThreshold(0), // BSL2LowThreshold
96 fBSL2Offset(0), // BSL2Offset
97 fBSL2Presamples(0), // BSL2Presamples(0),
98 fBSL2Postsamples(0), // BSL2Postsamples
100 fZSUThreshold(0), // ZSUThreshold
102 fZSUMinSamplesaboveThreshold(0), // ZSUMinSamplesaboveThreshold
103 fZSUPresamples(0), // ZSUPresamples
104 fZSUPostsamples(0), // ZSUPostsamples
106 fReader(0), // for Altro Emulation on Raw Reader
108 fDDLFolderName("/tmp/"),
109 fOutputDateFileName("/tmp/tmp.date"),
110 fOutputRootFileName("/tmp/tmp.root"),
118 // Constructor of Altro Class
121 fADCkeep = new Short_t[1024];
127 /** @brief Destructor of Altro Class
129 * Destructor of Altro Class\n
131 AliTPCAltroEmulator::~AliTPCAltroEmulator() {
133 // Destructor of Altro Class
136 // if(fConfiguredZSU == 1)
149 /** @brief Configures which modules of the Altro should be on.
151 * Configures which modules of the Altro should be on. Each of the modules
152 * which are configured to be on, have to be configured later before running
155 * @param ONBaselineCorrection1 an <tt> Int_t </tt> Switch (0,1) to turn on the Base Line Correction 1 (BSL1) Module
156 * @param ONTailcancellation an <tt> Int_t </tt> Switch (0,1) to turn on the Tail Cancellation Filter (TCF) Module
157 * @param ONBaselineCorrection2 an <tt> Int_t </tt> Switch (0,1) to turn on the Moving Average Filter (BSL2) Module
158 * @param ONClipping an <tt> Int_t </tt> Switch (0,1) to turn on the Clipping Module. This is not possible in the real Altro, there it is always on.
159 * @param ONZerosuppression an <tt> Int_t </tt> Switch (0,1) to turn on the Zero Suppression (ZSU) Module
160 * @param ONDataFormatting an <tt> Int_t </tt> Switch (0,1) to turn on the Data Formatting on (not implemented)
162 void AliTPCAltroEmulator::ConfigAltro(Int_t ONBaselineCorrection1, Int_t ONTailcancellation, Int_t ONBaselineCorrection2, Int_t ONClipping, Int_t ONZerosuppression, Int_t ONDataFormatting){
164 // Configures which modules of the Altro should be on
166 fOnBSL1 = InRange(ONBaselineCorrection1,0,1,"AliTPCAltroEmulator::ConfigAltro","ONBaselineCorrection1");
167 fOnTCF = InRange(ONTailcancellation,0,1,"AliTPCAltroEmulator::ConfigAltro","ONTailcancellation");
168 fOnBSL2 = InRange(ONBaselineCorrection2,0,1,"AliTPCAltroEmulator::ConfigAltro","ONBaselineCorrection2");
169 fOnClip = InRange(ONClipping,0,1,"AliTPCAltroEmulator::ConfigAltro","ONClipping");
170 fOnZSU = InRange(ONZerosuppression,0,1,"AliTPCAltroEmulator::ConfigAltro","ONZerosuppression");
171 fConfiguredAltro = 1;
172 if (!fConfiguredAltro) { //dummy code to avoid warning
173 printf("%d\n",ONDataFormatting); // does not have to be checked
177 /** @brief Configures the Base Line Correction 1 (BSL1) Module
179 * Configures the Base Line Correction 1 (BSL1) Module. You dont have to build a proper pedestalMemory
180 * array, a pointer of the correct type is enough, of course you are not allowed to use Basline
181 * Correction Modes which need then the array ...\n
182 * All configurable values are "Range checked" and if out of the Range set to the nearest extreme.
183 * So the Emulation will work, but the result is maybe not the expected one.
185 * @param mode an <tt> Int_t </tt> sets the mode of the Baseline Correction. See the Altro manual for a description
186 * @param ValuePeDestal an <tt> Int_t </tt> this is the baseline of the Channel.
187 * @param PedestalMem an <tt> *Int_t </tt> Pointer to a 1d Short_t Array with the pedestal memory Data
188 * @param polarity an <tt> Int_t </tt> Switch (0,1) for the polarity
190 void AliTPCAltroEmulator::ConfigBaselineCorrection1(Int_t mode, Int_t ValuePeDestal, Int_t *PedestalMem, Int_t polarity){
192 // Configures the Base Line Correction 1 (BSL1) Module
194 fBSL1mode = InRange(mode,0,16,"AliTPCAltroEmulator::ConfigBaselineCorrection1","mode");
195 fBSL1ValuePeDestal = InRange(ValuePeDestal,0,1023,"AliTPCAltroEmulator::BaselineCorrection1","ValuePeDestal");
196 fBSL1PedestalMem = PedestalMem;
197 fBSL1polarity = InRange(polarity,0,1,"AliTPCAltroEmulator::BaselineCorrection1","polarity");
201 /** @brief Configures the Tail Cancellation Filter (TCF) Module
203 * Configures the Tail Cancellation Filter (TCF) Module. You have to set the coefficients in the
205 * To convert from Int_t to Float_t use (int)*(pow(2,-16)-1)
206 * To convert from Float_t to Int_t usw (Float_t)*(pow(2,16)-1)
207 * All configurable values are "Range checked" and if out of the Range set to the nearest extreme.
208 * So the Emulation will work, but the result is maybe not the expected one.
210 * @param K1 an <tt> Int_t </tt> sets the K1 coeeficient of the TCF
211 * @param K2 an <tt> Int_t </tt> sets the K2 coeeficient of the TCF
212 * @param K3 an <tt> Int_t </tt> sets the K3 coeeficient of the TCF
213 * @param L1 an <tt> Int_t </tt> sets the L1 coeeficient of the TCF
214 * @param L2 an <tt> Int_t </tt> sets the L2 coeeficient of the TCF
215 * @param L3 an <tt> Int_t </tt> sets the L3 coeeficient of the TCF
217 void AliTPCAltroEmulator::ConfigTailCancellationFilter(Int_t K1, Int_t K2, Int_t K3, Int_t L1, Int_t L2, Int_t L3){
219 // Configures the Tail Cancellation Filter (TCF) Module
221 // conf from Int_t to fp: (int)*(pow(2,-16)-1)
222 // backway: (Float_t)*(pow(2,16)-1)
223 fTCFK1Int = InRange(K1,0,65535,"AliTPCAltroEmulator::ConfigTailCancellationFilter","K1");
224 fTCFK2Int = InRange(K2,0,65535,"AliTPCAltroEmulator::ConfigTailCancellationFilter","K2");
225 fTCFK3Int = InRange(K3,0,65535,"AliTPCAltroEmulator::ConfigTailCancellationFilter","K3");
227 fTCFL1Int = InRange(L1,0,65535,"AliTPCAltroEmulator::ConfigTailCancellationFilter","L1");
228 fTCFL2Int = InRange(L2,0,65535,"AliTPCAltroEmulator::ConfigTailCancellationFilter","L2");
229 fTCFL3Int = InRange(L3,0,65535,"AliTPCAltroEmulator::ConfigTailCancellationFilter","L3");
232 void AliTPCAltroEmulator::ConfigTailCancellationFilterForRAWfiles(const Int_t *K1, const Int_t *K2, const Int_t *K3,
233 const Int_t *L1, const Int_t *L2, const Int_t *L3){
235 // Configures the Tail Cancellation Filter (TCF) Module - Different settings for IROC and OROC
237 // conf from Int_t to fp: (int)*(pow(2,-16)-1)
238 // backway: (Float_t)*(pow(2,16)-1)
241 fTCFK1IntROC[0] = InRange(K1[0],0,65535,"AliTPCAltroEmulator::ConfigTailCancellationFilter","K1[0]");
242 fTCFK2IntROC[0] = InRange(K2[0],0,65535,"AliTPCAltroEmulator::ConfigTailCancellationFilter","K2[0]");
243 fTCFK3IntROC[0] = InRange(K3[0],0,65535,"AliTPCAltroEmulator::ConfigTailCancellationFilter","K3[0]");
244 fTCFL1IntROC[0] = InRange(L1[0],0,65535,"AliTPCAltroEmulator::ConfigTailCancellationFilter","L1[0]");
245 fTCFL2IntROC[0] = InRange(L2[0],0,65535,"AliTPCAltroEmulator::ConfigTailCancellationFilter","L2[0]");
246 fTCFL3IntROC[0] = InRange(L3[0],0,65535,"AliTPCAltroEmulator::ConfigTailCancellationFilter","L3[0]");
248 fTCFK1IntROC[1] = InRange(K1[1],0,65535,"AliTPCAltroEmulator::ConfigTailCancellationFilter","K1[1]");
249 fTCFK2IntROC[1] = InRange(K2[1],0,65535,"AliTPCAltroEmulator::ConfigTailCancellationFilter","K2[1]");
250 fTCFK3IntROC[1] = InRange(K3[1],0,65535,"AliTPCAltroEmulator::ConfigTailCancellationFilter","K3[1]");
251 fTCFL1IntROC[1] = InRange(L1[1],0,65535,"AliTPCAltroEmulator::ConfigTailCancellationFilter","L1[1]");
252 fTCFL2IntROC[1] = InRange(L2[1],0,65535,"AliTPCAltroEmulator::ConfigTailCancellationFilter","L2[1]");
253 fTCFL3IntROC[1] = InRange(L3[1],0,65535,"AliTPCAltroEmulator::ConfigTailCancellationFilter","L3[1]");
256 fConfiguredTCFraw = 1;
260 /** @brief Configures the Moving Average Filter (BSL2) Module
262 * Configures the Moving Average Filter (BSL2) Module.
263 * All configurable values are "Range checked" and if out of the Range set to the nearest extreme.
264 * So the Emulation will work, but the result is maybe not the expected one.
266 * @param HighThreshold an <tt> Int_t </tt> sets the high Threshold
267 * @param LowThreshold an <tt> Int_t </tt> sets the low Theshold
268 * @param Offset an <tt> Int_t </tt> sets the the offset which is added to the Signal
269 * @param Presamples an <tt> Int_t </tt> sets the number of pre samples excluded from the moving average caclulation
270 * @param Postsamples an <tt> Int_t </tt> sets the number of post samples excluded from the moving average caclulation
272 void AliTPCAltroEmulator::ConfigBaselineCorrection2(Int_t HighThreshold, Int_t LowThreshold, Int_t Offset, Int_t Presamples, Int_t Postsamples){
274 // Configures the Moving Average Filter (BSL2) Module
276 fBSL2HighThreshold = InRange(HighThreshold,0,1023,"AliTPCAltroEmulator::ConfigBaselineCorrection2","HighThreshold");
277 fBSL2LowThreshold = InRange(LowThreshold,0,1023,"AliTPCAltroEmulator::ConfigBaselineCorrection2","LowThreshold");
278 fBSL2Offset = InRange(Offset,0,1023,"AliTPCAltroEmulator::ConfigBaselineCorrection2","Offset");
279 fBSL2Presamples = InRange(Presamples,0,3,"AliTPCAltroEmulator::ConfigBaselineCorrection2","Presamples");
280 fBSL2Postsamples = InRange(Postsamples,0,15,"AliTPCAltroEmulator::ConfigBaselineCorrection2","Postsamples");
284 /** @brief Configures the Zero Suppression Module (ZSU)
286 * Configures the Zero Suppression Module (ZSU).
287 * All configurable values are "Range checked" and if out of the Range set to the nearest extreme.
288 * So the Emulation will work, but the result is maybe not the expected one.
290 * @param Threshold an <tt> Int_t </tt> sets the Threshold
291 * @param MinSamplesaboveThreshold an <tt> Int_t </tt> sets the minimum number of samples which have to be greater than the threshold
292 * @param Presamples an <tt> Int_t </tt> sets the number of pre samples which are kept
293 * @param Postsamples an <tt> Int_t </tt> sets the number of post samples which are kept
295 void AliTPCAltroEmulator::ConfigZerosuppression(Int_t Threshold, Int_t MinSamplesaboveThreshold, Int_t Presamples, Int_t Postsamples){
297 // Configures the Zero Suppression Module (ZSU)
299 fZSUThreshold = InRange(Threshold,0,1023,"AliTPCAltroEmulator::BaselineCorrection1","Threshold");
300 fZSUMinSamplesaboveThreshold = InRange(MinSamplesaboveThreshold,1,3,"AliTPCAltroEmulator::BaselineCorrection1","MinSamplesaboveThreshold");
301 fZSUPresamples = InRange(Presamples,0,3,"AliTPCAltroEmulator::BaselineCorrection1","Presamples");
302 fZSUPostsamples = InRange(Postsamples,0,7,"AliTPCAltroEmulator::BaselineCorrection1","Postsamples");
304 for(Int_t i = 0; i < ftimebins; i++){
310 /** @brief Prints the set Parameters, if module is configured
312 * Prints the set Parameters, if module is configured.
314 void AliTPCAltroEmulator::PrintParameters(){
316 // Prints the set Parameters, if module is configured
318 cout << "+-------------------------------------------+" << endl;
319 cout << "| Configured Parameters of the Altro Module |" << endl;
320 cout << "+-------------------------------------------+" << endl << endl;
322 cout << "Parameters set in the Altro Modules:" << endl << endl;
323 cout << "ONBaselineCorrection1: " << fOnBSL1 << endl;
324 cout << "ONTailcancellation : " << fOnTCF << endl;
325 cout << "ONBaselineCorrection2: " << fOnBSL2 << endl;
326 cout << "ONClipping : " << fOnClip << endl;
327 cout << "ONZerosuppression : " << fOnZSU << endl << endl << endl;
328 if(fConfiguredBSL1 == 1){
329 cout << "Parameters set in the BSL1 (Baseline Correction 1) Module:" << endl << endl;
330 cout << "mode : " << fBSL1mode << endl;
331 cout << "ValuePeDestal : " << fBSL1ValuePeDestal << endl;
332 cout << "polarity : " << fBSL1ValuePeDestal << endl << endl << endl;
334 cout << "BSL1 (Baseline Correction 1) Module not configured!" << endl << endl << endl;
336 if(fConfiguredTCF == 1){
337 cout << "Parameters set in the TCF (TailCancellation Filter) Module:" << endl << endl;
338 cout << "K1 (int|Float_t) : " << fTCFK1Int << " | " << fTCFK1Int/(Float_t)((1<<16)-1) << endl;
339 cout << "K2 (int|Float_t) : " << fTCFK2Int << " | " << fTCFK2Int/(Float_t)((1<<16)-1) << endl;
340 cout << "K3 (int|Float_t) : " << fTCFK3Int << " | " << fTCFK3Int/(Float_t)((1<<16)-1) << endl;
341 cout << "L1 (int|Float_t) : " << fTCFL1Int << " | " << fTCFL1Int/(Float_t)((1<<16)-1) << endl;
342 cout << "L2 (int|Float_t) : " << fTCFL2Int << " | " << fTCFL2Int/(Float_t)((1<<16)-1) << endl;
343 cout << "L3 (int|Float_t) : " << fTCFL3Int << " | " << fTCFL3Int/(Float_t)((1<<16)-1) << endl << endl << endl;
345 cout << "TCF (TailCancellation Filter) Module not configured!" << endl << endl << endl;
347 if(fConfiguredBSL2 == 1){
348 cout << "Parameters set in the BSL2 (Baseline Correction 2) Module:" << endl << endl;
349 cout << "HighThreshold : " << fBSL2HighThreshold << endl;
350 cout << "LowThreshold : " << fBSL2LowThreshold << endl;
351 cout << "Offset : " << fBSL2Offset << endl;
352 cout << "Presamples : " << fBSL2Presamples << endl;
353 cout << "Postsamples : " << fBSL2Postsamples << endl << endl << endl;
355 cout << "BSL2 (Baseline Correction 2) Module not configured!" << endl << endl << endl;
357 if(fConfiguredZSU == 1){
358 cout << "Parameters set in the ZSU (Zero Suppression Unit) Module:" << endl << endl;
359 cout << "Threshold : " << fZSUThreshold << endl;
360 cout << "MinSampaboveThreshold: " << fZSUMinSamplesaboveThreshold << endl;
361 cout << "Presamples : " << fZSUPresamples << endl;
362 cout << "Postsamples : " << fZSUPostsamples << endl << endl << endl;
364 cout << "ZSU (Zero Suppression Unit) Module not configured!" << endl << endl << endl;
369 void AliTPCAltroEmulator::SetChannelData(Int_t timebins, Short_t* channelData) {
371 // Set channel data, for example a new channel
374 ftimebins = timebins;
375 fChannelShort = channelData;
380 /** @brief Runs the emulation of all configured Modules.
382 * Runs the emulation of all configured Modules. This changes then the content of the
385 void AliTPCAltroEmulator::RunEmulation(Int_t roc){
387 // Runs the emulation of all configured Modules.
390 if (!fChannelShort) {
391 printf("ERROR cant run Altro Emulation: Channel input not set.\nUse for example: SetChannelData(Int_t timebins, Short_t* Channel)\n");
395 //cout << "AliTPCAltroEmulator::RunEmulation | start" << endl;
396 if(fConfiguredAltro == 0){
397 cout << "ERROR cant run Altro Emulation because not configured" << endl;
401 //cout << "AliTPCAltroEmulator::RunEmulation | start BSL1 on: " << fOnBSL1 << " configures: " << fConfiguredBSL1 << endl;
403 if(fConfiguredBSL1 == 1){
404 BaselineCorrection1(fBSL1mode, fBSL1ValuePeDestal, fBSL1PedestalMem, fBSL1polarity);
406 cout << "ERROR cant run Baseline Correction 1 because not configured" << endl;
411 //cout << "AliTPCAltroEmulator::RunEmulation | start TCF on: " << fOnTCF << " configures: " << fConfiguredTCF << endl;
413 if (roc==-1) { // use one set of TCF params
414 if(fConfiguredTCF == 1){
415 TailCancellationFilterFixedPoint(fTCFK1Int, fTCFK2Int, fTCFK3Int, fTCFL1Int, fTCFL2Int, fTCFL3Int);
417 cout << "ERROR cant run Tail Cancellation Filter because not configured" << endl;
420 } else { // use different TCF params for IROC and OROC
421 if(fConfiguredTCFraw == 1){
423 TailCancellationFilterFixedPoint(fTCFK1IntROC[0], fTCFK2IntROC[0], fTCFK3IntROC[0],
424 fTCFL1IntROC[0], fTCFL2IntROC[0], fTCFL3IntROC[0]);
425 else if (roc==1) // OROC
426 TailCancellationFilterFixedPoint(fTCFK1IntROC[1], fTCFK2IntROC[1], fTCFK3IntROC[1],
427 fTCFL1IntROC[1], fTCFL2IntROC[1], fTCFL3IntROC[1]);
429 cout << "ERROR cant run Tail Cancellation Filter because TCF settings for ROC not found" << endl;
431 cout << "ERROR cant run Tail Cancellation Filter because not configured (for RAW data files!)" << endl;
438 //cout << "AliTPCAltroEmulator::RunEmulation | start BSL2 on: " << fOnBSL2 << " configures: " << fConfiguredBSL2 << endl;
440 if(fConfiguredBSL2 == 1){
441 BaselineCorrection2RTL(fBSL2HighThreshold, fBSL2LowThreshold, fBSL2Offset, fBSL2Presamples, fBSL2Postsamples);
443 cout << "ERROR cant run Baseline Correction 2 because not configured" << endl;
447 //cout << "AliTPCAltroEmulator::RunEmulation | start CLIP on: " << fOnClip << endl;
451 //cout << "AliTPCAltroEmulator::RunEmulation | start ZSU on: " << fOnZSU << " configures: " << fConfiguredZSU << endl;
453 if(fConfiguredZSU == 1){
454 Zerosuppression(fZSUThreshold,fZSUMinSamplesaboveThreshold,fZSUPresamples,fZSUPostsamples);
456 cout << "ERROR cant run Zero Suppression Unit because not configured" << endl;
465 void AliTPCAltroEmulator::BaselineCorrection1(Int_t mode, Int_t ValuePeDestal, Int_t *PedestalMem, Int_t polarity){
467 // BaselineCorrection1
471 Int_t fixedPeDestal = 0;
473 // take first and last bins to calculate a mean pedestal value
475 Int_t meanPeDestal = 0;
476 for(Int_t i = 0; i < window; i++) {
477 meanPeDestal += fChannelShort[i];
478 meanPeDestal += fChannelShort[ftimebins-1-i];
480 meanPeDestal /= (window*2);
484 for(Int_t i = 0; i < ftimebins; i++){
485 fChannelShort[i] = 1023 - fChannelShort[i];
491 for(Int_t i = 0; i < ftimebins; i++)
492 fChannelShort[i] = fChannelShort[i] - fixedPeDestal;
495 for(Int_t i = 0; i < ftimebins; i++)
496 fChannelShort[i] = fChannelShort[i] - PedestalMem[i];
499 for(Int_t i = 0; i < ftimebins; i++)
500 fChannelShort[i] = fChannelShort[i] - PedestalMem[ fChannelShort[i] ];
503 for(Int_t i = 0; i < ftimebins; i++)
504 fChannelShort[i] = fChannelShort[i] - PedestalMem[ fChannelShort[i] - ValuePeDestal];
507 for(Int_t i = 0; i < ftimebins; i++)
508 fChannelShort[i] = fChannelShort[i] - ValuePeDestal - fixedPeDestal;
511 for(Int_t i = 0; i < ftimebins; i++)
512 fChannelShort[i] = fChannelShort[i] - ValuePeDestal - PedestalMem[i];
515 for(Int_t i = 0; i < ftimebins; i++)
516 fChannelShort[i] = fChannelShort[i] - ValuePeDestal - PedestalMem[ fChannelShort[i] ];
518 case kDINxVPDxFDINxVPD:
519 for(Int_t i = 0; i < ftimebins; i++)
520 fChannelShort[i] = fChannelShort[i] - ValuePeDestal - PedestalMem[ fChannelShort[i] - ValuePeDestal ];
523 for(Int_t i = 0; i < ftimebins; i++)
524 fChannelShort[i] = PedestalMem[ fChannelShort[i] ] - fixedPeDestal;
527 for(Int_t i = 0; i < ftimebins; i++)
528 fChannelShort[i] = PedestalMem[ fChannelShort[i] - ValuePeDestal ] - fixedPeDestal;
531 for(Int_t i = 0; i < ftimebins; i++)
532 fChannelShort[i] = PedestalMem[i] - fixedPeDestal;
535 for(Int_t i = 0; i < ftimebins; i++)
536 fChannelShort[i] = fChannelShort[i] - meanPeDestal;
541 Int_t AliTPCAltroEmulator::Multiply36(Int_t P, Int_t N){
543 // multiply function to emulate the 36 bit fixed point multiplication of the Altro.
548 temp = (long long)P*(long long)N;
549 vAX = (( Mask(temp,35,18) + ((long long)(-P)<<18) ) + Mask(temp,17,0));
550 if ( Maskandshift(N,17,17) == 1){
551 retval = ((Maskandshift(vAX,35,35)<<17) + Maskandshift(vAX,32,16));
553 retval = Maskandshift(temp,32,16);
557 long long AliTPCAltroEmulator::Mask(long long in, Int_t left, Int_t right){
563 long long length = abs(left - right)+1;
564 pattern = ((1<<length)-1)<<right;
569 long long AliTPCAltroEmulator::Maskandshift(long long in, Int_t left, Int_t right){
575 long long length = abs(left - right)+1;
576 pattern = ((1<<length)-1);
577 retval = (in>>right)&pattern;
581 void AliTPCAltroEmulator::TailCancellationFilterFixedPoint(Int_t K1, Int_t K2, Int_t K3, Int_t L1, Int_t L2, Int_t L3){
583 // TailCancellationFilterFixedPoint
585 Int_t c1n = 0, c2n = 0, c3n = 0;
586 Int_t c1o = 0, c2o = 0, c3o = 0;
587 Int_t d1 = 0, d2 = 0;
592 // printf("%5d %5d %5d %5d %5d %5d\n",K1,K2,K3,L1,L2,L3);
594 for(Int_t i = 0; i < ftimebins; i++){
595 din = fChannelShort[i];
598 c1n = Mask( (Mask(din,17,0) + Multiply36(K1,Mask(c1o,17,0)) ) ,17,0);
599 d1 = Mask( (Mask(c1n,17,0) - Multiply36(L1,Mask(c1o,17,0)) ) ,17,0);
600 //d1 = Mask( (Mask(c1n,17,0) + Mask(~Multiply36(L1,Mask(c1o,17,0))+1,17,0) ) ,17,0);
602 c2n = Mask( (Mask(d1 ,17,0) + Multiply36(K2,Mask(c2o,17,0)) ) ,17,0);
603 d2 = Mask( (Mask(c2n,17,0) - Multiply36(L2,Mask(c2o,17,0)) ) ,17,0);
604 //d2 = Mask( (Mask(c2n,17,0) + Mask(~Multiply36(L2,Mask(c2o,17,0))+1,17,0) ) ,17,0);
606 c3n = Mask( (Mask(d2 ,17,0) + Multiply36(K3,Mask(c3o,17,0)) ) ,17,0);
607 dout = Mask( (Mask(c3n,17,0) - Multiply36(L3,Mask(c3o,17,0)) ) ,17,0);
608 //dout = Mask( (Mask(c3n,17,0) + Mask(~Multiply36(L3,Mask(c3o,17,0))+1,17,0) ) ,17,0);
610 if( (Maskandshift(dout,2,2) == 1) || (Maskandshift(dout,1,1) == 1)){
616 dout = ((dout>>3)<<1) + bit;
617 if(Maskandshift(dout,15,15) == 1){
618 //is needed to get the correct coding when getting negative results
619 dout = -Mask((-Mask(dout,9,0)),9,0);
621 dout = Mask(dout,9,0);
624 fChannelShort[i] = (short) dout;
631 void AliTPCAltroEmulator::BaselineCorrection2RTL(Int_t HighThreshold, Int_t LowThreshold, Int_t Offset, Int_t Presamples, Int_t Postsamples){
633 // BaselineCorrection2RTL
636 //cout << "Altro::BaselineCorrection2RTL | HighThreshold: " << HighThreshold << " LowThreshold: " << LowThreshold << " Offset: " << Offset << " Presamples: " << Presamples << " Postsamples: " << Postsamples << endl;
637 //more or less direct "translation" of the hdl code.
641 Int_t edges[6]; // = Postsamples*4 + Presamples;
642 Int_t offset = Offset;
643 Int_t thrlo = LowThreshold;//called thr_mau[19] ...
644 Int_t thrhi = HighThreshold;
647 Int_t fOld[4]; //flag pipe
648 Int_t fNew[4]; //flag pipe
649 Int_t dOld[4]; //data pipe
650 Int_t dNew[4]; //data pipe
653 Int_t pstscnt; // Counter for Postsamples
654 Int_t zOld[9]; // Filter stages
655 Int_t zNew[9]; // Filter stages
656 Int_t zxOld; //Accumulator stage
657 Int_t zxNew; //Accumulator stage
658 Int_t valcntOld; //Valid sample counter
659 Int_t valcntNew = 0; //Valid sample counter
661 Int_t valid; //Valid flag
662 Int_t fx; //postsample flag
663 //Int_t s07; // differentiator result
664 Int_t s8; // Acc + Diff result
666 //Int_t bsth; //baseline threshold
667 //Int_t din_p; //Data input strictly positive
669 //Int_t dx_bsls; // dx -bsl
670 //Int_t dx_clip; // dxbsl clipped
674 for(Int_t i = 0; i < 9 ; i++)
676 for(Int_t i = 0; i < 4 ; i++){
685 for(Int_t i = 0; i < 2 ; i++){
686 edges[i] = (Presamples&(1<<i))>>i;
688 for(Int_t i = 0; i < 4 ; i++){
689 edges[(3-i)+2] = (Postsamples&(1<<i))>>i;
692 for(Int_t i = 0; i < 6 ; i++)
693 cout << edges[i] << ":";
694 cout << " Presamples: " << Presamples << " Postsamples: " << Postsamples << endl;*/
697 //cout << "AliTPCAltroEmulator::BaselineCorrection2_RTL | starting Loop" << endl;
698 for(Int_t timebin = -12; timebin < ftimebins+10; timebin++){
699 //cout << "AliTPCAltroEmulator::BaselineCorrection2_RTL | in Loop timebin: " << timebin << endl;
700 din = GetElement(fChannelShort,timebin);
702 s8 = zxOld + (zOld[8] - zOld[0]);
709 //assign flag = (din_p > thrhi) | (thrlo > din_p); // Signal samples between thresholds
710 if( (din <= (bsl + thrhi)) && (din >= (bsl - thrlo)) )
727 if( (fOld[3] == 1) || ( (flag == 1) && ( (edges[0] == 1) || (edges[1] == 1) ) ) ) //f[2] = f[3] | (flag&(edges[0]|edges[1]));
732 if( (fOld[2] == 1) || ( (edges[1] == 1) && (flag == 1) ) ) // f[1] = f[2] | (edges[1] & flag);
737 if( ( (fOld[1] == 1) || ( (flag == 1) && (edges[0] == 1) && (edges[1] == 1) ) || (fx==1) ) && (valid==1) ) // f[0] = (f[1] | (edges[1] & edges[0] & flag) | fx) & valid;
743 for(Int_t i = 0; i < 3; i++)
747 if( (fOld[1]==1) && (fOld[2]==0) )
748 pstscnt = Postsamples;
754 valcntNew = ++valcntOld;
757 for(Int_t i = 0; i < 8; i++)
762 for(Int_t i = 0; i < 9; i++)
765 dout = dxOld - (bsl - offset);
769 SetElement(fChannelShort,timebin-5,(short)dout);
771 for(Int_t i = 0; i < 9 ; i++)
774 for(Int_t i = 0; i < 4 ; i++){
779 valcntOld = valcntNew;
783 void AliTPCAltroEmulator::Clipping(){
785 // implement if no BC2 clipping has to run
787 for(Int_t i = 0; i < ftimebins; i++){
788 if(fChannelShort[i] < -1)
789 fChannelShort[i] = -1;
793 void AliTPCAltroEmulator::Zerosuppression(Int_t Threshold, Int_t MinSamplesaboveThreshold, Int_t Presamples, Int_t Postsamples){
795 // add again altro feature
798 //TODO: Implement "Altro zsu merging"
799 //Int_t Postsamplecounter = 0;
800 //Int_t setPostsample = 0;
802 for(Int_t i = 0; i < ftimebins; i++){
803 if(fChannelShort[i] >= Threshold)
809 Int_t startofclustersequence = -1;
810 Int_t endofClustersInSequence = -1;
812 for(Int_t i = 0; i < ftimebins; i++){
813 if( (fADCkeep[i] == 1) && (GetElement(fADCkeep,i-1) == 0) ){
814 startofclustersequence = i;
816 if( (fADCkeep[i] == 1) && (GetElement(fADCkeep,i+1) == 0) ){
817 endofClustersInSequence = i;
819 //cout << i << " startofclustersequence: " << startofclustersequence << " endofClustersInSequence: " << endofClustersInSequence;
820 if( (startofclustersequence != -1) && (endofClustersInSequence != -1) ){
821 //cout << " found! " << (endofClustersInSequence - startofclustersequence + 1);
822 if ( (endofClustersInSequence - startofclustersequence + 1) < MinSamplesaboveThreshold ){
823 for(Int_t j = startofclustersequence; j <= endofClustersInSequence ; j++){
827 startofclustersequence = -1;
828 endofClustersInSequence = -1;
833 /*for(Int_t i = 0; i < ftimebins; i++){
834 if( (GetElement(fADCkeep,i-1) == 1) && (GetElement(fADCkeep,i) == 0) && (GetElement(fADCkeep,i+1) == 1) ){
835 SetElement(fADCkeep,i,1);
839 for(Int_t i = 0; i < ftimebins; i++){
840 if( (fADCkeep[i] == 1) && (GetElement(fADCkeep,i-1) == 0) ){
841 for(Int_t j = i-Presamples ; j <= i; j++){
842 SetElement(fADCkeep,j,1);
846 for(Int_t i = ftimebins; i >= 0; i--){
847 if( (fADCkeep[i] == 1) && (GetElement(fADCkeep,i+1) == 0) ){
848 for(Int_t j = i ; j <= i+Postsamples; j++){
849 SetElement(fADCkeep,j,1);
853 /*cout << " Postsamplecounter: " << Postsamplecounter;
854 for(Int_t j = i+1 ; j <= i+Postsamples; j++){
855 SetElement(fADCkeep,j,1);
860 cout << i << " ADCK: " << GetElement(fADCkeep,i);
861 cout << " Postsam: " << Postsamplecounter << " ADCK: " << GetElement(fADCkeep,i);*/
863 for(Int_t i = 0; i < ftimebins; i++){
864 if( (fADCkeep[i] == 1) && (GetElement(fADCkeep,i+1) == 0) && ( (GetElement(fADCkeep,i+3) == 1) || (GetElement(fADCkeep,i+2) == 1) ) ){
865 SetElement(fADCkeep,i+1,1);
866 SetElement(fADCkeep,i+2,1);
870 for(Int_t i = 0; i < ftimebins; i++){
871 if( !GetKeepChannel(i) ) {
872 SetElement(fChannelShort,i,-1); // set non relevant data to -1
879 /** @brief formats the data like the ALTRO. Result is a 64 bit array
881 * formats the data like the ALTRO. Result is a 64 bit array
885 const void AliTPCAltroEmulator::DataFormater(){
887 // formats the data like the ALTRO. Result is a 64 bit array
894 /** @brief calculates the compression out of the bitmask
896 * calculates the compression out of the bitmask with the set adc values
898 * @return \c Float_t consisting of the compression factor
900 Float_t AliTPCAltroEmulator::CalculateCompression() {
902 // calculates the compression out of the bitmask
905 // calculation is based on altro 10 bit words ..
909 Float_t retval = 0.0;
911 for(Int_t i = 0; i < ftimebins; i++){
912 if(fADCkeep[i] == 1){
915 if( (fADCkeep[i] == 1) && (GetElement(fADCkeep,i+1) == 0) ){
919 data = sample + cluster*2;
920 data = data + data%4 + 4;
922 retval = ftimebins / (Float_t)data;//num of timebins is equal to max number of samples
929 const Short_t AliTPCAltroEmulator::GetElement(short* Array,Int_t index){
931 // GetElement of array
935 else if(index >= ftimebins)
941 void AliTPCAltroEmulator::SetElement(short* Array,Int_t index,Short_t value){
943 // SetElement of array
947 else if(index >= ftimebins)
950 Array[index] = value;
953 const Int_t AliTPCAltroEmulator::InBand(Int_t ADC,Int_t bsl, Int_t LowThreshold, Int_t HighThreshold){
955 // check if it's within the band of search
957 Int_t fLow = bsl - LowThreshold;
958 Int_t fHigh = bsl + HighThreshold;
959 if( (ADC <= fHigh) && (ADC >= fLow) )
965 const Int_t AliTPCAltroEmulator::InRange(Int_t parameter,Int_t Low,Int_t High,const char *Module,const char *ParameterName){
967 // checks it it's within the range
972 if(parameter > High){
973 sprintf(out,"Error | %s | Parameter %s is to big, has to be %d <= %s <= %d, is %d, now set to %d",Module,ParameterName,Low,ParameterName,High,parameter,High);
976 }else if(parameter < Low){
977 sprintf(out,"Error | %s | Parameter %s is to small, has to be %d <= %s <= %d, is %d, now set to %d",Module,ParameterName,Low,ParameterName,High,parameter,Low);
986 Short_t AliTPCAltroEmulator::GetShortChannel(Int_t i){
988 // GetElement of channel
990 return GetElement(fChannelShort,i);
993 Short_t AliTPCAltroEmulator::GetKeepChannel(Int_t i){
995 // GetElement of Keep Channel
997 return GetElement(fADCkeep,i);
1000 Bool_t AliTPCAltroEmulator::WriteEvent(Int_t ievent) {
1002 // Write event to the DDL data folders
1005 for (Int_t ddlID=0;ddlID<216;++ddlID) {
1006 Bool_t *channelsDDL=fChannels+ddlID*4096 ;
1007 Short_t *adcsDDL =fADCs +ddlID*4096*1024;
1008 UInt_t *cdhDDL =fCDHs +ddlID*8 ;
1009 UInt_t *trailerDDL =fTrailers+ddlID*9 ;
1011 FILE *file=fopen(Form("%s/raw%d/TPC_%03d.ddl",
1012 fDDLFolderName.Data(),ievent,768+ddlID),
1014 if (!file) return kFALSE;
1016 // write CDH (first word to be altered later)
1017 for (i32=0;i32<8;++i32)
1018 fRawData[i32]=cdhDDL[i32];
1021 for (Int_t hwaddr=0;hwaddr<4096;++hwaddr) if (channelsDDL[hwaddr]) {
1022 Short_t *adcsChannel=adcsDDL+hwaddr*1024;
1024 // TODO: acqusition window
1025 for (Int_t it=0;it<1024-3;++it) {
1026 if (adcsChannel[it]>=0&&adcsChannel[it+3]>=0) {
1027 if (adcsChannel[it+1]<0) {
1029 adcsChannel[it+1]=0;
1031 if (adcsChannel[it+2]<0) {
1033 adcsChannel[it+2]=0;
1042 for (Int_t it=1023;it>=0;--it) {
1043 Short_t w10=adcsChannel[it];
1051 fRawData[i32+i10/3]|=w10<<(10*(2-i10%3));
1058 fRawData[i32+icw/3]|=cw <<(10*(2-icw%3));
1059 fRawData[i32+its/3]|=ts <<(10*(2-its%3));
1064 fRawData[i32]=0x1<<30|(i10-3)<<16|hwaddr;
1068 for (Int_t i=0;i<1024;++i) adcsChannel[i]=-1;
1069 channelsDDL[hwaddr]=kFALSE;
1072 // write RCU trailer
1073 fRawData[i32]=0x2<<30|(i32-8);i32++;
1074 for (Int_t i=0;i<8;++i)
1075 fRawData[i32++]=trailerDDL[i];
1077 // write first word of CDH
1080 Int_t nwritten=fwrite(fRawData,sizeof(UInt_t),i32,file);
1081 if (nwritten!=i32) return kFALSE;
1084 do {fRawData[--i32]=0;} while (i32>0);
1091 Bool_t AliTPCAltroEmulator::GDC2DDLs(AliRawVEvent *gdc,Int_t ievent) {
1093 // Converte GDC data to DDL format
1095 for(Int_t iLDC=0;iLDC<gdc->GetNSubEvents();++iLDC) {
1096 AliRawVEvent *ldc=gdc->GetSubEvent(iLDC);
1097 for(Int_t iEq=0;iEq<ldc->GetNEquipments();++iEq) {
1098 AliRawVEquipment *eq=ldc->GetEquipment(iEq);
1099 AliRawEquipmentHeader *eqHeader=eq->GetEquipmentHeader();
1100 Int_t eqSize=eqHeader->GetEquipmentSize();
1103 Int_t detId=AliDAQ::DetectorIDFromDdlID(eqHeader->GetId(),ddlIndex);
1105 FILE *ddlFile=fopen(Form("%s/raw%d/%s",
1106 fDDLFolderName.Data(),
1108 AliDAQ::DdlFileName(detId,ddlIndex)),
1110 AliRawData *rawData=eq->GetRawData();
1112 nwritten=fwrite(rawData->GetBuffer(),1,rawData->GetSize(),ddlFile);
1115 if (nwritten<rawData->GetSize()) return kFALSE;
1123 Bool_t AliTPCAltroEmulator::ConvertRawFilesToDate(Int_t nevents) {
1125 // Convertes Raw files to Date format
1128 // from $ALICE_ROOT/STEER/AliSimulation.cxx
1132 if (fReader->GetRunNumber()>0)
1133 pipe=gSystem->OpenPipe(Form("dateStream -c -s -D -o %s -C -# %d -run %d",
1134 fOutputDateFileName.Data(),
1136 fReader->GetRunNumber()),
1139 pipe=gSystem->OpenPipe(Form("dateStream -c -s -D -o %s -C -# %d",
1140 fOutputDateFileName.Data(),
1144 fprintf(stderr,"error: cannot execute command: %s",command);
1148 for (Int_t ievent=0;ievent<nevents;++ievent) {
1149 UInt_t detectorPattern = 0xFFFFFFFF;
1150 fprintf(pipe, "GDC DetectorPattern %u\n", detectorPattern);
1155 // loop over detectors and DDLs
1156 for (Int_t iDet = 0; iDet < AliDAQ::kNDetectors; iDet++) {
1157 if (!(iDet<=5 || iDet==17 )) continue;
1158 for (Int_t iDDL = 0; iDDL < AliDAQ::NumberOfDdls(iDet); iDDL++) {
1159 // printf("iDet=%d, iDDL=%d, filenmae=%s\n",iDet,iDDL,filename);
1160 Int_t ddlID = AliDAQ::DdlID(iDet,iDDL);
1161 Int_t ldcID = Int_t(ldc + 0.0001);
1162 ldc += AliDAQ::NumberOfLdcs(iDet) / AliDAQ::NumberOfDdls(iDet);
1164 // check existence and size of raw data file
1165 FILE* file = fopen(Form("%s/raw%d/%s",
1166 fDDLFolderName.Data(),
1168 AliDAQ::DdlFileName(iDet,iDDL)),
1170 if (!file) continue;
1171 fseek(file, 0, SEEK_END);
1172 unsigned long size = ftell(file);
1174 if (!size) continue;
1176 if (ldcID != prevLDC) {
1177 fprintf(pipe, " LDC Id %d\n", ldcID);
1180 fprintf(pipe,Form(" Equipment Id %d Payload %s/raw%d/%s\n",
1182 fDDLFolderName.Data(),
1184 AliDAQ::DdlFileName(iDet,iDDL))
1189 Int_t result = gSystem->ClosePipe(pipe);
1190 return (result == 0);
1193 void AliTPCAltroEmulator::InitBuffers() {
1195 // Initialization of the Buffers
1197 if (!fChannels) fChannels=new Bool_t [216*4096 ];
1198 if (!fCDHs ) fCDHs =new UInt_t [216*8 ];
1199 if (!fADCs ) fADCs =new Short_t[216*4096*1024];
1200 if (!fTrailers) fTrailers=new UInt_t [216*9 ];
1201 if (!fRawData ) fRawData =new UInt_t [ 1*4096*1024]; // be save...
1203 for (Int_t i=0;i<216*4096 ;++i) fChannels[i]=kFALSE;
1204 // no need to init CDHs
1205 for (Int_t i=0;i<216*4096*1024;++i) fADCs [i]=-1 ;
1206 // no need to init trailers
1207 for (Int_t i=0;i< 1*4096*1024;++i) fRawData [i]= 0 ;
1210 Bool_t AliTPCAltroEmulator::ConvertDateToRoot() {
1212 // convert a DATE file to a root file with the program "alimdc"
1215 // from $ALICE_ROOT/STEER/AliSimulation.cxx
1218 const Int_t kDBSize = 2000000000; //2GB
1219 const Int_t kTagDBSize = 1000000000;
1220 const Bool_t kFilter = kFALSE;
1221 const Int_t kCompression = 1;
1223 // AliInfo(Form("converting DATE file %s to root file %s",
1224 // dateFileName, rootFileName));
1226 const char* rawDBFS[2] = { "/tmp/mdc1", "/tmp/mdc2" };
1227 const char* tagDBFS = "/tmp/mdc1/tags";
1229 // User defined file system locations
1230 if (gSystem->Getenv("ALIMDC_RAWDB1"))
1231 rawDBFS[0] = gSystem->Getenv("ALIMDC_RAWDB1");
1232 if (gSystem->Getenv("ALIMDC_RAWDB2"))
1233 rawDBFS[1] = gSystem->Getenv("ALIMDC_RAWDB2");
1234 if (gSystem->Getenv("ALIMDC_TAGDB"))
1235 tagDBFS = gSystem->Getenv("ALIMDC_TAGDB");
1237 gSystem->Exec(Form("rm -rf %s",rawDBFS[0]));
1238 gSystem->Exec(Form("rm -rf %s",rawDBFS[1]));
1239 gSystem->Exec(Form("rm -rf %s",tagDBFS));
1241 gSystem->Exec(Form("mkdir %s",rawDBFS[0]));
1242 gSystem->Exec(Form("mkdir %s",rawDBFS[1]));
1243 gSystem->Exec(Form("mkdir %s",tagDBFS));
1245 Int_t result = gSystem->Exec(Form("alimdc %d %d %d %d %s",
1246 kDBSize, kTagDBSize, kFilter, kCompression, fOutputDateFileName.Data()));
1247 gSystem->Exec(Form("mv %s/*.root %s", rawDBFS[0],fOutputRootFileName.Data()));
1249 gSystem->Exec(Form("rm -rf %s",rawDBFS[0]));
1250 gSystem->Exec(Form("rm -rf %s",rawDBFS[1]));
1251 gSystem->Exec(Form("rm -rf %s",tagDBFS));
1253 return (result == 0);
1256 void AliTPCAltroEmulator::RunEmulationOnRAWdata(AliRawReader *reader, Int_t plotFlag) {
1258 // Run the Altro Emulation on a full Raw data set (AliRawReader)
1259 // plus write the outcome in a RAW data format
1263 printf("ERROR cant run Altro Emulation: AliRawReader is zero. No RAW data file.\n");
1268 if (fDecoder) delete fDecoder;
1269 fDecoder=new AliTPCRawStreamV3(reader);
1274 TH1F hisO("DINO","DINO",1024,0,1024);
1275 TH1F his("DIN","DIN",1024,0,1024);
1276 his.GetYaxis()->SetRangeUser(-20,90);
1277 Short_t *data = new Short_t[1024];
1280 c1 = new TCanvas("c1","c1");
1281 c1->SetGridx(); c1->SetGridy();
1286 while (fReader->NextEvent()) {
1288 gSystem->Exec(Form("mkdir -p %s/raw%d/",fDDLFolderName.Data(),ievent));
1289 GDC2DDLs(const_cast<AliRawVEvent*>(fReader->GetEvent()),ievent);
1292 while (fDecoder->NextDDL()) {
1293 Int_t ddlID=fDecoder->GetDDLNumber();
1294 printf("ddl: %d (%d/216)\n",ddlID,++ddlC);
1296 Bool_t *channelsDDL=fChannels+ddlID*4096 ;
1297 Short_t *adcsDDL =fADCs +ddlID*4096*1024;
1298 UInt_t *cdhDDL =fCDHs +ddlID*8 ;
1299 UInt_t *trailerDDL =fTrailers+ddlID*9 ;
1302 for (Int_t i=0;i<8;++i)
1303 // just to show how ugly it is...
1304 cdhDDL[i]=reinterpret_cast<UInt_t*>(const_cast<AliRawDataHeader*>(fReader->GetDataHeader()))[i];
1307 while (fDecoder->NextChannel()) {
1308 Int_t hwaddr=fDecoder->GetHWAddress();
1309 Int_t sector=fDecoder->GetSector();
1310 Int_t row=fDecoder->GetRow();
1311 Int_t pad=fDecoder->GetPad();
1312 Short_t *adcsChannel=adcsDDL+hwaddr*1024;
1313 while (fDecoder->NextBunch()) {
1314 UInt_t ts =fDecoder->GetStartTimeBin();
1315 Int_t cw =fDecoder->GetBunchLength() ;
1316 const UShort_t *signals=fDecoder->GetSignals() ;
1317 for (Int_t ci=0;ci<cw;++ci) {
1318 Short_t s=signals[ci];
1320 // TODO aqcuisition window
1321 if (0<=t&&t<(1024-3)) {
1322 channelsDDL[hwaddr]=kTRUE;
1323 if (adcsChannel[t]<0)
1327 if (adcsChannel[t]>0x3ff)
1328 adcsChannel[t]=0x3ff;
1333 // search start of aquisition
1334 Int_t t0 = 0; while (adcsChannel[t0]==-1) t0++;
1335 // search end of aquisition
1336 Int_t tE = 1024; while (adcsChannel[tE]==-1) tE--;
1339 // channel is complete - Perform Altro Emulation
1340 if (plotFlag!=0 && !(chanCount%plotFlag) ) {
1341 for (Int_t t=0; t<1024; t++) {
1342 his.SetBinContent(t+1,adcsChannel[t]);
1344 his.SetTitle(Form("sig_sec%d_row%d_pad%d",sector,row,pad));
1345 his.SetStats(0); his.GetXaxis()->SetTitle("timebin");
1349 // FEED THE ALTRO EMULATOR WITH CLEAN SIGNAL (no aquisition-window ghosts)
1350 Int_t timebins = tE-t0+1;
1351 for (Int_t t=t0;t<(t0+timebins);t++)
1352 data[t-t0]=adcsChannel[t];
1353 SetChannelData(timebins,data);
1355 Int_t roc = (sector%36)>=18; // 0 for IROC, 1 for OROC
1357 for (Int_t t=t0;t<(t0+timebins);t++)
1358 adcsChannel[t]=data[t-t0];
1361 if (plotFlag!=0 && !(chanCount%plotFlag) ) {
1362 for (Int_t t=0; t<1024; t++)
1363 hisO.SetBinContent(t+1,adcsChannel[t]);
1364 hisO.SetStats(0); hisO.SetLineColor(2);
1365 hisO.DrawCopy("same");
1367 c1->SaveAs(Form("/tmp/sig_sec%02d_row%02d_pad%03d_%d%d%d%d%d.png",
1368 sector,row,pad,fOnBSL1,fOnTCF,fOnBSL2,fOnClip,fOnZSU));
1379 UChar_t *rcuTrailer;
1380 fDecoder->GetRCUTrailerData(rcuTrailer);
1381 for (Int_t i=0;i<= /* (!) */ fDecoder->GetRCUTrailerSize()/4;++i)
1382 trailerDDL[i]=reinterpret_cast<UInt_t*>(rcuTrailer)[i]; // again: UGLY!
1386 WriteEvent(ievent++);
1389 delete[] data; // free space
1391 // convert to date and back
1392 ConvertRawFilesToDate(ievent);
1393 ConvertDateToRoot();