Files
geant4/source/analysis/include/tools/hbook/wfile
T
2016-06-09 17:01:34 +02:00

264 lines
5.9 KiB
Plaintext

// Copyright (C) 2010, Guy Barrand. All rights reserved.
// See the file tools.license for terms.
#ifndef tools_hbook_wfile
#define tools_hbook_wfile
#include <sstream>
#include <ostream>
#include "CHBOOK"
#include <tools/srep>
#include <tools/sout>
#ifdef WIN32
extern "C" void __stdcall OCLOSE(int*);
#else
extern "C" void oclose_(int*);
#endif
namespace tools {
namespace hbook {
class wfile {
public:
wfile(std::ostream& a_out,const std::string& a_file,
unsigned int a_unit = 1,bool a_verbose = false)
:m_out(a_out)
,m_verbose(a_verbose)
,m_file_name(a_file)
,m_is_valid(false)
,m_unit(0)
{
std::string opts("NQ");
// maximum number of records
get_quest()[9] = 65000;
int record_size = 1024;
m_dir = "LUN";
{std::ostringstream strm;
strm << a_unit;
m_dir += strm.str();}
//FIXME : we should check if m_dir already exists.
int ier = CHROPEN(a_unit,m_dir,m_file_name,opts,record_size);
if(ier) {
m_out << "tools::hbook::wfile :"
<< " error on hropen, code " << ier
<< std::endl;
return;
}
if(get_quest()[0]) {
m_out << "tools::hbook::wfile :"
<< " error, cannot open file " << a_file
<< std::endl;
return;
}
if(m_verbose) {
m_out << "tools::hbook::wfile :"
<< " file " << a_file << " opened."
<< std::endl;
}
CHCDIR("//PAWC"," ");
if(CHEDIR(m_dir,true)) CHDDIR(m_dir);
CHMDIR(m_dir," ");
CHCDIR("//PAWC/"+m_dir," ");
m_unit = a_unit;
m_is_valid = true;
}
virtual ~wfile() {
if(m_verbose) {
m_out << "tools::hbook::wfile::~wfile : cleanup..." << std::endl;
}
//rootFolder().clear();
if(m_is_valid) {
//CHDELET(0);
if(m_verbose) {
m_out << "tools::hbook::wfile::~wfile : hrend..." << std::endl;
}
CHREND(m_dir);
#ifdef WIN32
OCLOSE(&m_unit);
#else
oclose_(&m_unit);
#endif
m_unit = 0;
CHCDIR("//PAWC"," ");
if(CHEDIR(m_dir,true)) CHDDIR(m_dir);
}
if(m_verbose) {
m_out << "tools::hbook::wfile::~wfile : end." << std::endl;
}
}
private:
wfile(const wfile& a_from):m_out(a_from.m_out){}
wfile& operator=(const wfile&){return *this;}
public:
const std::string& store_name() const {return m_file_name;}
bool is_valid() const {return m_is_valid;}
bool write() {
if(!m_is_valid) return false;
std::string pwd = CHPWD();
CHCDIR("//PAWC/"+m_dir," ");
CHCDIR("//"+m_dir," ");
CHROUT(0,0,"T");
//CHLDIR("//PAWC/"+m_dir,"T");
//CHLDIR("//"+m_dir,"T");
CHCDIR(pwd," ");
return true;
}
bool close() {
if(!m_is_valid) return true; //done or not opened.
CHREND(m_dir);
#ifdef WIN32
OCLOSE(&m_unit);
#else
oclose_(&m_unit);
#endif
m_unit = 0;
m_is_valid = false;
return true;
}
bool cd_home(){
if(!m_is_valid) return false;
CHCDIR("//PAWC/"+m_dir," ");
return true;
}
bool cd_up(){
if(!m_is_valid) return false;
std::string pwd = CHPWD(); // pwd should be //PAWC/LUN<unit>/<something>
if(pwd.substr(0,10)!="//PAWC/LUN") {
m_out << "tools::hbook::wfile::cd_up :"
<< " current directory " << tools::sout(pwd)
<< " is not under //PAWC/LUN."
<< std::endl;
return false;
}
// look if not under //PAWC/LUN<unit> :
{std::string s = pwd;
tools::replace(s,"//PAWC/LUN","");
if(s.find('/')==std::string::npos) return true;} //Can't cd. But it is ok.
CHCDIR("\\"," "); //cd up under //PAWC/LUN<unit>/<something>
std::string pwd2 = CHPWD();
std::string s = pwd;
tools::replace(s,"//PAWC","/");
// s should be //LUN<unit>/<something>
CHCDIR(s," ");
CHCDIR("\\"," "); //cd up under //LUN<unit>/<something>
CHCDIR(pwd2," ");
return true;
}
bool mkdir(const std::string& a_name){
// create a directory under
// //LUN<unit>/<something>
// and
// //PAWC/LUN<unit>/<something>
if(!m_is_valid) return false;
// a_name should not be a path.
if(a_name.find('/')!=std::string::npos) {
m_out << "tools::hbook::wfile::mkdir :"
<< " " << tools::sout(a_name) << " should not be a path."
<< std::endl;
return false;
}
if(a_name.find('.')!=std::string::npos) {
m_out << "tools::hbook::wfile::mkdir :"
<< " " << tools::sout(a_name) << " should not be a path."
<< std::endl;
return false;
}
if(a_name.empty()) return true;
std::string pwd = CHPWD(); // pwd should be //PAWC/LUN<unit>/<something>
if(pwd.substr(0,10)!="//PAWC/LUN") {
m_out << "tools::hbook::wfile::mkdir :"
<< " current directory " << tools::sout(pwd)
<< " is not under //PAWC/LUN."
<< std::endl;
return false;
}
if(CHEDIR(a_name,true)) {
//we assume that a_name is also here under //LUN<unit>/<something>
return true;
}
CHMDIR(a_name," ");
std::string s = pwd;
tools::replace(s,"//PAWC","/");
// s should be //LUN<unit>/<something>
CHCDIR(s," ");
CHMDIR(a_name," ");
CHCDIR(pwd," ");
return true;
}
bool mkcd(const std::string& a_name){
if(!mkdir(a_name)) return false;
CHCDIR(a_name," ");
return true;
}
bool cd(const std::string& a_name){
CHCDIR(a_name," ");
return true;
}
private:
std::ostream& m_out;
bool m_verbose;
std::string m_file_name;
bool m_is_valid;
std::string m_dir;
int m_unit;
};
}}
#endif
// NOTE :
// For doing RZ write :
// - A //LUN<unit> has to be open.
// - We create a //PAWC/LUN<unit> under //PAWC.
// - The hierarchy is done in //PAWC/LUN<unit> and histos
// are booked here. (A HBOOK1 books anyway in a directory under //PAWC).
// - The //PAWC/LUN<unit> structure has to be duplicated under //LUN<unit>.
// - Then a global CHROUT(0,0,"T") can be done after doing :
// CHCDIR("//PAWC/LUN<unit>"," ")
// CHCDIR("//LUN<unit>"," ")