/* This file is part of MAUS: http://micewww.pp.rl.ac.uk:8080/projects/maus
*
* MAUS is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* MAUS is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with MAUS. If not, see .
*
*/
#include "MDfileManager.h"
MDfileManager::~MDfileManager()
{
for(unsigned int i=0;i<_dateFiles.size();i++)
delete _dateFiles[i];
_dateFiles.resize(0);
}
// Scan the list given at the creation and add files or runs according to the recognized format
dateFileStatus_t MDfileManager::OpenFile(){
unsigned int myFileCount(0);
stringstream toScan(_list,ios_base::in);
std::string strBuf;
do {
toScan >> strBuf ;
if (IsFileName(strBuf)) {
if ( AddFile(strBuf,_path) ) myFileCount++;
}
if (IsNumber(strBuf)) {
myFileCount += AddRun(strBuf,_path);
}
} while (!toScan.eof());
if (myFileCount ) _status = DATE_FILE_OK;
else cout << " No file open. Aborting." << endl;
return _status;
}
unsigned char* MDfileManager::GetNextEvent()
{
unsigned char* eventBuffer = _dateFiles[ _fileCount ]->GetNextEvent();
if( !eventBuffer){
cout<<"++++ End of file "<< _dateFiles[ _fileCount ]->GetFileName() << " ++++" << endl;
_dateFiles[ _fileCount ]->CloseFile();
if( ++_fileCount<_dateFiles.size() ){
cout<<"++++ Start of file "<< _dateFiles[ _fileCount ]->GetFileName() << " ++++" << endl;
eventBuffer = _dateFiles[ _fileCount ]->GetNextEvent();
}
}
return eventBuffer;
}
unsigned char* MDfileManager::GetNextPhysEvent()
{
unsigned char* eventBuffer;
MDevent theEvent;
uint32_t eventType = 0;
while (eventType != PHYSICS_EVENT) {
eventBuffer = this->GetNextEvent();
if (!eventBuffer)
break;
theEvent.SetDataPtr(eventBuffer);
eventType = theEvent.EventType();
}
return eventBuffer;
}
unsigned char* MDfileManager::GetNextCalibEvent()
{
unsigned char* eventBuffer;
MDevent theEvent;
uint32_t eventType = 0;
while (eventType != CALIBRATION_EVENT || !eventBuffer) {
eventBuffer = this->GetNextEvent();
if (eventBuffer) {
theEvent.SetDataPtr(eventBuffer);
eventType = theEvent.EventType();
}
}
return eventBuffer;
}
bool MDfileManager::AddFile(string fn, string fp)
{
vector SearchDirs = FillDataDir( fp );
for( unsigned int di = 0; di < SearchDirs.size(); ++di ){
string dir = SearchDirs[di];
cout << "Trying to add file " << fn << " from " << dir << endl;
MDdateFile* f = new MDdateFile(fn, dir);
if ( f->OpenFile() == DATE_FILE_OK ){
this->AddFile(f);
cout << "File " << fn << " is added" << endl;
return true;
}
}
return false;
}
vector MDfileManager::FillDataDir( string aDirs ) {
vector Dirs;
stringstream toScan(aDirs,ios_base::in);
string strBuf;
do {
toScan >> strBuf ;
Dirs.push_back( strBuf );
} while (!toScan.eof());
return Dirs;
}
unsigned int MDfileManager::AddRun( string aRun, string aDir )
{
list fileList;
list::iterator itl;
stringstream ss(aRun,ios_base::out|ios_base::in );
int runNum(0);
// get run Number as int
ss >> runNum;
// Check
if (ss.fail()) {
cerr << "ERROR in MDfileManager::AddRun : The run number string " << aRun << " does not match an integer" << endl;
return 0;
}
vector SearchDirs = FillDataDir( aDir );
unsigned int nFiles=0;
for( unsigned int di = 0; di < SearchDirs.size(); ++di ){
string dir = SearchDirs[di];
cout << "Going to search for run " << aRun << " data files in " << dir << endl;
DIR *dp;
struct dirent *dirp;
if( ( dp = opendir( dir.c_str() ) ) != NULL ) {
while ( ( dirp = readdir( dp ) ) != NULL ) { // get the list of files in path
fileList.push_back(string( dirp->d_name ));
}
fileList.sort(); // sort the list of files
string SearchStr = aRun+".";
for ( itl=fileList.begin(); itl!=fileList.end(); itl++ ) {
string FileName = *itl;
//cout << "Found a file : " << FileName << endl;
// check if the file neme is correct and the run number matches
if (IsFileName(FileName)) {
float foundRunNum(0);
ss.clear();
ss.str(FileName);
ss >> foundRunNum;
//cout<<"found Run Num : "<< foundRunNum << endl;
if ((int)foundRunNum == runNum){
if( AddFile(FileName, dir) ) nFiles++;
} else {
//cout << "Rejected : " << foundRunNum << " != " << runNum << endl;
}
}
}
} else {
cout << "Cannot open " << dir << endl;
}
}
return nFiles;
}
bool MDfileManager::IsNumber( const std::string& s ){
for ( unsigned int i = 0; i < s.length(); i++) {
if ( !std::isdigit( s[ i ] ) ) return false;
}
if (s.length()) return true;
return false;
}
bool MDfileManager::IsFileName( const std::string& s ) {
int length, size;
size_t pos;
size = s.size();
if (size<3)
return false;
pos = s.find_last_of('.');
if (pos == std::string::npos)
return false;
// check if the file name and the file extention are numeric
char buffer[32];
length = s.copy(buffer, pos, 0);
buffer[length]='\0';
string FilePrefix(buffer);
//std::cout << "found run number : " << FilePrefix << std::endl;
length = s.copy(buffer, (size - pos), (pos + 1));
buffer[length]='\0';
string FileSuffix(buffer);
//cout << "found file index : " << FileSuffix << std::endl;
/*
if (IsNumber(FilePrefix) && IsNumber(FileSuffix))
return true;
*/
if (IsNumber(FileSuffix))
return true;
return false;
}