ROOT logo
#ifndef ALIFMDRAWREADER_H
#define ALIFMDRAWREADER_H
/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights
 * reserved. 
 *
 * Latest changes by Christian Holm Christensen <cholm@nbi.dk>
 *
 * See cxx source for full Copyright notice                               
 */
//____________________________________________________________________
// 
// Class to read ADC values from a AliRawReader object. 
// Note, that it uses an ALTRO reader, which is wrong. 
// Perhaps we need to implement it our selves
// 
/* $Id$ */
/** @file    AliFMDRawReader.h
    @author  Christian Holm Christensen <cholm@nbi.dk>
    @date    Mon Mar 27 12:45:23 2006
    @brief   Class to read raw data 
    @ingroup FMD_rec
*/
#include <TTask.h>
#include <TClonesArray.h>
#include "AliFMDUShortMap.h"

//____________________________________________________________________
class AliRawReader;
class AliAltroRawStreamV3;
class TTree;
class TClonesArray;
class TArrayS;
class AliFMDCalibSampleRate;
class AliFMDCalibStripRange;
class AliFMDUShortMap;

//____________________________________________________________________
/** @brief Class to read ALTRO formated raw data from an AliRawReader
    object. 
    @code 
    AliRawReader*    reader    = new AliRawReaderFile(0);
    AliFMDRawReader* fmdReader = new AliFMDRawReader(reader);
    TClonesArray*    array     = new TClonesArray("AliFMDDigit");
    fmdReader->ReadAdcs(array);
    @endcode 
    @ingroup FMD_rec
*/
class AliFMDRawReader : public TTask 
{
public:
  /** Number of possible DDLs */
  enum { 
    kNDDL = 3
  };
  enum { 
    kBadSignal = 0x7FFF // Largest signed 16bit short integer
  };
  /** 
   * CTOR 
   *
   * @param reader Raw reader
   * @param array  Output tree 
   */
  AliFMDRawReader(AliRawReader* reader, TTree* array);
  /** 
   * DTOR 
   */
  virtual ~AliFMDRawReader() {}
  void SetVerbose(Bool_t verb=kTRUE) { fVerbose = verb; }
  /** 
   * Read in, and store in output tree 
   *
   * @param option Not used 
   */
  virtual void   Exec(Option_t* option="");
  /**
   * Read ADC's into a TClonesArray of AliFMDDigit objects. 
   *
   * @param array       Array to read into 
   * 
   * @return @c true on success 
   */
  virtual Bool_t ReadAdcs(TClonesArray* array);
  /** 
   * Read ADCs into a unsigned short map. 
   * 
   * @param map Map to read into 
   * 
   * @return true on success 
   */
  virtual Bool_t ReadAdcs(AliFMDUShortMap& map);
  /** 
   * Read SOD event into passed objects.
   * 
   * @param samplerate   The sample rate object to fill
   * @param striprange   The strip range object to fill
   * @param pulseSize    The pulse size object to fill
   * @param pulseLength  The pulse length (in events) object to fill
   * 
   * @return @c true on success
   */  
  virtual Bool_t ReadSODevent(AliFMDCalibSampleRate* samplerate, 
			      AliFMDCalibStripRange* striprange, 
			      TArrayS &pulseSize, 
			      TArrayS &pulseLength, 
			      Bool_t* detectors=0);
  /** 
   * Check of the data from DDL @a ddl is zero-suppressed
   * 
   * @param ddl DDL number (0-2)
   * 
   * @return @c true if the data from this DDL is zero-suppressed. 
   */  
  Bool_t IsZeroSuppressed(UShort_t ddl) const { return fZeroSuppress[ddl]; }
  /** 
   * The factor used to multiply the noise when making on-line
   * pedestal subtraction.
   * 
   * @param ddl DDL number (0-2)
   * 
   * @return The factor used. 
   */
  UShort_t NoiseFactor(UShort_t ddl) const { return fNoiseFactor[ddl]; }

