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$ */
/** @file    AliFMDRawWriter.cxx
    @author  Christian Holm Christensen <cholm@nbi.dk>
    @date    Mon Mar 27 12:45:56 2006
    @brief   Class to write raw data 
*/
//____________________________________________________________________
//
// Class to write ADC values to a raw data file
//
// This class writes FMD Raw data to a file.   The sample rate (number
// of times the ALTRO ADC samples each pre-amp. channel - that is,
// data from a single strip), can be set via SetSampleRate. 
//
// Zero-suppression can be enabled by calling SetThreshold with a
// non-zero argument.   ADC values less than the value set will not be
// written to output.   Note, that if you use zero-suppression, you
// need to explicitly set the sample rate when reading back the data
// with AliFMDRawReader. 
// 
// This class uses the AliAltroBuffer class to write the data in the
// ALTRO format.  See the Exec member function for more information on
// that format.  
//
// #include <AliLog.h>		// ALILOG_H
#include "AliFMDDebug.h"        // Better debug macros
#include <AliLoader.h>		// ALILOADER_H
#include <AliAltroBufferV3.h>   // ALIALTROBUFFER_H
#include "AliFMD.h"		// ALIFMD_H
#include "AliFMDParameters.h"	// ALIFMDPARAMETERS_H
#include "AliFMDDigit.h"	// ALIFMDDIGIT_H
#include "AliFMDRawWriter.h"	// ALIFMDRAWREADER_H 
#include "AliFMDAltroMapping.h" // ALIFMDALTROMAPPING_H
// #include "AliFMDAltroIO.h"   // ALIFMDALTROWRITER_H
#include <TArrayI.h>		// ROOT_TArrayI
#include <TArrayF.h>		// ROOT_TArrayI
#include <TArrayC.h>		// ROOT_TArrayI
#include <TClonesArray.h>	// ROOT_TClonesArray
#include <TTree.h>
// #include <fstream>
#include "AliDAQ.h"

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

//____________________________________________________________________
AliFMDRawWriter::AliFMDRawWriter(AliFMD* fmd) 
  : TTask("FMDRawWriter", "Writer of Raw ADC values from the FMD"),
    fFMD(fmd),
    fSampleRate(0), 
    fChannelsPerAltro(0), 
    fThreshold(0)
{
  // CTOR 
  AliFMDDebug(5, ("Created AliFMDRawWriter object"));
}



//____________________________________________________________________
void
AliFMDRawWriter::Exec(Option_t*) 
{
  // Turn digits into raw data. 
  // 
  // Digits are read from the Digit branch, and processed to make
  // three DDL files, one for each of the sub-detectors FMD1, FMD2,
  // and FMD3. 
  //
  // The raw data files consists of a header, followed by ALTRO
  // formatted blocks.  
  // 
  //          +-------------+
  //          | Header      |
  //          +-------------+
  //          | ALTRO Block |
  //          | ...         |
  //          +-------------+
  //          DDL file 
  // 
  // An ALTRO formatted block, in the FMD context, consists of a
  // number of counts followed by a trailer. 
  // 
  //          +------------------+
  //          | Count            |
  //          | ...              |
  //          | possible fillers |
  //          +------------------+
  //          | Trailer          |
  //          +------------------+
  //          ALTRO block 
  // 
  // The counts are listed backwards, that is, starting with the
  // latest count, and ending in the first. 
  // 
  // Each count consist of 1 or more ADC samples of the VA1_ALICE
  // pre-amp. signal.  Just how many samples are used depends on
  // whether the ALTRO over samples the pre-amp.  Each sample is a
  // 10-bit word, and the samples are grouped into 40-bit blocks 
  //
  //          +------------------------------------+
  //          |  S(1)   | S(2)   | S(3)   | S(4)   |
  //          |  ...    | ...    | ...    | ...    |
  //          |  S(n)   | T(n)   | n+2    | 2AA    |
  //          +------------------------------------+
  //          Counts + possible filler 
  //
  // The trailer of the number of words of signales, the starting
  // strip number, the sector number, and the ring ID; each 10-bit
  // words,  packed into 40-bits. 
  // 
  //          +------------------------------------+
  //          |   2AAA   |  Len   |  A |  Address  |
  //          +------------------------------------+
  //          Trailer
  // 
  // Note, that this method assumes that the digits are ordered. 
  // 
  AliLoader* loader = fFMD->GetLoader();
  loader->LoadDigits("READ");
  TTree* digitTree = loader->TreeD();
  if (!digitTree) {
    AliError("no digit tree");
    return;
  }
  
  fFMD->SetTreeAddress();
  TClonesArray* digits = fFMD->Digits(); 
  // new TClonesArray("AliFMDDigit", 1000);
  // TBranch* digitBranch = digitTree->GetBranch(fFMD->GetName());
  // if (!digitBranch) {
  //   AliError(Form("no branch for %s", fFMD->GetName()));
  //   return;
  // }
  // digitBranch->SetAddress(&digits);
  
  Int_t nEvents = Int_t(digitTree->GetEntries());
  AliFMDDebug(5, ("Got a total of %5d events from tree", nEvents));
  for (Int_t event = 0; event < nEvents; event++) {
    fFMD->ResetDigits();
    digitTree->GetEvent(event);
    
    // Write out the digits
    WriteDigits(digits);
  }
  loader->UnloadDigits();
  //delete digits;
}

