PSCalib/src/CSPadCalibPars.cpp

Go to the documentation of this file.
00001 //--------------------------------------------------------------------------
00002 // File and Version Information:
00003 //      $Id$
00004 //
00005 // Description:
00006 //      Class CSPadCalibPars...
00007 //
00008 // Author List:
00009 //      Mikhail S. Dubrovin
00010 //
00011 //------------------------------------------------------------------------
00012 
00013 //-----------------------
00014 // This Class's Header --
00015 //-----------------------
00016 #include "PSCalib/CSPadCalibPars.h"
00017 
00018 //-----------------
00019 // C/C++ Headers --
00020 //-----------------
00021 #include <iostream>
00022 #include <iomanip>  // for std::setw
00023 
00024 //-------------------------------
00025 // Collaborating Class Headers --
00026 //-------------------------------
00027 #include "MsgLogger/MsgLogger.h"
00028 #include "PSCalib/CalibFileFinder.h"
00029 
00030 //-----------------------------------------------------------------------
00031 // Local Macros, Typedefs, Structures, Unions and Forward Declarations --
00032 //-----------------------------------------------------------------------
00033 using namespace std;
00034 
00035 //              ----------------------------------------
00036 //              -- Public Function Member Definitions --
00037 //              ----------------------------------------
00038 
00039 namespace PSCalib {
00040 
00041 const char logger[] = "PSCalib";
00042 
00043 //----------------
00044 // Constructors --
00045 //----------------
00046 
00047 CSPadCalibPars::CSPadCalibPars (bool isTestMode)
00048   : m_calibDir     (std::string())
00049   , m_typeGroupName(std::string())
00050   , m_source       (std::string())
00051   , m_runNumber    (0)
00052   , m_print_bits   (0377)
00053 {
00054     // Test staff:
00055     m_isTestMode = isTestMode;
00056     if (m_isTestMode) {
00057         m_calibdir      = "/reg/neh/home/dubrovin/LCLS/CSPadAlignment-v01/calib-cxi35711-r0009-det";
00058         m_calibfilename = "0-end.data";
00059     }
00060 
00061     fillCalibNameVector ();
00062     loadCalibPars ();
00063     //printCalibPars();
00064 }
00065 
00066 //----------------
00067 
00068 CSPadCalibPars::CSPadCalibPars ( const std::string&   calibDir,           //  /reg/d/psdm/cxi/cxi35711/calib
00069                                  const std::string&   typeGroupName,      //  CsPad::CalibV1
00070                                  const std::string&   source,             //  CxiDs1.0:Cspad.0
00071                                  const unsigned long& runNumber,          //  10
00072                                  const unsigned&      print_bits )        //  0
00073   : m_calibDir(calibDir)
00074   , m_typeGroupName(typeGroupName)
00075   , m_source(source)
00076 //, m_src(source)
00077   , m_runNumber(runNumber)
00078   , m_print_bits(print_bits)
00079 {
00080     m_isTestMode = false;
00081 
00082     fillCalibNameVector ();
00083     loadCalibPars ();
00084 
00085     if(m_print_bits & 1) {
00086       MsgLog("CSPadCalibPars", info, "Depricated constructor with string& source");
00087       printInputPars ();
00088     }
00089     if(m_print_bits & 2) printCalibPars();
00090 }
00091 
00092 //----------------
00093 
00094 CSPadCalibPars::CSPadCalibPars ( const std::string&   calibDir,           //  /reg/d/psdm/cxi/cxi35711/calib
00095                                  const std::string&   typeGroupName,      //  CsPad::CalibV1
00096                                  const Pds::Src&      src,                //  Pds::Src m_src; <- is defined in get(...,&m_src)
00097                                  const unsigned long& runNumber,          //  10
00098                                  const unsigned&      print_bits )        //  0
00099   : m_calibDir(calibDir)
00100   , m_typeGroupName(typeGroupName)
00101   , m_source(std::string())
00102   , m_src(src)
00103   , m_runNumber(runNumber)
00104   , m_print_bits(print_bits)
00105 {
00106     m_isTestMode = false;
00107 
00108     fillCalibNameVector ();
00109     loadCalibPars ();
00110 
00111     if(m_print_bits & 1) {
00112        MsgLog("CSPadCalibPars", info, "Regular constructor with Pds::Src& src, hence m_source is empty...");
00113        printInputPars ();
00114     }
00115     if(m_print_bits & 2) printCalibPars();
00116 }
00117 
00118 //----------------
00119 
00120 void CSPadCalibPars::fillCalibNameVector ()
00121 {
00122     v_calibname.clear();
00123     v_calibname.push_back("center");
00124     v_calibname.push_back("center_corr");
00125     v_calibname.push_back("marg_gap_shift");
00126     v_calibname.push_back("offset");
00127     v_calibname.push_back("offset_corr");
00128     v_calibname.push_back("rotation");
00129     v_calibname.push_back("tilt");
00130     v_calibname.push_back("quad_rotation");
00131     v_calibname.push_back("quad_tilt");
00132     v_calibname.push_back("beam_vector");
00133     v_calibname.push_back("beam_intersect");
00134     v_calibname.push_back("center_global");
00135     v_calibname.push_back("rotation_global");
00136 }
00137 
00138 //----------------
00139 
00140 void CSPadCalibPars::loadCalibPars ()
00141 {
00142     for( vector<std::string>::const_iterator iterCalibName  = v_calibname.begin();
00143                                              iterCalibName != v_calibname.end(); iterCalibName++ )
00144       {
00145         m_cur_calibname = *iterCalibName;
00146 
00147         getCalibFileName();
00148 
00149         if (m_fname == std::string()) { 
00150           fillDefaultCalibParsV1 ();
00151           if(m_print_bits & 4) msgUseDefault ();
00152           m_calibtype_status[m_cur_calibname] = 0; 
00153         } 
00154         else 
00155         {
00156           openCalibFile   ();
00157           readCalibPars   ();
00158           closeCalibFile  ();
00159           fillCalibParsV1 ();
00160           m_calibtype_status[m_cur_calibname] = 1; 
00161         }
00162       }
00163 }
00164 
00165 //----------------
00166 
00167 void CSPadCalibPars::getCalibFileName ()
00168 {
00169   if ( m_isTestMode ) 
00170     {
00171       m_fname  = m_calibdir + "/"; 
00172       m_fname += m_cur_calibname + "/"; 
00173       m_fname += m_calibfilename; // "/0-end.data"; // !!! THIS IS A SIMPLIFIED CASE OF THE FILE NAME!!!
00174     }
00175   else if (m_calibDir == std::string())
00176     {
00177       m_fname = std::string();
00178     }
00179   else
00180     {
00181       PSCalib::CalibFileFinder *calibfinder = new PSCalib::CalibFileFinder(m_calibDir, m_typeGroupName);
00182       //m_fname = calibfinder -> findCalibFile(m_src, m_cur_calibname, m_runNumber);
00183 
00184       if (m_source == std::string())
00185           m_fname = calibfinder -> findCalibFile(m_src, m_cur_calibname, m_runNumber);
00186       else
00187           m_fname = calibfinder -> findCalibFile(m_source, m_cur_calibname, m_runNumber);
00188     }
00189   MsgLog("CSPadCalibPars", debug, "getCalibFileName(): " << m_fname);
00190 }
00191 
00192 //----------------
00193 
00194 void CSPadCalibPars::openCalibFile ()
00195 {
00196    m_file.open(m_fname.c_str());
00197 
00198    if (not m_file.good()) {
00199      const std::string msg = "Failed to open file: "+m_fname;
00200      MsgLogRoot(error, msg);
00201      //throw std::runtime_error(msg);
00202    }
00203 }
00204 
00205 //----------------
00206 
00207 void CSPadCalibPars::closeCalibFile ()
00208 {
00209    m_file.close();
00210 }
00211 
00212 //----------------
00213 
00214 void CSPadCalibPars::readCalibPars ()
00215 {
00216   v_parameters.clear();
00217   std::string str;
00218   do{ 
00219       m_file >> str; 
00220       if(m_file.good()) {
00221          v_parameters.push_back(std::atof(str.c_str())); // cout << str << " "; 
00222       }
00223     } while( m_file.good() );                            // cout << endl << endl;
00224 }
00225 
00226 //----------------
00227 
00228 void CSPadCalibPars::fillCalibParsV1 ()
00229 {
00230        if( m_cur_calibname == v_calibname[0] ) m_center         = new pdscalibdata::CalibParsCenterV1(v_parameters);
00231   else if( m_cur_calibname == v_calibname[1] ) m_center_corr    = new pdscalibdata::CalibParsCenterCorrV1(v_parameters);
00232   else if( m_cur_calibname == v_calibname[2] ) m_marg_gap_shift = new pdscalibdata::CalibParsMargGapShiftV1(v_parameters);
00233   else if( m_cur_calibname == v_calibname[3] ) m_offset         = new pdscalibdata::CalibParsOffsetV1(v_parameters);
00234   else if( m_cur_calibname == v_calibname[4] ) m_offset_corr    = new pdscalibdata::CalibParsOffsetCorrV1(v_parameters);
00235   else if( m_cur_calibname == v_calibname[5] ) m_rotation       = new pdscalibdata::CalibParsRotationV1(v_parameters);
00236   else if( m_cur_calibname == v_calibname[6] ) m_tilt           = new pdscalibdata::CalibParsTiltV1(v_parameters);
00237   else if( m_cur_calibname == v_calibname[7] ) m_quad_rotation  = new pdscalibdata::CalibParsQuadRotationV1(v_parameters);
00238   else if( m_cur_calibname == v_calibname[8] ) m_quad_tilt      = new pdscalibdata::CalibParsQuadTiltV1(v_parameters);
00239   else if( m_cur_calibname == v_calibname[9] ) m_beam_vector    = new pdscalibdata::CsPadBeamVectorV1(v_parameters);
00240   else if( m_cur_calibname == v_calibname[10]) m_beam_intersect = new pdscalibdata::CsPadBeamIntersectV1(v_parameters);
00241   else if( m_cur_calibname == v_calibname[11]) m_center_global  = new pdscalibdata::CsPadCenterGlobalV1(v_parameters);
00242   else if( m_cur_calibname == v_calibname[12]) m_rotation_global= new pdscalibdata::CsPadRotationGlobalV1(v_parameters);
00243 }
00244 
00245 //----------------
00246 
00247 void CSPadCalibPars::fillDefaultCalibParsV1 ()
00248 {
00249   // If default parameters are available - set them.
00250   // For calib types where default parameters are not accaptable and the file is missing - error message and abort.
00251        if( m_cur_calibname == v_calibname[0] ) m_center         = new pdscalibdata::CalibParsCenterV1();
00252   else if( m_cur_calibname == v_calibname[1] ) m_center_corr    = new pdscalibdata::CalibParsCenterCorrV1();
00253   else if( m_cur_calibname == v_calibname[2] ) m_marg_gap_shift = new pdscalibdata::CalibParsMargGapShiftV1();
00254   else if( m_cur_calibname == v_calibname[3] ) m_offset         = new pdscalibdata::CalibParsOffsetV1();
00255   else if( m_cur_calibname == v_calibname[4] ) m_offset_corr    = new pdscalibdata::CalibParsOffsetCorrV1();
00256   else if( m_cur_calibname == v_calibname[5] ) m_rotation       = new pdscalibdata::CalibParsRotationV1();
00257   else if( m_cur_calibname == v_calibname[6] ) m_tilt           = new pdscalibdata::CalibParsTiltV1();
00258   else if( m_cur_calibname == v_calibname[7] ) m_quad_rotation  = new pdscalibdata::CalibParsQuadRotationV1();
00259   else if( m_cur_calibname == v_calibname[8] ) m_quad_tilt      = new pdscalibdata::CalibParsQuadTiltV1();
00260   else if( m_cur_calibname == v_calibname[9] ) m_beam_vector    = new pdscalibdata::CsPadBeamVectorV1();
00261   else if( m_cur_calibname == v_calibname[10]) m_beam_intersect = new pdscalibdata::CsPadBeamIntersectV1();
00262   else if( m_cur_calibname == v_calibname[11]) m_center_global  = new pdscalibdata::CsPadCenterGlobalV1();
00263   else if( m_cur_calibname == v_calibname[12]) m_rotation_global= new pdscalibdata::CsPadRotationGlobalV1();
00264 
00265   else fatalMissingFileName ();
00266 }
00267 
00268 //----------------
00269 
00270 void CSPadCalibPars::fatalMissingFileName ()
00271 {
00272         MsgLog("CSPadCalibPars", warning, "In getCalibFileName(): the calibration file for the source=" << m_source 
00273                   << ", type=" << m_cur_calibname 
00274                   << ", run=" <<  m_runNumber
00275                   << " is not found ..."
00276                   << "\nWARNING: Default CSPad alignment constants can not guarantee correct geometry and are not available yet."
00277                   << "\nWARNING: Please provide all expected CSPad alignment constants under the directory .../<experiment>/calib/...");
00278         abort();
00279 }
00280 
00281 //----------------
00282 
00283 void CSPadCalibPars::msgUseDefault ()
00284 {
00285         MsgLog("CSPadCalibPars", info, "In getCalibFileName(): the calibration file for the source=" << m_source 
00286                   << ", type=" << m_cur_calibname 
00287                   << ", run=" <<  m_runNumber
00288                   << " is not found ..."
00289                   << "\nWARNING: Default CSPad alignment constants will be used.");
00290 }
00291 
00292 //----------------
00293 
00294 void CSPadCalibPars::printCalibPars()
00295 {
00296     WithMsgLog("CSPadCalibPars", info, str) {
00297       str << "printCalibPars()" ;
00298       str << "\n getColSize_um()    = " << getColSize_um() ;
00299       str << "\n getRowSize_um()    = " << getRowSize_um() ;
00300       str << "\n getGapRowSize_um() = " << getGapRowSize_um() ;
00301     }        
00302 
00303      m_center         -> print();
00304      m_center_corr    -> print();
00305      m_marg_gap_shift -> print();
00306      m_offset         -> print();
00307      m_offset_corr    -> print();
00308      m_rotation       -> print();
00309      m_tilt           -> print();
00310      m_quad_rotation  -> print();
00311      m_quad_tilt      -> print();
00312      m_beam_vector    -> print();
00313      m_beam_intersect -> print();
00314      m_center_global  -> print();
00315      m_rotation_global-> print();
00316 }
00317 
00318 //----------------
00319 
00320 void CSPadCalibPars::printInputPars()
00321 {
00322     WithMsgLog("CSPadCalibPars", info, str) {
00323       str << "printInputPars()" ;
00324       str << "\n m_calibDir      = " << m_calibDir ;
00325       str << "\n m_typeGroupName = " << m_typeGroupName ;
00326       str << "\n m_source        = " << m_source ;
00327       str << "\n m_runNumber     = " << m_runNumber ;
00328     }        
00329 }
00330 
00331 //----------------
00332 
00333 void CSPadCalibPars::printCalibParsStatus ()
00334 {
00335     WithMsgLog("CSPadCalibPars", info, str) {
00336       str << "printCalibParsStatus()" ;
00337 
00338       for( vector<std::string>::const_iterator iterCalibName  = v_calibname.begin();
00339                                                iterCalibName != v_calibname.end(); iterCalibName++ )
00340       {
00341           m_cur_calibname = *iterCalibName;
00342 
00343           str << "\n type: "  << std::left << std::setw(20) << m_cur_calibname
00344               << " status = " << m_calibtype_status[m_cur_calibname]; 
00345       }
00346     }        
00347 }
00348 
00349 //--------------
00350 // Destructor --
00351 //--------------
00352 
00353 CSPadCalibPars::~CSPadCalibPars ()
00354 {
00355   //delete [] m_data; 
00356 }
00357 
00358 //----------------
00359 //----------------
00360 //----------------
00361 //----------------
00362 
00363 } // namespace PSCalib

Generated on 19 Dec 2016 for PSANAmodules by  doxygen 1.4.7