00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "PSCalib/CSPadCalibPars.h"
00017
00018
00019
00020
00021 #include <iostream>
00022 #include <iomanip>
00023
00024
00025
00026
00027 #include "MsgLogger/MsgLogger.h"
00028 #include "PSCalib/CalibFileFinder.h"
00029
00030
00031
00032
00033 using namespace std;
00034
00035
00036
00037
00038
00039 namespace PSCalib {
00040
00041 const char logger[] = "PSCalib";
00042
00043
00044
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
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
00064 }
00065
00066
00067
00068 CSPadCalibPars::CSPadCalibPars ( const std::string& calibDir,
00069 const std::string& typeGroupName,
00070 const std::string& source,
00071 const unsigned long& runNumber,
00072 const unsigned& print_bits )
00073 : m_calibDir(calibDir)
00074 , m_typeGroupName(typeGroupName)
00075 , m_source(source)
00076
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,
00095 const std::string& typeGroupName,
00096 const Pds::Src& src,
00097 const unsigned long& runNumber,
00098 const unsigned& print_bits )
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;
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
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
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()));
00222 }
00223 } while( m_file.good() );
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
00250
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
00351
00352
00353 CSPadCalibPars::~CSPadCalibPars ()
00354 {
00355
00356 }
00357
00358
00359
00360
00361
00362
00363 }