#if 1
//____________________________________________________________________
Long_t
AliFMDRawWriter::WriteDigits(TClonesArray* digits)
{
  // WRite an array of digits to disk file 
  Int_t nDigits = digits->GetEntries();
  if (nDigits < 1) return 0;
  AliFMDDebug(5, ("Got a total of %5d digits from tree", nDigits));

  AliFMDParameters* pars = AliFMDParameters::Instance();
  UShort_t threshold    = 0;
  UShort_t factor       = 0;
  UInt_t   prevddl      = 0xFFFF;
  UInt_t   prevaddr     = 0xFFF;
  // UShort_t prevStrip    = 0;
  
  // Which channel number in the ALTRO channel we're at 
  UShort_t nWords       = 0;
  UShort_t preSamples   = 0;
  UShort_t sampleRate   = 0;
  
  // A buffer to hold 1 ALTRO channel - Normally, one ALTRO channel
  // holds 128 VA1_ALICE channels, sampled at a rate of `sampleRate' 
  TArrayI data(pars->GetChannelsPerAltro() * 8);
  TArrayF peds(pars->GetChannelsPerAltro() * 8);
  TArrayF noise(pars->GetChannelsPerAltro() * 8);

  // The Altro buffer 
  AliAltroBufferV3* altro = 0;
  
  Int_t  totalWords = 0;
  Int_t  nCounts    = 0;
  Long_t nBits      = 0;

  // Loop over the digits in the event.  Note, that we assume the
  // the digits are in order in the branch.   If they were not, we'd
  // have to cache all channels before we could write the data to
  // the ALTRO buffer, or we'd have to set up a map of the digits. 
  UShort_t oldDet = 1000;
  for (Int_t i = 0; i < nDigits; i++) {
    // Get the digit
    AliFMDDigit* digit = static_cast<AliFMDDigit*>(digits->At(i));
    UShort_t det    = digit->Detector();
    Char_t   ring   = digit->Ring();
    UShort_t sector = digit->Sector();
    UShort_t strip  = digit->Strip();
    UShort_t ddl, addr, time;

    AliFMDDebug(15, ("Processing digit # %5d FMD%d%c[%2d,%3d]", 
		    i, det, ring, sector, strip));
    threshold  = pars->GetZeroSuppression(det, ring, sector, strip);
    sampleRate = pars->GetSampleRate(det, ring, sector, strip);
    preSamples = pars->GetPreSamples(det, ring, sector, strip);
    factor     = UShort_t(pars->GetPedestalFactor());

    if (det != oldDet) {
      AliFMDDebug(5, ("Got new detector: %d (was %d)", det, oldDet));
      oldDet = det;      
    }
    AliFMDDebug(15, ("Sample rate is %d", sampleRate));
    
    for (UShort_t j = 0; j < sampleRate; j++) { 
      if (!pars->Detector2Hardware(det,ring,sector,strip,j,ddl,addr,time)){
	AliError(Form("Failed to get hardware address for FMD%d%c[%2d,%3d]-%d", 
		      det, ring, sector, strip, j));
	continue;
      }
    
      AliFMDDebug(10, ("FMD%d%c[%2d,%3d]-%d-> 0x%x/0x%x/%04d", 
		       det, ring, sector, strip, j, ddl, addr, time));
      if (addr != prevaddr) {
	// Flush a channel to output 
	AliFMDDebug(5, ("Now hardware address 0x%x from FMD%d%c[%2d,%3d]-%d"
			 "(b: 0x%02x, a: 0x%01x, c: 0x%02x, t: %04d), "
			 "flushing old channel at 0x%x with %d words", 
			 addr, det, ring, sector, strip, j,
			 (addr >> 7), (addr >> 4) & 0x7, addr & 0xf, 
			 time, prevaddr, nWords));
	totalWords += nWords;
	ZeroSuppress(data.fArray, nWords, peds.fArray, noise.fArray, threshold);
	if (altro) 
	  /*nBits+=*/altro->WriteChannel(prevaddr,nWords,data.fArray,threshold);
	data.Reset(-1);
	peds.Reset(0);
	noise.Reset(0);
	nWords   = 0;
	prevaddr = addr;
      }
      if (ddl != prevddl) {
	AliFMDDebug(10, ("FMD: New DDL, was %d, now %d", prevddl, ddl));
	// If an altro exists, delete the object, flushing the data to
	// disk, and closing the file. 
	if (altro) { 
	  // When the first argument is false, we write the real
	  // header. 
	  AliFMDDebug(15, ("Closing output"));
	  WriteRCUTrailer(altro, prevddl, threshold > 0, factor, sampleRate); 
    
	  delete altro;
	  altro = 0;
	}
	prevddl = ddl;
	// Need to open a new DDL! 
	TString filename(AliDAQ::DdlFileName(fFMD ? fFMD->GetName() : "FMD",  ddl));
	AliFMDDebug(5, ("New altro buffer with DDL file %s", filename.Data()));
	// Create a new altro buffer - a `1' as the second argument
	// means `write mode' 
	altro = new AliAltroBufferV3(filename.Data());
	altro->SetMapping(pars->GetAltroMap());      
	// Write a dummy (first argument is true) header to the DDL
	// file - later on, when we close the file, we write the real
	// header
	altro->WriteDataHeader(kTRUE, kFALSE);
      }
    
      // Get the pedestal value 
      peds[time]  = pars->GetPedestal(det, ring, sector, strip);
      noise[time] = pars->GetPedestalWidth(det, ring, sector, strip);

      // Store the counts of the ADC in the channel buffer 
      AliFMDDebug(15, ("Storing FMD%d%c[%02d,%03d]-%d in timebin %d (%d)",
		      det, ring, sector, strip, j, time, preSamples));
      data[time] = digit->Count(j);
      nWords++;
      nCounts++;
      if (time == preSamples) {
	AliFMDDebug(15, ("Filling in %4d for %d presamples", 
			data[time], preSamples));
	for (int k = 0; k < preSamples; k++) { 
	  peds[k]  = peds[time];
	  noise[k] = noise[time];
	  data[k]  = data[time];
	}
	nWords += preSamples;
      }
    }
  }
  // Finally, we need to close the final ALTRO buffer if it wasn't
  // already 
  if (altro) {
    ZeroSuppress(data.fArray, nWords, peds.fArray, noise.fArray, threshold);
    if (nWords > 0) 
      /* nBits += */ altro->WriteChannel(prevaddr,nWords,data.fArray,threshold);
    WriteRCUTrailer(altro, prevddl, threshold > 0, factor, sampleRate); 
    delete altro;
  }
  AliFMDDebug(5, ("Wrote a total of %d words in %ld bytes for %d counts", 
		  nWords, nBits / 8, nCounts));
  return nBits;
}
//____________________________________________________________________
void
AliFMDRawWriter::WriteRCUTrailer(AliAltroBufferV3* altro,
				 UInt_t ddl,
				 Bool_t zs,
				 UShort_t factor,
				 UShort_t rate) const
{
  // Flush and write the data header
  altro->Flush();
  altro->WriteDataHeader(kFALSE, kFALSE);
    
  // Set parameters in RCU trailer. 
  // Zero-suppression flag
  altro->SetZeroSupp(zs); // bool
  // WARNING: We store the noise factor in the 2nd baseline
  // filters excluded post samples, since we'll never use that
  // mode. 
  // altro->SetNPostsamples(factor); // 
  altro->SetNNonZSPostsamples(factor);
  // WARNING: We store the sample rate in the number of pre-trigger
  // samples, since we'll never use that mode.
  altro->SetNPretriggerSamples(rate); // fSampleRate[ddl]
  // Active front-end cars 
  altro->SetActiveFECsA((ddl == 0 ? 0x1 : 0x3));
  altro->SetActiveFECsB((ddl == 0 ? 0x1 : 0x3));

  // Calculate number of samples 
  altro->SetNSamplesPerCh(rate * 128);
  AliDebug(5,Form("Writing RCU trailer @ DDL %d w/zs=%d, factor=%d, rate=%d",
		  ddl, zs > 0, factor, rate));
  altro->WriteRCUTrailer(ddl);
}

