00001 #ifndef PSCALIB_GENERICCALIBPARS_H 00002 #define PSCALIB_GENERICCALIBPARS_H 00003 00004 //-------------------------------------------------------------------------- 00005 // File and Version Information: 00006 // $Id: GenericCalibPars.h 10156 2015-05-23 00:00:36Z dubrovin@SLAC.STANFORD.EDU $ 00007 // 00008 // $Revision: 10156 $ 00009 //------------------------------------------------------------------------ 00010 00011 //----------------- 00012 // C/C++ Headers -- 00013 //----------------- 00014 #include <iostream> 00015 #include <string> 00016 #include <vector> 00017 #include <map> 00018 #include <fstream> // open, close etc. 00019 00020 //---------------------- 00021 // Base Class Headers -- 00022 //---------------------- 00023 #include "PSCalib/CalibPars.h" 00024 #include "pdscalibdata/NDArrIOV1.h" 00025 00026 //------------------------------- 00027 // Collaborating Class Headers -- 00028 //------------------------------- 00029 #include "ndarray/ndarray.h" 00030 #include "pdsdata/xtc/Src.hh" 00031 00032 //------------------------------- 00033 00034 namespace PSCalib { 00035 00036 /// @addtogroup PSCalib PSCalib 00037 00038 /** 00039 * @ingroup PSCalib 00040 * 00041 * @brief GenericCalibPars class loads/holds/provides access to the pnCCD 00042 * geometry calibration parameters. 00043 * 00044 * This software was developed for the LCLS project. If you use all or 00045 * part of it, please give an appropriate acknowledgment. 00046 * 00047 * @see CalibPars, CalibParsStore 00048 * 00049 * @version $Id: GenericCalibPars.h 10156 2015-05-23 00:00:36Z dubrovin@SLAC.STANFORD.EDU $ 00050 * 00051 * @author Mikhail S. Dubrovin 00052 * 00053 * 00054 * 00055 * 00056 * @anchor interface 00057 * @par<interface> Interface Description 00058 * 00059 * @li Include and typedef 00060 * @code 00061 * #include "PSCalib/GenericCalibPars.h" 00062 * 00063 * #include "pdscalibdata/CsPadBaseV2.h" 00064 * #include "pdscalibdata/CsPad2x2BaseV2.h" 00065 * #include "pdscalibdata/PnccdBaseV1.h" 00066 * #include "pdscalibdata/PrincetonBaseV1.h" 00067 * #include "pdscalibdata/AndorBaseV1.h" 00068 * #include "pdscalibdata/Opal1000BaseV1.h" 00069 * #include "pdscalibdata/Opal4000BaseV1.h" 00070 * ... 00071 * 00072 * typedef PSCalib::GenericCalibPars<pdscalibdata::PnccdBaseV2> CALIB; 00073 * typedef PSCalib::GenericCalibPars<pdscalibdata::...BaseV2> ...CALIB; 00074 * ... 00075 * @endcode 00076 * 00077 * @li Instatiation 00078 * \n 00079 * For default constructor: 00080 * @code 00081 * CALIB *calibpars = new CALIB(); 00082 * @endcode 00083 * \n 00084 * For regular constructor: 00085 * @code 00086 * const std::string calibDir = "/reg/d/psdm/AMO/amoa1214/calib"; 00087 * const std::string groupName = "PNCCD::CalibV1"; 00088 * const std::string source = "Camp.0:pnCCD.1"; 00089 * unsigned long runNumber = 10; 00090 * unsigned print_bits = 255; 00091 * Pds::Src src; env.get(source, key, &src); 00092 * CALIB *calibpars = new CALIB(calibDir, groupName, src, runNumber, print_bits); 00093 * @endcode 00094 * \n 00095 * or similar for explicit constructor (depricated): 00096 * @code 00097 * CALIB *calibpars = new CALIB(calibDir, groupName, source, runNumber, print_bits); 00098 * @endcode 00099 * \n 00100 * or for the same list of parameters using polymorphism: 00101 * @code 00102 * PSCalib::CalibPars *calibpars = new CALIB(calibDir, groupName, source, runNumber, print_bits); 00103 * @endcode 00104 * In this case all virtual methods defined in the base class PSCalib::CalibPars will be accessible through the calibpars pointer. 00105 * 00106 * 00107 * @li Printing methods 00108 * @code 00109 * calibpars -> printInputPars(); 00110 * calibpars -> printCalibPars(); 00111 * calibpars -> printCalibParsStatus(); 00112 * @endcode 00113 * 00114 * @li Access methods 00115 * @code 00116 * const size_t ndim = calibpars -> ndim(); 00117 * const size_t size = calibpars -> size(); 00118 * const unsigned* p_shape = calibpars -> shape(); 00119 * const CalibPars::pedestals_t* p_pedestals = calibpars -> pedestals() 00120 * const CalibPars::common_mode_t* p_common_mode = calibpars -> common_mode() 00121 * const CalibPars::pixel_status_t* p_pixel_stat = calibpars -> pixel_status() 00122 * const CalibPars::pixel_gain_t* p_pixel_gain = calibpars -> pixel_gain() 00123 * const CalibPars::pixel_mask_t* p_pixel_mask = calibpars -> pixel_mask() 00124 * const CalibPars::pixel_bkgd_t* p_pixel_bkgd = calibpars -> pixel_bkgd() 00125 * const CalibPars::pixel_rms_t* p_pixel_rms = calibpars -> pixel_rms() 00126 * ... etc. for all other access methods 00127 * @endcode 00128 * 00129 * @see CalibFileFinder 00130 */ 00131 00132 00133 00134 //---------------- 00135 template <typename TBASE> // TBASE stands for something like pdscalibdata::PrincetonBaseV1 00136 class GenericCalibPars: public PSCalib::CalibPars, TBASE { 00137 00138 public: 00139 00140 00141 typedef PSCalib::CalibPars::shape_t shape_t; 00142 00143 00144 // const static size_t Ndim = TBASE::Ndim; 00145 00146 /** 00147 * @brief Constructor, which use string& source 00148 * 00149 * @param[in] calibDir Calibration directory for current experiment. 00150 * @param[in] groupName Data type and group names. 00151 * @param[in] source The name of the data source. 00152 * @param[in] runNumber Run number to search the valid file name. 00153 * @param[in] print_bits =0-print no messages; +1-input parameters, +2-print msges from PSCalib::CalibFileFinder, +4-use default, +8-missing type 00154 */ 00155 GenericCalibPars ( const std::string& calibDir, // /reg/d/psdm/AMO/amoa1214/calib 00156 const std::string& groupName, // PNCCD::CalibV1 00157 const std::string& source, // Camp.0:pnCCD.0 00158 const unsigned long& runNumber, // 7 00159 unsigned print_bits=255 ); 00160 00161 /** 00162 * @brief Constructor, which use Pds::Src& src 00163 * 00164 * @param[in] calibDir Calibration directory for current experiment. 00165 * @param[in] groupName Data type and group names. 00166 * @param[in] src The data source object, for example Pds::Src m_src; defined in the env.get(...,&m_src) 00167 * @param[in] runNumber Run number to search the valid file name. 00168 * @param[in] print_bits =0-print no messages; +1-input parameters, +2-print msges from PSCalib::CalibFileFinder, +4-use default, +8-missing type 00169 */ 00170 GenericCalibPars ( const std::string& calibDir, // /reg/d/psdm/AMO/amoa1214/calib 00171 const std::string& groupName, // PNCCD::CalibV1 00172 const Pds::Src& src, // Pds::Src m_src; <- is defined in env.get(...,&m_src) 00173 const unsigned long& runNumber, // 7 00174 unsigned print_bits=255 ) ; 00175 00176 virtual ~GenericCalibPars () ; 00177 00178 /// INTERFACE METHODS 00179 00180 virtual const size_t ndim (const CALIB_TYPE& calibtype=PEDESTALS); 00181 virtual const size_t size (const CALIB_TYPE& calibtype=PEDESTALS); 00182 virtual const shape_t* shape(const CALIB_TYPE& calibtype=PEDESTALS); 00183 00184 virtual const int status(const CALIB_TYPE& calibtype); 00185 00186 virtual const CalibPars::pedestals_t* pedestals(); 00187 virtual const CalibPars::pixel_gain_t* pixel_gain(); 00188 virtual const CalibPars::pixel_mask_t* pixel_mask(); 00189 virtual const CalibPars::pixel_bkgd_t* pixel_bkgd(); 00190 virtual const CalibPars::pixel_rms_t* pixel_rms(); 00191 virtual const CalibPars::pixel_status_t* pixel_status(); 00192 virtual const CalibPars::common_mode_t* common_mode(); 00193 00194 virtual void printCalibPars(); 00195 00196 /// ADDITIONAL METHODS 00197 00198 const size_t size_of_ndarray(); 00199 const shape_t* shape_of_ndarray(); 00200 00201 00202 void printInputPars(); 00203 void printCalibParsStatus(); 00204 std::string str_shape(); 00205 00206 // What if 0-pointer? 00207 //const ndarray<const CalibPars::pedestals_t, TBASE::Ndim> pedestals_ndarr (){ return m_pedestals -> get_ndarray(); } 00208 //const ndarray<const CalibPars::pixel_status_t, TBASE::Ndim> pixel_status_ndarr(){ return m_pixel_status -> get_ndarray(); } 00209 //const ndarray<const CalibPars::pixel_gain_t, TBASE::Ndim> pixel_gain_ndarr (){ return m_pixel_gain -> get_ndarray(); } 00210 //const ndarray<const CalibPars::pixel_mask_t, TBASE::Ndim> pixel_mask_ndarr (){ return m_pixel_mask -> get_ndarray(); } 00211 //const ndarray<const CalibPars::pixel_bkgd_t, TBASE::Ndim> pixel_bkgd_ndarr (){ return m_pixel_bkgd -> get_ndarray(); } 00212 //const ndarray<const CalibPars::pixel_rms_t, TBASE::Ndim> pixel_rms_ndarr (){ return m_pixel_rms -> get_ndarray(); } 00213 //const ndarray<const CalibPars::common_mode_t, 1> common_mode_ndarr (){ return m_common_mode -> get_ndarray(); } 00214 00215 private: 00216 00217 /// Initialization, common for all constructors 00218 void init(); 00219 00220 /// Define the path to the calibration file based on input parameters 00221 std::string getCalibFileName(const CALIB_TYPE& calibtype); 00222 00223 /// Copy constructor is disabled by default 00224 GenericCalibPars ( const GenericCalibPars& ) ; 00225 /// Assignment is disabled by default 00226 //GenericCalibPars operator = ( const GenericCalibPars& ) ; 00227 00228 /// Request to load all calib pars for printCalibParsStatus() and printCalibPars() 00229 void loadAllCalibPars(); 00230 00231 // Data members for regular constructor 00232 std::string m_calibDir; 00233 std::string m_groupName; 00234 std::string m_source; 00235 Pds::Src m_src; 00236 std::string m_dataType; 00237 unsigned m_runNumber; 00238 unsigned m_print_bits; 00239 unsigned m_prbits_type; 00240 unsigned m_prbits_cff; 00241 std::string m_name; 00242 size_t m_size; 00243 size_t m_size_cm; 00244 00245 /// dynamically generated 1-d shape for 1-d common mode array 00246 shape_t* m_shape_cm; 00247 00248 // Assuming path: /reg/d/psdm/AMO/amoa1214/calib/PNCCD::CalibV1/Camp.0:pnCCD.1/pedestals/1-end.data 00249 std::string m_fname; 00250 00251 const CalibPars::pedestals_t* p_peds; 00252 00253 typedef pdscalibdata::NDArrIOV1<CalibPars::pedestals_t, TBASE::Ndim> NDAIPEDS; 00254 typedef pdscalibdata::NDArrIOV1<CalibPars::pixel_gain_t, TBASE::Ndim> NDAIGAIN; 00255 typedef pdscalibdata::NDArrIOV1<CalibPars::pixel_mask_t, TBASE::Ndim> NDAIMASK; 00256 typedef pdscalibdata::NDArrIOV1<CalibPars::pixel_bkgd_t, TBASE::Ndim> NDAIBKGD; 00257 typedef pdscalibdata::NDArrIOV1<CalibPars::pixel_rms_t, TBASE::Ndim> NDAIRMS; 00258 typedef pdscalibdata::NDArrIOV1<CalibPars::pixel_status_t,TBASE::Ndim> NDAISTATUS; 00259 typedef pdscalibdata::NDArrIOV1<CalibPars::common_mode_t, 1> NDAICMOD; 00260 00261 NDAIPEDS *m_pedestals; 00262 NDAIGAIN *m_pixel_gain; 00263 NDAIMASK *m_pixel_mask; 00264 NDAIBKGD *m_pixel_bkgd; 00265 NDAIRMS *m_pixel_rms; 00266 NDAISTATUS *m_pixel_status; 00267 NDAICMOD *m_common_mode; 00268 }; 00269 00270 } // namespace PSCalib 00271 00272 #endif // PSCALIB_GENERICCALIBPARS_H