ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

/* $Id$ */

////////////////////////////////////////////////////////////////////////////
//                                                                        //
//  Pre-Trigger Control-Box A or C for simulation                         //
//                                                                        //
//  Authors: F. Reidt (Felix.Reidt@cern.ch)                               //
//                                                                        //
////////////////////////////////////////////////////////////////////////////

#include <stdio.h>

#include "AliRun.h"
#include "AliRunLoader.h"

#include "AliLog.h"

#include "AliTRDptrgParam.h"
#include "AliTRDptrgFEB.h"
#include "AliTRDptrgLUT.h"

#include "AliTRDptrgCBAC.h"

ClassImp(AliTRDptrgCBAC)

//______________________________________________________________________________
AliTRDptrgCBAC::AliTRDptrgCBAC(AliRunLoader *rl) 
  : TObject(),
  fRunLoader(rl),
  fLUTArray(),
  fFEBArray(),
  fPosition(AliTRDptrgParam::kUnknown),
  fOperatingMode(AliTRDptrgParam::kDigits),
  fParam(0x0)
{
  //
  // ctor
  //

  AliError("default ctor - usage not recommended");

}

//______________________________________________________________________________
AliTRDptrgCBAC::AliTRDptrgCBAC(AliRunLoader *rl, 
                               AliTRDptrgParam::AliTRDptrgFEBPosition_t position,
                               AliTRDptrgParam::AliTRDptrgOperatingMode_t operatingMode,
                               AliTRDptrgParam *param) 
  : TObject(),
  fRunLoader(rl),
  fLUTArray(),
  fFEBArray(),
  fPosition(position),
  fOperatingMode(operatingMode),
  fParam(param)
{
  //
  // ctor  
  //

  this->LoadParams(); // load parameters
 
  // T0
  AliTRDptrgFEB *FEB = new AliTRDptrgFEB(this->fRunLoader, AliTRDptrgParam::kTZERO, 
                                         this->fOperatingMode, this->fPosition,
                                         0, this->fParam);
  this->fFEBArray.AddLast(FEB);

  // V0-1
  FEB = new AliTRDptrgFEB(this->fRunLoader, AliTRDptrgParam::kVZERO, this->fOperatingMode, 
                          this->fPosition, 1, this->fParam);
  this->fFEBArray.AddLast(FEB);

  // V0-2
  FEB = new AliTRDptrgFEB(this->fRunLoader, AliTRDptrgParam::kVZERO, this->fOperatingMode, 
                          this->fPosition, 2, this->fParam);
  this->fFEBArray.AddLast(FEB);

  // V0-3
  FEB = new AliTRDptrgFEB(this->fRunLoader, AliTRDptrgParam::kVZERO, this->fOperatingMode, 
                          this->fPosition, 3, this->fParam);
  this->fFEBArray.AddLast(FEB);

  // V0-4
  FEB = new AliTRDptrgFEB(this->fRunLoader, AliTRDptrgParam::kVZERO, this->fOperatingMode, 
                          this->fPosition, 4, this->fParam);
  this->fFEBArray.AddLast(FEB);

}

