00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "CSPadPixCoords/GlobalMethods.h"
00017
00018
00019
00020
00021 #include <boost/lexical_cast.hpp>
00022
00023
00024
00025
00026 #include <boost/shared_ptr.hpp>
00027 #include "PSEvt/EventId.h"
00028 #include "PSTime/Time.h"
00029
00030
00031
00032
00033
00034
00035 using namespace std;
00036 using namespace CSPadPixCoords;
00037
00038
00039
00040
00041
00042 namespace CSPadPixCoords {
00043
00044
00045
00046
00047 GlobalMethods::GlobalMethods ()
00048 {
00049 }
00050
00051
00052
00053
00054 GlobalMethods::~GlobalMethods ()
00055 {
00056 }
00057
00058
00059
00060 std::string
00061 stringFromUint(unsigned number, unsigned width, char fillchar)
00062 {
00063 stringstream ssNum; ssNum << setw(width) << setfill(fillchar) << number;
00064 return ssNum.str();
00065 }
00066
00067
00068
00069 std::string
00070 stringTimeStamp(PSEvt::Event& evt, std::string fmt)
00071 {
00072 boost::shared_ptr<PSEvt::EventId> eventId = evt.get();
00073 if (eventId.get()) return (eventId->time()).asStringFormat(fmt);
00074 else return std::string("time-stamp-is-unavailable");
00075 }
00076
00077
00078
00079 double
00080 doubleTime(PSEvt::Event& evt)
00081 {
00082 boost::shared_ptr<PSEvt::EventId> eventId = evt.get();
00083 if (eventId.get()) return double(eventId->time().sec()) + 1e-9*eventId->time().nsec();
00084 else return double(0);
00085 }
00086
00087
00088
00089 std::string
00090 stringRunNumber(PSEvt::Event& evt, unsigned width)
00091 {
00092 boost::shared_ptr<PSEvt::EventId> eventId = evt.get();
00093 if (eventId.get()) return stringFromUint(eventId->run(), width);
00094 else return std::string("run-is-not-defined");
00095 }
00096
00097
00098
00099
00100 int
00101 getRunNumber(PSEvt::Event& evt)
00102 {
00103 boost::shared_ptr<PSEvt::EventId> eventId = evt.get();
00104 if (eventId.get()) {
00105 return eventId->run();
00106 } else {
00107 MsgLogRoot(warning, "Cannot determine run number, will use 0.");
00108 return int(0);
00109 }
00110 }
00111
00112
00113
00114 void
00115 printTimeStamp(PSEvt::Event& evt, int counter)
00116 {
00117 boost::shared_ptr<PSEvt::EventId> eventId = evt.get();
00118 if (eventId.get()) {
00119
00120 MsgLogRoot( info, " Run=" << eventId->run()
00121 << " Event=" << counter
00122 << " Time=" << eventId->time() );
00123 }
00124 }
00125
00126
00127
00128 unsigned
00129 fiducials(PSEvt::Event& evt)
00130 {
00131 boost::shared_ptr<PSEvt::EventId> eventId = evt.get();
00132 if (eventId.get()) return eventId->fiducials();
00133 else return 0;
00134 }
00135
00136
00137
00138 unsigned
00139 eventCounterSinceConfigure(PSEvt::Event& evt)
00140 {
00141 boost::shared_ptr<PSEvt::EventId> eventId = evt.get();
00142 if (eventId.get()) return eventId->vector();
00143 else return 0;
00144 }
00145
00146
00147
00148 void
00149 printSizeOfTypes()
00150 {
00151 std::cout << "Size Of Types:"
00152 << "\nsizeof(bool ) = " << sizeof(bool ) << " with typeid(bool ).name(): " << typeid(bool ).name()
00153 << "\nsizeof(uint8_t ) = " << sizeof(uint8_t ) << " with typeid(uint8_t ).name(): " << typeid(uint8_t ).name()
00154 << "\nsizeof(uint16_t) = " << sizeof(uint16_t) << " with typeid(uint16_t).name(): " << typeid(uint16_t).name()
00155 << "\nsizeof(uint32_t) = " << sizeof(uint32_t) << " with typeid(uint32_t).name(): " << typeid(uint32_t).name()
00156 << "\nsizeof(int ) = " << sizeof(int ) << " with typeid(int ).name(): " << typeid(int ).name()
00157 << "\nsizeof(int16_t ) = " << sizeof(int16_t ) << " with typeid(int16_t ).name(): " << typeid(int16_t ).name()
00158 << "\nsizeof(int32_t ) = " << sizeof(int32_t ) << " with typeid(int32_t ).name(): " << typeid(int32_t ).name()
00159 << "\nsizeof(float ) = " << sizeof(float ) << " with typeid(float ).name(): " << typeid(float ).name()
00160 << "\nsizeof(double ) = " << sizeof(double ) << " with typeid(double ).name(): " << typeid(double ).name()
00161 << "\n\n";
00162 }
00163
00164
00165
00166 void
00167 defineImageShape(PSEvt::Event& evt, const PSEvt::Source& src, const std::string& key, unsigned* shape)
00168 {
00169 if ( defineImageShapeForType<double> (evt, src, key, shape) ) return;
00170 if ( defineImageShapeForType<float> (evt, src, key, shape) ) return;
00171 if ( defineImageShapeForType<int> (evt, src, key, shape) ) return;
00172 if ( defineImageShapeForType<int32_t> (evt, src, key, shape) ) return;
00173 if ( defineImageShapeForType<uint32_t>(evt, src, key, shape) ) return;
00174 if ( defineImageShapeForType<uint16_t>(evt, src, key, shape) ) return;
00175 if ( defineImageShapeForType<uint8_t> (evt, src, key, shape) ) return;
00176
00177
00178 const std::string msg = "Image shape is tested for double, uint16_t, int, float, uint8_t and is not defined in the event(...)\nfor source:"
00179 + boost::lexical_cast<std::string>(src) + " key:" + key + "\nEXIT psana...";
00180 MsgLogRoot(error, msg);
00181 throw std::runtime_error("EXIT psana...");
00182 }
00183
00184
00185
00186 }