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

///////////////////////////////////////////////////////////////////////////////
///
/// This class provides access to VME data in test beam raw data.
///
///////////////////////////////////////////////////////////////////////////////

#include "AliVMERawStream.h"
#include "AliRawReader.h"

ClassImp(AliVMERawStream)



AliVMERawStream::AliVMERawStream(AliRawReader* rawReader) :
  fRawReader(rawReader),
  fData(0),
  fNChannels(-1),
  fBlock(0),
  fNumber(0),
  fChannel(0),
  fValue(0),
  fTime(0),
  fTimeMuSec(0)
{
// create an object to read VME raw digits

  fRawReader = rawReader;

  ReadTDC();
  ReadTime();

  fRawReader->Reset();
  fRawReader->SelectEquipment(551, 38, 38);
}

Bool_t AliVMERawStream::Next()
{
// read the next raw digit
// returns kFALSE if there is no digit left

  // V551 string
  if (fNChannels == -1) {
    if (!fRawReader->ReadNextInt(fData)) return kFALSE;
    if (!CheckString("V551")) return kFALSE;
    fNChannels = 0;
  }

  while (fNChannels == 0) {
    // V550 or v551 string
    if (!fRawReader->ReadNextInt(fData)) {
      Error("Next", "incomplete equipment");
      return kFALSE;
    }
    // check for v551 string (end of data)
    const char* v551 = "v551";
    if (fData == *((UInt_t*) v551)) return kFALSE;
    if (!CheckString("V550")) return kFALSE;

    // block
    if (!fRawReader->ReadNextShort(fBlock)) {
      Error("Next", "incomplete equipment");
      return kFALSE;
    }

    // serial number
    if (!fRawReader->ReadNextShort(fNumber)) {
      Error("Next", "incomplete equipment");
      return kFALSE;
    }

    // number of channels
    if (!fRawReader->ReadNextInt((UInt_t&) fNChannels)) {
      Error("Next", "incomplete equipment");
      return kFALSE;
    }
  }

  if (!fRawReader->ReadNextInt(fData)) {
    Error("Next", "incomplete equipment");
    return kFALSE;
  }
  fChannel = (fData >> 12) & 0x03ff;
  fValue = fData & 0x0fff;
  fNChannels--;

  return kTRUE;
}



Bool_t AliVMERawStream::CheckString(const char* str) const
{
// check fData to be equal to the given string

  if (fData != *((UInt_t*) str)) {
    char strData[5];
    memcpy(strData, &fData, 4);
    strData[4] = 0;
    Error("CheckString", "invalid %s string (%s)", str, strData);
    return kFALSE;
  }
  return kTRUE;
}

Bool_t AliVMERawStream::ReadTDC()
{
// read the TDC information

  fRawReader->Reset();
  fRawReader->SelectEquipment(775, 72, 72);

  // V775 string
  if (!fRawReader->ReadNextInt(fData)) return kFALSE;
  if (!CheckString("V775")) return kFALSE;

  // header
  if (!fRawReader->ReadNextInt(fData)) {
    Error("ReadTDC", "incomplete TDC equipment");
    return kFALSE;
  }
  if ((fData & 0x02000000) == 0) {
    Error("ReadTDC", "invalid header: 0x%x", fData);
    return kFALSE;
  }

  // check the array size
  Int_t nTDC = fRawReader->GetDataSize() / 4 - 4; // - V775,header,counter,v775
  if ( nTDC != 3 ) {
    Error("ReadTDC", "wrong number of TDC channels: %d", nTDC);
    return kFALSE;
  }

  // TDC data
  for (Int_t i = 0; i < fgkNTDC; i++) {
    if (!fRawReader->ReadNextInt(fData)) {
      Error("ReadTDC", "incomplete TDC equipment");
      return kFALSE;
    }
    if (fData & 0x07000000) {
      Warning("ReadTDC", "bad TDC data: %x", fData);
    }
    if ((fData & 0x00004000) == 0) {
      Warning("ReadTDC", "TDC data not valid: %x", fData);
    }
    if (fData & 0x00002000) {
      Warning("ReadTDC", "TDC data underflow: %x", fData);
    }
    if (fData & 0x00001000) {
      Warning("ReadTDC", "TDC data overflow: %x", fData);
    }
    fTDCChannel[i]  = (fData >> 16) & 0x1f;
    fTDCValue[i] = fData & 0x0fff;
  }

  // counter
  if (!fRawReader->ReadNextInt(fData)) {
    Error("ReadTDC", "incomplete TDC equipment");
    return kFALSE;
  }
  if ((fData & 0x04000000) == 0) {
    Error("ReadTDC", "invalid counter: 0x%x", fData);
    return kFALSE;
  }

  // v775 string
  if (!fRawReader->ReadNextInt(fData)) {
    Error("ReadTDC", "incomplete TDC equipment");
    return kFALSE;
  }
  if (!CheckString("v775")) return kFALSE;

  return kTRUE;
}

Bool_t AliVMERawStream::ReadTime()
{
// read the time information

  fRawReader->Reset();
  fRawReader->SelectEquipment(1970, 0x12345678, 0x12345678);

  // TIME string
  if (!fRawReader->ReadNextInt(fData)) return kFALSE;
  if (!CheckString("TIME")) return kFALSE;

  // time value
  if (!fRawReader->ReadNextInt(fTime)) {
    Error("ReadTime", "incomplete time equipment");
    return kFALSE;
  }

  // micro seconds value
  if (!fRawReader->ReadNextInt(fTimeMuSec)) {
    Error("ReadTime", "incomplete time equipment");
    return kFALSE;
  }

  // time string
  if (!fRawReader->ReadNextInt(fData)) {
    Error("ReadTime", "incomplete time equipment");
    return kFALSE;
  }
  if (!CheckString("time")) return kFALSE;

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