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

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
//  TRD raw data conversion class                                            //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////


#include <TMath.h>
#include "TClass.h"

#include "AliDAQ.h"
#include "AliRawDataHeaderSim.h"
#include "AliRawReader.h"
#include "AliLog.h"
#include "AliFstream.h"
#include "AliLoader.h"
#include "AliTreeLoader.h"

#include "AliTRDrawData.h"
#include "AliTRDdigitsManager.h"
#include "AliTRDgeometry.h"
#include "AliTRDarrayDictionary.h"
#include "AliTRDarrayADC.h"
#include "AliTRDrawStream.h"
#include "AliTRDcalibDB.h"
#include "AliTRDSignalIndex.h"
#include "AliTRDfeeParam.h"
#include "AliTRDmcmSim.h"
#include "AliTRDtrackletWord.h"
#include "AliTRDtrackGTU.h"
#include "AliESDTrdTrack.h"
#include "AliTRDdigitsParam.h"

ClassImp(AliTRDrawData)

Int_t AliTRDrawData::fgDataSuppressionLevel = 0;

//_____________________________________________________________________________
AliTRDrawData::AliTRDrawData()
  :TObject()
  ,fRunLoader(NULL)
  ,fGeo(NULL)
  ,fFee(NULL)
  ,fNumberOfDDLs(0)
  ,fTrackletTree(NULL)
  ,fTracklets(new TClonesArray("AliTRDtrackletWord", 1000))
  ,fTracks(new TClonesArray("AliESDTrdTrack", 500))
  ,fSMindexPos(0)
  ,fStackindexPos(0)
  ,fEventCounter(0)
  ,fTrgFlags()
  ,fMcmSim(new AliTRDmcmSim)
  ,fDigitsParam(NULL)
{
  //
  // Default constructor
  //

  fFee = AliTRDfeeParam::Instance();
  fNumberOfDDLs = AliDAQ::NumberOfDdls("TRD");

}

//_____________________________________________________________________________
AliTRDrawData::AliTRDrawData(const AliTRDrawData &r)
  :TObject(r)
  ,fRunLoader(NULL)
  ,fGeo(NULL)
  ,fFee(NULL)
  ,fNumberOfDDLs(0)
  ,fTrackletTree(NULL)
  ,fTracklets(new TClonesArray("AliTRDtrackletWord", 1000))
  ,fTracks(new TClonesArray("AliESDTrdTrack", 500))
  ,fSMindexPos(0)
  ,fStackindexPos(0)
  ,fEventCounter(0)
  ,fTrgFlags()
  ,fMcmSim(new AliTRDmcmSim)
  ,fDigitsParam(NULL)
{
  //
  // Copy constructor
  //

  fFee = AliTRDfeeParam::Instance();
  fNumberOfDDLs = AliDAQ::NumberOfDdls("TRD");

}

//_____________________________________________________________________________
AliTRDrawData::~AliTRDrawData()
{
  //
  // Destructor
  //

  delete fTracklets;
  delete fTracks;
  delete fMcmSim;

}

//_____________________________________________________________________________
Bool_t AliTRDrawData::Digits2Raw(TTree *digitsTree, const TTree *tracks )
{
  //
  // Initialize necessary parameters and call one
  // of the raw data simulator selected by SetRawVersion.
  //
  // Currently tracklet output is not spported yet and it
  // will be supported in higher version simulator.
  //

  AliTRDdigitsManager* const digitsManager = new AliTRDdigitsManager();

  if (!digitsManager->ReadDigits(digitsTree)) {
    delete digitsManager;
    return kFALSE;
  }

  if (tracks != NULL) {
    delete digitsManager;
    AliError("Tracklet input is not supported yet.");
    return kFALSE;
  }

  fGeo = new AliTRDgeometry();

  if (!AliTRDcalibDB::Instance()) {
    AliError("Could not get calibration object");
    delete fGeo;
    delete digitsManager;
    return kFALSE;
  }

  Int_t retval = kTRUE;
  Int_t rv     = fFee->GetRAWversion();

  // Call appropriate Raw Simulator
  if ( rv > 0 && rv <= 3 ) retval = Digits2Raw(digitsManager); 
  else {
    retval = kFALSE;
    AliWarning(Form("Unsupported raw version (%d).", rv));
  }

  // Cleanup
  delete fGeo;
  delete digitsManager;

  return retval;

}

