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

//____________________________________________________________________
//                                                                          
// Buffer to read RAW ALTRO FMD format from a AliRawReader 
// 
// This class derives from AliAltroBuffer, but overloads the memer
// function Next to do some extra processing.  In particular, it tries
// to autodetect the sample rate.  If zero-suppression was used when
// writing the raw data, then the automatic discovery will not work,
// and the sample rate should be set explicitly. 
//
#include "AliFMDRawStream.h"		// ALIFMDRAWSTREAM_H
// #include <AliRawReader.h>		// ALIRAWREADER_H
#include "AliFMDParameters.h"
// #include <AliLog.h>
#include "AliFMDDebug.h" // Better debug macros
// #include <iomanip>
// #include <iostream>
#include "AliRawReader.h"
#include <climits>

//____________________________________________________________________
ClassImp(AliFMDRawStream)
#if 0
  ; // This is here to keep Emacs for indenting the next line
#endif

//____________________________________________________________________
AliFMDRawStream::AliFMDRawStream(AliRawReader* reader) 
  : AliAltroRawStream(reader)
{
  // CTOR 
  reader->Reset();
  // Select FMD DDL's 
  SelectRawData("FMD");
}

//_____________________________________________________________________________
Bool_t 
AliFMDRawStream::ReadChannel(UInt_t& ddl, UInt_t& addr, 
			     UInt_t& len, volatile UShort_t* data)
{
  // Read one channel and return.   Returns 0 when there's no more
  // data. 
  Int_t        l         = 0;
  static Int_t last      = 0xFFFF; // 0xFFFF means signal is used
  Bool_t       next      = kTRUE;
  do {
    Int_t signal = last;
    if (last > 0x3FF) {
      AliFMDDebug(30, ("Last is 0x%x, so reading a new word", last));
      next   = Next();
      if(!next){
	AliFMDDebug(15, ("Read word # %d (!next)", l));
	addr = GetPrevHWAddress();
	ddl  = (GetPrevDDLNumber() < 0 ? UINT_MAX: UInt_t(GetPrevDDLNumber()));
	len  = l+1; // Need to add one - l points to last valid index
	last = signal;
	break;
      }
      signal = GetSignal();
      if (GetHWAddress() != GetPrevHWAddress() && GetPrevHWAddress() >= 0) {
	AliFMDDebug(15, ("New hardware address, was 0x%x, now 0x%x", 
			  GetPrevHWAddress(), GetHWAddress()));
	addr = GetPrevHWAddress();
	ddl  = (GetPrevDDLNumber() < 0 ? UINT_MAX : UInt_t(GetPrevDDLNumber()));
	len  = l+1; // Need to add one - l points to last valid index
	last = signal;
	break;
      }
    }
    // Sanity check - if the total bunch length is less than 1, then
    // read until we get the next bunch. 
    Int_t b  = GetTimeLength();
    if (b < 1) { 
      AliWarning(Form("Bunch length %0d is less than 0 for "
		      "DDL %4d address 0x%03x", 
		      b, ddl, addr));
      last = 0xFFFF;
      continue;
    }

    // Sanity check - if the current time is less than 0, then read
    // until we get a new bunch. 
    Int_t t  = GetTime();
    if (t < 0) {
      AliWarning(Form("Time %0d is less than 0 for DDL %4d address 0x%03x", 
		      t, ddl, addr));
      last = 0xFFFF;
      continue;
    }
    l        = TMath::Max(l, t);
    data[t]  = signal;
    last     = 0xFFFF;
#if 0
    AliFMDDebug(signal > 512 ? 1 : 0, ("Signal @ %d (%d) is %d", 
				       time, t, data[t]));
#endif
  } while (next);
  return next;
}


