]> git.uio.no Git - u/mrichter/AliRoot.git/blame_incremental - TPC/AliTPCDDLRawData.cxx
o fix for coverity bug 19907
[u/mrichter/AliRoot.git] / TPC / AliTPCDDLRawData.cxx
... / ...
CommitLineData
1/**************************************************************************
2 * Copyright(c) 1998-2003, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
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 **************************************************************************/
15/* $Id$ */
16
17
18//This class conteins all the methods to create raw data
19//as par a given DDL.
20//It produces DDL with both compressed and uncompressed format.
21//For compression we use the optimized table wich needs
22//to be provided.
23
24#include <TObjArray.h>
25#include <TString.h>
26#include <TSystem.h>
27#include <Riostream.h>
28#include <stdio.h>
29#include <stdlib.h>
30//#include "AliAltroBuffer.h"
31#include "AliAltroBufferV3.h"
32#include "AliTPCAltroMapping.h"
33#include "AliTPCDDLRawData.h"
34#include "AliDAQ.h"
35
36ClassImp(AliTPCDDLRawData)
37////////////////////////////////////////////////////////////////////////////////////////
38
39AliTPCDDLRawData::AliTPCDDLRawData(const AliTPCDDLRawData &source):
40 TObject(source),
41 fVerbose(0)
42{
43 // Copy Constructor
44 fVerbose=source.fVerbose;
45 return;
46}
47
48AliTPCDDLRawData& AliTPCDDLRawData::operator=(const AliTPCDDLRawData &source){
49 //Assigment operator
50 if (this == &source) return (*this);
51 fVerbose=source.fVerbose;
52 return *this;
53}
54
55
56////////////////////////////////////////////////////////////////////////////
57void AliTPCDDLRawData::RawData(const char* inputFileName){
58 //Raw data generation
59 //Number of DDL=2*36+4*36=216
60 //2 DDL for each inner sector
61 //4 DDL for each outer sector
62 ifstream f;
63#ifndef __DECCXX
64 f.open(inputFileName,ios::binary);
65#else
66 f.open(inputFileName);
67#endif
68 if(!f){Error("RawData", "File doesn't exist !!");return;}
69 struct DataPad{
70 Int_t Sec;
71 Int_t SubSec;
72 Int_t Row;
73 Int_t Pad;
74 Int_t Dig;
75 Int_t Time;
76 };
77 DataPad data;
78
79 //AliAltroBuffer is used in write mode to generate raw data file
80 char filename[101];
81 Int_t ddlNumber=0;
82 AliAltroBuffer *buffer=NULL;
83 Int_t pSecNumber=-1; //Previous Sector number
84 Int_t pRowNumber=-1; //Previous Row number
85 Int_t pPadNumber=-1; //Previous Pad number
86 Int_t pTimeBin=-1; //Previous Time-Bin
87 Int_t pSubSector=-1; //Previous Sub Sector
88 Int_t bunchLength=0;
89 Int_t nwords=0;
90 UInt_t numPackets=0;
91
92 TString path = gSystem->Getenv("ALICE_ROOT");
93 path += "/TPC/mapping/Patch";
94 TString path2;
95 AliTPCAltroMapping *mapping[6];
96 for(Int_t i = 0; i < 6; i++) {
97 path2 = path;
98 path2 += i;
99 path2 += ".data";
100 mapping[i] = new AliTPCAltroMapping(path2.Data());
101 }
102
103
104 while (f.read((char*)(&data),sizeof(data))){
105 if (pPadNumber==-1){
106 pSecNumber=data.Sec;
107 pRowNumber=data.Row;
108 pPadNumber=data.Pad;
109 pTimeBin=data.Time;
110 pSubSector=data.SubSec;
111
112 if(data.Sec<36)
113 ddlNumber=data.Sec*2+data.SubSec;
114 else
115 ddlNumber=72+(data.Sec-36)*4+data.SubSec;
116 strncpy(filename,AliDAQ::DdlFileName("TPC",ddlNumber),100);
117 Int_t patchIndex = data.SubSec;
118 if(data.Sec>=36) patchIndex += 2;
119 //buffer=new AliAltroBuffer(filename,mapping[patchIndex]);
120 buffer=new AliAltroBufferV3(filename,mapping[patchIndex]);
121 //size magic word sector number sub-sector number 0 for TPC 0 for uncompressed
122 buffer->WriteDataHeader(kTRUE,kFALSE);//Dummy;
123 bunchLength=1;
124 buffer->FillBuffer(data.Dig);
125 nwords++;
126 }//end if
127 else{
128 if ( (data.Time==(pTimeBin+1)) &&
129 (pPadNumber==data.Pad) &&
130 (pRowNumber==data.Row) &&
131 (pSecNumber==data.Sec) &&
132 (pSubSector==data.SubSec)){
133 bunchLength++;
134 }//end if
135 else{
136 buffer->FillBuffer(pTimeBin);
137 buffer->FillBuffer(bunchLength+2);
138 nwords+=2;
139 if ((pPadNumber!=data.Pad)||(pRowNumber!=data.Row)||(pSecNumber!=data.Sec)||(pSubSector!=data.SubSec)){
140 //Trailer is formatted and inserted!!
141 buffer->WriteTrailer(nwords,pPadNumber,pRowNumber,pSecNumber);
142 numPackets++;
143 nwords=0;
144
145 if(pSecNumber!=data.Sec || pSubSector!=data.SubSec){
146 //size magic word sector number sub-sector number 0 for TPC 0 for uncompressed
147 buffer->Flush();
148 buffer->WriteDataHeader(kFALSE,kFALSE);
149 //cout<<"Data header for DDL:"<<PSecNumber<<" Sub-sec:"<<PSubSector<<endl;
150 delete buffer;
151
152 if(data.Sec<36)
153 ddlNumber=data.Sec*2+data.SubSec;
154 else
155 ddlNumber=72+(data.Sec-36)*4+data.SubSec;
156 strncpy(filename,AliDAQ::DdlFileName("TPC",ddlNumber),100);
157 Int_t patchIndex = data.SubSec;
158 if(data.Sec>=36) patchIndex += 2;
159 // buffer=new AliAltroBuffer(filename,mapping[patchIndex]);
160 buffer=new AliAltroBufferV3(filename,mapping[patchIndex]);
161 buffer->WriteDataHeader(kTRUE,kFALSE);//Dummy;
162 pSubSector=data.SubSec;
163 }//end if
164 }//end if
165
166 bunchLength=1;
167 pPadNumber=data.Pad;
168 pRowNumber=data.Row;
169 pSecNumber=data.Sec;
170 }//end else
171 pTimeBin=data.Time;
172 buffer->FillBuffer(data.Dig);
173 nwords++;
174 }//end else
175 }//end while
176 if (buffer) {
177 buffer->FillBuffer(pTimeBin);
178 buffer->FillBuffer(bunchLength+2);
179 nwords+=2;
180 buffer->WriteTrailer(nwords,pPadNumber,pRowNumber,pSecNumber);
181 //write the D.H.
182 buffer->Flush();
183 buffer->WriteDataHeader(kFALSE,kFALSE);
184 //cout<<"Data header for D D L:"<<pSecNumber<<" Sub-sec:"<<pSubSector<<endl;
185 delete buffer;
186 }
187
188 for(Int_t i = 0; i < 6; i++) delete mapping[i];
189
190 f.close();
191 return;
192}