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 bottom class                                  //
//                                                                        //
//  Authors: F. Reidt (Felix.Reidt@cern.ch)                               //
//                                                                        //
////////////////////////////////////////////////////////////////////////////


#include "TROOT.h"

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

#include "AliTRDptrgLUT.h"
#include "AliTRDptrgParam.h"
#include "AliTRDptrgCBAC.h"
#include "AliTRDptrgTLMU.h"
#include "AliTRDptrgCBB.h"
#include "AliLog.h"
ClassImp(AliTRDptrgCBB)

AliTRDptrgCBB::AliTRDptrgCBB(AliRunLoader *rl) 
  : TObject(),
  fRunLoader(rl),
  fParam(0),
  fOperatingMode(AliTRDptrgParam::kDigits),
  fCBA(0),
  fCBC(0),
  fTLMU(0),
  fLUTArray(0),
  fPTmasks(0x0)
{
  // default ctor
  AliError("default ctor - usage not recommended\n");
}


AliTRDptrgCBB::AliTRDptrgCBB(AliRunLoader *rl, AliTRDptrgParam* param, 
                             AliTRDptrgParam::AliTRDptrgOperatingMode_t operatingMode)
  : TObject(),
  fRunLoader(rl),
  fParam(param),
  fOperatingMode(operatingMode),
  fCBA(0),
  fCBC(0),
  fTLMU(0),
  fLUTArray(0),
  fPTmasks(0x0) 
{
  // recommended ctor
  this->fCBA = new AliTRDptrgCBAC(rl, AliTRDptrgParam::kA, operatingMode, param);
  this->fCBC = new AliTRDptrgCBAC(rl, AliTRDptrgParam::kC, operatingMode, param);
  this->fTLMU = new AliTRDptrgTLMU(rl, param, operatingMode);

  this->LoadParams();
}

AliTRDptrgCBB::~AliTRDptrgCBB() 
{
  // destructor

  if (this->fCBA != 0x0) {
    delete this->fCBA;
    this->fCBA = 0x0;
  }

  if (this->fCBC != 0x0) {
    delete this->fCBC;
    this->fCBC = 0x0;
  }

  if (this->fTLMU != 0x0) {
    delete this->fTLMU;
    this->fTLMU = 0x0;
  }

  this->fLUTArray.Delete();
}


//______________________________________________________________________________
Bool_t AliTRDptrgCBB::LoadParams() 
{
  // load configuration parameters

  if (this->fParam != 0x0) {
    // read AliTRDptrgParam
    
    // get LUTs
    // 0
    AliTRDptrgLUT* LUT = new AliTRDptrgLUT();
    LUT->InitTable(12, 12, this->fParam->GetCBLUT(0, 0), kFALSE);
    // get CB-B_0 and do not copy lut content
    this->fLUTArray.AddLast(LUT);
 
    // 1
    LUT = new AliTRDptrgLUT();
    LUT->InitTable(12, 12, this->fParam->GetCBLUT(0, 1), kFALSE);
    // get CB-B_1 and do not copy lut content
    this->fLUTArray.AddLast(LUT);

    // 2
    LUT = new AliTRDptrgLUT();
    LUT->InitTable(12, 12, this->fParam->GetCBLUT(0, 2), kFALSE);
    // get CB-B_2 and do not copy lut content
    this->fLUTArray.AddLast(LUT);

    // masks
    this->fPTmasks = this->fParam->GetPTmasks();
  }
  else {
    // load default parameters 
    // initialize LUTsoutputWidth=<value optimized out>
    AliTRDptrgLUT* lut = new AliTRDptrgLUT();
    this->fLUTArray.AddLast(lut);
    lut = new AliTRDptrgLUT(); // this->fRunLoader
    this->fLUTArray.AddLast(lut);
    lut = new AliTRDptrgLUT(); // this->fRunLoader
    this->fLUTArray.AddLast(lut);
    // the following lines are only needed for test reasons
    Int_t* initData = new Int_t[4096]; // 2^12
    lut = dynamic_cast<AliTRDptrgLUT*>(this->fLUTArray.At(0));
    if (lut) {
      for (Int_t i = 0; i < 4096; i++ ) {
        initData[i] = i;
      }
      lut->InitTable(12, 12, initData, kTRUE); // make a copy
    }
    lut = dynamic_cast<AliTRDptrgLUT*>(this->fLUTArray.At(0));
    if (lut) {
      for (Int_t i = 0; i < 4096; i++ ) {
        initData[i] = i;
      }
      lut->InitTable(12, 12, initData, kTRUE); // make a copy
    }
    lut = dynamic_cast<AliTRDptrgLUT*>(this->fLUTArray.At(1));
    if (lut) {
      //for (Int_t i = 4096; i >= 0; i--) {
      for (Int_t i = 4096; i > 0; i--) {
        initData[4096 - i] = i;  // inverse ramp
      }
      lut->InitTable(12, 12, initData, kTRUE); // make a copy 
    }
    delete [] initData;

    AliTRDptrgParam::AliTRDptrgPTmasks* masks = 
      new AliTRDptrgParam::AliTRDptrgPTmasks();  
    masks->fLUTs[0] = kTRUE;
    masks->fLUTs[1] = kTRUE;
    masks->fLUTs[2] = kTRUE;
    this->fPTmasks = masks;
  }  
  return false;
}