//_____________________________________________________________________________
Bool_t AliTRDrawData::Digits2Raw(AliTRDdigitsManager *digitsManager)
{
  //
  // Raw data simulator for all versions > 0. This is prepared for real data.
  // This version simulate only raw data with ADC data and not with tracklet.
  //

  const Int_t kMaxHcWords = (fGeo->TBmax()/3)
                          * fGeo->ADCmax()
                          * fGeo->MCMmax()
                          * fGeo->ROBmaxC1()/2 
                          + 100 + 20;

  // Buffer to temporary store half chamber data
  UInt_t     *hcBuffer    = new UInt_t[kMaxHcWords];

  Bool_t newEvent = kFALSE;  // only for correct readout tree
  Bool_t newSM    = kFALSE;  // new SM flag, for writing SM index words
  // Coverity
  //Bool_t newStack = kFALSE;  // new stack flag, for writing stack index words

  // Get digits parameter
  fDigitsParam = digitsManager->GetDigitsParam();

  // sect is same as iDDL, so I use only sect here.
  for (Int_t sect = 0; sect < fGeo->Nsector(); sect++) { 

    char name[1024];
    snprintf(name,1024,"TRD_%d.ddl",sect + AliTRDrawStream::kDDLOffset);

    AliFstream* of = new AliFstream(name);

    // Write a dummy data header
    AliRawDataHeaderSim  header;  // the event header
    UInt_t hpos = of->Tellp();
    of->WriteBuffer((char *) (& header), sizeof(header));
    
    // Reset payload byte size (payload does not include header).
    Int_t npayloadbyte = 0;

    // check the existance of the data
    // SM index word and Stack index word
    UInt_t *iwbuffer = new UInt_t[109]; // index word buffer; max 109 = 2 SM headers + 67 dummy headers + 5*8 stack headers
    Int_t nheader = 0;
    UInt_t bStackMask = 0x0;
    Bool_t bStackHasData = kFALSE;
    Bool_t bSMHasData = kFALSE;
    
    //iwbuffer[nheader++] = 0x0001a020;   // SM index words 
    iwbuffer[nheader++] = 0x0044b020;   // SM index words | additional SM header:48 = 1 SM header + 47 dummy words(for future use)
    iwbuffer[nheader++] = 0x10404071;   // SM header
    for ( Int_t i=0; i<66; i++ ) iwbuffer[nheader++] = 0x00000000;  // dummy words 
    iwbuffer[nheader++] = 0x10000000;   // end of dummy words
    
    for ( Int_t stack= 0; stack < fGeo->Nstack(); stack++) {
      UInt_t linkMask = 0x0;
      for( Int_t layer = 0; layer < fGeo->Nlayer(); layer++) {
	Int_t iDet = fGeo->GetDetector(layer,stack,sect);
	AliTRDarrayADC *digits = (AliTRDarrayADC *) digitsManager->GetDigits(iDet);
	if ( fgDataSuppressionLevel==0 || digits->HasData() ) {
	  bStackMask = bStackMask | ( 1 << stack ); // active stack mask for new stack
	  linkMask = linkMask | ( 3 << (2*layer) );    // 3 = 0011
	  bStackHasData = kTRUE;
	  bSMHasData = kTRUE;
	} // has data
      } // loop over layer
      
      if ( fgDataSuppressionLevel==0 || bStackHasData ){
	iwbuffer[nheader++] = 0x0007a000 | linkMask;    // stack index word + link masks
	if (fgDataSuppressionLevel==0) iwbuffer[nheader-1] = 0x0007afff;  // no suppression
	iwbuffer[nheader++] = 0x04045b01;               // stack header
	for (Int_t i=0;i<6;i++) iwbuffer[nheader++] = 0x00000000; // 6 dummy words
	bStackHasData = kFALSE;
      }
    } // loop over stack
    
    if ( fgDataSuppressionLevel==0 || bSMHasData ){
      iwbuffer[0] = iwbuffer[0] | bStackMask;  // add stack masks to SM index word
      if (fgDataSuppressionLevel==0) iwbuffer[0] = 0x0044b03f;    // no suppression : all stacks are active
      of->WriteBuffer((char *) iwbuffer, nheader*4);
      AliDebug(11, Form("SM %d index word: %08x", sect, iwbuffer[0]));
      AliDebug(11, Form("SM %d header: %08x", sect, iwbuffer[1]));
    }
    // end of SM & stack header ------------------------------------------------------------------------
    // -------------------------------------------------------------------------------------------------
    
    // Prepare chamber data
    for( Int_t stack = 0; stack < fGeo->Nstack(); stack++) {
      for( Int_t layer = 0; layer < fGeo->Nlayer(); layer++) {
	
	Int_t iDet = fGeo->GetDetector(layer,stack,sect);
	if (iDet == 0){
	  newEvent = kTRUE; // it is expected that each event has at least one tracklet; 
	  // this is only needed for correct readout tree
	  fEventCounter++;
	  AliDebug(11, Form("New event!! Event counter: %d",fEventCounter));
	}
	
	if ( stack==0 && layer==0 ) newSM = kTRUE;  // new SM flag
        // Coverity
	//if ( layer==0 ) newStack = kTRUE;           // new stack flag
	AliDebug(15, Form("stack : %d, layer : %d, iDec : %d\n",stack,layer,iDet));
	// Get the digits array
	AliTRDarrayADC *digits = (AliTRDarrayADC *) digitsManager->GetDigits(iDet);
	if (fgDataSuppressionLevel==0 || digits->HasData() ) {  // second part is new!! and is for indicating a new event
	  
	  if (digits->HasData()) digits->Expand();
	  
	  Int_t hcwords = 0;
	  
	  // Process A side of the chamber
	  hcwords = ProduceHcData(digits,0,iDet,hcBuffer,kMaxHcWords,newEvent,newSM);
	  if ( newEvent ) newEvent = kFALSE;
	  //AssignLinkMask(hcBuffer, layer);  // active link mask for this layer(2*HC)
	  of->WriteBuffer((char *) hcBuffer, hcwords*4);
	  npayloadbyte += hcwords*4;
	  
	  // Process B side of the chamber
	  hcwords = ProduceHcData(digits,1,iDet,hcBuffer,kMaxHcWords,newEvent,newSM);
	  of->WriteBuffer((char *) hcBuffer, hcwords*4);
	  npayloadbyte += hcwords*4;
	} // has data
	
      } // loop over layer
    } // loop over stack
    
    // Complete header
    header.fSize = UInt_t(of->Tellp()) - hpos;
    header.SetAttribute(0);  // Valid data
    of->Seekp(hpos);         // Rewind to header position
    of->WriteBuffer((char *) (& header), sizeof(header));
    delete of;

    delete [] iwbuffer;

  } // loop over sector(SM)
  
  delete [] hcBuffer;
  
  return kTRUE;
}

//_____________________________________________________________________________
void AliTRDrawData::ProduceSMIndexData(UInt_t *buf, Int_t& nw){
	// 
	// This function generates 
	// 	 1) SM index words : ssssssss ssssssss vvvv rrrr r d t mmmmm
	// 	    - s : size of SM header (number of header, default = 0x0001)
	// 	    - v : SM header version (default = 0xa)
	// 	    - r : reserved for future use (default = 00000)
	// 	    - d : track data enabled bit (default = 0)
	// 	    - t : tracklet data enabled bit (default = 1)
	// 	    - m : stack mask (each bit corresponds a stack, default = 11111)
	//
	// 	 2) SM header : rrr c vvvv vvvvvvvv vvvv rrrr bbbbbbbb
	// 	    - r : reserved for future use (default = 000)
	// 	    - c : clean check out flag (default = 1)
	// 	    - v : hardware design revision (default = 0x0404)
	// 	    - r : reserved for future use (default = 0x0)
	// 	    - b : physical board ID (default = 0x71)
	//
	// 	 3) stack index words : ssssssss ssssssss vvvv mmmm mmmmmmmm
	// 	    - s : size of stack header (number of header, (default = 0x0007)
	// 	    - v : header version (default = 0xa)
	// 	    - m : link mask (default = 0xfff)
	//
	// 	 4) stack header : vvvvvvvv vvvvvvvv bbbbbbbb rrrr rrr c
	// 	    - v : hardware design revision (default = 0x0404)
	// 	    - b : physical board ID (default = 0x5b)
	// 	    - r : reserved for future use (default = 0000 000)
	// 	    - c : clean checkout flag (default = 1)
	// 	
	// 	 and 6 dummy words(0x00000000)
	//
	
    //buf[nw++] = 0x0001a03f;   // SM index words
    fSMindexPos = nw;       // memorize position of the SM index word for re-allocating stack mask
    buf[nw++] = 0x0001b020; // SM index words
    buf[nw++] = 0x10404071; // SM header

    fStackindexPos = nw;    // memorize position of the stack index word for future adding
	/*  
    for (Int_t istack=0; istack<5; istack++){
        buf[nw++] = 0x0007afff; // stack index words
        buf[nw++] = 0x04045b01; // stack header
        for (Int_t i=0;i<6;i++) buf[nw++] = 0x00000000; // 6 dummy words
    } // loop over 5 stacks
	*/
}

//_____________________________________________________________________________
void AliTRDrawData::AssignStackMask(UInt_t *buf, Int_t nStack){
    //
    // This function re-assign stack mask active(from 0 to 1) in the SM index word
    //   
    buf[fSMindexPos] = buf[fSMindexPos] | ( 1 << nStack );
}

//_____________________________________________________________________________  
Int_t AliTRDrawData::AddStackIndexWords(UInt_t *buf, Int_t /*nStack*/, Int_t nMax){
    // 
    // This function add stack index words and stack header when there is data for the stack
    //
    //   1) stack index words : ssssssss ssssssss vvvv mmmm mmmmmmmm 
    //      - s : size of stack header (number of header, (default = 0x0007)       
    //      - v : header version (default = 0xa)
    //      - m : link mask (default = 0xfff)
    //      - m : link mask (starting value = 0x000)
    //
    //   2) stack header : vvvvvvvv vvvvvvvv bbbbbbbb rrrr rrr c
    //      - v : hardware design revision (default = 0x0404)
    //      - b : physical board ID (default = 0x5b)
    //      - r : reserved for future use (default = 0000 000)
    //      - c : clean checkout flag (default = 1)
    //  
    //   and 6 dummy words(0x00000000)
    //

    Int_t nAddedWords = 0;  // Number of added words
    if ( ShiftWords(buf, fStackindexPos, 8, nMax)== kFALSE ){
        AliError("Adding stack header failed.");
        return 0;
    }

    buf[fStackindexPos++] = 0x0007a000; // stack index words
    buf[fStackindexPos++] = 0x04045b01; // stack header
    for (Int_t i=0;i<6;i++) buf[fStackindexPos++] = 0x00000000; // 6 dummy words 
    nAddedWords += 8;

    return nAddedWords;
}

