CSPadPixCoords/src/SaveImageInFile.cpp

Go to the documentation of this file.
00001 //--------------------------------------------------------------------------
00002 // File and Version Information:
00003 //      $Id$
00004 //
00005 // Description:
00006 //      Class SaveImageInFile...
00007 //
00008 // Author List:
00009 //      Mikhail S. Dubrovin
00010 //
00011 //------------------------------------------------------------------------
00012 
00013 //-----------------------
00014 // This Class's Header --
00015 //-----------------------
00016 #include "CSPadPixCoords/SaveImageInFile.h"
00017 
00018 //-----------------
00019 // C/C++ Headers --
00020 //-----------------
00021 // #include <time.h>
00022 
00023 //-------------------------------
00024 // Collaborating Class Headers --
00025 //-------------------------------
00026 #include "MsgLogger/MsgLogger.h"
00027 #include "PSEvt/EventId.h"
00028 #include "CSPadPixCoords/Image2D.h"
00029 
00030 //-----------------------------------------------------------------------
00031 // Local Macros, Typedefs, Structures, Unions and Forward Declarations --
00032 //-----------------------------------------------------------------------
00033 //#include <boost/lexical_cast.hpp>
00034 #include <iomanip> // for setw, setfill
00035 #include <sstream> // for streamstring
00036 
00037 // This declares this class as psana module
00038 using namespace CSPadPixCoords;
00039 PSANA_MODULE_FACTORY(SaveImageInFile)
00040 
00041 using namespace std;
00042 
00043 //              ----------------------------------------
00044 //              -- Public Function Member Definitions --
00045 //              ----------------------------------------
00046 
00047 namespace CSPadPixCoords {
00048 
00049 //----------------
00050 // Constructors --
00051 //----------------
00052 
00053 SaveImageInFile::SaveImageInFile (const std::string& name)
00054   : Module(name)
00055   , m_str_src()
00056   , m_key()
00057   , m_eventSave()
00058   , m_saveAll()
00059   , m_fname()
00060   , m_print_bits()
00061   , m_count(0)
00062 {
00063   // get the values from configuration or use defaults
00064   m_str_src       = configStr("source",   "CxiDs1.0:Cspad.0");
00065   m_key           = configStr("key",      "Image2D");
00066   m_eventSave     = config   ("eventSave", 0);
00067   m_saveAll       = config   ("saveAll",   false);
00068   m_fname         = configStr("fname",    "cspad-image");
00069   m_print_bits    = config   ("print_bits",0);
00070 }
00071 
00072 //--------------
00073 // Destructor --
00074 //--------------
00075 
00076 SaveImageInFile::~SaveImageInFile ()
00077 {
00078 }
00079 
00080 //--------------------
00081 
00082 //--------------------
00083 
00084 /// Method which is called once at the beginning of the job
00085 void 
00086 SaveImageInFile::beginJob(Event& evt, Env& env)
00087 {
00088   if( m_print_bits & 1 ) printInputParameters();
00089 }
00090 
00091 //--------------------
00092 
00093 /// Method which is called at the beginning of the run
00094 void 
00095 SaveImageInFile::beginRun(Event& evt, Env& env)
00096 {
00097 }
00098 
00099 //--------------------
00100 
00101 /// Method which is called at the beginning of the calibration cycle
00102 void 
00103 SaveImageInFile::beginCalibCycle(Event& evt, Env& env)
00104 {
00105 }
00106 
00107 //--------------------
00108 
00109 /// Method which is called with event data, this is the only required 
00110 /// method, all other methods are optional
00111 void 
00112 SaveImageInFile::event(Event& evt, Env& env)
00113 {
00114   // this is how to gracefully stop analysis job
00115   ++m_count;
00116   //if (m_count >= m_maxEvents) stop();
00117   MsgLog(name(), debug, "Event: " << m_count);
00118   if (m_saveAll || m_count == m_eventSave) this -> saveImageInFile(evt);
00119 }
00120 
00121 //--------------------
00122   
00123 /// Method which is called at the end of the calibration cycle
00124 void 
00125 SaveImageInFile::endCalibCycle(Event& evt, Env& env)
00126 {
00127 }
00128 
00129 //--------------------
00130 
00131 /// Method which is called at the end of the run
00132 void 
00133 SaveImageInFile::endRun(Event& evt, Env& env)
00134 {
00135 }
00136 
00137 //--------------------
00138 
00139 /// Method which is called once at the end of the job
00140 void 
00141 SaveImageInFile::endJob(Event& evt, Env& env)
00142 {
00143 }
00144 
00145 //--------------------
00146 //--------------------
00147 //--------------------
00148 //--------------------
00149 
00150 std::string  
00151 SaveImageInFile::strTimeStamp(Event& evt)
00152 {
00153   shared_ptr<PSEvt::EventId> eventId = evt.get();
00154   if (eventId.get()) {
00155 
00156     //m_time = eventId->time();
00157     //std::stringstream ss;
00158     //ss << hex << t_msec;
00159     //string hex_msec = ss.str();
00160 
00161     return (eventId->time()).asStringFormat( "%Y-%m-%d-%H%M%S%f"); // "%Y-%m-%d %H:%M:%S%f%z"
00162   }
00163   else
00164     return std::string("time-stamp-is-not-defined");
00165 }
00166 
00167 //--------------------
00168 
00169 std::string  
00170 SaveImageInFile::strRunNumber(Event& evt)
00171 {
00172   shared_ptr<PSEvt::EventId> eventId = evt.get();
00173   if (eventId.get()) {
00174     stringstream ssRunNum; ssRunNum << "r" << setw(4) << setfill('0') << eventId->run();
00175     return ssRunNum.str();
00176   }
00177   else
00178     return std::string("run-is-not-defined");
00179 }
00180 
00181 //--------------------
00182 
00183 std::string
00184 SaveImageInFile::strEventCounter()
00185 {
00186   stringstream ssEvNum; ssEvNum << setw(6) << setfill('0') << m_count;
00187   return ssEvNum.str();
00188 }
00189 
00190 //--------------------
00191 
00192 void 
00193 SaveImageInFile::saveImageInFile(Event& evt)
00194 {
00195   // Define the file name
00196   stringstream ssEvNum; ssEvNum << setw(6) << setfill('0') << m_count;
00197   string fname = m_fname + "-" + strRunNumber(evt) + "-" + strTimeStamp(evt) + ".txt";
00198 
00199   // In case if m_key == "Image2D" 
00200 
00201   shared_ptr< CSPadPixCoords::Image2D<double> > img2d = evt.get(m_str_src, m_key, &m_src);
00202   if (img2d.get()) {
00203     if( m_print_bits & 2 )MsgLog(name(), info, "::saveImageInFile(...): Get image as Image2D<double> from event and save it in file");
00204     img2d -> saveImageInFile(fname,0);
00205   } // if (img2d.get())
00206 
00207 
00208   shared_ptr< ndarray<const double,2> > img = evt.get(m_str_src, m_key, &m_src);
00209   if (img.get()) {
00210     if( m_print_bits & 2 ) MsgLog(name(), info, "::saveImageInFile(...): Get image as ndarray<double,2> from event and save it in file");
00211     CSPadPixCoords::Image2D<double> *img2d = new CSPadPixCoords::Image2D<double>(img->data(),img->shape()[0],img->shape()[1]);
00212     img2d -> saveImageInFile(fname,0);
00213   } // if (img.get())
00214 
00215 
00216   shared_ptr< ndarray<const uint16_t,2> > img_u16 = evt.get(m_str_src, m_key, &m_src);
00217   if (img_u16.get()) {
00218     if( m_print_bits & 2 ) MsgLog(name(), info, "::saveImageInFile(...): Get image as ndarray<uint16_t,2> from event and save it in file");
00219     CSPadPixCoords::Image2D<uint16_t> *img2d = new CSPadPixCoords::Image2D<uint16_t>(img_u16->data(),img_u16->shape()[0],img_u16->shape()[1]);
00220     img2d -> saveImageInFile(fname,0);
00221   } // if (img_u16.get())
00222 }
00223 
00224 //--------------------
00225 /// Print input parameters
00226 void 
00227 SaveImageInFile::printInputParameters()
00228 {
00229   WithMsgLog(name(), info, log) {
00230     log << "\nInput parameters:"
00231         << "\nsource       : "     << m_str_src
00232         << "\nkey          : "     << m_key      
00233         << "\neventSave    : "     << m_eventSave
00234         << "\nsaveAll      : "     << m_saveAll
00235         << "\nfname        : "     << m_fname
00236         << "\nm_print_bits : "     << m_print_bits;
00237   }
00238 }
00239 
00240 //--------------------
00241 //--------------------
00242 
00243 } // namespace CSPadPixCoords

Generated on 19 Dec 2016 for PSANAmodules by  doxygen 1.4.7