//______________________________________________________________________________
Int_t* AliTRDptrgCBB::Simulate()
{ 
  // Simulate the CBB behavior of event
  //
  // returns array containing:
  // 0: array element count
  // 1..count-2: LUT results
  // count-1: pretrigger decision

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

  Int_t inputVector = 0x0;
  // initialize partResults
  Int_t** partResults = 0x0;  
  partResults = new Int_t* [3]; // CB-A, CB-C, TLMU
 
  // get partResults
  partResults[0] = this->fCBA->Simulate(); // CB-A
  partResults[1] = this->fCBC->Simulate(); // CB-C
  partResults[2] = this->fTLMU->Simulate(); // TLMU
  
  // combine partResults and create inputVectors  
  Int_t mask = 0x1;
  for (Int_t i = 0; i < 3 ; i++) {
    for (Int_t j = 1; j <= partResults[i][0]; j++) {
      if (partResults[i][j] > 0) {
        inputVector |= mask; // Add bit to the  inputVector
      }
      mask <<= 1;
    }
  }
  
  AliDebug(5, Form("Inputvectors: 0x%x", inputVector));
    
  // perform look up
  Int_t* result = new Int_t[nLUTs + 2]; // generate new return array
  result[0] = nLUTs + 1; // 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 = dynamic_cast<AliTRDptrgLUT*>(this->fLUTArray[iLUT]);
    if (lutTmp) {
      result[iLUT + 1] = lutTmp->LookUp(inputVector);
    }
    AliDebug(4, Form("CBB result[%d] = 0x%x\n",(iLUT + 1),result[iLUT + 1])); 
  }
  
  // evaluate PT decision
  // stored in result[nLUTs + 1]
  result[nLUTs + 1] = 0;

  for (Int_t i = 0; i < 2; i++) {
    // CB-A
    if (this->fPTmasks->fCBA[i] && partResults[0][i + 1]) {
      result[nLUTs + 1]++;
    }
    // CB-C
    if (this->fPTmasks->fCBC[i] && partResults[1][i + 1]) {
      result[nLUTs + 1]++;
    }
    // CB-B (own LUTs)
    if (this->fPTmasks->fLUTs[i] && result[i + 1]) {
      result[nLUTs + 1]++;
    }       
  }
  if (this->fPTmasks->fLUTs[2] && result[3]) { // CB-B (third own LUT)
    result[nLUTs + 1]++;
  }

  // TLMU
  for (Int_t i = 0; i < 8; i++) {
    if (this->fPTmasks->fTLMU[i] && partResults[2][i + 1]) {
      result[nLUTs + 1]++;
    }
  }
  AliDebug(4, Form("CBB TRD Wake up result = %d", result[nLUTs + 1]));

  delete [] partResults;

  return result;

}

