/* 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 .
*
*/
#ifndef _MAUS_TOFCALIBRATIONMAP_HH_
#define _MAUS_TOFCALIBRATIONMAP_HH_
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "json/json.h"
#include "Utils/TOFChannelMap.hh"
#include "Utils/Exception.hh"
#include "Utils/Squeak.hh"
#include "src/common_cpp/Utils/JsonWrapper.hh"
namespace MAUS {
/** Identifier for a single TOF pixel.
* This class is used to hold and manage all the information needed
* to identifiy one pixel in the TOF detectors.
*/
class TOFPixelKey {
public:
TOFPixelKey()
:_station(-999), _slabX(-999), _slabY(-999), _detector("unknown") {}
TOFPixelKey(int st, int slX, int slY, string d)
:_station(st), _slabX(slX), _slabY(slY), _detector(d) {}
explicit TOFPixelKey(string keyStr) throw(Exceptions::Exception);
virtual ~TOFPixelKey() {}
bool operator==( const TOFPixelKey& key ) const;
bool operator!=( const TOFPixelKey& key ) const;
friend ostream& operator<<( ostream& stream, TOFPixelKey key );
friend istream& operator>>( istream& stream, TOFPixelKey &key ) throw(Exceptions::Exception);
string detector() {return _detector;}
/** This function converts the DAQChannelKey into string.
* \return String identifier.
*/
string str();
int station() {return _station;}
int slabX() {return _slabX;}
int slabY() {return _slabY;}
void SetStation(int xStation) {_station = xStation;}
void SetSlabX(int xSlab) {_slabX = xSlab;}
void SetSlabY(int xSlab) {_slabY = xSlab;}
void SetDetector(string xDetector) {_detector = xDetector;}
/* This function creates unique integer identifier.
* \return Integer identifier.
*
int make_TOFPixelKey_id() {return _station*1e6 + _slabY*1e3 + _slabX;}
*/
private:
/// TOF station number.
int _station;
/** Number of the horizontal Slab. ATTENTION : according to the convention used in
* the cabling file the horizontal slabs are always in plane 0.
*/
int _slabX;
/** Number of the vertical Slab. ATTENTION : according to the convention used in
* the cabling file the vertical slabs are always in plane 1.
*/
int _slabY;
/// Name of the detector.
string _detector;
};
/** Complete map of all calibration constants needed in order to reconstruct the time
* measured by the TOF detectors. This class is used to hold and manage calibration
* constants and to calculate the calibration corrections. The algorithm, used to calibrate
* the time measurements, is described in MICE Note 251 "TOF Detectors Time Calibration".
* http://mice.iit.edu/micenotes/public/pdf/MICE0251/MICE0251.pdf
*/
class TOFCalibrationMap {
public:
TOFCalibrationMap();
virtual ~TOFCalibrationMap();
/** Initialize the calibration map by using the text files provided in
* ConfigurationDefaults.py
* \param[in] json_configuration Json document containing the configuration.
* \returns true if all text files are loaded successfully.
*/
bool InitializeFromCards(Json::Value configJSON, int);
/// Get calibrations from CDB
bool InitializeFromCDB();
/** Initialize the map by using the provided text files.
* \param[in] t0File name of the text file containing the t0 calibration constants.
* \param[in] twFile name of the text file containing the TimeWalk calibration constants.
* \param[in] triggerFile name of the text file containing the trigger delay calibration
* constants.
* \returns true if all text files are loaded successfully.
*/
bool Initialize(std::string t0File, std::string twFile, std::string triggerFile);
/** Return the T0 correction for the channel coded by the key.
* \param[in] key the channel of the measurement.
* \param[out] r the number of the refference pixel in the slab.
* The refference pixel is the pixel where the T0 calibration constant for this channel
* has been calculated.
* \returns the value of the T0 correction for this channel and sets the number of the
* refference pixel. If no calibration for this channel the function returns NOCALIB (-99999).
*/
double T0(TOFChannelKey key, int &r) const;
/** Return the Trigger delay correction for the pixel coded by the key.
* \param[in] key the pixel of the hit that gives the trigger.
* \returns the value of the trigger delay correction. If no calibration for this pixel the
* function returns NOCALIB (-99999).
*/
double TriggerT0(TOFPixelKey key) const;
/** Calculate the TimeWalk correction for the channel coded by the key and for given adc value.
* \param[in] key the channel of the measurement.
* \param[in] adc the measured value of the amplitude of the signal.
* \returns the value of the time-walk correction. If no calibration for this channel the function
* returns NOCALIB (-99999).
*/
double TW(TOFChannelKey key, int adc ) const;
/** Calculate the combined correction for the channel coded by Pkey, trigger
* pixel coded by the Tkey and for given adc value.
* \param[in] Pkey the channel of the measurement.
* \param[in] Tkey the pixel of the hit that gives the trigger.
* \param[in] adc the measured value of the amplitude of the signal.
*/
double dT(TOFChannelKey Pkey, TOFPixelKey Tkey, int adc) const;
/** Return the data member Name.
*/
std::string Name() const {return _name;}
/** Return the data member _triggerStation.
*/
int TriggerStationNumber() const {return _triggerStation;}
/** Print the calibration map;
* To be used only for debugging.
*/
void Print();
bool InitializePyMod();
void GetCalib(std::string devname, std::string caltype);
void SetTriggerStation(int station) {_triggerStation = station;}
enum {
/** This value is returned when the correction can not be calculated.
*/
NOCALIB = -99999
};
private:
/** Make one TOFChannelKey for each channel of the detector.
* All TOFChannelKeys are held in the data member _Pkey.
* ATTENTION : The detector configuration is HARDCODED !!!!
* TO BE IMPROVED !!!!
*/
int MakeTOFChannelKeys();
/** Use this function to reset the map before reloading. */
void reset();
/** Load T0 constants from text file.
*/
bool LoadT0File(std::string t0File);
/** Load Trigger delay constants from text file.
*/
bool LoadTWFile(std::string twFile);
/** Load TimeWalk constants from text file.
*/
bool LoadTriggerFile(std::string triggerFile);
/** Find the position of the PMT key in the data member _Pkey.
*/
int FindTOFChannelKey(TOFChannelKey key) const;
/** Find the position of the trigger key in the data member _Tkey.
*/
int FindTOFPixelKey(TOFPixelKey key) const;
/** This vector holds one TOFChannelKey for each channel of the detector.
*/
std::vector _Pkey;
/** This vector holds the TimeWalk constants. IMPORTANT - the order of the entries
* here is the same as the order of the entries in _Pkey.
* This is used when the constants are read.
*/
std::vector< std::vector > _twPar;
/** This vector holds the T0 constants. IMPORTANT - the order of the entries here is
* the same as the order of the entries in _Pkey.
* This is used when the constants are read.
*/
std::vector _t0;
/** This vector holds the number of the refference bar. IMPORTANT - the order of
* the entries here is the same as the order of the entries in _Pkey.
* This is used when the constants are read.
*/
std::vector_reff;
/** This vector holds one TOFPixelKey for each calibrated pixel of the trigger station.
* IMPORTANT - uncalibrated pixels are not presented here.
*/
std::vector _Tkey;
/** This vector holds the Trigger delay constants. IMPORTANT - the order of
* the entries here is the same as the order of the entries in _Tkey.
* This is used when the constants are read.
*/
std::vector _Trt0;
/** Number of the trigger station. It is automatically set during the initialization.
*/
int _triggerStation;
/** Name of the calibration as in the CDB.
*/
std::string _name;
std::stringstream t0str, twstr, trigstr;
std::string _tof_station, _tof_calibdate, _tof_calib_by;
/** Flags for switching On and Off of the different types of calibration corrections.
*/
bool _do_timeWalk_correction;
bool _do_triggerDelay_correction;
bool _do_t0_correction;
PyObject* _calib_mod;
PyObject* _tcalib;
PyObject* _get_calib_func;
bool LoadT0Calib();
bool LoadTWCalib();
bool LoadTriggerCalib();
bool pymod_ok;
int runNumber;
};
}
#endif