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$

//-----------------------------------------------------------------------------
/// \class AliMUONPayloadTrigger
/// Class Payload
///
/// Decodes rawdata from buffer and stores in TClonesArray.
/// 
/// First version implement for Trigger
///
/// \author Christian Finck
//-----------------------------------------------------------------------------

#include "AliMUONPayloadTrigger.h"

#include "AliMUONDarcHeader.h"
#include "AliMUONRegHeader.h"
#include "AliMUONLocalStruct.h"
#include "AliMUONDDLTrigger.h"
#include "AliMUONLogger.h"

#include "AliLog.h"

/// \cond CLASSIMP
ClassImp(AliMUONPayloadTrigger)
/// \endcond

AliMUONPayloadTrigger::AliMUONPayloadTrigger()
  : TObject(),
    fMaxReg(8),
    fMaxLoc(16),
    fDDLTrigger(new AliMUONDDLTrigger()),
    fRegHeader(new AliMUONRegHeader()), 
    fLocalStruct(new AliMUONLocalStruct()),
    fLog(new AliMUONLogger(1000)),
    fDarcEoWErrors(0),
    fGlobalEoWErrors(0),
    fRegEoWErrors(0),
    fLocalEoWErrors(0),
    fWarnings(kTRUE),
    fNofRegSet(kFALSE)
{
  ///
  /// create an object to read MUON raw digits
  /// Default ctor for monitoring purposes
  ///

}

//___________________________________
AliMUONPayloadTrigger::~AliMUONPayloadTrigger()
{
  ///
  /// clean up
  ///
  delete fDDLTrigger;
  delete fLocalStruct;
  delete fRegHeader;
  delete fLog;
}