//_____________________________________________________________________________
void AliTRDrawData::AssignLinkMask(UInt_t *buf, Int_t nLayer){
    //
    // This function re-assign link mask active(from 0 to 1) in the stack index word
    //   
    buf[fStackindexPos-8] = buf[fStackindexPos-8] | ( 3 << (2*nLayer) );    // 3 = 0011 
}

//_____________________________________________________________________________ 
Bool_t AliTRDrawData::ShiftWords(UInt_t *buf, Int_t nStart, Int_t nWords, Int_t nMax){
    //  
    // This function shifts n words
    //
    //if ( nStart+nWords > sizeof(buf)/sizeof(UInt_t) ){
    //  AliError("Words shift failed. No more buffer space.");
    //  return kFALSE;
    //}

    for ( Int_t iw=nMax; iw>nStart-1; iw--){
        buf[iw+nWords] = buf[iw];
    }
    return kTRUE;
}

//_____________________________________________________________________________
Int_t AliTRDrawData::ProduceHcData(AliTRDarrayADC *digits, Int_t side, Int_t det, UInt_t *buf, Int_t maxSize, Bool_t /*newEvent = kFALSE*/, Bool_t /*newSM = kFALSE*/){
	//
        // This function produces the raw data for one HC, i.e. tracklets, tracklet endmarkers, 
        // raw data, raw data endmarkers. 
	// This function can be used for both ZS and NZS data
	//

  	Int_t           nw = 0;                       // Number of written    words
  	Int_t           of = 0;                       // Number of overflowed words
  	Int_t      *tempnw = &nw;                     // Number of written    words for temp. buffer
  	Int_t      *tempof = &of;                     // Number of overflowed words for temp. buffer
  	Int_t        layer = fGeo->GetLayer( det );   // Layer
  	Int_t        stack = fGeo->GetStack( det );   // Stack
  	Int_t         sect = fGeo->GetSector( det );  // Sector (=iDDL)
	const Int_t kCtype = fGeo->GetStack(det) == 2 ? 0 : 1;                       // Chamber type (0:C0, 1:C1)

	Bool_t trackletOn = fFee->GetTracklet();     // tracklet simulation active?

  	AliDebug(1,Form("Producing raw data for sect=%d layer=%d stack=%d side=%d",sect,layer,stack,side));
        
	UInt_t *tempBuffer = buf; // tempBuffer used to write ADC data
	                          // different in case of tracklet writing
	
	if (trackletOn) {
	  tempBuffer = new UInt_t[maxSize];
	  tempnw     = new Int_t(0);
	  tempof     = new Int_t(0);
	}
	  
	WriteIntermediateWords(tempBuffer,*tempnw,*tempof,maxSize,det,side);

	if (digits->HasData()) {
	  // scanning direction such, that tracklet-words are sorted in ascending z and then in ascending y order
	  // ROB numbering on chamber and MCM numbering on ROB increase with decreasing z and increasing y
	  for (Int_t iRobRow = 0; iRobRow <= (kCtype + 3)-1; iRobRow++ ) {
	    // ROB number should be increasing
	    Int_t iRob = iRobRow * 2 + side;
	    // MCM on one ROB
	    for (Int_t iMcmRB = 0; iMcmRB < fGeo->MCMmax(); iMcmRB++ ) {
	      Int_t iMcm = 16 - 4*(iMcmRB/4 + 1) + (iMcmRB%4);
	      
	      fMcmSim->Init(det, iRob, iMcm);
	      fMcmSim->SetData(digits);     // no filtering done here (already done in digitizer)
	      if (trackletOn) {
		fMcmSim->Tracklet();
		Int_t tempNw = fMcmSim->ProduceTrackletStream(&buf[nw], maxSize - nw);
		if(  tempNw < 0 ) {
		  of += tempNw;
		  nw += maxSize - nw;
		  AliError(Form("Buffer overflow detected. Please increase the buffer size and recompile."));
		} else {
		  nw += tempNw;
		}
	      }
	      fMcmSim->ZSMapping();  // Calculate zero suppression mapping
	      // at the moment it has to be rerun here
	      // Write MCM data to temp. buffer
	      Int_t tempNw = fMcmSim->ProduceRawStream( &tempBuffer[*tempnw], maxSize - *tempnw, fEventCounter );
	      if ( tempNw < 0 ) {
		*tempof += tempNw;
		*tempnw += maxSize - nw;
		AliError(Form("Buffer overflow detected. Please increase the buffer size and recompile."));
	      } else {
		*tempnw += tempNw;
	      }
	    }
	  }
	}
	  
	// in case of tracklet writing copy temp data to final buffer
	if (trackletOn) {
	  if (nw + *tempnw < maxSize) {
	    memcpy(&buf[nw], tempBuffer, *tempnw * sizeof(UInt_t));
	    nw += *tempnw;
	  }
	  else {
	    AliError("Buffer overflow detected");
	  }

	  delete [] tempBuffer;
	  delete tempof;
          delete tempnw;
	}
    
  	// Write end of raw data marker
  	if (nw+3 < maxSize) {
          buf[nw++] = fgkEndOfDataMarker;
          buf[nw++] = fgkEndOfDataMarker;
          buf[nw++] = fgkEndOfDataMarker;
          buf[nw++] = fgkEndOfDataMarker;
  	} else {
          of += 4;
  	}
  	
	if (of != 0) {
          AliError("Buffer overflow. Data is truncated. Please increase buffer size and recompile.");
  	}

  	return nw;
}