//______________________________________________________________________________
Bool_t AliTRDptrgCBB::GetPT() {
  // evaluates the pre trigger decision

  Int_t* LUTresults = this->Simulate();
  if (LUTresults[(LUTresults[0] - 1)]) {
    delete[] LUTresults;
    return kTRUE;
  }
  else {
    delete[] LUTresults;
    return kFALSE;
  }
}
 AliTRDptrgCBB.cxx:1
 AliTRDptrgCBB.cxx:2
 AliTRDptrgCBB.cxx:3
 AliTRDptrgCBB.cxx:4
 AliTRDptrgCBB.cxx:5
 AliTRDptrgCBB.cxx:6
 AliTRDptrgCBB.cxx:7
 AliTRDptrgCBB.cxx:8
 AliTRDptrgCBB.cxx:9
 AliTRDptrgCBB.cxx:10
 AliTRDptrgCBB.cxx:11
 AliTRDptrgCBB.cxx:12
 AliTRDptrgCBB.cxx:13
 AliTRDptrgCBB.cxx:14
 AliTRDptrgCBB.cxx:15
 AliTRDptrgCBB.cxx:16
 AliTRDptrgCBB.cxx:17
 AliTRDptrgCBB.cxx:18
 AliTRDptrgCBB.cxx:19
 AliTRDptrgCBB.cxx:20
 AliTRDptrgCBB.cxx:21
 AliTRDptrgCBB.cxx:22
 AliTRDptrgCBB.cxx:23
 AliTRDptrgCBB.cxx:24
 AliTRDptrgCBB.cxx:25
 AliTRDptrgCBB.cxx:26
 AliTRDptrgCBB.cxx:27
 AliTRDptrgCBB.cxx:28
 AliTRDptrgCBB.cxx:29
 AliTRDptrgCBB.cxx:30
 AliTRDptrgCBB.cxx:31
 AliTRDptrgCBB.cxx:32
 AliTRDptrgCBB.cxx:33
 AliTRDptrgCBB.cxx:34
 AliTRDptrgCBB.cxx:35
 AliTRDptrgCBB.cxx:36
 AliTRDptrgCBB.cxx:37
 AliTRDptrgCBB.cxx:38
 AliTRDptrgCBB.cxx:39
 AliTRDptrgCBB.cxx:40
 AliTRDptrgCBB.cxx:41
 AliTRDptrgCBB.cxx:42
 AliTRDptrgCBB.cxx:43
 AliTRDptrgCBB.cxx:44
 AliTRDptrgCBB.cxx:45
 AliTRDptrgCBB.cxx:46
 AliTRDptrgCBB.cxx:47
 AliTRDptrgCBB.cxx:48
 AliTRDptrgCBB.cxx:49
 AliTRDptrgCBB.cxx:50
 AliTRDptrgCBB.cxx:51
 AliTRDptrgCBB.cxx:52
 AliTRDptrgCBB.cxx:53
 AliTRDptrgCBB.cxx:54
 AliTRDptrgCBB.cxx:55
 AliTRDptrgCBB.cxx:56
 AliTRDptrgCBB.cxx:57
 AliTRDptrgCBB.cxx:58
 AliTRDptrgCBB.cxx:59
 AliTRDptrgCBB.cxx:60
 AliTRDptrgCBB.cxx:61
 AliTRDptrgCBB.cxx:62
 AliTRDptrgCBB.cxx:63
 AliTRDptrgCBB.cxx:64
 AliTRDptrgCBB.cxx:65
 AliTRDptrgCBB.cxx:66
 AliTRDptrgCBB.cxx:67
 AliTRDptrgCBB.cxx:68
 AliTRDptrgCBB.cxx:69
 AliTRDptrgCBB.cxx:70
 AliTRDptrgCBB.cxx:71
 AliTRDptrgCBB.cxx:72
 AliTRDptrgCBB.cxx:73
 AliTRDptrgCBB.cxx:74
 AliTRDptrgCBB.cxx:75
 AliTRDptrgCBB.cxx:76
 AliTRDptrgCBB.cxx:77
 AliTRDptrgCBB.cxx:78
 AliTRDptrgCBB.cxx:79
 AliTRDptrgCBB.cxx:80
 AliTRDptrgCBB.cxx:81
 AliTRDptrgCBB.cxx:82
 AliTRDptrgCBB.cxx:83
 AliTRDptrgCBB.cxx:84
 AliTRDptrgCBB.cxx:85
 AliTRDptrgCBB.cxx:86
 AliTRDptrgCBB.cxx:87
 AliTRDptrgCBB.cxx:88
 AliTRDptrgCBB.cxx:89
 AliTRDptrgCBB.cxx:90
 AliTRDptrgCBB.cxx:91
 AliTRDptrgCBB.cxx:92
 AliTRDptrgCBB.cxx:93
 AliTRDptrgCBB.cxx:94
 AliTRDptrgCBB.cxx:95
 AliTRDptrgCBB.cxx:96
 AliTRDptrgCBB.cxx:97
 AliTRDptrgCBB.cxx:98
 AliTRDptrgCBB.cxx:99
 AliTRDptrgCBB.cxx:100
 AliTRDptrgCBB.cxx:101
 AliTRDptrgCBB.cxx:102
 AliTRDptrgCBB.cxx:103
 AliTRDptrgCBB.cxx:104
 AliTRDptrgCBB.cxx:105
 AliTRDptrgCBB.cxx:106
 AliTRDptrgCBB.cxx:107
 AliTRDptrgCBB.cxx:108
 AliTRDptrgCBB.cxx:109
 AliTRDptrgCBB.cxx:110
 AliTRDptrgCBB.cxx:111
 AliTRDptrgCBB.cxx:112
 AliTRDptrgCBB.cxx:113
 AliTRDptrgCBB.cxx:114
 AliTRDptrgCBB.cxx:115
 AliTRDptrgCBB.cxx:116
 AliTRDptrgCBB.cxx:117
 AliTRDptrgCBB.cxx:118
 AliTRDptrgCBB.cxx:119
 AliTRDptrgCBB.cxx:120
 AliTRDptrgCBB.cxx:121
 AliTRDptrgCBB.cxx:122
 AliTRDptrgCBB.cxx:123
 AliTRDptrgCBB.cxx:124
 AliTRDptrgCBB.cxx:125
 AliTRDptrgCBB.cxx:126
 AliTRDptrgCBB.cxx:127
 AliTRDptrgCBB.cxx:128
 AliTRDptrgCBB.cxx:129
 AliTRDptrgCBB.cxx:130
 AliTRDptrgCBB.cxx:131
 AliTRDptrgCBB.cxx:132
 AliTRDptrgCBB.cxx:133
 AliTRDptrgCBB.cxx:134
 AliTRDptrgCBB.cxx:135
 AliTRDptrgCBB.cxx:136
 AliTRDptrgCBB.cxx:137
 AliTRDptrgCBB.cxx:138
 AliTRDptrgCBB.cxx:139
 AliTRDptrgCBB.cxx:140
 AliTRDptrgCBB.cxx:141
 AliTRDptrgCBB.cxx:142
 AliTRDptrgCBB.cxx:143
 AliTRDptrgCBB.cxx:144
 AliTRDptrgCBB.cxx:145
 AliTRDptrgCBB.cxx:146
 AliTRDptrgCBB.cxx:147
 AliTRDptrgCBB.cxx:148
 AliTRDptrgCBB.cxx:149
 AliTRDptrgCBB.cxx:150
 AliTRDptrgCBB.cxx:151
 AliTRDptrgCBB.cxx:152
 AliTRDptrgCBB.cxx:153
 AliTRDptrgCBB.cxx:154
 AliTRDptrgCBB.cxx:155
 AliTRDptrgCBB.cxx:156
 AliTRDptrgCBB.cxx:157
 AliTRDptrgCBB.cxx:158
 AliTRDptrgCBB.cxx:159
 AliTRDptrgCBB.cxx:160
 AliTRDptrgCBB.cxx:161
 AliTRDptrgCBB.cxx:162
 AliTRDptrgCBB.cxx:163
 AliTRDptrgCBB.cxx:164
 AliTRDptrgCBB.cxx:165
 AliTRDptrgCBB.cxx:166
 AliTRDptrgCBB.cxx:167
 AliTRDptrgCBB.cxx:168
 AliTRDptrgCBB.cxx:169
 AliTRDptrgCBB.cxx:170
 AliTRDptrgCBB.cxx:171
 AliTRDptrgCBB.cxx:172
 AliTRDptrgCBB.cxx:173
 AliTRDptrgCBB.cxx:174
 AliTRDptrgCBB.cxx:175
 AliTRDptrgCBB.cxx:176
 AliTRDptrgCBB.cxx:177
 AliTRDptrgCBB.cxx:178
 AliTRDptrgCBB.cxx:179
 AliTRDptrgCBB.cxx:180
 AliTRDptrgCBB.cxx:181
 AliTRDptrgCBB.cxx:182
 AliTRDptrgCBB.cxx:183
 AliTRDptrgCBB.cxx:184
 AliTRDptrgCBB.cxx:185
 AliTRDptrgCBB.cxx:186
 AliTRDptrgCBB.cxx:187
 AliTRDptrgCBB.cxx:188
 AliTRDptrgCBB.cxx:189
 AliTRDptrgCBB.cxx:190
 AliTRDptrgCBB.cxx:191
 AliTRDptrgCBB.cxx:192
 AliTRDptrgCBB.cxx:193
 AliTRDptrgCBB.cxx:194
 AliTRDptrgCBB.cxx:195
 AliTRDptrgCBB.cxx:196
 AliTRDptrgCBB.cxx:197
 AliTRDptrgCBB.cxx:198
 AliTRDptrgCBB.cxx:199
 AliTRDptrgCBB.cxx:200
 AliTRDptrgCBB.cxx:201
 AliTRDptrgCBB.cxx:202
 AliTRDptrgCBB.cxx:203
 AliTRDptrgCBB.cxx:204
 AliTRDptrgCBB.cxx:205
 AliTRDptrgCBB.cxx:206
 AliTRDptrgCBB.cxx:207
 AliTRDptrgCBB.cxx:208
 AliTRDptrgCBB.cxx:209
 AliTRDptrgCBB.cxx:210
 AliTRDptrgCBB.cxx:211
 AliTRDptrgCBB.cxx:212
 AliTRDptrgCBB.cxx:213
 AliTRDptrgCBB.cxx:214
 AliTRDptrgCBB.cxx:215
 AliTRDptrgCBB.cxx:216
 AliTRDptrgCBB.cxx:217
 AliTRDptrgCBB.cxx:218
 AliTRDptrgCBB.cxx:219
 AliTRDptrgCBB.cxx:220
 AliTRDptrgCBB.cxx:221
 AliTRDptrgCBB.cxx:222
 AliTRDptrgCBB.cxx:223
 AliTRDptrgCBB.cxx:224
 AliTRDptrgCBB.cxx:225
 AliTRDptrgCBB.cxx:226
 AliTRDptrgCBB.cxx:227
 AliTRDptrgCBB.cxx:228
 AliTRDptrgCBB.cxx:229
 AliTRDptrgCBB.cxx:230
 AliTRDptrgCBB.cxx:231
 AliTRDptrgCBB.cxx:232
 AliTRDptrgCBB.cxx:233
 AliTRDptrgCBB.cxx:234
 AliTRDptrgCBB.cxx:235
 AliTRDptrgCBB.cxx:236
 AliTRDptrgCBB.cxx:237
 AliTRDptrgCBB.cxx:238
 AliTRDptrgCBB.cxx:239
 AliTRDptrgCBB.cxx:240
 AliTRDptrgCBB.cxx:241
 AliTRDptrgCBB.cxx:242
 AliTRDptrgCBB.cxx:243
 AliTRDptrgCBB.cxx:244
 AliTRDptrgCBB.cxx:245
 AliTRDptrgCBB.cxx:246
 AliTRDptrgCBB.cxx:247
 AliTRDptrgCBB.cxx:248
 AliTRDptrgCBB.cxx:249
 AliTRDptrgCBB.cxx:250
 AliTRDptrgCBB.cxx:251
 AliTRDptrgCBB.cxx:252
 AliTRDptrgCBB.cxx:253
 AliTRDptrgCBB.cxx:254
 AliTRDptrgCBB.cxx:255
 AliTRDptrgCBB.cxx:256
 AliTRDptrgCBB.cxx:257
 AliTRDptrgCBB.cxx:258
 AliTRDptrgCBB.cxx:259
 AliTRDptrgCBB.cxx:260
 AliTRDptrgCBB.cxx:261
 AliTRDptrgCBB.cxx:262
 AliTRDptrgCBB.cxx:263
 AliTRDptrgCBB.cxx:264
 AliTRDptrgCBB.cxx:265
 AliTRDptrgCBB.cxx:266
 AliTRDptrgCBB.cxx:267
 AliTRDptrgCBB.cxx:268
 AliTRDptrgCBB.cxx:269
 AliTRDptrgCBB.cxx:270