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.                  *
 **************************************************************************/

// Interface to the Altro format
// to read and write digits
// To be used in Alice Data Challenges 
// and in the compression of the RAW data

#include "AliAltroBufferV3.h"
#include "AliRawDataHeaderSim.h"
#include "AliLog.h"
#include "AliFstream.h"

ClassImp(AliAltroBufferV3)

//_____________________________________________________________________________
AliAltroBufferV3::AliAltroBufferV3(const char* fileName, AliAltroMapping *mapping):
AliAltroBuffer(fileName,mapping),
  fN(0),
  fFECERRA(0),	
  fFECERRB(0),	
  fERRREG2(0),	
  fERRREG3(0),	
  fActiveFECsA(0xffff),
  fActiveFECsB(0xffff),
  fALTROCFG1(0),	
  fALTROCFG2(0),	
  fTSample(0),	
  fL1Phase(0)
{
  // Constructor
  memset(fArray, 0, kMaxWords*sizeof(UShort_t));
}

//_____________________________________________________________________________
AliAltroBufferV3::~AliAltroBufferV3()
{
// destructor
}

//_____________________________________________________________________________
AliAltroBufferV3::AliAltroBufferV3(const AliAltroBufferV3& source):
  AliAltroBuffer(source),
  fN(source.fN),
  fFECERRA(source.fFECERRA),	
  fFECERRB(source.fFECERRB),	
  fERRREG2(source.fERRREG2),	
  fERRREG3(source.fERRREG3),	
  fActiveFECsA(source.fActiveFECsA),
  fActiveFECsB(source.fActiveFECsB),
  fALTROCFG1(source.fALTROCFG1),	
  fALTROCFG2(source.fALTROCFG2),	
  fTSample(source.fTSample),	
  fL1Phase(source.fL1Phase)
{
// Copy Constructor

  Fatal("AliAltroBufferV3", "copy constructor not implemented");
}

//_____________________________________________________________________________
AliAltroBufferV3& AliAltroBufferV3::operator = (const AliAltroBufferV3& /*source*/)
{
//Assigment operator
#if 0
  fFECERRA	= source.fFECERRA;	
  fFECERRB	= source.fFECERRB;	
  fERRREG2	= source.fERRREG2;	
  fERRREG3	= source.fERRREG3;	
  fActiveFECsA	= source.fActiveFECsA;
  fActiveFECsB	= source.fActiveFECsB;
  fALTROCFG1	= source.fALTROCFG1;	
  fALTROCFG2	= source.fALTROCFG2;	
  fTSample	= source.fTSample;	
  fL1Phase      = source.fL1Phase;
#endif

  Fatal("operator =", "assignment operator not implemented");
  return *this;
}

//_____________________________________________________________________________
void AliAltroBufferV3::FillBuffer(Int_t val)
{
//Fills the Buffer with 16 ten bits words and write into a file 

  if ((val > 0x3FF) || (val < 0)) {
    Error("FillBuffer", "Value out of range (10 bits): %d", val);
    val = 0x3FF;
  }

  if (fN >= (kMaxWords-1)) {
    Error("FillBuffer","Altro channel can't have more than 1024 10-bit words!");
    return;
  }

  fArray[fN++] = val;
}

//_____________________________________________________________________________
void AliAltroBufferV3::WriteTrailer(Int_t wordsNumber, Short_t hwAddress)
{
  //Writes a trailer (header) of 32 bits using
  //a given hardware adress
  UInt_t temp = hwAddress & 0xFFF;
  temp |= ((wordsNumber & 0x3FF) << 16);
  temp |= (0x1U << 30);

  fFile->WriteBuffer((char *)(&temp),sizeof(UInt_t));

  ReverseAndWrite();
}

//_____________________________________________________________________________
UInt_t AliAltroBufferV3::SetField(UInt_t& input, UShort_t start, UInt_t mask, UInt_t val) const
{
  UInt_t out = (mask << start);
  UInt_t fld = (val << start) & out;
  input &= ~out;
  input |= fld;
  return input;
}

//_____________________________________________________________________________
void AliAltroBufferV3::ReverseAndWrite()
{
  // Reverse the altro data order and
  // write the buffer to the file
  UInt_t temp = 0;
  Int_t shift = 20;
  for(Int_t i = (fN-1); i >= 0; i--) {
    temp |= (fArray[i] << shift);
    shift -= 10;
    if (shift < 0) {
      fFile->WriteBuffer((char *)(&temp),sizeof(UInt_t));
      temp = 0;
      shift = 20;
    }
  }

  if (shift != 20) {
    fFile->WriteBuffer((char *)(&temp),sizeof(UInt_t));
  }

  fN = 0;
}

//_____________________________________________________________________________
UChar_t AliAltroBufferV3::WriteRCUTrailer(Int_t rcuId)
{
  // Writes the RCU trailer
  // rcuId the is serial number of the corresponding
  // RCU. The basic format of the trailer can be
  // found in the RCU manual.
  // This method should be called at the end of
  // raw data writing.

  UInt_t currentFilePos = fFile->Tellp();
  UInt_t size = currentFilePos-fDataHeaderPos;
  size -= sizeof(AliRawDataHeaderV3);
  size /= 4;
  
  if (size > 0x3FFFFFF) {
    AliFatal(Form("The current raw data payload size of %d is bigger than the max possible one ! Can not write the RCU trailer !",size));
    return 2;
  }

  // Now add the the RCU trailer tag
  size |= (1U << 31);
  fFile->WriteBuffer((char *)(&size),sizeof(UInt_t));

  // Now several well defined fields contained
  // in the trailer
  // For details check the RCU manual
  UInt_t buffer;

  buffer  = (0x1U << 26);
  buffer |= (0x1U << 31);
  fFile->WriteBuffer((char *)(&buffer),sizeof(UInt_t));

  buffer =  (fERRREG2 & 0x3FFFFFF);
  buffer |= (0x2U << 26);
  buffer |= (0x1U << 31);
  fFile->WriteBuffer((char *)(&buffer),sizeof(UInt_t));
  
  buffer =  (fERRREG3 & 0x3FFFFFF);
  buffer |= (0x3U << 26);
  buffer |= (0x1U << 31);
  fFile->WriteBuffer((char *)(&buffer),sizeof(UInt_t));

  buffer  = (fActiveFECsA & 0x3FFFFFF);
  buffer |= (0x4U << 26);
  buffer |= (0x1U << 31);
  fFile->WriteBuffer((char *)(&buffer),sizeof(UInt_t)); 

  buffer  = (fActiveFECsB & 0x3FFFFFF);
  buffer |= (0x5U << 26);
  buffer |= (0x1U << 31);
  fFile->WriteBuffer((char *)(&buffer),sizeof(UInt_t));

  buffer  = (fALTROCFG1 & 0x3FFFFFF);
  buffer |= (0x6U << 26);
  buffer |= (0x1U << 31);
  fFile->WriteBuffer((char *)(&buffer),sizeof(UInt_t));
  
  buffer  = (fALTROCFG2 & 0x3FFFFFF);
  buffer |= (0x7U << 26);
  buffer |= (0x1U << 31);
  fFile->WriteBuffer((char *)(&buffer),sizeof(UInt_t));
  
  //  Now the RCU identifier and size of the trailer
  buffer = (9 & 0x7F);
  buffer |= ((rcuId & 0x1FF) << 7);
  buffer |= (0x2U << 16);
  buffer |= (0x8U << 26);
  buffer |= (0x3U << 30);
  fFile->WriteBuffer((char *)(&buffer),sizeof(UInt_t));

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