/* 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
#include "Utils/TOFChannelMap.hh"
#include "cabling/cabling.h"
// #include "generated/CablingImplPortBinding.nsmap"
namespace MAUS {
TOFChannelMap::~TOFChannelMap() {
this->reset();
}
void TOFChannelMap::reset() {
for (unsigned int i = 0;i < _tofKey.size();i++) {
delete _tofKey[i];
delete _tdcKey[i];
delete _fadcKey[i];
}
_tdcKey.resize(0);
_fadcKey.resize(0);
_tofKey.resize(0);
cblstr.str("");
cblstr.clear();
}
TOFChannelMap::TOFChannelMap() {
runNumber = 0;
}
bool TOFChannelMap::InitializeCards(Json::Value configJSON, int rnum) {
this->reset();
_tof_station = JsonWrapper::GetProperty(configJSON,
"TOF_trigger_station",
JsonWrapper::stringValue).asString();
// convert trigger station name to upper case
// the DB holds detector names in upper case
std::transform(_tof_station.begin(), _tof_station.end(),
_tof_station.begin(),
std::ptr_fun(std::toupper));
_tof_cablingdate = JsonWrapper::GetProperty(configJSON,
"TOF_cabling_date_from",
JsonWrapper::stringValue).asString();
std::string _cabling_source = JsonWrapper::GetProperty(configJSON,
"TOF_cabling_source",
JsonWrapper::stringValue).asString();
try {
_tof_cabling_by = JsonWrapper::GetProperty(configJSON,
"TOF_cabling_by",
JsonWrapper::stringValue).asString();
if (_tof_cabling_by == "run_number" && rnum == 0)
_tof_cabling_by = "date";
} catch (MAUS::Exceptions::Exception e) {
Squeak::mout(Squeak::error)
<< "Error getting data card TOF_cabling_by" << std::endl
<< e.GetMessage() << std::endl;
return false;
}
// std::cout << "TOF cabling date: " << _tof_cablingdate << std::endl;
// std::cout << "TOF cabling source: " << _cabling_source << std::endl;
runNumber = rnum;
bool fromDB = true;
if (_cabling_source == "file")
fromDB = false;
// std::cerr << ">>> SOURCE: " << fromDB << std::endl;
// std::cerr << ">>> BY: " << _tof_cabling_by << std::endl;
bool loaded;
if (!fromDB) {
std::string tof_cabling_file = JsonWrapper::GetProperty(configJSON,
"TOF_cabling_file",
JsonWrapper::stringValue).asString();
loaded = this->InitFromFile(tof_cabling_file);
} else {
loaded = this->InitFromCDB();
}
if (!loaded)
return false;
return true;
}
bool TOFChannelMap::InitFromFile(string filename) {
ifstream stream(filename.c_str());
if ( !stream ) {
Squeak::mout(Squeak::error)
<< "Error in TOFChannelMap::InitFromFile : Can't open TOF cabling file "
<< filename << std::endl;
return false;
}
TOFChannelKey* tofkey;
DAQChannelKey* tdckey;
DAQChannelKey* fadckey;
try {
while (!stream.eof()) {
tofkey = new TOFChannelKey();
tdckey = new DAQChannelKey();
fadckey = new DAQChannelKey();
stream >> *tofkey >> *fadckey >> *tdckey;
_tofKey.push_back(tofkey);
_tdcKey.push_back(tdckey);
_fadcKey.push_back(fadckey);
}
} catch (Exceptions::Exception e) {
Squeak::mout(Squeak::error)
<< "Error in TOFChannelMap::InitFromFile : Error during loading." << std::endl
<< e.GetMessage() << std::endl;
return false;
}
if (_tofKey.size() == 0) {
Squeak::mout(Squeak::error)
<< "Error in TOFChannelMap::InitFromFile : Nothing is loaded. " << std::endl;
return false;
}
return true;
}
bool TOFChannelMap::InitFromCDB() {
if (!this->GetCablingCAPI(_tof_station))
return false;
std::cout << "got cabling from CDB" << std::endl;
TOFChannelKey* tofkey;
DAQChannelKey* tdckey;
DAQChannelKey* fadckey;
try {
while (!cblstr.eof()) {
tofkey = new TOFChannelKey();
tdckey = new DAQChannelKey();
fadckey = new DAQChannelKey();
cblstr >> *tofkey >> *fadckey >> *tdckey;
_tofKey.push_back(tofkey);
_tdcKey.push_back(tdckey);
_fadcKey.push_back(fadckey);
}
} catch (Exceptions::Exception e) {
Squeak::mout(Squeak::error)
<< "Error in TOFChannelMap::InitFromCDB : Error during loading." << std::endl
<< e.GetMessage() << std::endl;
return false;
}
if (_tofKey.size() == 0) {
Squeak::mout(Squeak::error)
<< "Error in TOFChannelMap::InitFromCDB : Nothing is loaded. " << std::endl;
return false;
}
return true;
}
TOFChannelKey* TOFChannelMap::find(DAQChannelKey *daqKey) const {
if (daqKey->eqType() == 102)
for (unsigned int i = 0;i < _tofKey.size();i++) {
if ( _tdcKey[i]->ldc() == daqKey->ldc() &&
_tdcKey[i]->geo() == daqKey->geo() &&
_tdcKey[i]->channel() == daqKey->channel() ) {
return _tofKey[i];
}
}
if (daqKey->eqType() == 120) {
for (unsigned int i = 0;i < _tofKey.size();i++) {
if ( _fadcKey[i]->ldc() == daqKey->ldc() &&
_fadcKey[i]->geo() == daqKey->geo() &&
_fadcKey[i]->channel() == daqKey->channel() ) {
return _tofKey[i];
}
}
}
return NULL;
}
TOFChannelKey* TOFChannelMap::find(std::string daqKeyStr) const {
DAQChannelKey xDaqKey;
stringstream xConv;
try {
xConv << daqKeyStr;
xConv >> xDaqKey;
}catch(Exceptions::Exception e) {
throw(Exceptions::Exception(Exceptions::recoverable,
std::string("corrupted DAQ Channel Key"),
"TOFChannelMap::find(std::string)"));
}
TOFChannelKey* xTofKey = find(&xDaqKey);
return xTofKey;
}
DAQChannelKey* TOFChannelMap::findfAdcKey(std::string tdcKeyStr) {
DAQChannelKey xDaqKey;
stringstream xConv;
try {
xConv << tdcKeyStr;
xConv >> xDaqKey;
}catch(Exceptions::Exception e) {
throw(Exceptions::Exception(Exceptions::recoverable,
std::string("corrupted DAQ Channel Key"),
"TOFChannelMap::findfAdcKey(std::string)"));
}
if (xDaqKey.eqType() == 102) {
for (unsigned int i = 0;i < _tofKey.size();i++) {
if ( *(_tdcKey[i]) == xDaqKey ) {
return _fadcKey[i];
}
}
}
return NULL;
}
DAQChannelKey* TOFChannelMap::findTdcKey(std::string adcKeyStr) {
DAQChannelKey xDaqKey;
stringstream xConv;
try {
xConv << adcKeyStr;
xConv >> xDaqKey;
}catch(Exceptions::Exception e) {
throw(Exceptions::Exception(Exceptions::recoverable,
std::string("corrupted DAQ Channel Key"),
"TOFChannelMap::findTdcKey(std::string)"));
}
if (xDaqKey.eqType() == 120) {
for (unsigned int i = 0;i < _tofKey.size();i++) {
if ( *(_fadcKey[i]) == xDaqKey ) {
return _tdcKey[i];
}
}
}
return NULL;
}
//////////////////////////////////////////////////////////////////////////
TOFChannelKey::TOFChannelKey(string keyStr) throw(Exceptions::Exception) {
std::stringstream xConv;
try {
xConv << keyStr;
xConv >> (*this);
}catch(Exceptions::Exception e) {
throw(Exceptions::Exception(Exceptions::recoverable,
std::string("corrupted TOF Channel Key"),
"TOFChannelKey::TOFChannelKey(std::string)"));
}
}
bool TOFChannelKey::operator==( const TOFChannelKey& key ) const {
if ( _station == key._station &&
_plane == key._plane &&
_slab == key._slab &&
_pmt == key._pmt &&
_detector == key._detector) {
return true;
} else {
return false;
}
}
bool TOFChannelKey::operator!=( const TOFChannelKey& key ) const {
if ( _station == key._station &&
_plane == key._plane &&
_slab == key._slab &&
_pmt == key._pmt &&
_detector == key._detector) {
return false;
} else {
return true;
}
}
bool TOFChannelKey::inSameSlab(TOFChannelKey key) {
if (this->station() == key.station() &&
this->plane() == key.plane() &&
this->slab() == key.slab() &&
this->detector() == key.detector()&&
this->pmt() != key.pmt())
return true;
return false;
}
bool TOFChannelKey::inSameSlab(string keyStr) {
TOFChannelKey key(keyStr);
return this->inSameSlab(key);
}
TOFChannelKey TOFChannelKey::GetOppositeSidePMT() {
TOFChannelKey key;
key.SetStation(this->station());
key.SetPlane(this->plane());
key.SetSlab(this->slab());
key.SetDetector(this->detector());
if (this->pmt() == 0) key.SetPmt(1);
if (this->pmt() == 1) key.SetPmt(0);
return key;
}
string TOFChannelKey::GetOppositeSidePMTStr() {
TOFChannelKey key = this->GetOppositeSidePMT();
return key.str();
}
ostream& operator<<( ostream& stream, TOFChannelKey key ) {
stream << "TOFChannelKey " << key._station;
stream << " " << key._plane;
stream << " " << key._slab;
stream << " " << key._pmt;
stream << " " << key._detector;
return stream;
}
istream& operator>>( istream& stream, TOFChannelKey &key ) throw(Exceptions::Exception) {
string xLabel;
stream >> xLabel >> key._station >> key._plane >> key._slab >> key._pmt >> key._detector;
if (xLabel != "TOFChannelKey") {
throw(Exceptions::Exception(Exceptions::recoverable,
std::string("corrupted TOF Channel Key"),
"istream& operator>>(istream& stream, TOFChannelKey)"));
}
return stream;
}
string TOFChannelKey::str() {
stringstream xConv;
xConv << (*this);
return xConv.str();
}
bool TOFChannelMap::GetCablingCAPI(std::string devname) {
// setup the CDB Cabling service
// default endpoint is the public slave cdb.mice.rl.ac.uk
// in order to use preprod, do
// MAUS::CDB::Cabling cbl("http://preprodcdb.mice.rl.ac.uk")
MAUS::CDB::Cabling cbl;
// result holds the string returned by the cdb query
std::string result;
try {
std::string status;
cbl.getStatus(status);
if (status.compare("OK") != 0) {
std::cerr << "+++ CDB Error status = " << status << std::endl;
return false;
}
// std::cerr << " Cabling status returned " << status << std::endl;
if (_tof_cabling_by == "date") {
std::cout << "+++ Getting TOFcabling by DATE: " << _tof_cablingdate.c_str() << std::endl;
if (_tof_cablingdate.compare("current") == 0) {
cbl.getCurrentDetectorCabling(devname.c_str(),
result);
} else {
cbl.getDetectorCablingForDate(devname.c_str(),
_tof_cablingdate.c_str(),
result);
}
} else if (_tof_cabling_by == "run_number") {
std::cout << "+++ Getting TOFcabling by RUN# " << runNumber << std::endl;
cbl.getDetectorCablingForRun(devname.c_str(),
runNumber,
result);
}
// std::cout << result << "(" << result.size() << " characters)" << std::endl;
} catch (std::exception &e) {
std::cerr << e.what() << std::endl;
return false;
}
// store the result in a stringstream so it can be parsed by the InitFromCDB function
cblstr.str(result);
return true;
}
} // end namespace MAUS