  /** 
   * Get the next signal
   * 
   * @param det  On return, the detector
   * @param rng  On return, the ring
   * @param sec  On return, the sector
   * @param str  On return, the strip
   * @param sam  On return, the sample
   * @param rat  On return, the sample rate
   * @param adc  On return, the ADC value
   * @param zs   On return, whether zero-supp. is enabled
   * @param fac  On return, the usd noise factor
   * 
   * @return 0 if there's no more data.  -1 if the read sample
   * corresponds to a bad bunch in the channel.  Positive return
   * values represent a bit mask of 
   * - 0x1  New DDL 
   * - 0x2  New Channel 
   * - 0x4  New Bunch 
   * - 0x8  New Sample 
   */
  Int_t NextSample(UShort_t& det, Char_t&   rng, UShort_t& sec, UShort_t& str,
		    UShort_t& sam, UShort_t& rat, Short_t&  adc, 
		    Bool_t&   zs,  UShort_t& fac);
  /** 
   * Get the next signal
   * 
   * @param det  On return, the detector
   * @param rng  On return, the ring
   * @param sec  On return, the sector
   * @param str  On return, the strip
   * @param adc  On return, the ADC value
   * @param zs   On return, whether zero-supp. is enabled
   * @param fac  On return, the usd noise factor
   * 
   * @return 0 if there's no more data.  -1 if the read sample
   * corresponds to a bad bunch in the channel.  Positive return
   * values represent a bit mask of 
   * - 0x1  New DDL 
   * - 0x2  New Channel 
   * - 0x4  New Bunch 
   * - 0x8  New Sample 
   */
  Int_t NextSignal(UShort_t& det, Char_t&   rng, 
		   UShort_t& sec, UShort_t& str, 
		   Short_t&  adc, Bool_t&   zs, 
		   UShort_t& fac);
  /** 
   * Get number of read-out errors.  Note, that a channel marked as
   * bad counts as 10 errors 
   * 
   * @param ddl DDL off set ([0,kNDDL-1])
   * 
   * @return Number of seen errors 
   */
  UShort_t GetNErrors(UShort_t ddl) const {return (ddl >= kNDDL ? 0 : fNErrors[ddl]);}
  /** 
   * Get the phase of the L1 signal 
   * 
   * @param ddl DDL number ([0,kNDDL-1])
   * 
   * @return Phase of the L1 signal in steps of 25ns. 
   */
  UShort_t GetL1Phase(UShort_t ddl) const {return (ddl >= kNDDL ? -1 : fL1Phase[ddl]);}
  /** 
   * Whether to keep a sample based on the rate used. 
   * 
   * @param samp Sample number 
   * @param rate Over sampling rate
   * 
   * @return Whether to keep the sample or not
   */
  static Bool_t SelectSample(UShort_t samp, UShort_t rate);
protected:
  /** 
   * Copy constructor 
   * 
   * @param o Object to construct from
   */  
  AliFMDRawReader(const AliFMDRawReader& o) 
    : TTask(o), 
      fTree(0), 
      fReader(0), 
      fData(0),
      fNbytes(0), 
      fMinStrip(0), 
      fMaxStrip(127),
      fPreSamp(14+5),
      fSeen(0),
      fVerbose(o.fVerbose), 
      fErrors(o.fErrors), 
      fNErrChanLen(o.fNErrChanLen), 
      fNErrAddress(o.fNErrAddress)
  {}
  /** 
   * Assignment operator
   * 
   * @return Reference to this object
   */
  AliFMDRawReader& operator=(const AliFMDRawReader&) { return *this; }
  /** 
   * Process a new DDL.  Sets the internal data members fZeroSuppress, 
   * fSampleRate, and fNoiseFactor based on information in the RCU trailer. 
   * 
   * @param input Input stream
   * @param det   On return, the detector number
   * 
   * @return negative value in case of problems, the DDL number otherwise
   */
  Int_t NewDDL(AliAltroRawStreamV3& input, UShort_t& det);
  /** 
   * Processs a new channel.  Sets the internal data members
   * fMinStrip, fMaxStrip, and fPreSamp. 
   * 
   * @param input   Input stream
   * @param det     Detector number
   * @param ring    On return, the ring identifier 
   * @param sec     On return, the sector number
   * @param strbase On return, the strip base
   * 
   * @return negative value in case of problems, hardware address otherwise
   */
  Int_t NewChannel(const AliAltroRawStreamV3& input, 
		   UShort_t det, Char_t&  ring, 
		   UShort_t& sec, Short_t& strbase);
  /** 
   * Process a new bunch.
   * 
   * @param input    Input stream
   * @param start    On input, the old start time. On return, the start time
   * @param length   On return, the bunch length
   * 
   * @return true on success, false otherwise 
   */
  Bool_t NewBunch(const AliAltroRawStreamV3& input, 
		  UShort_t&  start, UShort_t& length);
  /** 
   * Process a new timebin
   * 
   * @param input   Input stream
   * @param i       Index into bunch data
   * @param t       Time
   * @param sec     Sector number
   * @param strbase Base of strip numbers for this channel
   * @param str     On return, the strip number
   * @param samp    On return, the sample number
   * 
   * @return negative value in case of problems, ADC value otherwise
   */  
  Int_t NewSample(const AliAltroRawStreamV3& input, 
		  Int_t i, UShort_t t, UShort_t sec,
		  UShort_t  strbase, Short_t&  str, UShort_t& samp);