//_____________________________________________________________________________
AliTRDdigitsManager *AliTRDrawData::Raw2Digits(AliRawReader *rawReader)
{
  //
  // Vx of the raw data reading
  //

  rawReader->Select("TRD"); //[mj]

  AliTRDarrayADC *digits = 0;
  AliTRDarrayDictionary *track0 = 0;
  AliTRDarrayDictionary *track1 = 0;
  AliTRDarrayDictionary *track2 = 0;  

  //AliTRDSignalIndex *indexes = 0;
  // Create the digits manager
  AliTRDdigitsManager* digitsManager = new AliTRDdigitsManager();
  digitsManager->CreateArrays();

  AliTRDrawStream input(rawReader);

  AliRunLoader *runLoader = AliRunLoader::Instance();

  // ----- preparing tracklet output -----
  AliDataLoader *trklLoader = runLoader->GetLoader("TRDLoader")->GetDataLoader("tracklets");
  if (!trklLoader) {
    trklLoader = new AliDataLoader("TRD.Tracklets.root","tracklets", "tracklets");
    runLoader->GetLoader("TRDLoader")->AddDataLoader(trklLoader);
  }
  if (!trklLoader) {
    AliError("Could not get the tracklet data loader!");
    return 0x0;
  }
  // trklLoader->SetEvent();
  trklLoader->Load("update");
  AliTreeLoader *trklTreeLoader = dynamic_cast<AliTreeLoader*> (trklLoader->GetBaseLoader("tracklets-raw"));
  if (!trklTreeLoader) {
    trklTreeLoader = new AliTreeLoader("tracklets-raw", trklLoader);
    trklLoader->AddBaseLoader(trklTreeLoader);
  }

  TClonesArray *fTrackletArray = new TClonesArray("AliTRDtrackletWord", 256);
  Int_t lastHC = -1;
  if (trklLoader->Tree())
    trklLoader->MakeTree();
  TTree *trackletTree = trklTreeLoader->Tree();
  if (!trackletTree) {
    trklTreeLoader->MakeTree();
    trackletTree = trklTreeLoader->Tree();
  }
  if (!trackletTree->GetBranch("hc"))
    trackletTree->Branch("hc", &lastHC, "hc/I");
  else
    trackletTree->SetBranchAddress("hc", &lastHC);

  if (!trackletTree->GetBranch("trkl"))
    trackletTree->Branch("trkl", &fTrackletArray);
  else
    trackletTree->SetBranchAddress("trkl", &fTrackletArray);

  // ----- preparing track output -----
  AliDataLoader *trkLoader = 0x0;
  trkLoader = runLoader->GetLoader("TRDLoader")->GetDataLoader("gtutracks");
  if (!trkLoader) {
    trkLoader = new AliDataLoader("TRD.GtuTracks.root","gtutracks", "gtutracks");
    runLoader->GetLoader("TRDLoader")->AddDataLoader(trkLoader);
  }
  if (!trkLoader) {
    AliError("Could not get the GTU-track data loader!");
    return 0x0;
  }
  trkLoader->Load("UPDATE");

  TTree *trackTree = trkLoader->Tree();
  if (!trackTree) {
    trkLoader->MakeTree();
    trackTree = trkLoader->Tree();
  }

  AliTRDtrackGTU trk;
  if (!trackTree->GetBranch("TRDtrackGTU"))
    trackTree->Branch("TRDtrackGTU", "AliTRDtrackGTU", &trk, 32000);

  // ----- read the raw data -----
  // write the tracklets to arrays while reading raw data
  input.SetTrackletArray(fTracklets);
  input.SetTrackArray(fTracks);

  // Loop through the digits
  Int_t det    = 0;

  while (det >= 0)
    {
      det = input.NextChamber(digitsManager);

      if (det >= 0)
	{
	  // get...
	  digits = (AliTRDarrayADC *) digitsManager->GetDigits(det);
	  track0 = (AliTRDarrayDictionary *) digitsManager->GetDictionary(det,0);
	  track1 = (AliTRDarrayDictionary *) digitsManager->GetDictionary(det,1);
	  track2 = (AliTRDarrayDictionary *) digitsManager->GetDictionary(det,2);
	  // and compress
 	  if (digits) digits->Compress();  
 	  if (track0) track0->Compress();   
 	  if (track1) track1->Compress();     
 	  if (track2) track2->Compress();
	}
    }

  for (Int_t iSector = 0; iSector < fGeo->Nsector(); iSector++) {
    fTrgFlags[iSector] = input.GetTriggerFlags(iSector);
  }

  // ----- tracklet output -----
  fTrackletArray->Clear();
  Int_t nTracklets = fTracklets ? fTracklets->GetEntries() : 0;
  AliDebug(1, Form("Writing %i tracklets to loader", nTracklets));
  for (Int_t iTracklet = 0; iTracklet < nTracklets; ++iTracklet) {
    AliTRDtrackletWord *trkl = (AliTRDtrackletWord*) fTracklets->At(iTracklet);
    if (trkl->GetHCId() != lastHC) {
      if (fTrackletArray->GetEntriesFast() > 0) {
  	trackletTree->Fill();
  	fTrackletArray->Clear();
      }
      lastHC = trkl->GetHCId();
    }
    new ((*fTrackletArray)[fTrackletArray->GetEntriesFast()]) AliTRDtrackletWord(*trkl);
  }
  if (fTrackletArray->GetEntriesFast() > 0) {
      trackletTree->Fill();
      fTrackletArray->Clear();
  }
  trklTreeLoader->WriteData("OVERWRITE");
  trklLoader->WriteData("OVERWRITE");
  trklLoader->UnloadAll();
  trklLoader->CloseFile();

  // ----- track output -----
  Int_t nTracks = fTracks ? fTracks->GetEntriesFast() : 0;
  AliDebug(1, Form("Writing %i tracks to loader", nTracks));
  for (Int_t iTrack = 0; iTrack < nTracks; ++iTrack) {
    AliESDTrdTrack *trkEsd = (AliESDTrdTrack*) fTracks->At(iTrack);
    trk = *trkEsd;
    trackTree->Fill();
  }
  trkLoader->WriteData("OVERWRITE");
  trkLoader->UnloadAll();
  trkLoader->CloseFile();

  return digitsManager;
}