//_____________________________________________________________________________
//
// EOF
//
 AliFMDRawStream.cxx:1
 AliFMDRawStream.cxx:2
 AliFMDRawStream.cxx:3
 AliFMDRawStream.cxx:4
 AliFMDRawStream.cxx:5
 AliFMDRawStream.cxx:6
 AliFMDRawStream.cxx:7
 AliFMDRawStream.cxx:8
 AliFMDRawStream.cxx:9
 AliFMDRawStream.cxx:10
 AliFMDRawStream.cxx:11
 AliFMDRawStream.cxx:12
 AliFMDRawStream.cxx:13
 AliFMDRawStream.cxx:14
 AliFMDRawStream.cxx:15
 AliFMDRawStream.cxx:16
 AliFMDRawStream.cxx:17
 AliFMDRawStream.cxx:18
 AliFMDRawStream.cxx:19
 AliFMDRawStream.cxx:20
 AliFMDRawStream.cxx:21
 AliFMDRawStream.cxx:22
 AliFMDRawStream.cxx:23
 AliFMDRawStream.cxx:24
 AliFMDRawStream.cxx:25
 AliFMDRawStream.cxx:26
 AliFMDRawStream.cxx:27
 AliFMDRawStream.cxx:28
 AliFMDRawStream.cxx:29
 AliFMDRawStream.cxx:30
 AliFMDRawStream.cxx:31
 AliFMDRawStream.cxx:32
 AliFMDRawStream.cxx:33
 AliFMDRawStream.cxx:34
 AliFMDRawStream.cxx:35
 AliFMDRawStream.cxx:36
 AliFMDRawStream.cxx:37
 AliFMDRawStream.cxx:38
 AliFMDRawStream.cxx:39
 AliFMDRawStream.cxx:40
 AliFMDRawStream.cxx:41
 AliFMDRawStream.cxx:42
 AliFMDRawStream.cxx:43
 AliFMDRawStream.cxx:44
 AliFMDRawStream.cxx:45
 AliFMDRawStream.cxx:46
 AliFMDRawStream.cxx:47
 AliFMDRawStream.cxx:48
 AliFMDRawStream.cxx:49
 AliFMDRawStream.cxx:50
 AliFMDRawStream.cxx:51
 AliFMDRawStream.cxx:52
 AliFMDRawStream.cxx:53
 AliFMDRawStream.cxx:54
 AliFMDRawStream.cxx:55
 AliFMDRawStream.cxx:56
 AliFMDRawStream.cxx:57
 AliFMDRawStream.cxx:58
 AliFMDRawStream.cxx:59
 AliFMDRawStream.cxx:60
 AliFMDRawStream.cxx:61
 AliFMDRawStream.cxx:62
 AliFMDRawStream.cxx:63
 AliFMDRawStream.cxx:64
 AliFMDRawStream.cxx:65
 AliFMDRawStream.cxx:66
 AliFMDRawStream.cxx:67
 AliFMDRawStream.cxx:68
 AliFMDRawStream.cxx:69
 AliFMDRawStream.cxx:70
 AliFMDRawStream.cxx:71
 AliFMDRawStream.cxx:72
 AliFMDRawStream.cxx:73
 AliFMDRawStream.cxx:74
 AliFMDRawStream.cxx:75
 AliFMDRawStream.cxx:76
 AliFMDRawStream.cxx:77
 AliFMDRawStream.cxx:78
 AliFMDRawStream.cxx:79
 AliFMDRawStream.cxx:80
 AliFMDRawStream.cxx:81
 AliFMDRawStream.cxx:82
 AliFMDRawStream.cxx:83
 AliFMDRawStream.cxx:84
 AliFMDRawStream.cxx:85
 AliFMDRawStream.cxx:86
 AliFMDRawStream.cxx:87
 AliFMDRawStream.cxx:88
 AliFMDRawStream.cxx:89
 AliFMDRawStream.cxx:90
 AliFMDRawStream.cxx:91
 AliFMDRawStream.cxx:92
 AliFMDRawStream.cxx:93
 AliFMDRawStream.cxx:94
 AliFMDRawStream.cxx:95
 AliFMDRawStream.cxx:96
 AliFMDRawStream.cxx:97
 AliFMDRawStream.cxx:98
 AliFMDRawStream.cxx:99
 AliFMDRawStream.cxx:100
 AliFMDRawStream.cxx:101
 AliFMDRawStream.cxx:102
 AliFMDRawStream.cxx:103
 AliFMDRawStream.cxx:104
 AliFMDRawStream.cxx:105
 AliFMDRawStream.cxx:106
 AliFMDRawStream.cxx:107
 AliFMDRawStream.cxx:108
 AliFMDRawStream.cxx:109
 AliFMDRawStream.cxx:110
 AliFMDRawStream.cxx:111
 AliFMDRawStream.cxx:112
 AliFMDRawStream.cxx:113
 AliFMDRawStream.cxx:114
 AliFMDRawStream.cxx:115
 AliFMDRawStream.cxx:116
 AliFMDRawStream.cxx:117
 AliFMDRawStream.cxx:118
 AliFMDRawStream.cxx:119
 AliFMDRawStream.cxx:120
 AliFMDRawStream.cxx:121
 AliFMDRawStream.cxx:122
 AliFMDRawStream.cxx:123