//____________________________________________________________________
void
AliFMDRawWriter::ZeroSuppress(Int_t*& data, Int_t nWords, 
			      const Float_t* peds, 
			      const Float_t* noise, UShort_t threshold) const
{
  // Simulate the ALTRO zero-suppression filter.  The data passed in
  // the first array is modified, such that all suppressed channels
  // are set to some value below threshold.  
  // 
  // If threshold == 0 zero suppression is considered disabled, and no
  // action is taken. 
  if (threshold <= 0) return;

  // const Short_t width  = 3;
  // If fPedSubtract is false, compare data-(ped+f*noise), if true
  // always modify data by -(ped+f*noise), and force negative values
  // to zero.
  Bool_t   pedSubtract = AliFMDParameters::Instance()->IsZSPedSubtract();
  UShort_t pre         = AliFMDParameters::Instance()->GetZSPreSamples();
  UShort_t post        = AliFMDParameters::Instance()->GetZSPostSamples();
  Float_t  factor      = AliFMDParameters::Instance()->GetPedestalFactor();
  
  TArrayC mask(nWords+1);
  for (Short_t i = 0; i < nWords; i++) { 
    Float_t            val     = data[i] - peds[i] - factor * noise[i];
    if (val < 0.5)     val     = 0;
    if (pedSubtract)   data[i] = Int_t(val) & 0x3FF;

    mask[i] = (val > threshold ? 1 : 0);
    AliFMDDebug(10, ("Comparing sample %d %d-%f-%f*%f=%f to %d -> %s", 
		     i, data[i], peds[i], factor, noise[i], val, threshold, 
		    (mask[i] ? "above" : "below")));
  }
  
  for (Short_t i = 0; i < nWords; i++) { 
    if (mask[i]) { // Signal above, so do nothing 
      AliFMDDebug(10, ("Sample %d, above", i));
      if (i < nWords-1 && !mask[i+1]) { 
	// After a valid sample.  Increase the pointer to the next
	// possible data, thereby skipping over the post-samples 
	AliFMDDebug(10, ("At sample %d, next is below, skipping %d to %d", 
			i, post, i+post));
	i += post;
      }
      continue;
    }
    
    Short_t lookahead = TMath::Min(Short_t(nWords), Short_t(i+pre));
    AliFMDDebug(10, ("Sample %d, below, look to %d", i, lookahead));
    if (mask[lookahead] && pre > 0) { 
      AliFMDDebug(10, ("Sample %d is a pre-sample to %d", i, lookahead));
      // We're in a presample, so don't modify the data, and increase
      // counter by the number of pre-samples 
      i += pre-1;
      continue;
    }
    
    // This sample must be surpressed 
    data[i] = threshold - 1;
  }
}