  /** 
   * 
   * Get the number of words 
   * 
   * @return Number of 32bit words 
   */
  ULong_t GetNwords() const {return fNbytes / 4;}
  /** 
   * Get the next 32bit word from payload
   * 
   * @param idx Which 32bit word to get
   * 
   * @return 
   */
  UInt_t Get32bitWord(Int_t idx);
  /** 
   * Get short index for a given half-ring
   * 
   * @param det   Detector number
   * @param ring  Ring identifer
   * @param board Board number
   * 
   * @return 
   */
  Int_t GetHalfringIndex(UShort_t det, Char_t ring, UShort_t board) const;
  void AddError(Int_t ddl, Int_t hwaddr);
  void ReadbackError(const AliAltroRawStreamV3& input, const char* format, ...);

  TTree*          fTree;             //! Pointer to tree to read into 
  AliRawReader*   fReader;           //! Pointer to raw reader 
  UShort_t        fSampleRate[kNDDL];// The sample rate (if 0,infer from data)
  UChar_t*        fData;             // Data pointer
  ULong_t  	  fNbytes;           // Number of bytes
  Bool_t          fZeroSuppress[kNDDL]; // Zero suppression flag
  UShort_t        fNoiseFactor[kNDDL];  // Noise factor 
  UShort_t        fMinStrip;        // Current minimum strip number (0)
  UShort_t        fMaxStrip;        // Current maximum strip number (127)
  UShort_t        fPreSamp;         // Current number of pre-samples (14+5)
  AliFMDUShortMap fSeen;            // Seen strips 
  UShort_t        fNErrors[kNDDL];  // Number of errors per DDL
  UShort_t        fL1Phase[kNDDL];  // Number of errors per DDL
  Bool_t          fVerbose;         // Whether to be verbose 
  TClonesArray    fErrors;          // Clones array of channels with errors 
  UShort_t        fNErrChanLen;     // Number of channel length errors 
  UShort_t        fNErrAddress;     // Number of address errors 
  
  ClassDef(AliFMDRawReader, 0) // Read FMD raw data into a cache 
};