//______________________________________________________
Bool_t AliMUONPayloadTrigger::Decode(UInt_t *buffer, Bool_t scalerEvent)
{
  /// decode trigger DDL
  /// store only notified cards

 // reading DDL for trigger

  AliMUONDarcHeader* darcHeader = fDDLTrigger->GetDarcHeader();

  static Int_t kGlobalHeaderSize   = darcHeader->GetGlobalHeaderLength(); 
  static Int_t kDarcHeaderSize     = darcHeader->GetDarcHeaderLength(); 
  static Int_t kRegHeaderSize      = fRegHeader->GetHeaderLength();
  static Int_t kRegEmptySize       = fRegHeader->GetHeaderLength()+1 + 16*(fLocalStruct->GetLength()+1);
  static Int_t kRegEmptyScalerSize = fRegHeader->GetHeaderLength() + fRegHeader->GetScalerLength() + 1 +
                                      16*(fLocalStruct->GetLength() + fLocalStruct->GetScalerLength() + 1);

  Int_t index = 0;

  memcpy(darcHeader->GetHeader(), &buffer[index], (kDarcHeaderSize)*4); 
  index += kDarcHeaderSize;


  // darc type vadorh
  if (darcHeader->GetDarcType() == darcHeader->GetDarcVadohrType())
      fMaxReg = 1;
    
  // darc type def.
  if (darcHeader->GetDarcType() == darcHeader->GetDarcDefaultType())
      fMaxReg = 8;
      
  if(darcHeader->GetEventType() == scalerEvent) 
      if (fWarnings) AliWarning("Wrong event type obtained from the Darc header, take the one of CDH");


  if(scalerEvent) {
    // 6 DARC scaler words
    memcpy(darcHeader->GetDarcScalers(), &buffer[index], darcHeader->GetDarcScalerLength()*4);
    index += darcHeader->GetDarcScalerLength();
  }

  if (buffer[index++] != darcHeader->GetEndOfDarc()) {

      const Char_t* msg = Form("Wrong end of Darc word %x instead of %x\n",
		    buffer[index-1], darcHeader->GetEndOfDarc());
      if (fWarnings) AliWarning(msg);
      AddErrorMessage(msg);
      fDarcEoWErrors++;
  }
  // 4 words of global board input + Global board output
  memcpy(darcHeader->GetGlobalInput(), &buffer[index], (kGlobalHeaderSize)*4); 
  index += kGlobalHeaderSize; 

  if(scalerEvent) {
    // 10 Global scaler words
    memcpy(darcHeader->GetGlobalScalers(), &buffer[index], darcHeader->GetGlobalScalerLength()*4);
    index += darcHeader->GetGlobalScalerLength();
  }

  if (buffer[index++] != darcHeader->GetEndOfGlobal()) {

      const Char_t* msg = Form("Wrong end of Global word %x instead of %x\n",
		      buffer[index-1], darcHeader->GetEndOfGlobal());
      if (fWarnings) AliWarning(msg);
      AddErrorMessage(msg);
      fGlobalEoWErrors++;
  }
  // 8 regional boards
  for (Int_t iReg = 0; iReg < fMaxReg; iReg++) {           //loop over regeonal card

    // skip empty regaional board (not connected or with error reading)
    if (buffer[index] == fRegHeader->GetErrorWord()) {
      fDDLTrigger->AddRegHeader(*fRegHeader);
      if (scalerEvent)
        index += kRegEmptyScalerSize;
      else 
        index += kRegEmptySize;
      continue;
    }
    memcpy(fRegHeader->GetHeader(), &buffer[index], kRegHeaderSize*4);
    index += kRegHeaderSize;

    fDDLTrigger->AddRegHeader(*fRegHeader);
    // 11 regional scaler word
    if(scalerEvent) {
      memcpy(fRegHeader->GetScalers(), &buffer[index], fRegHeader->GetScalerLength()*4);
      index += fRegHeader->GetScalerLength();
    }

    if (buffer[index++] != fRegHeader->GetEndOfReg()) {

      const Char_t* msg = Form("Wrong end of Regional word %x instead of %x\n",
		    buffer[index-1], fRegHeader->GetEndOfReg());
      if (fWarnings) AliWarning(msg);
      AddErrorMessage(msg);
      fRegEoWErrors++;
    }
    // 16 local cards per regional board
    for (Int_t iLoc = 0; iLoc < fMaxLoc; iLoc++) {         //loop over local card
	  
      Int_t dataSize = fLocalStruct->GetLength();;

      // 5 word trigger information
      memcpy(fLocalStruct->GetData(), &buffer[index], dataSize*4); 
      index += dataSize;	 

      // 45 regional scaler word
      if(scalerEvent) {
	memcpy(fLocalStruct->GetScalers(), &buffer[index], fLocalStruct->GetScalerLength()*4);
	index += fLocalStruct->GetScalerLength();
      }

      if (buffer[index++] != fLocalStruct->GetEndOfLocal()) {

        const Char_t* msg = Form("Wrong end of Local word %x instead of %x\n",
                                 buffer[index-1], fLocalStruct->GetEndOfLocal());
        
        if (fWarnings) AliWarning(msg);
        AddErrorMessage(msg);
	fLocalEoWErrors++;
      }
      // fill only if card notified
      if (fLocalStruct->GetData(0) == fLocalStruct->GetDisableWord())
	  continue;

      fDDLTrigger->AddLocStruct(*fLocalStruct, iReg);

    } // local card loop
	
  } // regional card loop
      

  return kTRUE;
}

//______________________________________________________
void AliMUONPayloadTrigger::ResetDDL()
{
  /// reseting TClonesArray
  /// after each DDL
  ///
  AliMUONDarcHeader* darcHeader = fDDLTrigger->GetDarcHeader();
  darcHeader->GetRegHeaderArray()->Delete();
  fDarcEoWErrors   = 0;
  fGlobalEoWErrors = 0;
  fRegEoWErrors    = 0;
  fLocalEoWErrors  = 0;
}

//______________________________________________________
void AliMUONPayloadTrigger::SetMaxReg(Int_t reg) 
{
  /// set regional card number
  if (reg > 8) reg = 8;
   fMaxReg = reg;
   
  fNofRegSet = kTRUE;
}

//______________________________________________________
void AliMUONPayloadTrigger::SetMaxLoc(Int_t loc) 
{
  /// set local card number
  if (loc > 16) loc = 16;
  fMaxLoc = loc;
}

//______________________________________________________
void AliMUONPayloadTrigger::AddErrorMessage(const Char_t* msg)
{
/// adding message to logger
 
  TString tmp(msg);
  
  Int_t pos = tmp.First("\n");
  tmp[pos] = 0;
    
  fLog->Log(tmp.Data());
}

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