1 /**************************************************************************
2 * Copyright(c) 1998-1999, 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 Revision 1.1 2007/09/17 10:23:31 cvetan
19 New TPC monitoring package from Stefan Kniege. The monitoring package can be started by running TPCMonitor.C macro located in macros folder.
23 ////////////////////////////////////////////////////////////////////////
25 // AliTPCMonitorDateFile class
27 // Class for handling the data structure in a DATE file
28 // Used to read DATE files for the TPC raw data Monitor
30 // Author: Roland Bramm
31 // Stefan Kniege, IKF, Frankfurt
34 /////////////////////////////////////////////////////////////////////////
38 #include "AliTPCMonitorDateFile.h"
39 #include "AliTPCMonitorDateFormat.h"
40 #include <Riostream.h>
41 ClassImp(AliTPCMonitorDateFile)
43 //____________________________________________________________________________
44 AliTPCMonitorDateFile::AliTPCMonitorDateFile() :
48 fisBigMemAllocated(false),
52 freadPosOverflow(false),
58 //____________________________________________________________________________
59 AliTPCMonitorDateFile::AliTPCMonitorDateFile(const AliTPCMonitorDateFile &datefile) :
60 TNamed(datefile.GetName(),datefile.GetTitle()),
61 ffilePos(datefile.ffilePos),
62 fbigMem(datefile.fbigMem),
63 fbigMemsize(datefile.fbigMemsize),
64 fisBigMemAllocated(datefile.fisBigMemAllocated),
65 ffileSize(datefile.ffileSize),
66 ffilename(datefile.ffilename),
67 finitFile(datefile.finitFile),
68 freadPosOverflow(datefile.freadPosOverflow),
74 //____________________________________________________________________________
75 AliTPCMonitorDateFile &AliTPCMonitorDateFile:: operator= (const AliTPCMonitorDateFile& datefile)
78 // assignment operator
81 ffilePos=datefile.ffilePos;
82 fbigMem=datefile.fbigMem;
83 fbigMemsize=datefile.fbigMemsize;
84 fisBigMemAllocated=datefile.fisBigMemAllocated;
85 ffileSize=datefile.ffileSize;
86 ffilename=datefile.ffilename;
87 finitFile=datefile.finitFile;
88 freadPosOverflow=datefile.freadPosOverflow;
94 //____________________________________________________________________________
95 AliTPCMonitorDateFile::~AliTPCMonitorDateFile()
99 if(fisBigMemAllocated == true){
104 //____________________________________________________________________________
105 void AliTPCMonitorDateFile::OpenDateFile(string name)
108 if( (ffilename != name) && (finitFile == true) ) {
112 fin->open(name.c_str());
118 //____________________________________________________________________________
119 Bool_t AliTPCMonitorDateFile::IsDateFileOpen()
121 // Check if DATE file is open
122 return fin->is_open();
125 //____________________________________________________________________________
126 void AliTPCMonitorDateFile::CloseDateFile()
130 freadPosOverflow = false;
132 fin = new ifstream();
135 //____________________________________________________________________________
136 void AliTPCMonitorDateFile::ResetFilePos()
138 // Reset file position
142 //____________________________________________________________________________
143 void AliTPCMonitorDateFile::SetFileSize()
145 // Set size of DATE file
146 fin->seekg (0, ios::end);
147 ffileSize = fin->tellg();
148 fin->seekg (0, ios::beg);
151 //____________________________________________________________________________
152 Int_t AliTPCMonitorDateFile::GetFileSize()
154 // Return size of DATE file
158 //____________________________________________________________________________
159 void AliTPCMonitorDateFile::ReadEvent()
161 // Read in event from file
163 Char_t fmem[512]; // array for event header
165 Bool_t toSwapEndian = false;
166 //Fetch some bytes to get headers to know how much
167 fin->seekg(ffilePos);
168 //if( (getFilePosition() + sizeof(fmem)) <= (unsigned int)getFileSize()){
170 if( (GetFilePosition() + sfmem) <= (UInt_t)GetFileSize()){
173 fin->read((Char_t*)fmem,sfmem);
174 fin->seekg(ffilePos);
175 AliTPCMonitorDateFormat *DateForm;
176 DateForm = new AliTPCMonitorDateFormat((Char_t *)&fmem);
180 toSwapEndian = DateForm->IsEventWrongEndian();
181 if(toSwapEndian == true){
183 for(Int_t i = 0; i < 68; i++) {
184 swapcarry[0] = fmem[(i*4)+0];
185 swapcarry[1] = fmem[(i*4)+1];
186 swapcarry[2] = fmem[(i*4)+2];
187 swapcarry[3] = fmem[(i*4)+3];
188 fmem[(i*4)+0] = swapcarry[3];
189 fmem[(i*4)+1] = swapcarry[2];
190 fmem[(i*4)+2] = swapcarry[1];
191 fmem[(i*4)+3] = swapcarry[0];
193 DateForm = new AliTPCMonitorDateFormat((Char_t *)&fmem);
195 size = DateForm->GetEventSize();
196 if(size > GetAllocatedSizeofArray()) {
197 AllocateArray((Int_t)(size*1.1));
199 if( (GetFilePosition() + size) <= GetFileSize()){
200 fin->read((Char_t*)fbigMem,size);
201 if(toSwapEndian == true){
202 for(Int_t i = 0; i < (size/4); i++) {
203 swapcarry[0] = fbigMem[(i*4)+0];
204 swapcarry[1] = fbigMem[(i*4)+1];
205 swapcarry[2] = fbigMem[(i*4)+2];
206 swapcarry[3] = fbigMem[(i*4)+3];
207 fbigMem[(i*4)+0] = swapcarry[3];
208 fbigMem[(i*4)+1] = swapcarry[2];
209 fbigMem[(i*4)+2] = swapcarry[1];
210 fbigMem[(i*4)+3] = swapcarry[0];
215 freadPosOverflow = true;
219 freadPosOverflow = true;
223 //____________________________________________________________________________
224 Bool_t AliTPCMonitorDateFile::IsLastEvent()
226 // Check if event is last event in file
228 if( (ffilePos < ffileSize) && (freadPosOverflow == false) )
235 //____________________________________________________________________________
236 Bool_t AliTPCMonitorDateFile::IsEventValid()
238 // Check Over flow flag
240 if(freadPosOverflow == false)
247 //____________________________________________________________________________
248 Int_t AliTPCMonitorDateFile::GetFilePosition()
250 // Return current position in file
254 //____________________________________________________________________________
255 Int_t AliTPCMonitorDateFile::GetAllocatedSizeofArray()
257 // Return size of allocated data array
261 //____________________________________________________________________________
262 void AliTPCMonitorDateFile::AllocateArray(Int_t size)
264 // allocate data array
265 if(fisBigMemAllocated == false) {
266 fbigMem = new Char_t[size];
268 fisBigMemAllocated = true;
271 fbigMem = new Char_t[size];
273 fisBigMemAllocated = true;
277 //____________________________________________________________________________
278 Char_t *AliTPCMonitorDateFile::GetMemoryPointer()
280 // Return pointer to data array