#else
//____________________________________________________________________
void
AliFMDRawWriter::WriteDigits(TClonesArray* digits)
{
  // 
  // Write digits to file 
  //
  Int_t nDigits = digits->GetEntries();
  if (nDigits < 1) return;

  AliFMDParameters*  pars    = AliFMDParameters::Instance();
  AliFMDAltroWriter* writer  = 0;
  Int_t          sampleRate  = -1;
  UShort_t       hwaddr      = 0;
  UShort_t       ddl         = 0;
  std::ofstream* file        = 0;
  Int_t          ret         = 0;
  for (Int_t i = 0; i < nDigits; i++) {
    // Get the digit
    AliFMDDigit* digit = static_cast<AliFMDDigit*>(digits->At(i));
    UInt_t   thisDDL, thisHwaddr;
    UShort_t det    = digit->Detector();
    Char_t   ring   = digit->Ring();
    UShort_t sector = digit->Sector();
    UShort_t strip  = digit->Strip();
    if (!pars->Detector2Hardware(det,ring,sector,strip,thisDDL,thisHwaddr)) {
      AliError(Form("Failed to get hardware address for FMD%d%c[%2d,%3d]",
		    det, ring, sector, strip));
      continue;
    }
    AliFMDDebug(40, ("Got DDL=%d and address=%d from FMD%d%c[%2d,%3d]", 
		     thisDDL, thisHwaddr, det, ring, sector, strip));
    // Check if we're still in the same channel
    if (thisHwaddr != hwaddr) {
      AliFMDDebug(30, ("Now hardware address 0x%x from FMD%d%c[%2d,%3d] "
		       "(board 0x%x, chip 0x%x, channel 0x%x)",
		       thisHwaddr, det, ring, sector, strip, 
		       (thisHwaddr >> 7), (thisHwaddr >> 4) & 0x7, 
		       thisHwaddr & 0xf));
      if (writer) writer->AddChannelTrailer(hwaddr);
      hwaddr = thisHwaddr;
    }
    // Check if we're still in the same detector (DDL)
    if (ddl != thisDDL) {
      if (writer) {
	AliFMDDebug(1, ("Closing altro writer %p", writer));
	if ((ret = writer->Close()) < 0) {
	  AliError(Form("Error: %s", writer->ErrorString(ret)));
	  return;
	}
	delete writer;
	writer = 0;
	file->close();
	delete file;
	file = 0;
      }
      ddl = thisDDL;
    }
    // If we haven't got a writer (either because none were made so
    // far, or because we've switch DDL), make one. 
    if (!writer) {
      AliFMDDebug(1, ("Opening new ALTRO writer w/file %s", 
		      AliDAQ::DdlFileName("FMD",ddl)));
      file   = new std::ofstream(AliDAQ::DdlFileName("FMD",ddl));
      if (!file || !*file) {
	AliFatal(Form("Failed to open file %s", 
		      AliDAQ::DdlFileName("FMD",ddl)));
	return;
      }
      writer  = new AliFMDAltroWriter(*file);
      writer->SetThreshold(pars->GetZeroSuppression(det, ring, sector, strip));
    }
    // Write out our signal
    sampleRate =  pars->GetSampleRate(det,ring,sector,strip);
    writer->AddSignal(digit->Count1());
    if (sampleRate >= 2) writer->AddSignal(digit->Count2());
    if (sampleRate >= 3) writer->AddSignal(digit->Count3());
  }
  if (writer) {
    writer->AddChannelTrailer(hwaddr);
    writer->Close();
    delete writer;
    file->close();
    delete file;
  }
}
#endif


  

