1 /**************************************************************************
2 * Copyright(c) 1998-2003, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 //This class conteins all the methods to create raw data
20 //It produces DDL with both compressed and uncompressed format.
21 //For compression we use the optimized table wich needs
24 #include <TObjArray.h>
27 #include <Riostream.h>
30 //#include "AliAltroBuffer.h"
31 #include "AliAltroBufferV3.h"
32 #include "AliTPCAltroMapping.h"
33 #include "AliTPCDDLRawData.h"
36 ClassImp(AliTPCDDLRawData)
37 ////////////////////////////////////////////////////////////////////////////////////////
39 AliTPCDDLRawData::AliTPCDDLRawData(const AliTPCDDLRawData &source):
44 fVerbose=source.fVerbose;
48 AliTPCDDLRawData& AliTPCDDLRawData::operator=(const AliTPCDDLRawData &source){
50 fVerbose=source.fVerbose;
55 ////////////////////////////////////////////////////////////////////////////
56 void AliTPCDDLRawData::RawData(const char* inputFileName){
58 //Number of DDL=2*36+4*36=216
59 //2 DDL for each inner sector
60 //4 DDL for each outer sector
63 f.open(inputFileName,ios::binary);
65 f.open(inputFileName);
67 if(!f){Error("RawData", "File doesn't exist !!");return;}
78 //AliAltroBuffer is used in write mode to generate raw data file
81 AliAltroBuffer *buffer=NULL;
82 Int_t pSecNumber=-1; //Previous Sector number
83 Int_t pRowNumber=-1; //Previous Row number
84 Int_t pPadNumber=-1; //Previous Pad number
85 Int_t pTimeBin=-1; //Previous Time-Bin
86 Int_t pSubSector=-1; //Previous Sub Sector
91 TString path = gSystem->Getenv("ALICE_ROOT");
92 path += "/TPC/mapping/Patch";
94 AliTPCAltroMapping *mapping[6];
95 for(Int_t i = 0; i < 6; i++) {
99 mapping[i] = new AliTPCAltroMapping(path2.Data());
103 while (f.read((char*)(&data),sizeof(data))){
109 pSubSector=data.SubSec;
112 ddlNumber=data.Sec*2+data.SubSec;
114 ddlNumber=72+(data.Sec-36)*4+data.SubSec;
115 strncpy(filename,AliDAQ::DdlFileName("TPC",ddlNumber),100);
116 Int_t patchIndex = data.SubSec;
117 if(data.Sec>=36) patchIndex += 2;
118 //buffer=new AliAltroBuffer(filename,mapping[patchIndex]);
119 buffer=new AliAltroBufferV3(filename,mapping[patchIndex]);
120 //size magic word sector number sub-sector number 0 for TPC 0 for uncompressed
121 buffer->WriteDataHeader(kTRUE,kFALSE);//Dummy;
123 buffer->FillBuffer(data.Dig);
127 if ( (data.Time==(pTimeBin+1)) &&
128 (pPadNumber==data.Pad) &&
129 (pRowNumber==data.Row) &&
130 (pSecNumber==data.Sec) &&
131 (pSubSector==data.SubSec)){
135 buffer->FillBuffer(pTimeBin);
136 buffer->FillBuffer(bunchLength+2);
138 if ((pPadNumber!=data.Pad)||(pRowNumber!=data.Row)||(pSecNumber!=data.Sec)||(pSubSector!=data.SubSec)){
139 //Trailer is formatted and inserted!!
140 buffer->WriteTrailer(nwords,pPadNumber,pRowNumber,pSecNumber);
144 if(pSecNumber!=data.Sec || pSubSector!=data.SubSec){
145 //size magic word sector number sub-sector number 0 for TPC 0 for uncompressed
147 buffer->WriteDataHeader(kFALSE,kFALSE);
148 //cout<<"Data header for DDL:"<<PSecNumber<<" Sub-sec:"<<PSubSector<<endl;
152 ddlNumber=data.Sec*2+data.SubSec;
154 ddlNumber=72+(data.Sec-36)*4+data.SubSec;
155 strncpy(filename,AliDAQ::DdlFileName("TPC",ddlNumber),100);
156 Int_t patchIndex = data.SubSec;
157 if(data.Sec>=36) patchIndex += 2;
158 // buffer=new AliAltroBuffer(filename,mapping[patchIndex]);
159 buffer=new AliAltroBufferV3(filename,mapping[patchIndex]);
160 buffer->WriteDataHeader(kTRUE,kFALSE);//Dummy;
161 pSubSector=data.SubSec;
171 buffer->FillBuffer(data.Dig);
176 buffer->FillBuffer(pTimeBin);
177 buffer->FillBuffer(bunchLength+2);
179 buffer->WriteTrailer(nwords,pPadNumber,pRowNumber,pSecNumber);
182 buffer->WriteDataHeader(kFALSE,kFALSE);
183 //cout<<"Data header for D D L:"<<pSecNumber<<" Sub-sec:"<<pSubSector<<endl;
187 for(Int_t i = 0; i < 6; i++) delete mapping[i];