//______________________________________________________________________________
Bool_t AliTRDptrgCBAC::LoadParams() 
{
  //
  // Load configuration parameters
  //

  if (this->fParam != 0x0) {
    // read AliTRDptrgParam

    // get LUTs
    AliTRDptrgLUT* lut = 0x0;
    // 0
    lut = new AliTRDptrgLUT();
    lut->InitTable(10, 10, this->fParam->GetCBLUT(this->fPosition, 0), kFALSE); 
    // do not copy table data 
    this->fLUTArray.AddLast(lut);
    // 1
    lut = new AliTRDptrgLUT();
    lut->InitTable(10, 10, this->fParam->GetCBLUT(this->fPosition, 1), kFALSE); 
    // do not copy table data 
    this->fLUTArray.AddLast(lut);
  }
  else {
    // load default parameters 
    AliTRDptrgLUT* lut = new AliTRDptrgLUT();
    this->fLUTArray.AddLast(lut);
    lut = new AliTRDptrgLUT();
    this->fLUTArray.AddLast(lut);
    // the following lines are only needed for test reasons
    lut = dynamic_cast<AliTRDptrgLUT*>(this->fLUTArray.At(0));
    if (lut) {
      Int_t* initData = new Int_t[1024]; // 2^10
      for (Int_t i = 0; i < 1024; i++ ) {
        initData[i] = i;
      }
      lut->InitTable(10, 10, initData, kTRUE); // copy initData
      lut = dynamic_cast<AliTRDptrgLUT*>(this->fLUTArray.At(1));
      if (lut) {
        for (Int_t i = 1023; i >= 0; i--) {
          initData[31 - i] = i;  // inverse ramp
        }
        lut->InitTable(10, 10, initData, kTRUE); // copy initData
      }
    }
  }  

  return false;

}

//______________________________________________________________________________
AliTRDptrgCBAC::~AliTRDptrgCBAC() 
{
  //
  // Destructor
  //

  this->fLUTArray.Delete();
  this->fFEBArray.Delete();

}