//_____________________________________________________________________________
void AliTRDrawData::WriteIntermediateWords(UInt_t* buf, Int_t& nw, Int_t& of, const Int_t& maxSize, const Int_t& det, const Int_t& side) {
    // 
    // write tracklet end marker(0x10001000) 
    // and half chamber headers(H[0] and H[1])
    //
    
    Int_t        layer = fGeo->GetLayer( det );   // Layer
    Int_t        stack = fGeo->GetStack( det );   // Stack
    Int_t         sect = fGeo->GetSector( det );  // Sector (=iDDL)
    Int_t           rv = fFee->GetRAWversion();
    const Int_t kNTBin = fDigitsParam->GetNTimeBins(det);
    Bool_t  trackletOn = fFee->GetTracklet();
    UInt_t           x = 0;

    // Write end of tracklet marker
    if (nw < maxSize){
      buf[nw++] = fgkEndOfTrackletMarker;
      buf[nw++] = fgkEndOfTrackletMarker;     // the number of tracklet end marker should be more than 2
    }
    else {
      of++;
    }
   
    // Half Chamber header
    // h[0] (there are 2 HC headers) xmmm mmmm nnnn nnnq qqss sssp ppcc ci01
    // 	, where	 x : Raw version speacial number (=1)
    // 		     m : Raw version major number (test pattern, ZS, disable tracklet, 0, options)
    // 		     n : Raw version minor number
    // 		     q : number of addtional header words (default = 1)
    // 		     s : SM sector number (ALICE numbering)
    // 		     p : plane(layer) number
    //			 c : chamber(stack) number
    //			 i : side number (0:A, 1:B)
    Int_t majorv = 0;	// The major version number 
    Int_t minorv = 0;	// The minor version number
    Int_t add    = 1;	// The number of additional header words to follow : now 1, previous 2
    Int_t tp	 = 0;	// test pattern (default=0)
    Int_t zs	 = (rv==3) ? 1 : 0;			// zero suppression
    Int_t dt	 = (trackletOn) ? 0 : 1; 	// disable tracklet 
    
    majorv = (tp<<6) | (zs<<5) | (dt<<4) | 1;	// major version
    
    x = (1<<31) | (majorv<<24) | (minorv<<17) | (add<<14) | (sect<<9) | (layer<<6) | (stack<<3) | (side<<2) | 1;
    if (nw < maxSize) buf[nw++] = x; else of++;
    
    // h[1]		tttt ttbb bbbb bbbb bbbb bbpp pphh hh01
    // , where  t : number of time bins
    //          b : bunch crossing number
    //          p : pretrigger counter
    //          h : pretrigger phase
    Int_t bcCtr   = 99; // bunch crossing counter. Here it is set to 99 always for no reason
    Int_t ptCtr   = 15; // pretrigger counter. Here it is set to 15 always for no reason
    Int_t ptPhase = 11; // pretrigger phase. Here it is set to 11 always for no reason
    //x = (bcCtr<<16) | (ptCtr<<12) | (ptPhase<<8) | ((kNTBin-1)<<2) | 1; 	// old format
    x = ((kNTBin)<<26) | (bcCtr<<10) | (ptCtr<<6) | (ptPhase<<2) | 1;
    if (nw < maxSize) buf[nw++] = x; else of++;
}
 AliTRDrawData.cxx:1
 AliTRDrawData.cxx:2
 AliTRDrawData.cxx:3
 AliTRDrawData.cxx:4
 AliTRDrawData.cxx:5
 AliTRDrawData.cxx:6
 AliTRDrawData.cxx:7
 AliTRDrawData.cxx:8
 AliTRDrawData.cxx:9
 AliTRDrawData.cxx:10
 AliTRDrawData.cxx:11
 AliTRDrawData.cxx:12
 AliTRDrawData.cxx:13
 AliTRDrawData.cxx:14
 AliTRDrawData.cxx:15
 AliTRDrawData.cxx:16
 AliTRDrawData.cxx:17
 AliTRDrawData.cxx:18
 AliTRDrawData.cxx:19
 AliTRDrawData.cxx:20
 AliTRDrawData.cxx:21
 AliTRDrawData.cxx:22
 AliTRDrawData.cxx:23
 AliTRDrawData.cxx:24
 AliTRDrawData.cxx:25
 AliTRDrawData.cxx:26
 AliTRDrawData.cxx:27
 AliTRDrawData.cxx:28
 AliTRDrawData.cxx:29
 AliTRDrawData.cxx:30
 AliTRDrawData.cxx:31
 AliTRDrawData.cxx:32
 AliTRDrawData.cxx:33
 AliTRDrawData.cxx:34
 AliTRDrawData.cxx:35
 AliTRDrawData.cxx:36
 AliTRDrawData.cxx:37
 AliTRDrawData.cxx:38
 AliTRDrawData.cxx:39
 AliTRDrawData.cxx:40
 AliTRDrawData.cxx:41
 AliTRDrawData.cxx:42
 AliTRDrawData.cxx:43
 AliTRDrawData.cxx:44
 AliTRDrawData.cxx:45
 AliTRDrawData.cxx:46
 AliTRDrawData.cxx:47
 AliTRDrawData.cxx:48
 AliTRDrawData.cxx:49
 AliTRDrawData.cxx:50
 AliTRDrawData.cxx:51
 AliTRDrawData.cxx:52
 AliTRDrawData.cxx:53
 AliTRDrawData.cxx:54
 AliTRDrawData.cxx:55
 AliTRDrawData.cxx:56
 AliTRDrawData.cxx:57
 AliTRDrawData.cxx:58
 AliTRDrawData.cxx:59
 AliTRDrawData.cxx:60
 AliTRDrawData.cxx:61
 AliTRDrawData.cxx:62
 AliTRDrawData.cxx:63
 AliTRDrawData.cxx:64
 AliTRDrawData.cxx:65
 AliTRDrawData.cxx:66
 AliTRDrawData.cxx:67
 AliTRDrawData.cxx:68
 AliTRDrawData.cxx:69
 AliTRDrawData.cxx:70
 AliTRDrawData.cxx:71
 AliTRDrawData.cxx:72
 AliTRDrawData.cxx:73
 AliTRDrawData.cxx:74
 AliTRDrawData.cxx:75
 AliTRDrawData.cxx:76
 AliTRDrawData.cxx:77
 AliTRDrawData.cxx:78
 AliTRDrawData.cxx:79
 AliTRDrawData.cxx:80
 AliTRDrawData.cxx:81
 AliTRDrawData.cxx:82
 AliTRDrawData.cxx:83
 AliTRDrawData.cxx:84
 AliTRDrawData.cxx:85
 AliTRDrawData.cxx:86
 AliTRDrawData.cxx:87
 AliTRDrawData.cxx:88
 AliTRDrawData.cxx:89
 AliTRDrawData.cxx:90
 AliTRDrawData.cxx:91
 AliTRDrawData.cxx:92
 AliTRDrawData.cxx:93
 AliTRDrawData.cxx:94
 AliTRDrawData.cxx:95
 AliTRDrawData.cxx:96
 AliTRDrawData.cxx:97
 AliTRDrawData.cxx:98
 AliTRDrawData.cxx:99
 AliTRDrawData.cxx:100
 AliTRDrawData.cxx:101
 AliTRDrawData.cxx:102
 AliTRDrawData.cxx:103
 AliTRDrawData.cxx:104
 AliTRDrawData.cxx:105
 AliTRDrawData.cxx:106
 AliTRDrawData.cxx:107
 AliTRDrawData.cxx:108
 AliTRDrawData.cxx:109
 AliTRDrawData.cxx:110
 AliTRDrawData.cxx:111
 AliTRDrawData.cxx:112
 AliTRDrawData.cxx:113
 AliTRDrawData.cxx:114
 AliTRDrawData.cxx:115
 AliTRDrawData.cxx:116
 AliTRDrawData.cxx:117
 AliTRDrawData.cxx:118
 AliTRDrawData.cxx:119
 AliTRDrawData.cxx:120
 AliTRDrawData.cxx:121
 AliTRDrawData.cxx:122
 AliTRDrawData.cxx:123
 AliTRDrawData.cxx:124
 AliTRDrawData.cxx:125
 AliTRDrawData.cxx:126
 AliTRDrawData.cxx:127
 AliTRDrawData.cxx:128
 AliTRDrawData.cxx:129
 AliTRDrawData.cxx:130
 AliTRDrawData.cxx:131
 AliTRDrawData.cxx:132
 AliTRDrawData.cxx:133
 AliTRDrawData.cxx:134
 AliTRDrawData.cxx:135
 AliTRDrawData.cxx:136
 AliTRDrawData.cxx:137
 AliTRDrawData.cxx:138
 AliTRDrawData.cxx:139
 AliTRDrawData.cxx:140
 AliTRDrawData.cxx:141
 AliTRDrawData.cxx:142
 AliTRDrawData.cxx:143
 AliTRDrawData.cxx:144
 AliTRDrawData.cxx:145
 AliTRDrawData.cxx:146
 AliTRDrawData.cxx:147
 AliTRDrawData.cxx:148
 AliTRDrawData.cxx:149
 AliTRDrawData.cxx:150
 AliTRDrawData.cxx:151
 AliTRDrawData.cxx:152
 AliTRDrawData.cxx:153
 AliTRDrawData.cxx:154
 AliTRDrawData.cxx:155
 AliTRDrawData.cxx:156
 AliTRDrawData.cxx:157
 AliTRDrawData.cxx:158
 AliTRDrawData.cxx:159
 AliTRDrawData.cxx:160
 AliTRDrawData.cxx:161
 AliTRDrawData.cxx:162
 AliTRDrawData.cxx:163
 AliTRDrawData.cxx:164
 AliTRDrawData.cxx:165
 AliTRDrawData.cxx:166
 AliTRDrawData.cxx:167
 AliTRDrawData.cxx:168
 AliTRDrawData.cxx:169
 AliTRDrawData.cxx:170
 AliTRDrawData.cxx:171
 AliTRDrawData.cxx:172
 AliTRDrawData.cxx:173
 AliTRDrawData.cxx:174
 AliTRDrawData.cxx:175
 AliTRDrawData.cxx:176
 AliTRDrawData.cxx:177
 AliTRDrawData.cxx:178
 AliTRDrawData.cxx:179
 AliTRDrawData.cxx:180
 AliTRDrawData.cxx:181
 AliTRDrawData.cxx:182
 AliTRDrawData.cxx:183
 AliTRDrawData.cxx:184
 AliTRDrawData.cxx:185
 AliTRDrawData.cxx:186
 AliTRDrawData.cxx:187
 AliTRDrawData.cxx:188
 AliTRDrawData.cxx:189
 AliTRDrawData.cxx:190
 AliTRDrawData.cxx:191
 AliTRDrawData.cxx:192
 AliTRDrawData.cxx:193
 AliTRDrawData.cxx:194
 AliTRDrawData.cxx:195
 AliTRDrawData.cxx:196
 AliTRDrawData.cxx:197
 AliTRDrawData.cxx:198
 AliTRDrawData.cxx:199
 AliTRDrawData.cxx:200
 AliTRDrawData.cxx:201
 AliTRDrawData.cxx:202
 AliTRDrawData.cxx:203
 AliTRDrawData.cxx:204
 AliTRDrawData.cxx:205
 AliTRDrawData.cxx:206
 AliTRDrawData.cxx:207
 AliTRDrawData.cxx:208
 AliTRDrawData.cxx:209
 AliTRDrawData.cxx:210
 AliTRDrawData.cxx:211
 AliTRDrawData.cxx:212
 AliTRDrawData.cxx:213
 AliTRDrawData.cxx:214
 AliTRDrawData.cxx:215
 AliTRDrawData.cxx:216
 AliTRDrawData.cxx:217
 AliTRDrawData.cxx:218
 AliTRDrawData.cxx:219
 AliTRDrawData.cxx:220
 AliTRDrawData.cxx:221
 AliTRDrawData.cxx:222
 AliTRDrawData.cxx:223
 AliTRDrawData.cxx:224
 AliTRDrawData.cxx:225
 AliTRDrawData.cxx:226
 AliTRDrawData.cxx:227
 AliTRDrawData.cxx:228
 AliTRDrawData.cxx:229
 AliTRDrawData.cxx:230
 AliTRDrawData.cxx:231
 AliTRDrawData.cxx:232
 AliTRDrawData.cxx:233
 AliTRDrawData.cxx:234
 AliTRDrawData.cxx:235
 AliTRDrawData.cxx:236
 AliTRDrawData.cxx:237
 AliTRDrawData.cxx:238
 AliTRDrawData.cxx:239
 AliTRDrawData.cxx:240
 AliTRDrawData.cxx:241
 AliTRDrawData.cxx:242
 AliTRDrawData.cxx:243
 AliTRDrawData.cxx:244
 AliTRDrawData.cxx:245
 AliTRDrawData.cxx:246
 AliTRDrawData.cxx:247
 AliTRDrawData.cxx:248
 AliTRDrawData.cxx:249
 AliTRDrawData.cxx:250
 AliTRDrawData.cxx:251
 AliTRDrawData.cxx:252
 AliTRDrawData.cxx:253
 AliTRDrawData.cxx:254
 AliTRDrawData.cxx:255
 AliTRDrawData.cxx:256
 AliTRDrawData.cxx:257
 AliTRDrawData.cxx:258
 AliTRDrawData.cxx:259
 AliTRDrawData.cxx:260
 AliTRDrawData.cxx:261
 AliTRDrawData.cxx:262
 AliTRDrawData.cxx:263
 AliTRDrawData.cxx:264
 AliTRDrawData.cxx:265
 AliTRDrawData.cxx:266
 AliTRDrawData.cxx:267
 AliTRDrawData.cxx:268
 AliTRDrawData.cxx:269
 AliTRDrawData.cxx:270
 AliTRDrawData.cxx:271
 AliTRDrawData.cxx:272
 AliTRDrawData.cxx:273
 AliTRDrawData.cxx:274
 AliTRDrawData.cxx:275
 AliTRDrawData.cxx:276
 AliTRDrawData.cxx:277
 AliTRDrawData.cxx:278
 AliTRDrawData.cxx:279
 AliTRDrawData.cxx:280
 AliTRDrawData.cxx:281
 AliTRDrawData.cxx:282
 AliTRDrawData.cxx:283
 AliTRDrawData.cxx:284
 AliTRDrawData.cxx:285
 AliTRDrawData.cxx:286
 AliTRDrawData.cxx:287
 AliTRDrawData.cxx:288
 AliTRDrawData.cxx:289
 AliTRDrawData.cxx:290
 AliTRDrawData.cxx:291
 AliTRDrawData.cxx:292
 AliTRDrawData.cxx:293
 AliTRDrawData.cxx:294
 AliTRDrawData.cxx:295
 AliTRDrawData.cxx:296
 AliTRDrawData.cxx:297
 AliTRDrawData.cxx:298
 AliTRDrawData.cxx:299
 AliTRDrawData.cxx:300
 AliTRDrawData.cxx:301
 AliTRDrawData.cxx:302
 AliTRDrawData.cxx:303
 AliTRDrawData.cxx:304
 AliTRDrawData.cxx:305
 AliTRDrawData.cxx:306
 AliTRDrawData.cxx:307
 AliTRDrawData.cxx:308
 AliTRDrawData.cxx:309
 AliTRDrawData.cxx:310
 AliTRDrawData.cxx:311
 AliTRDrawData.cxx:312
 AliTRDrawData.cxx:313
 AliTRDrawData.cxx:314
 AliTRDrawData.cxx:315
 AliTRDrawData.cxx:316
 AliTRDrawData.cxx:317
 AliTRDrawData.cxx:318
 AliTRDrawData.cxx:319
 AliTRDrawData.cxx:320
 AliTRDrawData.cxx:321
 AliTRDrawData.cxx:322
 AliTRDrawData.cxx:323
 AliTRDrawData.cxx:324
 AliTRDrawData.cxx:325
 AliTRDrawData.cxx:326
 AliTRDrawData.cxx:327
 AliTRDrawData.cxx:328
 AliTRDrawData.cxx:329
 AliTRDrawData.cxx:330
 AliTRDrawData.cxx:331
 AliTRDrawData.cxx:332
 AliTRDrawData.cxx:333
 AliTRDrawData.cxx:334
 AliTRDrawData.cxx:335
 AliTRDrawData.cxx:336
 AliTRDrawData.cxx:337
 AliTRDrawData.cxx:338
 AliTRDrawData.cxx:339
 AliTRDrawData.cxx:340
 AliTRDrawData.cxx:341
 AliTRDrawData.cxx:342
 AliTRDrawData.cxx:343
 AliTRDrawData.cxx:344
 AliTRDrawData.cxx:345
 AliTRDrawData.cxx:346
 AliTRDrawData.cxx:347
 AliTRDrawData.cxx:348
 AliTRDrawData.cxx:349
 AliTRDrawData.cxx:350
 AliTRDrawData.cxx:351
 AliTRDrawData.cxx:352
 AliTRDrawData.cxx:353
 AliTRDrawData.cxx:354
 AliTRDrawData.cxx:355
 AliTRDrawData.cxx:356
 AliTRDrawData.cxx:357
 AliTRDrawData.cxx:358
 AliTRDrawData.cxx:359
 AliTRDrawData.cxx:360
 AliTRDrawData.cxx:361
 AliTRDrawData.cxx:362
 AliTRDrawData.cxx:363
 AliTRDrawData.cxx:364
 AliTRDrawData.cxx:365
 AliTRDrawData.cxx:366
 AliTRDrawData.cxx:367
 AliTRDrawData.cxx:368
 AliTRDrawData.cxx:369
 AliTRDrawData.cxx:370
 AliTRDrawData.cxx:371
 AliTRDrawData.cxx:372
 AliTRDrawData.cxx:373
 AliTRDrawData.cxx:374
 AliTRDrawData.cxx:375
 AliTRDrawData.cxx:376
 AliTRDrawData.cxx:377
 AliTRDrawData.cxx:378
 AliTRDrawData.cxx:379
 AliTRDrawData.cxx:380
 AliTRDrawData.cxx:381
 AliTRDrawData.cxx:382
 AliTRDrawData.cxx:383
 AliTRDrawData.cxx:384
 AliTRDrawData.cxx:385
 AliTRDrawData.cxx:386
 AliTRDrawData.cxx:387
 AliTRDrawData.cxx:388
 AliTRDrawData.cxx:389
 AliTRDrawData.cxx:390
 AliTRDrawData.cxx:391
 AliTRDrawData.cxx:392
 AliTRDrawData.cxx:393
 AliTRDrawData.cxx:394
 AliTRDrawData.cxx:395
 AliTRDrawData.cxx:396
 AliTRDrawData.cxx:397
 AliTRDrawData.cxx:398
 AliTRDrawData.cxx:399
 AliTRDrawData.cxx:400
 AliTRDrawData.cxx:401
 AliTRDrawData.cxx:402
 AliTRDrawData.cxx:403
 AliTRDrawData.cxx:404
 AliTRDrawData.cxx:405
 AliTRDrawData.cxx:406
 AliTRDrawData.cxx:407
 AliTRDrawData.cxx:408
 AliTRDrawData.cxx:409
 AliTRDrawData.cxx:410
 AliTRDrawData.cxx:411
 AliTRDrawData.cxx:412
 AliTRDrawData.cxx:413
 AliTRDrawData.cxx:414
 AliTRDrawData.cxx:415
 AliTRDrawData.cxx:416
 AliTRDrawData.cxx:417
 AliTRDrawData.cxx:418
 AliTRDrawData.cxx:419
 AliTRDrawData.cxx:420
 AliTRDrawData.cxx:421
 AliTRDrawData.cxx:422
 AliTRDrawData.cxx:423
 AliTRDrawData.cxx:424
 AliTRDrawData.cxx:425
 AliTRDrawData.cxx:426
 AliTRDrawData.cxx:427
 AliTRDrawData.cxx:428
 AliTRDrawData.cxx:429
 AliTRDrawData.cxx:430
 AliTRDrawData.cxx:431
 AliTRDrawData.cxx:432
 AliTRDrawData.cxx:433
 AliTRDrawData.cxx:434
 AliTRDrawData.cxx:435
 AliTRDrawData.cxx:436
 AliTRDrawData.cxx:437
 AliTRDrawData.cxx:438
 AliTRDrawData.cxx:439
 AliTRDrawData.cxx:440
 AliTRDrawData.cxx:441
 AliTRDrawData.cxx:442
 AliTRDrawData.cxx:443
 AliTRDrawData.cxx:444
 AliTRDrawData.cxx:445
 AliTRDrawData.cxx:446
 AliTRDrawData.cxx:447
 AliTRDrawData.cxx:448
 AliTRDrawData.cxx:449
 AliTRDrawData.cxx:450
 AliTRDrawData.cxx:451
 AliTRDrawData.cxx:452
 AliTRDrawData.cxx:453
 AliTRDrawData.cxx:454
 AliTRDrawData.cxx:455
 AliTRDrawData.cxx:456
 AliTRDrawData.cxx:457
 AliTRDrawData.cxx:458
 AliTRDrawData.cxx:459
 AliTRDrawData.cxx:460
 AliTRDrawData.cxx:461
 AliTRDrawData.cxx:462
 AliTRDrawData.cxx:463
 AliTRDrawData.cxx:464
 AliTRDrawData.cxx:465
 AliTRDrawData.cxx:466
 AliTRDrawData.cxx:467
 AliTRDrawData.cxx:468
 AliTRDrawData.cxx:469
 AliTRDrawData.cxx:470
 AliTRDrawData.cxx:471
 AliTRDrawData.cxx:472
 AliTRDrawData.cxx:473
 AliTRDrawData.cxx:474
 AliTRDrawData.cxx:475
 AliTRDrawData.cxx:476
 AliTRDrawData.cxx:477
 AliTRDrawData.cxx:478
 AliTRDrawData.cxx:479
 AliTRDrawData.cxx:480
 AliTRDrawData.cxx:481
 AliTRDrawData.cxx:482
 AliTRDrawData.cxx:483
 AliTRDrawData.cxx:484
 AliTRDrawData.cxx:485
 AliTRDrawData.cxx:486
 AliTRDrawData.cxx:487
 AliTRDrawData.cxx:488
 AliTRDrawData.cxx:489
 AliTRDrawData.cxx:490
 AliTRDrawData.cxx:491
 AliTRDrawData.cxx:492
 AliTRDrawData.cxx:493
 AliTRDrawData.cxx:494
 AliTRDrawData.cxx:495
 AliTRDrawData.cxx:496
 AliTRDrawData.cxx:497
 AliTRDrawData.cxx:498
 AliTRDrawData.cxx:499
 AliTRDrawData.cxx:500
 AliTRDrawData.cxx:501
 AliTRDrawData.cxx:502
 AliTRDrawData.cxx:503
 AliTRDrawData.cxx:504
 AliTRDrawData.cxx:505
 AliTRDrawData.cxx:506
 AliTRDrawData.cxx:507
 AliTRDrawData.cxx:508
 AliTRDrawData.cxx:509
 AliTRDrawData.cxx:510
 AliTRDrawData.cxx:511
 AliTRDrawData.cxx:512
 AliTRDrawData.cxx:513
 AliTRDrawData.cxx:514
 AliTRDrawData.cxx:515
 AliTRDrawData.cxx:516
 AliTRDrawData.cxx:517
 AliTRDrawData.cxx:518
 AliTRDrawData.cxx:519
 AliTRDrawData.cxx:520
 AliTRDrawData.cxx:521
 AliTRDrawData.cxx:522
 AliTRDrawData.cxx:523
 AliTRDrawData.cxx:524
 AliTRDrawData.cxx:525
 AliTRDrawData.cxx:526
 AliTRDrawData.cxx:527
 AliTRDrawData.cxx:528
 AliTRDrawData.cxx:529
 AliTRDrawData.cxx:530
 AliTRDrawData.cxx:531
 AliTRDrawData.cxx:532
 AliTRDrawData.cxx:533
 AliTRDrawData.cxx:534
 AliTRDrawData.cxx:535
 AliTRDrawData.cxx:536
 AliTRDrawData.cxx:537
 AliTRDrawData.cxx:538
 AliTRDrawData.cxx:539
 AliTRDrawData.cxx:540
 AliTRDrawData.cxx:541
 AliTRDrawData.cxx:542
 AliTRDrawData.cxx:543
 AliTRDrawData.cxx:544
 AliTRDrawData.cxx:545
 AliTRDrawData.cxx:546
 AliTRDrawData.cxx:547
 AliTRDrawData.cxx:548
 AliTRDrawData.cxx:549
 AliTRDrawData.cxx:550
 AliTRDrawData.cxx:551
 AliTRDrawData.cxx:552
 AliTRDrawData.cxx:553
 AliTRDrawData.cxx:554
 AliTRDrawData.cxx:555
 AliTRDrawData.cxx:556
 AliTRDrawData.cxx:557
 AliTRDrawData.cxx:558
 AliTRDrawData.cxx:559
 AliTRDrawData.cxx:560
 AliTRDrawData.cxx:561
 AliTRDrawData.cxx:562
 AliTRDrawData.cxx:563
 AliTRDrawData.cxx:564
 AliTRDrawData.cxx:565
 AliTRDrawData.cxx:566
 AliTRDrawData.cxx:567
 AliTRDrawData.cxx:568
 AliTRDrawData.cxx:569
 AliTRDrawData.cxx:570
 AliTRDrawData.cxx:571
 AliTRDrawData.cxx:572
 AliTRDrawData.cxx:573
 AliTRDrawData.cxx:574
 AliTRDrawData.cxx:575
 AliTRDrawData.cxx:576
 AliTRDrawData.cxx:577
 AliTRDrawData.cxx:578
 AliTRDrawData.cxx:579
 AliTRDrawData.cxx:580
 AliTRDrawData.cxx:581
 AliTRDrawData.cxx:582
 AliTRDrawData.cxx:583
 AliTRDrawData.cxx:584
 AliTRDrawData.cxx:585
 AliTRDrawData.cxx:586
 AliTRDrawData.cxx:587
 AliTRDrawData.cxx:588
 AliTRDrawData.cxx:589
 AliTRDrawData.cxx:590
 AliTRDrawData.cxx:591
 AliTRDrawData.cxx:592
 AliTRDrawData.cxx:593
 AliTRDrawData.cxx:594
 AliTRDrawData.cxx:595
 AliTRDrawData.cxx:596
 AliTRDrawData.cxx:597
 AliTRDrawData.cxx:598
 AliTRDrawData.cxx:599
 AliTRDrawData.cxx:600
 AliTRDrawData.cxx:601
 AliTRDrawData.cxx:602
 AliTRDrawData.cxx:603
 AliTRDrawData.cxx:604
 AliTRDrawData.cxx:605
 AliTRDrawData.cxx:606
 AliTRDrawData.cxx:607
 AliTRDrawData.cxx:608
 AliTRDrawData.cxx:609
 AliTRDrawData.cxx:610
 AliTRDrawData.cxx:611
 AliTRDrawData.cxx:612
 AliTRDrawData.cxx:613
 AliTRDrawData.cxx:614
 AliTRDrawData.cxx:615
 AliTRDrawData.cxx:616
 AliTRDrawData.cxx:617
 AliTRDrawData.cxx:618
 AliTRDrawData.cxx:619
 AliTRDrawData.cxx:620
 AliTRDrawData.cxx:621
 AliTRDrawData.cxx:622
 AliTRDrawData.cxx:623
 AliTRDrawData.cxx:624
 AliTRDrawData.cxx:625
 AliTRDrawData.cxx:626
 AliTRDrawData.cxx:627
 AliTRDrawData.cxx:628
 AliTRDrawData.cxx:629
 AliTRDrawData.cxx:630
 AliTRDrawData.cxx:631
 AliTRDrawData.cxx:632
 AliTRDrawData.cxx:633
 AliTRDrawData.cxx:634
 AliTRDrawData.cxx:635
 AliTRDrawData.cxx:636
 AliTRDrawData.cxx:637
 AliTRDrawData.cxx:638
 AliTRDrawData.cxx:639
 AliTRDrawData.cxx:640
 AliTRDrawData.cxx:641
 AliTRDrawData.cxx:642
 AliTRDrawData.cxx:643
 AliTRDrawData.cxx:644
 AliTRDrawData.cxx:645
 AliTRDrawData.cxx:646
 AliTRDrawData.cxx:647
 AliTRDrawData.cxx:648
 AliTRDrawData.cxx:649
 AliTRDrawData.cxx:650
 AliTRDrawData.cxx:651
 AliTRDrawData.cxx:652
 AliTRDrawData.cxx:653
 AliTRDrawData.cxx:654
 AliTRDrawData.cxx:655
 AliTRDrawData.cxx:656
 AliTRDrawData.cxx:657
 AliTRDrawData.cxx:658
 AliTRDrawData.cxx:659
 AliTRDrawData.cxx:660
 AliTRDrawData.cxx:661
 AliTRDrawData.cxx:662
 AliTRDrawData.cxx:663
 AliTRDrawData.cxx:664
 AliTRDrawData.cxx:665
 AliTRDrawData.cxx:666
 AliTRDrawData.cxx:667
 AliTRDrawData.cxx:668
 AliTRDrawData.cxx:669
 AliTRDrawData.cxx:670
 AliTRDrawData.cxx:671
 AliTRDrawData.cxx:672
 AliTRDrawData.cxx:673
 AliTRDrawData.cxx:674
 AliTRDrawData.cxx:675
 AliTRDrawData.cxx:676
 AliTRDrawData.cxx:677
 AliTRDrawData.cxx:678
 AliTRDrawData.cxx:679
 AliTRDrawData.cxx:680
 AliTRDrawData.cxx:681
 AliTRDrawData.cxx:682
 AliTRDrawData.cxx:683
 AliTRDrawData.cxx:684
 AliTRDrawData.cxx:685
 AliTRDrawData.cxx:686
 AliTRDrawData.cxx:687
 AliTRDrawData.cxx:688
 AliTRDrawData.cxx:689
 AliTRDrawData.cxx:690
 AliTRDrawData.cxx:691
 AliTRDrawData.cxx:692
 AliTRDrawData.cxx:693
 AliTRDrawData.cxx:694
 AliTRDrawData.cxx:695
 AliTRDrawData.cxx:696
 AliTRDrawData.cxx:697
 AliTRDrawData.cxx:698
 AliTRDrawData.cxx:699
 AliTRDrawData.cxx:700
 AliTRDrawData.cxx:701
 AliTRDrawData.cxx:702
 AliTRDrawData.cxx:703
 AliTRDrawData.cxx:704
 AliTRDrawData.cxx:705
 AliTRDrawData.cxx:706
 AliTRDrawData.cxx:707
 AliTRDrawData.cxx:708
 AliTRDrawData.cxx:709
 AliTRDrawData.cxx:710
 AliTRDrawData.cxx:711
 AliTRDrawData.cxx:712
 AliTRDrawData.cxx:713
 AliTRDrawData.cxx:714
 AliTRDrawData.cxx:715
 AliTRDrawData.cxx:716
 AliTRDrawData.cxx:717
 AliTRDrawData.cxx:718
 AliTRDrawData.cxx:719
 AliTRDrawData.cxx:720
 AliTRDrawData.cxx:721
 AliTRDrawData.cxx:722
 AliTRDrawData.cxx:723
 AliTRDrawData.cxx:724
 AliTRDrawData.cxx:725
 AliTRDrawData.cxx:726
 AliTRDrawData.cxx:727
 AliTRDrawData.cxx:728
 AliTRDrawData.cxx:729
 AliTRDrawData.cxx:730
 AliTRDrawData.cxx:731
 AliTRDrawData.cxx:732
 AliTRDrawData.cxx:733
 AliTRDrawData.cxx:734
 AliTRDrawData.cxx:735
 AliTRDrawData.cxx:736
 AliTRDrawData.cxx:737
 AliTRDrawData.cxx:738
 AliTRDrawData.cxx:739
 AliTRDrawData.cxx:740