1 ////////////////////////////////////////////////////////////////////////////////
3 // Author: Artur Szostak
4 // Email: artur@alice.phy.uct.ac.za | artursz@iafrica.com
6 ////////////////////////////////////////////////////////////////////////////////
8 #include "AliRoot/ADCStreamSource.hpp"
9 #include "AliRoot/Base.hpp"
13 // TODO: Change all the Error message statements to AliError at some stage.
16 ClassImp(AliMUONHLT::ADCStreamSource);
17 ClassImp(AliMUONHLT::ADCStreamSource::DataBlock);
23 ADCStreamSource::ADCStreamSource() : TObject()
29 ADCStreamSource::~ADCStreamSource()
31 // Everything is cleaned up implicitly.
35 void ADCStreamSource::FillFromFile(const TString& filename, const Int_t eventnumber)
37 DebugMsg(1, "Entering FillFromFile, file = " << filename.Data()
38 << ", event number = " << eventnumber
40 FILE* file = fopen(filename, "r");
47 if ( gSystem->GetPathInfo(filename, &id, &size, &flags, &modtime) == 0 )
49 DebugMsg(2, "Size of file: " << filename.Data() << " is " << size << " bytes");
51 stream.Size(size/sizeof(Int_t));
52 size_t bytesread = fread(stream.Data(), 1, size, file);
53 if (bytesread == (size_t)size)
54 AddStream(stream, eventnumber);
56 Error("FillFromFile", "Could not read from file: %s", filename.Data());
59 Error("FillFromFile", "Could not stat the file: %s", filename.Data());
66 DebugMsg(1, "Leaving FillFromFile");
70 void ADCStreamSource::FillFrom(const TString& directory, const Int_t eventnumber)
72 DebugMsg(1, "Entering FillFrom, directory = " << directory.Data()
73 << ", event number = " << eventnumber
76 void* dir = gSystem->OpenDirectory(directory);
79 const char* entry = gSystem->GetDirEntry(dir);
82 TString filename = entry;
83 if (filename.BeginsWith("MUON"))
84 FillFromFile(filename, eventnumber);
85 entry = gSystem->GetDirEntry(dir);
90 gSystem->FreeDirectory(dir);
94 DebugMsg(1, "Leaving FillFrom");
98 void ADCStreamSource::FillFrom(const TString& dirprefix, const UInt_t firstevent, const UInt_t lastevent)
100 DebugMsg(1, "Entering FillFrom");
102 for (UInt_t i = firstevent; i <= lastevent; i++)
104 TString dirname = dirprefix;
106 FillFrom(dirname, i);
109 DebugMsg(1, "Leaving FillFrom");
113 void ADCStreamSource::Clear()
116 fList.erase( fList.begin(), fList.end() );
120 Int_t ADCStreamSource::NumberOfStreams() const
126 Bool_t ADCStreamSource::GetStream(const Int_t index) const
128 if ( 0 <= index and index < NumberOfStreams() )
130 fCurrentStream = index;
135 // The index is out of bounds so inform the user.
136 if (NumberOfStreams() > 0)
138 "The ADC stream index (%d) is out of bounds. Valid range is [0, %d]",
139 index, NumberOfStreams() - 1
143 "The ADC stream index (%d) is out of bounds. No streams found.",
151 Bool_t ADCStreamSource::FirstStream() const
153 if (NumberOfStreams() > 0)
163 Bool_t ADCStreamSource::NextStream() const
165 if ( 0 <= fCurrentStream and fCurrentStream < NumberOfStreams() - 1 )
175 Int_t ADCStreamSource::EventNumber() const
177 if (fCurrentStream >= 0)
179 Assert( fCurrentStream < NumberOfStreams() );
180 return fList[fCurrentStream].fEventNumber;
184 Error("EventNumber", "No ADC stream selected.");
190 Bool_t ADCStreamSource::FetchStream(ADCStream& stream) const
192 if (fCurrentStream >= 0)
194 Assert( fCurrentStream < NumberOfStreams() );
195 stream = fList[fCurrentStream].fStream;
200 Error("FetchStream", "No ADC stream selected.");
206 Bool_t ADCStreamSource::FetchStream(const Int_t index, ADCStream& stream) const
208 if ( GetStream(index) )
209 return FetchStream(stream);
215 const ADCStream* ADCStreamSource::FetchStream() const
217 if (fCurrentStream >= 0)
219 Assert( fCurrentStream < NumberOfStreams() );
220 return &( fList[fCurrentStream].fStream );
224 Error("FetchStream", "No ADC stream selected.");
230 void ADCStreamSource::AddStream(ADCStream& stream, const UInt_t eventnumber)
232 DebugMsg(1, "Entering AddStream");
235 newdata.fEventNumber = eventnumber;
236 newdata.fStream = stream;
237 fList.push_back(newdata);
238 fCurrentStream = fList.size() - 1;
240 DebugMsg(1, "Leaving AddStream");