#endif
//____________________________________________________________________
//
// Local Variables:
//   mode: C++
// End:
//
// EOF
//

 AliFMDRawReader.h:1
 AliFMDRawReader.h:2
 AliFMDRawReader.h:3
 AliFMDRawReader.h:4
 AliFMDRawReader.h:5
 AliFMDRawReader.h:6
 AliFMDRawReader.h:7
 AliFMDRawReader.h:8
 AliFMDRawReader.h:9
 AliFMDRawReader.h:10
 AliFMDRawReader.h:11
 AliFMDRawReader.h:12
 AliFMDRawReader.h:13
 AliFMDRawReader.h:14
 AliFMDRawReader.h:15
 AliFMDRawReader.h:16
 AliFMDRawReader.h:17
 AliFMDRawReader.h:18
 AliFMDRawReader.h:19
 AliFMDRawReader.h:20
 AliFMDRawReader.h:21
 AliFMDRawReader.h:22
 AliFMDRawReader.h:23
 AliFMDRawReader.h:24
 AliFMDRawReader.h:25
 AliFMDRawReader.h:26
 AliFMDRawReader.h:27
 AliFMDRawReader.h:28
 AliFMDRawReader.h:29
 AliFMDRawReader.h:30
 AliFMDRawReader.h:31
 AliFMDRawReader.h:32
 AliFMDRawReader.h:33
 AliFMDRawReader.h:34
 AliFMDRawReader.h:35
 AliFMDRawReader.h:36
 AliFMDRawReader.h:37
 AliFMDRawReader.h:38
 AliFMDRawReader.h:39
 AliFMDRawReader.h:40
 AliFMDRawReader.h:41
 AliFMDRawReader.h:42
 AliFMDRawReader.h:43
 AliFMDRawReader.h:44
 AliFMDRawReader.h:45
 AliFMDRawReader.h:46
 AliFMDRawReader.h:47
 AliFMDRawReader.h:48
 AliFMDRawReader.h:49
 AliFMDRawReader.h:50
 AliFMDRawReader.h:51
 AliFMDRawReader.h:52
 AliFMDRawReader.h:53
 AliFMDRawReader.h:54
 AliFMDRawReader.h:55
 AliFMDRawReader.h:56
 AliFMDRawReader.h:57
 AliFMDRawReader.h:58
 AliFMDRawReader.h:59
 AliFMDRawReader.h:60
 AliFMDRawReader.h:61
 AliFMDRawReader.h:62
 AliFMDRawReader.h:63
 AliFMDRawReader.h:64
 AliFMDRawReader.h:65
 AliFMDRawReader.h:66
 AliFMDRawReader.h:67
 AliFMDRawReader.h:68
 AliFMDRawReader.h:69
 AliFMDRawReader.h:70
 AliFMDRawReader.h:71
 AliFMDRawReader.h:72
 AliFMDRawReader.h:73
 AliFMDRawReader.h:74
 AliFMDRawReader.h:75
 AliFMDRawReader.h:76
 AliFMDRawReader.h:77
 AliFMDRawReader.h:78
 AliFMDRawReader.h:79
 AliFMDRawReader.h:80
 AliFMDRawReader.h:81
 AliFMDRawReader.h:82
 AliFMDRawReader.h:83
 AliFMDRawReader.h:84
 AliFMDRawReader.h:85
 AliFMDRawReader.h:86
 AliFMDRawReader.h:87
 AliFMDRawReader.h:88
 AliFMDRawReader.h:89
 AliFMDRawReader.h:90
 AliFMDRawReader.h:91
 AliFMDRawReader.h:92
 AliFMDRawReader.h:93
 AliFMDRawReader.h:94
 AliFMDRawReader.h:95
 AliFMDRawReader.h:96
 AliFMDRawReader.h:97
 AliFMDRawReader.h:98
 AliFMDRawReader.h:99
 AliFMDRawReader.h:100
 AliFMDRawReader.h:101
 AliFMDRawReader.h:102
 AliFMDRawReader.h:103
 AliFMDRawReader.h:104
 AliFMDRawReader.h:105
 AliFMDRawReader.h:106
 AliFMDRawReader.h:107
 AliFMDRawReader.h:108
 AliFMDRawReader.h:109
 AliFMDRawReader.h:110
 AliFMDRawReader.h:111
 AliFMDRawReader.h:112
 AliFMDRawReader.h:113
 AliFMDRawReader.h:114
 AliFMDRawReader.h:115
 AliFMDRawReader.h:116
 AliFMDRawReader.h:117
 AliFMDRawReader.h:118
 AliFMDRawReader.h:119
 AliFMDRawReader.h:120
 AliFMDRawReader.h:121
 AliFMDRawReader.h:122
 AliFMDRawReader.h:123
 AliFMDRawReader.h:124
 AliFMDRawReader.h:125
 AliFMDRawReader.h:126
 AliFMDRawReader.h:127
 AliFMDRawReader.h:128
 AliFMDRawReader.h:129
 AliFMDRawReader.h:130
 AliFMDRawReader.h:131
 AliFMDRawReader.h:132
 AliFMDRawReader.h:133
 AliFMDRawReader.h:134
 AliFMDRawReader.h:135
 AliFMDRawReader.h:136
 AliFMDRawReader.h:137
 AliFMDRawReader.h:138
 AliFMDRawReader.h:139
 AliFMDRawReader.h:140
 AliFMDRawReader.h:141
 AliFMDRawReader.h:142
 AliFMDRawReader.h:143
 AliFMDRawReader.h:144
 AliFMDRawReader.h:145
 AliFMDRawReader.h:146
 AliFMDRawReader.h:147
 AliFMDRawReader.h:148
 AliFMDRawReader.h:149
 AliFMDRawReader.h:150
 AliFMDRawReader.h:151
 AliFMDRawReader.h:152
 AliFMDRawReader.h:153
 AliFMDRawReader.h:154
 AliFMDRawReader.h:155
 AliFMDRawReader.h:156
 AliFMDRawReader.h:157
 AliFMDRawReader.h:158
 AliFMDRawReader.h:159
 AliFMDRawReader.h:160
 AliFMDRawReader.h:161
 AliFMDRawReader.h:162
 AliFMDRawReader.h:163
 AliFMDRawReader.h:164
 AliFMDRawReader.h:165
 AliFMDRawReader.h:166
 AliFMDRawReader.h:167
 AliFMDRawReader.h:168
 AliFMDRawReader.h:169
 AliFMDRawReader.h:170
 AliFMDRawReader.h:171
 AliFMDRawReader.h:172
 AliFMDRawReader.h:173
 AliFMDRawReader.h:174
 AliFMDRawReader.h:175
 AliFMDRawReader.h:176
 AliFMDRawReader.h:177
 AliFMDRawReader.h:178
 AliFMDRawReader.h:179
 AliFMDRawReader.h:180
 AliFMDRawReader.h:181
 AliFMDRawReader.h:182
 AliFMDRawReader.h:183
 AliFMDRawReader.h:184
 AliFMDRawReader.h:185
 AliFMDRawReader.h:186
 AliFMDRawReader.h:187
 AliFMDRawReader.h:188
 AliFMDRawReader.h:189
 AliFMDRawReader.h:190
 AliFMDRawReader.h:191
 AliFMDRawReader.h:192
 AliFMDRawReader.h:193
 AliFMDRawReader.h:194
 AliFMDRawReader.h:195
 AliFMDRawReader.h:196
 AliFMDRawReader.h:197
 AliFMDRawReader.h:198
 AliFMDRawReader.h:199
 AliFMDRawReader.h:200
 AliFMDRawReader.h:201
 AliFMDRawReader.h:202
 AliFMDRawReader.h:203
 AliFMDRawReader.h:204
 AliFMDRawReader.h:205
 AliFMDRawReader.h:206
 AliFMDRawReader.h:207
 AliFMDRawReader.h:208
 AliFMDRawReader.h:209
 AliFMDRawReader.h:210
 AliFMDRawReader.h:211
 AliFMDRawReader.h:212
 AliFMDRawReader.h:213
 AliFMDRawReader.h:214
 AliFMDRawReader.h:215
 AliFMDRawReader.h:216
 AliFMDRawReader.h:217
 AliFMDRawReader.h:218
 AliFMDRawReader.h:219
 AliFMDRawReader.h:220
 AliFMDRawReader.h:221
 AliFMDRawReader.h:222
 AliFMDRawReader.h:223
 AliFMDRawReader.h:224
 AliFMDRawReader.h:225
 AliFMDRawReader.h:226
 AliFMDRawReader.h:227
 AliFMDRawReader.h:228
 AliFMDRawReader.h:229
 AliFMDRawReader.h:230
 AliFMDRawReader.h:231
 AliFMDRawReader.h:232
 AliFMDRawReader.h:233
 AliFMDRawReader.h:234
 AliFMDRawReader.h:235
 AliFMDRawReader.h:236
 AliFMDRawReader.h:237
 AliFMDRawReader.h:238
 AliFMDRawReader.h:239
 AliFMDRawReader.h:240
 AliFMDRawReader.h:241
 AliFMDRawReader.h:242
 AliFMDRawReader.h:243
 AliFMDRawReader.h:244
 AliFMDRawReader.h:245
 AliFMDRawReader.h:246
 AliFMDRawReader.h:247
 AliFMDRawReader.h:248
 AliFMDRawReader.h:249
 AliFMDRawReader.h:250
 AliFMDRawReader.h:251
 AliFMDRawReader.h:252
 AliFMDRawReader.h:253
 AliFMDRawReader.h:254
 AliFMDRawReader.h:255
 AliFMDRawReader.h:256
 AliFMDRawReader.h:257
 AliFMDRawReader.h:258
 AliFMDRawReader.h:259
 AliFMDRawReader.h:260
 AliFMDRawReader.h:261
 AliFMDRawReader.h:262
 AliFMDRawReader.h:263
 AliFMDRawReader.h:264
 AliFMDRawReader.h:265
 AliFMDRawReader.h:266
 AliFMDRawReader.h:267
 AliFMDRawReader.h:268
 AliFMDRawReader.h:269
 AliFMDRawReader.h:270
 AliFMDRawReader.h:271
 AliFMDRawReader.h:272
 AliFMDRawReader.h:273
 AliFMDRawReader.h:274
 AliFMDRawReader.h:275
 AliFMDRawReader.h:276
 AliFMDRawReader.h:277
 AliFMDRawReader.h:278
 AliFMDRawReader.h:279
 AliFMDRawReader.h:280
 AliFMDRawReader.h:281
 AliFMDRawReader.h:282
 AliFMDRawReader.h:283
 AliFMDRawReader.h:284
 AliFMDRawReader.h:285
 AliFMDRawReader.h:286
 AliFMDRawReader.h:287
 AliFMDRawReader.h:288
 AliFMDRawReader.h:289
 AliFMDRawReader.h:290
 AliFMDRawReader.h:291
 AliFMDRawReader.h:292
 AliFMDRawReader.h:293
 AliFMDRawReader.h:294
 AliFMDRawReader.h:295
 AliFMDRawReader.h:296
 AliFMDRawReader.h:297
 AliFMDRawReader.h:298
 AliFMDRawReader.h:299
 AliFMDRawReader.h:300
 AliFMDRawReader.h:301
 AliFMDRawReader.h:302
 AliFMDRawReader.h:303
 AliFMDRawReader.h:304
 AliFMDRawReader.h:305
 AliFMDRawReader.h:306
 AliFMDRawReader.h:307
 AliFMDRawReader.h:308
 AliFMDRawReader.h:309
 AliFMDRawReader.h:310
 AliFMDRawReader.h:311
 AliFMDRawReader.h:312
 AliFMDRawReader.h:313
 AliFMDRawReader.h:314
 AliFMDRawReader.h:315
 AliFMDRawReader.h:316
 AliFMDRawReader.h:317
 AliFMDRawReader.h:318
 AliFMDRawReader.h:319
 AliFMDRawReader.h:320
 AliFMDRawReader.h:321
 AliFMDRawReader.h:322
 AliFMDRawReader.h:323
 AliFMDRawReader.h:324
 AliFMDRawReader.h:325
 AliFMDRawReader.h:326
 AliFMDRawReader.h:327
 AliFMDRawReader.h:328
 AliFMDRawReader.h:329
 AliFMDRawReader.h:330
 AliFMDRawReader.h:331
 AliFMDRawReader.h:332
 AliFMDRawReader.h:333
 AliFMDRawReader.h:334
 AliFMDRawReader.h:335
 AliFMDRawReader.h:336