//____________________________________________________________________
// 
// EOF
//

 AliFMDRawWriter.cxx:1
 AliFMDRawWriter.cxx:2
 AliFMDRawWriter.cxx:3
 AliFMDRawWriter.cxx:4
 AliFMDRawWriter.cxx:5
 AliFMDRawWriter.cxx:6
 AliFMDRawWriter.cxx:7
 AliFMDRawWriter.cxx:8
 AliFMDRawWriter.cxx:9
 AliFMDRawWriter.cxx:10
 AliFMDRawWriter.cxx:11
 AliFMDRawWriter.cxx:12
 AliFMDRawWriter.cxx:13
 AliFMDRawWriter.cxx:14
 AliFMDRawWriter.cxx:15
 AliFMDRawWriter.cxx:16
 AliFMDRawWriter.cxx:17
 AliFMDRawWriter.cxx:18
 AliFMDRawWriter.cxx:19
 AliFMDRawWriter.cxx:20
 AliFMDRawWriter.cxx:21
 AliFMDRawWriter.cxx:22
 AliFMDRawWriter.cxx:23
 AliFMDRawWriter.cxx:24
 AliFMDRawWriter.cxx:25
 AliFMDRawWriter.cxx:26
 AliFMDRawWriter.cxx:27
 AliFMDRawWriter.cxx:28
 AliFMDRawWriter.cxx:29
 AliFMDRawWriter.cxx:30
 AliFMDRawWriter.cxx:31
 AliFMDRawWriter.cxx:32
 AliFMDRawWriter.cxx:33
 AliFMDRawWriter.cxx:34
 AliFMDRawWriter.cxx:35
 AliFMDRawWriter.cxx:36
 AliFMDRawWriter.cxx:37
 AliFMDRawWriter.cxx:38
 AliFMDRawWriter.cxx:39
 AliFMDRawWriter.cxx:40
 AliFMDRawWriter.cxx:41
 AliFMDRawWriter.cxx:42
 AliFMDRawWriter.cxx:43
 AliFMDRawWriter.cxx:44
 AliFMDRawWriter.cxx:45
 AliFMDRawWriter.cxx:46
 AliFMDRawWriter.cxx:47
 AliFMDRawWriter.cxx:48
 AliFMDRawWriter.cxx:49
 AliFMDRawWriter.cxx:50
 AliFMDRawWriter.cxx:51
 AliFMDRawWriter.cxx:52
 AliFMDRawWriter.cxx:53
 AliFMDRawWriter.cxx:54
 AliFMDRawWriter.cxx:55
 AliFMDRawWriter.cxx:56
 AliFMDRawWriter.cxx:57
 AliFMDRawWriter.cxx:58
 AliFMDRawWriter.cxx:59
 AliFMDRawWriter.cxx:60
 AliFMDRawWriter.cxx:61
 AliFMDRawWriter.cxx:62
 AliFMDRawWriter.cxx:63
 AliFMDRawWriter.cxx:64
 AliFMDRawWriter.cxx:65
 AliFMDRawWriter.cxx:66
 AliFMDRawWriter.cxx:67
 AliFMDRawWriter.cxx:68
 AliFMDRawWriter.cxx:69
 AliFMDRawWriter.cxx:70
 AliFMDRawWriter.cxx:71
 AliFMDRawWriter.cxx:72
 AliFMDRawWriter.cxx:73
 AliFMDRawWriter.cxx:74
 AliFMDRawWriter.cxx:75
 AliFMDRawWriter.cxx:76
 AliFMDRawWriter.cxx:77
 AliFMDRawWriter.cxx:78
 AliFMDRawWriter.cxx:79
 AliFMDRawWriter.cxx:80
 AliFMDRawWriter.cxx:81
 AliFMDRawWriter.cxx:82
 AliFMDRawWriter.cxx:83
 AliFMDRawWriter.cxx:84
 AliFMDRawWriter.cxx:85
 AliFMDRawWriter.cxx:86
 AliFMDRawWriter.cxx:87
 AliFMDRawWriter.cxx:88
 AliFMDRawWriter.cxx:89
 AliFMDRawWriter.cxx:90
 AliFMDRawWriter.cxx:91
 AliFMDRawWriter.cxx:92
 AliFMDRawWriter.cxx:93
 AliFMDRawWriter.cxx:94
 AliFMDRawWriter.cxx:95
 AliFMDRawWriter.cxx:96
 AliFMDRawWriter.cxx:97
 AliFMDRawWriter.cxx:98
 AliFMDRawWriter.cxx:99
 AliFMDRawWriter.cxx:100
 AliFMDRawWriter.cxx:101
 AliFMDRawWriter.cxx:102
 AliFMDRawWriter.cxx:103
 AliFMDRawWriter.cxx:104
 AliFMDRawWriter.cxx:105
 AliFMDRawWriter.cxx:106
 AliFMDRawWriter.cxx:107
 AliFMDRawWriter.cxx:108
 AliFMDRawWriter.cxx:109
 AliFMDRawWriter.cxx:110
 AliFMDRawWriter.cxx:111
 AliFMDRawWriter.cxx:112
 AliFMDRawWriter.cxx:113
 AliFMDRawWriter.cxx:114
 AliFMDRawWriter.cxx:115
 AliFMDRawWriter.cxx:116
 AliFMDRawWriter.cxx:117
 AliFMDRawWriter.cxx:118
 AliFMDRawWriter.cxx:119
 AliFMDRawWriter.cxx:120
 AliFMDRawWriter.cxx:121
 AliFMDRawWriter.cxx:122
 AliFMDRawWriter.cxx:123
 AliFMDRawWriter.cxx:124
 AliFMDRawWriter.cxx:125
 AliFMDRawWriter.cxx:126
 AliFMDRawWriter.cxx:127
 AliFMDRawWriter.cxx:128
 AliFMDRawWriter.cxx:129
 AliFMDRawWriter.cxx:130
 AliFMDRawWriter.cxx:131
 AliFMDRawWriter.cxx:132
 AliFMDRawWriter.cxx:133
 AliFMDRawWriter.cxx:134
 AliFMDRawWriter.cxx:135
 AliFMDRawWriter.cxx:136
 AliFMDRawWriter.cxx:137
 AliFMDRawWriter.cxx:138
 AliFMDRawWriter.cxx:139
 AliFMDRawWriter.cxx:140
 AliFMDRawWriter.cxx:141
 AliFMDRawWriter.cxx:142
 AliFMDRawWriter.cxx:143
 AliFMDRawWriter.cxx:144
 AliFMDRawWriter.cxx:145
 AliFMDRawWriter.cxx:146
 AliFMDRawWriter.cxx:147
 AliFMDRawWriter.cxx:148
 AliFMDRawWriter.cxx:149
 AliFMDRawWriter.cxx:150
 AliFMDRawWriter.cxx:151
 AliFMDRawWriter.cxx:152
 AliFMDRawWriter.cxx:153
 AliFMDRawWriter.cxx:154
 AliFMDRawWriter.cxx:155
 AliFMDRawWriter.cxx:156
 AliFMDRawWriter.cxx:157
 AliFMDRawWriter.cxx:158
 AliFMDRawWriter.cxx:159
 AliFMDRawWriter.cxx:160
 AliFMDRawWriter.cxx:161
 AliFMDRawWriter.cxx:162
 AliFMDRawWriter.cxx:163
 AliFMDRawWriter.cxx:164
 AliFMDRawWriter.cxx:165
 AliFMDRawWriter.cxx:166
 AliFMDRawWriter.cxx:167
 AliFMDRawWriter.cxx:168
 AliFMDRawWriter.cxx:169
 AliFMDRawWriter.cxx:170
 AliFMDRawWriter.cxx:171
 AliFMDRawWriter.cxx:172
 AliFMDRawWriter.cxx:173
 AliFMDRawWriter.cxx:174
 AliFMDRawWriter.cxx:175
 AliFMDRawWriter.cxx:176
 AliFMDRawWriter.cxx:177
 AliFMDRawWriter.cxx:178
 AliFMDRawWriter.cxx:179
 AliFMDRawWriter.cxx:180
 AliFMDRawWriter.cxx:181
 AliFMDRawWriter.cxx:182
 AliFMDRawWriter.cxx:183
 AliFMDRawWriter.cxx:184
 AliFMDRawWriter.cxx:185
 AliFMDRawWriter.cxx:186
 AliFMDRawWriter.cxx:187
 AliFMDRawWriter.cxx:188
 AliFMDRawWriter.cxx:189
 AliFMDRawWriter.cxx:190
 AliFMDRawWriter.cxx:191
 AliFMDRawWriter.cxx:192
 AliFMDRawWriter.cxx:193
 AliFMDRawWriter.cxx:194
 AliFMDRawWriter.cxx:195
 AliFMDRawWriter.cxx:196
 AliFMDRawWriter.cxx:197
 AliFMDRawWriter.cxx:198
 AliFMDRawWriter.cxx:199
 AliFMDRawWriter.cxx:200
 AliFMDRawWriter.cxx:201
 AliFMDRawWriter.cxx:202
 AliFMDRawWriter.cxx:203
 AliFMDRawWriter.cxx:204
 AliFMDRawWriter.cxx:205
 AliFMDRawWriter.cxx:206
 AliFMDRawWriter.cxx:207
 AliFMDRawWriter.cxx:208
 AliFMDRawWriter.cxx:209
 AliFMDRawWriter.cxx:210
 AliFMDRawWriter.cxx:211
 AliFMDRawWriter.cxx:212
 AliFMDRawWriter.cxx:213
 AliFMDRawWriter.cxx:214
 AliFMDRawWriter.cxx:215
 AliFMDRawWriter.cxx:216
 AliFMDRawWriter.cxx:217
 AliFMDRawWriter.cxx:218
 AliFMDRawWriter.cxx:219
 AliFMDRawWriter.cxx:220
 AliFMDRawWriter.cxx:221
 AliFMDRawWriter.cxx:222
 AliFMDRawWriter.cxx:223
 AliFMDRawWriter.cxx:224
 AliFMDRawWriter.cxx:225
 AliFMDRawWriter.cxx:226
 AliFMDRawWriter.cxx:227
 AliFMDRawWriter.cxx:228
 AliFMDRawWriter.cxx:229
 AliFMDRawWriter.cxx:230
 AliFMDRawWriter.cxx:231
 AliFMDRawWriter.cxx:232
 AliFMDRawWriter.cxx:233
 AliFMDRawWriter.cxx:234
 AliFMDRawWriter.cxx:235
 AliFMDRawWriter.cxx:236
 AliFMDRawWriter.cxx:237
 AliFMDRawWriter.cxx:238
 AliFMDRawWriter.cxx:239
 AliFMDRawWriter.cxx:240
 AliFMDRawWriter.cxx:241
 AliFMDRawWriter.cxx:242
 AliFMDRawWriter.cxx:243
 AliFMDRawWriter.cxx:244
 AliFMDRawWriter.cxx:245
 AliFMDRawWriter.cxx:246
 AliFMDRawWriter.cxx:247
 AliFMDRawWriter.cxx:248
 AliFMDRawWriter.cxx:249
 AliFMDRawWriter.cxx:250
 AliFMDRawWriter.cxx:251
 AliFMDRawWriter.cxx:252
 AliFMDRawWriter.cxx:253
 AliFMDRawWriter.cxx:254
 AliFMDRawWriter.cxx:255
 AliFMDRawWriter.cxx:256
 AliFMDRawWriter.cxx:257
 AliFMDRawWriter.cxx:258
 AliFMDRawWriter.cxx:259
 AliFMDRawWriter.cxx:260
 AliFMDRawWriter.cxx:261
 AliFMDRawWriter.cxx:262
 AliFMDRawWriter.cxx:263
 AliFMDRawWriter.cxx:264
 AliFMDRawWriter.cxx:265
 AliFMDRawWriter.cxx:266
 AliFMDRawWriter.cxx:267
 AliFMDRawWriter.cxx:268
 AliFMDRawWriter.cxx:269
 AliFMDRawWriter.cxx:270
 AliFMDRawWriter.cxx:271
 AliFMDRawWriter.cxx:272
 AliFMDRawWriter.cxx:273
 AliFMDRawWriter.cxx:274
 AliFMDRawWriter.cxx:275
 AliFMDRawWriter.cxx:276
 AliFMDRawWriter.cxx:277
 AliFMDRawWriter.cxx:278
 AliFMDRawWriter.cxx:279
 AliFMDRawWriter.cxx:280
 AliFMDRawWriter.cxx:281
 AliFMDRawWriter.cxx:282
 AliFMDRawWriter.cxx:283
 AliFMDRawWriter.cxx:284
 AliFMDRawWriter.cxx:285
 AliFMDRawWriter.cxx:286
 AliFMDRawWriter.cxx:287
 AliFMDRawWriter.cxx:288
 AliFMDRawWriter.cxx:289
 AliFMDRawWriter.cxx:290
 AliFMDRawWriter.cxx:291
 AliFMDRawWriter.cxx:292
 AliFMDRawWriter.cxx:293
 AliFMDRawWriter.cxx:294
 AliFMDRawWriter.cxx:295
 AliFMDRawWriter.cxx:296
 AliFMDRawWriter.cxx:297
 AliFMDRawWriter.cxx:298
 AliFMDRawWriter.cxx:299
 AliFMDRawWriter.cxx:300
 AliFMDRawWriter.cxx:301
 AliFMDRawWriter.cxx:302
 AliFMDRawWriter.cxx:303
 AliFMDRawWriter.cxx:304
 AliFMDRawWriter.cxx:305
 AliFMDRawWriter.cxx:306
 AliFMDRawWriter.cxx:307
 AliFMDRawWriter.cxx:308
 AliFMDRawWriter.cxx:309
 AliFMDRawWriter.cxx:310
 AliFMDRawWriter.cxx:311
 AliFMDRawWriter.cxx:312
 AliFMDRawWriter.cxx:313
 AliFMDRawWriter.cxx:314
 AliFMDRawWriter.cxx:315
 AliFMDRawWriter.cxx:316
 AliFMDRawWriter.cxx:317
 AliFMDRawWriter.cxx:318
 AliFMDRawWriter.cxx:319
 AliFMDRawWriter.cxx:320
 AliFMDRawWriter.cxx:321
 AliFMDRawWriter.cxx:322
 AliFMDRawWriter.cxx:323
 AliFMDRawWriter.cxx:324
 AliFMDRawWriter.cxx:325
 AliFMDRawWriter.cxx:326
 AliFMDRawWriter.cxx:327
 AliFMDRawWriter.cxx:328
 AliFMDRawWriter.cxx:329
 AliFMDRawWriter.cxx:330
 AliFMDRawWriter.cxx:331
 AliFMDRawWriter.cxx:332
 AliFMDRawWriter.cxx:333
 AliFMDRawWriter.cxx:334
 AliFMDRawWriter.cxx:335
 AliFMDRawWriter.cxx:336
 AliFMDRawWriter.cxx:337
 AliFMDRawWriter.cxx:338
 AliFMDRawWriter.cxx:339
 AliFMDRawWriter.cxx:340
 AliFMDRawWriter.cxx:341
 AliFMDRawWriter.cxx:342
 AliFMDRawWriter.cxx:343
 AliFMDRawWriter.cxx:344
 AliFMDRawWriter.cxx:345
 AliFMDRawWriter.cxx:346
 AliFMDRawWriter.cxx:347
 AliFMDRawWriter.cxx:348
 AliFMDRawWriter.cxx:349
 AliFMDRawWriter.cxx:350
 AliFMDRawWriter.cxx:351
 AliFMDRawWriter.cxx:352
 AliFMDRawWriter.cxx:353
 AliFMDRawWriter.cxx:354
 AliFMDRawWriter.cxx:355
 AliFMDRawWriter.cxx:356
 AliFMDRawWriter.cxx:357
 AliFMDRawWriter.cxx:358
 AliFMDRawWriter.cxx:359
 AliFMDRawWriter.cxx:360
 AliFMDRawWriter.cxx:361
 AliFMDRawWriter.cxx:362
 AliFMDRawWriter.cxx:363
 AliFMDRawWriter.cxx:364
 AliFMDRawWriter.cxx:365
 AliFMDRawWriter.cxx:366
 AliFMDRawWriter.cxx:367
 AliFMDRawWriter.cxx:368
 AliFMDRawWriter.cxx:369
 AliFMDRawWriter.cxx:370
 AliFMDRawWriter.cxx:371
 AliFMDRawWriter.cxx:372
 AliFMDRawWriter.cxx:373
 AliFMDRawWriter.cxx:374
 AliFMDRawWriter.cxx:375
 AliFMDRawWriter.cxx:376
 AliFMDRawWriter.cxx:377
 AliFMDRawWriter.cxx:378
 AliFMDRawWriter.cxx:379
 AliFMDRawWriter.cxx:380
 AliFMDRawWriter.cxx:381
 AliFMDRawWriter.cxx:382
 AliFMDRawWriter.cxx:383
 AliFMDRawWriter.cxx:384
 AliFMDRawWriter.cxx:385
 AliFMDRawWriter.cxx:386
 AliFMDRawWriter.cxx:387
 AliFMDRawWriter.cxx:388
 AliFMDRawWriter.cxx:389
 AliFMDRawWriter.cxx:390
 AliFMDRawWriter.cxx:391
 AliFMDRawWriter.cxx:392
 AliFMDRawWriter.cxx:393
 AliFMDRawWriter.cxx:394
 AliFMDRawWriter.cxx:395
 AliFMDRawWriter.cxx:396
 AliFMDRawWriter.cxx:397
 AliFMDRawWriter.cxx:398
 AliFMDRawWriter.cxx:399
 AliFMDRawWriter.cxx:400
 AliFMDRawWriter.cxx:401
 AliFMDRawWriter.cxx:402
 AliFMDRawWriter.cxx:403
 AliFMDRawWriter.cxx:404
 AliFMDRawWriter.cxx:405
 AliFMDRawWriter.cxx:406
 AliFMDRawWriter.cxx:407
 AliFMDRawWriter.cxx:408
 AliFMDRawWriter.cxx:409
 AliFMDRawWriter.cxx:410
 AliFMDRawWriter.cxx:411
 AliFMDRawWriter.cxx:412
 AliFMDRawWriter.cxx:413
 AliFMDRawWriter.cxx:414
 AliFMDRawWriter.cxx:415
 AliFMDRawWriter.cxx:416
 AliFMDRawWriter.cxx:417
 AliFMDRawWriter.cxx:418
 AliFMDRawWriter.cxx:419
 AliFMDRawWriter.cxx:420
 AliFMDRawWriter.cxx:421
 AliFMDRawWriter.cxx:422
 AliFMDRawWriter.cxx:423
 AliFMDRawWriter.cxx:424
 AliFMDRawWriter.cxx:425
 AliFMDRawWriter.cxx:426
 AliFMDRawWriter.cxx:427
 AliFMDRawWriter.cxx:428
 AliFMDRawWriter.cxx:429
 AliFMDRawWriter.cxx:430
 AliFMDRawWriter.cxx:431
 AliFMDRawWriter.cxx:432
 AliFMDRawWriter.cxx:433
 AliFMDRawWriter.cxx:434
 AliFMDRawWriter.cxx:435
 AliFMDRawWriter.cxx:436
 AliFMDRawWriter.cxx:437
 AliFMDRawWriter.cxx:438
 AliFMDRawWriter.cxx:439
 AliFMDRawWriter.cxx:440
 AliFMDRawWriter.cxx:441
 AliFMDRawWriter.cxx:442
 AliFMDRawWriter.cxx:443
 AliFMDRawWriter.cxx:444
 AliFMDRawWriter.cxx:445
 AliFMDRawWriter.cxx:446
 AliFMDRawWriter.cxx:447
 AliFMDRawWriter.cxx:448
 AliFMDRawWriter.cxx:449
 AliFMDRawWriter.cxx:450
 AliFMDRawWriter.cxx:451
 AliFMDRawWriter.cxx:452
 AliFMDRawWriter.cxx:453
 AliFMDRawWriter.cxx:454
 AliFMDRawWriter.cxx:455
 AliFMDRawWriter.cxx:456
 AliFMDRawWriter.cxx:457
 AliFMDRawWriter.cxx:458
 AliFMDRawWriter.cxx:459
 AliFMDRawWriter.cxx:460
 AliFMDRawWriter.cxx:461
 AliFMDRawWriter.cxx:462
 AliFMDRawWriter.cxx:463
 AliFMDRawWriter.cxx:464
 AliFMDRawWriter.cxx:465
 AliFMDRawWriter.cxx:466
 AliFMDRawWriter.cxx:467
 AliFMDRawWriter.cxx:468
 AliFMDRawWriter.cxx:469
 AliFMDRawWriter.cxx:470
 AliFMDRawWriter.cxx:471
 AliFMDRawWriter.cxx:472
 AliFMDRawWriter.cxx:473
 AliFMDRawWriter.cxx:474
 AliFMDRawWriter.cxx:475
 AliFMDRawWriter.cxx:476
 AliFMDRawWriter.cxx:477
 AliFMDRawWriter.cxx:478
 AliFMDRawWriter.cxx:479
 AliFMDRawWriter.cxx:480
 AliFMDRawWriter.cxx:481
 AliFMDRawWriter.cxx:482
 AliFMDRawWriter.cxx:483
 AliFMDRawWriter.cxx:484
 AliFMDRawWriter.cxx:485
 AliFMDRawWriter.cxx:486
 AliFMDRawWriter.cxx:487
 AliFMDRawWriter.cxx:488
 AliFMDRawWriter.cxx:489
 AliFMDRawWriter.cxx:490
 AliFMDRawWriter.cxx:491
 AliFMDRawWriter.cxx:492
 AliFMDRawWriter.cxx:493
 AliFMDRawWriter.cxx:494
 AliFMDRawWriter.cxx:495
 AliFMDRawWriter.cxx:496
 AliFMDRawWriter.cxx:497
 AliFMDRawWriter.cxx:498
 AliFMDRawWriter.cxx:499
 AliFMDRawWriter.cxx:500
 AliFMDRawWriter.cxx:501
 AliFMDRawWriter.cxx:502
 AliFMDRawWriter.cxx:503
 AliFMDRawWriter.cxx:504
 AliFMDRawWriter.cxx:505
 AliFMDRawWriter.cxx:506
 AliFMDRawWriter.cxx:507
 AliFMDRawWriter.cxx:508
 AliFMDRawWriter.cxx:509
 AliFMDRawWriter.cxx:510
 AliFMDRawWriter.cxx:511