//______________________________________________________________________________
Int_t* AliTRDptrgCBAC::Simulate()
{ 
  //
  // Simulate the CBAC behavior of event
  //

  Int_t nFEBs = this->fFEBArray.GetEntries();
  Int_t nLUTs = this->fLUTArray.GetEntries();

  Int_t inputVector = 0x0;

  Int_t** partResults = 0x0;  
  partResults = new Int_t* [nFEBs];

  for (Int_t iFEB = 0; iFEB < nFEBs; iFEB++) {
    AliTRDptrgFEB *feb = 0x0;
    if ((feb = dynamic_cast<AliTRDptrgFEB*>(this->fFEBArray.At(iFEB)))) {
      partResults[iFEB] = feb->Simulate();
    }
  }
  
  // combine partResults and create inputVector  
  Int_t iBit = 0;
  Int_t mask = 0x1;
  for (Int_t iFEB = 0; iFEB < nFEBs ; iFEB++) {
    for (Int_t j = 1; j <= partResults[iFEB][0]; j++) {
      AliTRDptrgLUT *lut0 = dynamic_cast<AliTRDptrgLUT*>(this->fLUTArray[0]);
      AliTRDptrgLUT *lut1 = dynamic_cast<AliTRDptrgLUT*>(this->fLUTArray[1]);
      if (lut0 && lut1) {
        if ((iBit > lut0->GetInputWidth()) 
         || (iBit > lut1->GetInputWidth())) {
          AliError("FEB result width does not match CB-A/C input with!");
	}
      }
      iBit++;
      if (partResults[iFEB][j] > 0) {
        inputVector |= mask; // Add bit to the corresponding inputVector
        mask <<= 1;
      } 
    }
  }

  AliDebug(5, Form("Inputvector: 0x%x", inputVector));
    
  // perform look up
  Int_t* result = new Int_t[nLUTs + 1]; // generate new return array
  result[0] = nLUTs; // storage array length in the first array value
  for (Int_t iLUT = 0; iLUT < nLUTs; iLUT++) { 
    // process the return value for each LUT and store the result in the array
    AliTRDptrgLUT *lutTmp = 0x0;
    if ((lutTmp = dynamic_cast<AliTRDptrgLUT*>(this->fLUTArray[iLUT]))) {
      result[iLUT + 1] = lutTmp->LookUp(inputVector);
    }
    AliDebug(4, Form("CBAC result[%d] = 0x%x",(iLUT + 1),result[iLUT + 1])); 
  }

  // Clean up
  delete [] partResults;

  return result;

}



 AliTRDptrgCBAC.cxx:1
 AliTRDptrgCBAC.cxx:2
 AliTRDptrgCBAC.cxx:3
 AliTRDptrgCBAC.cxx:4
 AliTRDptrgCBAC.cxx:5
 AliTRDptrgCBAC.cxx:6
 AliTRDptrgCBAC.cxx:7
 AliTRDptrgCBAC.cxx:8
 AliTRDptrgCBAC.cxx:9
 AliTRDptrgCBAC.cxx:10
 AliTRDptrgCBAC.cxx:11
 AliTRDptrgCBAC.cxx:12
 AliTRDptrgCBAC.cxx:13
 AliTRDptrgCBAC.cxx:14
 AliTRDptrgCBAC.cxx:15
 AliTRDptrgCBAC.cxx:16
 AliTRDptrgCBAC.cxx:17
 AliTRDptrgCBAC.cxx:18
 AliTRDptrgCBAC.cxx:19
 AliTRDptrgCBAC.cxx:20
 AliTRDptrgCBAC.cxx:21
 AliTRDptrgCBAC.cxx:22
 AliTRDptrgCBAC.cxx:23
 AliTRDptrgCBAC.cxx:24
 AliTRDptrgCBAC.cxx:25
 AliTRDptrgCBAC.cxx:26
 AliTRDptrgCBAC.cxx:27
 AliTRDptrgCBAC.cxx:28
 AliTRDptrgCBAC.cxx:29
 AliTRDptrgCBAC.cxx:30
 AliTRDptrgCBAC.cxx:31
 AliTRDptrgCBAC.cxx:32
 AliTRDptrgCBAC.cxx:33
 AliTRDptrgCBAC.cxx:34
 AliTRDptrgCBAC.cxx:35
 AliTRDptrgCBAC.cxx:36
 AliTRDptrgCBAC.cxx:37
 AliTRDptrgCBAC.cxx:38
 AliTRDptrgCBAC.cxx:39
 AliTRDptrgCBAC.cxx:40
 AliTRDptrgCBAC.cxx:41
 AliTRDptrgCBAC.cxx:42
 AliTRDptrgCBAC.cxx:43
 AliTRDptrgCBAC.cxx:44
 AliTRDptrgCBAC.cxx:45
 AliTRDptrgCBAC.cxx:46
 AliTRDptrgCBAC.cxx:47
 AliTRDptrgCBAC.cxx:48
 AliTRDptrgCBAC.cxx:49
 AliTRDptrgCBAC.cxx:50
 AliTRDptrgCBAC.cxx:51
 AliTRDptrgCBAC.cxx:52
 AliTRDptrgCBAC.cxx:53
 AliTRDptrgCBAC.cxx:54
 AliTRDptrgCBAC.cxx:55
 AliTRDptrgCBAC.cxx:56
 AliTRDptrgCBAC.cxx:57
 AliTRDptrgCBAC.cxx:58
 AliTRDptrgCBAC.cxx:59
 AliTRDptrgCBAC.cxx:60
 AliTRDptrgCBAC.cxx:61
 AliTRDptrgCBAC.cxx:62
 AliTRDptrgCBAC.cxx:63
 AliTRDptrgCBAC.cxx:64
 AliTRDptrgCBAC.cxx:65
 AliTRDptrgCBAC.cxx:66
 AliTRDptrgCBAC.cxx:67
 AliTRDptrgCBAC.cxx:68
 AliTRDptrgCBAC.cxx:69
 AliTRDptrgCBAC.cxx:70
 AliTRDptrgCBAC.cxx:71
 AliTRDptrgCBAC.cxx:72
 AliTRDptrgCBAC.cxx:73
 AliTRDptrgCBAC.cxx:74
 AliTRDptrgCBAC.cxx:75
 AliTRDptrgCBAC.cxx:76
 AliTRDptrgCBAC.cxx:77
 AliTRDptrgCBAC.cxx:78
 AliTRDptrgCBAC.cxx:79
 AliTRDptrgCBAC.cxx:80
 AliTRDptrgCBAC.cxx:81
 AliTRDptrgCBAC.cxx:82
 AliTRDptrgCBAC.cxx:83
 AliTRDptrgCBAC.cxx:84
 AliTRDptrgCBAC.cxx:85
 AliTRDptrgCBAC.cxx:86
 AliTRDptrgCBAC.cxx:87
 AliTRDptrgCBAC.cxx:88
 AliTRDptrgCBAC.cxx:89
 AliTRDptrgCBAC.cxx:90
 AliTRDptrgCBAC.cxx:91
 AliTRDptrgCBAC.cxx:92
 AliTRDptrgCBAC.cxx:93
 AliTRDptrgCBAC.cxx:94
 AliTRDptrgCBAC.cxx:95
 AliTRDptrgCBAC.cxx:96
 AliTRDptrgCBAC.cxx:97
 AliTRDptrgCBAC.cxx:98
 AliTRDptrgCBAC.cxx:99
 AliTRDptrgCBAC.cxx:100
 AliTRDptrgCBAC.cxx:101
 AliTRDptrgCBAC.cxx:102
 AliTRDptrgCBAC.cxx:103
 AliTRDptrgCBAC.cxx:104
 AliTRDptrgCBAC.cxx:105
 AliTRDptrgCBAC.cxx:106
 AliTRDptrgCBAC.cxx:107
 AliTRDptrgCBAC.cxx:108
 AliTRDptrgCBAC.cxx:109
 AliTRDptrgCBAC.cxx:110
 AliTRDptrgCBAC.cxx:111
 AliTRDptrgCBAC.cxx:112
 AliTRDptrgCBAC.cxx:113
 AliTRDptrgCBAC.cxx:114
 AliTRDptrgCBAC.cxx:115
 AliTRDptrgCBAC.cxx:116
 AliTRDptrgCBAC.cxx:117
 AliTRDptrgCBAC.cxx:118
 AliTRDptrgCBAC.cxx:119
 AliTRDptrgCBAC.cxx:120
 AliTRDptrgCBAC.cxx:121
 AliTRDptrgCBAC.cxx:122
 AliTRDptrgCBAC.cxx:123
 AliTRDptrgCBAC.cxx:124
 AliTRDptrgCBAC.cxx:125
 AliTRDptrgCBAC.cxx:126
 AliTRDptrgCBAC.cxx:127
 AliTRDptrgCBAC.cxx:128
 AliTRDptrgCBAC.cxx:129
 AliTRDptrgCBAC.cxx:130
 AliTRDptrgCBAC.cxx:131
 AliTRDptrgCBAC.cxx:132
 AliTRDptrgCBAC.cxx:133
 AliTRDptrgCBAC.cxx:134
 AliTRDptrgCBAC.cxx:135
 AliTRDptrgCBAC.cxx:136
 AliTRDptrgCBAC.cxx:137
 AliTRDptrgCBAC.cxx:138
 AliTRDptrgCBAC.cxx:139
 AliTRDptrgCBAC.cxx:140
 AliTRDptrgCBAC.cxx:141
 AliTRDptrgCBAC.cxx:142
 AliTRDptrgCBAC.cxx:143
 AliTRDptrgCBAC.cxx:144
 AliTRDptrgCBAC.cxx:145
 AliTRDptrgCBAC.cxx:146
 AliTRDptrgCBAC.cxx:147
 AliTRDptrgCBAC.cxx:148
 AliTRDptrgCBAC.cxx:149
 AliTRDptrgCBAC.cxx:150
 AliTRDptrgCBAC.cxx:151
 AliTRDptrgCBAC.cxx:152
 AliTRDptrgCBAC.cxx:153
 AliTRDptrgCBAC.cxx:154
 AliTRDptrgCBAC.cxx:155
 AliTRDptrgCBAC.cxx:156
 AliTRDptrgCBAC.cxx:157
 AliTRDptrgCBAC.cxx:158
 AliTRDptrgCBAC.cxx:159
 AliTRDptrgCBAC.cxx:160
 AliTRDptrgCBAC.cxx:161
 AliTRDptrgCBAC.cxx:162
 AliTRDptrgCBAC.cxx:163
 AliTRDptrgCBAC.cxx:164
 AliTRDptrgCBAC.cxx:165
 AliTRDptrgCBAC.cxx:166
 AliTRDptrgCBAC.cxx:167
 AliTRDptrgCBAC.cxx:168
 AliTRDptrgCBAC.cxx:169
 AliTRDptrgCBAC.cxx:170
 AliTRDptrgCBAC.cxx:171
 AliTRDptrgCBAC.cxx:172
 AliTRDptrgCBAC.cxx:173
 AliTRDptrgCBAC.cxx:174
 AliTRDptrgCBAC.cxx:175
 AliTRDptrgCBAC.cxx:176
 AliTRDptrgCBAC.cxx:177
 AliTRDptrgCBAC.cxx:178
 AliTRDptrgCBAC.cxx:179
 AliTRDptrgCBAC.cxx:180
 AliTRDptrgCBAC.cxx:181
 AliTRDptrgCBAC.cxx:182
 AliTRDptrgCBAC.cxx:183
 AliTRDptrgCBAC.cxx:184
 AliTRDptrgCBAC.cxx:185
 AliTRDptrgCBAC.cxx:186
 AliTRDptrgCBAC.cxx:187
 AliTRDptrgCBAC.cxx:188
 AliTRDptrgCBAC.cxx:189
 AliTRDptrgCBAC.cxx:190
 AliTRDptrgCBAC.cxx:191
 AliTRDptrgCBAC.cxx:192
 AliTRDptrgCBAC.cxx:193
 AliTRDptrgCBAC.cxx:194
 AliTRDptrgCBAC.cxx:195
 AliTRDptrgCBAC.cxx:196
 AliTRDptrgCBAC.cxx:197
 AliTRDptrgCBAC.cxx:198
 AliTRDptrgCBAC.cxx:199
 AliTRDptrgCBAC.cxx:200
 AliTRDptrgCBAC.cxx:201
 AliTRDptrgCBAC.cxx:202
 AliTRDptrgCBAC.cxx:203
 AliTRDptrgCBAC.cxx:204
 AliTRDptrgCBAC.cxx:205
 AliTRDptrgCBAC.cxx:206
 AliTRDptrgCBAC.cxx:207
 AliTRDptrgCBAC.cxx:208
 AliTRDptrgCBAC.cxx:209
 AliTRDptrgCBAC.cxx:210
 AliTRDptrgCBAC.cxx:211
 AliTRDptrgCBAC.cxx:212
 AliTRDptrgCBAC.cxx:213
 AliTRDptrgCBAC.cxx:214
 AliTRDptrgCBAC.cxx:215
 AliTRDptrgCBAC.cxx:216
 AliTRDptrgCBAC.cxx:217
 AliTRDptrgCBAC.cxx:218
 AliTRDptrgCBAC.cxx:219
 AliTRDptrgCBAC.cxx:220
 AliTRDptrgCBAC.cxx:221
 AliTRDptrgCBAC.cxx:222
 AliTRDptrgCBAC.cxx:223
 AliTRDptrgCBAC.cxx:224
 AliTRDptrgCBAC.cxx:225
 AliTRDptrgCBAC.cxx:226
 AliTRDptrgCBAC.cxx:227
 AliTRDptrgCBAC.cxx:228
 AliTRDptrgCBAC.cxx:229
 AliTRDptrgCBAC.cxx:230
 AliTRDptrgCBAC.cxx:231
 AliTRDptrgCBAC.cxx:232
 AliTRDptrgCBAC.cxx:233
 AliTRDptrgCBAC.cxx:234