ROOT logo
/**************************************************************************
 * Copyright(c) 1998-2003, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
/* $Id$ */


//This class conteins all the methods to create raw data 
//as par a given DDL.
//It produces DDL with both compressed and uncompressed format.
//For compression we use the optimized table wich needs 
//to be provided.

#include <TObjArray.h>
#include <TString.h>
#include <TSystem.h>
#include <Riostream.h>
#include <stdio.h>
#include <stdlib.h>
//#include "AliAltroBuffer.h"
#include "AliAltroBufferV3.h"
#include "AliTPCAltroMapping.h"
#include "AliTPCDDLRawData.h"
#include "AliDAQ.h"

using std::ios;
ClassImp(AliTPCDDLRawData)
////////////////////////////////////////////////////////////////////////////////////////

AliTPCDDLRawData::AliTPCDDLRawData(const AliTPCDDLRawData &source):
  TObject(source),
  fVerbose(0)
{
  // Copy Constructor
  fVerbose=source.fVerbose;
  return;
}

AliTPCDDLRawData& AliTPCDDLRawData::operator=(const AliTPCDDLRawData &source){
  //Assigment operator
  if (this == &source) return (*this);
  fVerbose=source.fVerbose;
  return *this;
}


////////////////////////////////////////////////////////////////////////////
void AliTPCDDLRawData::RawData(const char* inputFileName){
  //Raw data generation
  //Number of DDL=2*36+4*36=216
  //2 DDL for each inner sector
  //4 DDL for each outer sector
  ifstream f;
#ifndef __DECCXX
  f.open(inputFileName,ios::binary);
#else
  f.open(inputFileName);
#endif
  if(!f){Error("RawData", "File doesn't exist !!");return;}
  struct DataPad{
    Int_t Sec;
    Int_t SubSec;
    Int_t Row;
    Int_t Pad;
    Int_t Dig;
    Int_t Time;
  };
  DataPad data;

  //AliAltroBuffer is used in write mode to generate raw data file
  char  filename[101];
  Int_t ddlNumber=0;
  AliAltroBuffer *buffer=NULL;
  Int_t pSecNumber=-1;  //Previous Sector number
  Int_t pRowNumber=-1;  //Previous Row number  
  Int_t pPadNumber=-1;  //Previous Pad number
  Int_t pTimeBin=-1;    //Previous Time-Bin
  Int_t pSubSector=-1;  //Previous Sub Sector
  Int_t bunchLength=0;
  Int_t nwords=0;
  UInt_t numPackets=0;

  TString path = gSystem->Getenv("ALICE_ROOT");
  path += "/TPC/mapping/Patch";
  TString path2;
  AliTPCAltroMapping *mapping[6];
  for(Int_t i = 0; i < 6; i++) {
    path2 = path;
    path2 += i;
    path2 += ".data";
    mapping[i] = new AliTPCAltroMapping(path2.Data());
  }


  while (f.read((char*)(&data),sizeof(data))){
    if (pPadNumber==-1){
      pSecNumber=data.Sec;
      pRowNumber=data.Row;
      pPadNumber=data.Pad;
      pTimeBin=data.Time;
      pSubSector=data.SubSec;

      if(data.Sec<36)
	ddlNumber=data.Sec*2+data.SubSec;
      else
	ddlNumber=72+(data.Sec-36)*4+data.SubSec;
      strncpy(filename,AliDAQ::DdlFileName("TPC",ddlNumber),100);
      Int_t patchIndex = data.SubSec;
      if(data.Sec>=36) patchIndex += 2;
      //buffer=new AliAltroBuffer(filename,mapping[patchIndex]);
      buffer=new AliAltroBufferV3(filename,mapping[patchIndex]);
      //size magic word sector number sub-sector number 0 for TPC 0 for uncompressed
      buffer->WriteDataHeader(kTRUE,kFALSE);//Dummy;
      bunchLength=1;
      buffer->FillBuffer(data.Dig);
      nwords++;
    }//end if
    else{
      if ( (data.Time==(pTimeBin+1)) &&
	   (pPadNumber==data.Pad) &&
	   (pRowNumber==data.Row) &&
	   (pSecNumber==data.Sec) &&
	   (pSubSector==data.SubSec)){
	bunchLength++;
      }//end if
      else{
	buffer->FillBuffer(pTimeBin);
	buffer->FillBuffer(bunchLength+2);
	nwords+=2;
	if ((pPadNumber!=data.Pad)||(pRowNumber!=data.Row)||(pSecNumber!=data.Sec)||(pSubSector!=data.SubSec)){
	  //Trailer is formatted and inserted!!
	  buffer->WriteTrailer(nwords,pPadNumber,pRowNumber,pSecNumber);
	  numPackets++;
	  nwords=0;

	  if(pSecNumber!=data.Sec || pSubSector!=data.SubSec){
	    //size magic word sector number sub-sector number 0 for TPC 0 for uncompressed
	    buffer->Flush();
	    buffer->WriteDataHeader(kFALSE,kFALSE);
	    //cout<<"Data header for DDL:"<<PSecNumber<<" Sub-sec:"<<PSubSector<<endl;
	    delete buffer;

	    if(data.Sec<36)
	      ddlNumber=data.Sec*2+data.SubSec;
	    else
	      ddlNumber=72+(data.Sec-36)*4+data.SubSec;
	    strncpy(filename,AliDAQ::DdlFileName("TPC",ddlNumber),100);
	    Int_t patchIndex = data.SubSec;
	    if(data.Sec>=36) patchIndex += 2;
	    // buffer=new AliAltroBuffer(filename,mapping[patchIndex]);
            buffer=new AliAltroBufferV3(filename,mapping[patchIndex]);
	    buffer->WriteDataHeader(kTRUE,kFALSE);//Dummy;
	    pSubSector=data.SubSec;
	  }//end if
	}//end if
	
	bunchLength=1;
	pPadNumber=data.Pad;
	pRowNumber=data.Row;
	pSecNumber=data.Sec;
      }//end else
      pTimeBin=data.Time;
      buffer->FillBuffer(data.Dig);
      nwords++;
    }//end else
  }//end while
  if (buffer) {
    buffer->FillBuffer(pTimeBin);
    buffer->FillBuffer(bunchLength+2);
    nwords+=2;
    buffer->WriteTrailer(nwords,pPadNumber,pRowNumber,pSecNumber);
    //write the  D.H.
    buffer->Flush();
    buffer->WriteDataHeader(kFALSE,kFALSE);
    //cout<<"Data header for D D L:"<<pSecNumber<<" Sub-sec:"<<pSubSector<<endl;
    delete buffer;
  }

  for(Int_t i = 0; i < 6; i++) delete mapping[i];

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