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.2 2007/10/12 13:36:27 cvetan
19 Coding convention fixes from Stefan
21 Revision 1.1 2007/09/17 10:23:31 cvetan
22 New TPC monitoring package from Stefan Kniege. The monitoring package can be started by running TPCMonitor.C macro located in macros folder.
26 ////////////////////////////////////////////////////////////////////////
28 //// AliTPCMonitorDateFile class
30 //// Class for handling the data structure in a DATE file
31 //// Used to read DATE files for the TPC raw data Monitor
33 //// Author: Roland Bramm
34 //// Stefan Kniege, IKF, Frankfurt
37 /////////////////////////////////////////////////////////////////////////
41 #include "AliTPCMonitorDateFile.h"
42 #include "AliTPCMonitorDateFormat.h"
43 #include <Riostream.h>
44 ClassImp(AliTPCMonitorDateFile)
46 //____________________________________________________________________________
47 AliTPCMonitorDateFile::AliTPCMonitorDateFile() :
51 fisBigMemAllocated(false),
55 freadPosOverflow(false),
61 //____________________________________________________________________________
62 AliTPCMonitorDateFile::AliTPCMonitorDateFile(const AliTPCMonitorDateFile &datefile) :
63 TNamed(datefile.GetName(),datefile.GetTitle()),
64 ffilePos(datefile.ffilePos),
65 fbigMem(datefile.fbigMem),
66 fbigMemsize(datefile.fbigMemsize),
67 fisBigMemAllocated(datefile.fisBigMemAllocated),
68 ffileSize(datefile.ffileSize),
69 ffilename(datefile.ffilename),
70 finitFile(datefile.finitFile),
71 freadPosOverflow(datefile.freadPosOverflow),
77 //____________________________________________________________________________
78 AliTPCMonitorDateFile &AliTPCMonitorDateFile:: operator= (const AliTPCMonitorDateFile& datefile)
81 // assignment operator
84 ffilePos=datefile.ffilePos;
85 fbigMem=datefile.fbigMem;
86 fbigMemsize=datefile.fbigMemsize;
87 fisBigMemAllocated=datefile.fisBigMemAllocated;
88 ffileSize=datefile.ffileSize;
89 ffilename=datefile.ffilename;
90 finitFile=datefile.finitFile;
91 freadPosOverflow=datefile.freadPosOverflow;
97 //____________________________________________________________________________
98 AliTPCMonitorDateFile::~AliTPCMonitorDateFile()
102 if(fisBigMemAllocated == true){
107 //____________________________________________________________________________
108 void AliTPCMonitorDateFile::OpenDateFile(string name)
111 if( (ffilename != name) && (finitFile == true) ) {
115 fin->open(name.c_str());
121 //____________________________________________________________________________
122 Bool_t AliTPCMonitorDateFile::IsDateFileOpen()
124 // Check if DATE file is open
125 return fin->is_open();
128 //____________________________________________________________________________
129 void AliTPCMonitorDateFile::CloseDateFile()
133 freadPosOverflow = false;
135 fin = new ifstream();
138 //____________________________________________________________________________
139 void AliTPCMonitorDateFile::ResetFilePos()
141 // Reset file position
145 //____________________________________________________________________________
146 void AliTPCMonitorDateFile::SetFileSize()
148 // Set size of DATE file
149 fin->seekg (0, ios::end);
150 ffileSize = fin->tellg();
151 fin->seekg (0, ios::beg);
154 //____________________________________________________________________________
155 Int_t AliTPCMonitorDateFile::GetFileSize() const
157 // Return size of DATE file
161 //____________________________________________________________________________
162 void AliTPCMonitorDateFile::ReadEvent()
164 // Read in event from file
166 Char_t fmem[512]; // array for event header
168 Bool_t toSwapEndian = false;
169 //Fetch some bytes to get headers to know how much
170 fin->seekg(ffilePos);
171 //if( (getFilePosition() + sizeof(fmem)) <= (unsigned int)getFileSize()){
173 if( (GetFilePosition() + sfmem) <= (UInt_t)GetFileSize()){
176 fin->read((Char_t*)fmem,sfmem);
177 fin->seekg(ffilePos);
178 AliTPCMonitorDateFormat *dateform;
179 dateform = new AliTPCMonitorDateFormat((Char_t *)&fmem);
183 toSwapEndian = dateform->IsEventWrongEndian();
184 if(toSwapEndian == true){
186 for(Int_t i = 0; i < 68; i++) {
187 swapcarry[0] = fmem[(i*4)+0];
188 swapcarry[1] = fmem[(i*4)+1];
189 swapcarry[2] = fmem[(i*4)+2];
190 swapcarry[3] = fmem[(i*4)+3];
191 fmem[(i*4)+0] = swapcarry[3];
192 fmem[(i*4)+1] = swapcarry[2];
193 fmem[(i*4)+2] = swapcarry[1];
194 fmem[(i*4)+3] = swapcarry[0];
196 dateform = new AliTPCMonitorDateFormat((Char_t *)&fmem);
198 size = dateform->GetEventSize();
199 if(size > GetAllocatedSizeofArray()) {
200 AllocateArray((Int_t)(size*1.1));
202 if( (GetFilePosition() + size) <= GetFileSize()){
203 fin->read((Char_t*)fbigMem,size);
204 if(toSwapEndian == true){
205 for(Int_t i = 0; i < (size/4); i++) {
206 swapcarry[0] = fbigMem[(i*4)+0];
207 swapcarry[1] = fbigMem[(i*4)+1];
208 swapcarry[2] = fbigMem[(i*4)+2];
209 swapcarry[3] = fbigMem[(i*4)+3];
210 fbigMem[(i*4)+0] = swapcarry[3];
211 fbigMem[(i*4)+1] = swapcarry[2];
212 fbigMem[(i*4)+2] = swapcarry[1];
213 fbigMem[(i*4)+3] = swapcarry[0];
218 freadPosOverflow = true;
222 freadPosOverflow = true;
226 //____________________________________________________________________________
227 Bool_t AliTPCMonitorDateFile::IsLastEvent() const
229 // Check if event is last event in file
231 if( (ffilePos < ffileSize) && (freadPosOverflow == false) )
238 //____________________________________________________________________________
239 Bool_t AliTPCMonitorDateFile::IsEventValid() const
241 // Check Over flow flag
243 if(freadPosOverflow == false)
250 //____________________________________________________________________________
251 Int_t AliTPCMonitorDateFile::GetFilePosition() const
253 // Return current position in file
257 //____________________________________________________________________________
258 Int_t AliTPCMonitorDateFile::GetAllocatedSizeofArray() const
260 // Return size of allocated data array
264 //____________________________________________________________________________
265 void AliTPCMonitorDateFile::AllocateArray(Int_t size)
267 // allocate data array
268 if(fisBigMemAllocated == false) {
269 fbigMem = new Char_t[size];
271 fisBigMemAllocated = true;
274 fbigMem = new Char_t[size];
276 fisBigMemAllocated = true;
280 //____________________________________________________________________________
281 Char_t *AliTPCMonitorDateFile::GetMemoryPointer()
283 // Return pointer to data array