00001 #ifndef CSPADPIXCOORDS_CSPAD2X2NDARRPRODUCER_H
00002 #define CSPADPIXCOORDS_CSPAD2X2NDARRPRODUCER_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "psana/Module.h"
00021
00022
00023
00024
00025 #include "CSPadPixCoords/GlobalMethods.h"
00026 #include "CSPadPixCoords/CSPad2x2ConfigPars.h"
00027
00028
00029
00030
00031 #include "PSEvt/Source.h"
00032 #include "psddl_psana/cspad2x2.ddl.h"
00033
00034
00035
00036
00037
00038
00039 using namespace std;
00040
00041 namespace CSPadPixCoords {
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068 class CSPad2x2NDArrProducer : public Module {
00069 public:
00070
00071 typedef CSPadPixCoords::CSPad2x2ConfigPars CONFIG;
00072
00073 const static uint32_t NRows2x1 = 185;
00074 const static uint32_t NCols2x1 = 388;
00075 const static uint32_t N2x1 = 2;
00076
00077
00078 CSPad2x2NDArrProducer (const std::string& name) ;
00079
00080
00081 virtual ~CSPad2x2NDArrProducer () ;
00082
00083
00084 virtual void beginJob(Event& evt, Env& env);
00085
00086
00087 virtual void beginRun(Event& evt, Env& env);
00088
00089
00090 virtual void beginCalibCycle(Event& evt, Env& env);
00091
00092
00093
00094 virtual void event(Event& evt, Env& env);
00095
00096
00097 virtual void endCalibCycle(Event& evt, Env& env);
00098
00099
00100 virtual void endRun(Event& evt, Env& env);
00101
00102
00103 virtual void endJob(Event& evt, Env& env);
00104
00105
00106 protected:
00107
00108 void printInputParameters();
00109 void procEvent(Event& evt, Env& env);
00110 void checkTypeImplementation();
00111
00112 private:
00113
00114
00115
00116 Pds::Src m_src;
00117 Source m_source;
00118 std::string m_inkey;
00119 std::string m_outkey;
00120 std::string m_outtype;
00121 bool m_is_2darray;
00122 unsigned m_print_bits;
00123 long m_count;
00124
00125 DATA_TYPE m_dtype;
00126 CONFIG* m_config;
00127
00128
00129 uint32_t m_roiMask;
00130 uint32_t m_numAsicsStored;
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141 template <typename TELEMENT, typename TOUT>
00142 bool procCSPad2x2DataForType (Event& evt) {
00143
00144 typedef int16_t data_cspad_t;
00145
00146 shared_ptr<TELEMENT> elem = evt.get(m_source, m_inkey, &m_src);
00147
00148 if (elem) {
00149
00150 const ndarray<const data_cspad_t,3>& data_ndarr = elem->data();
00151
00152
00153
00154
00155
00156
00157
00158 if (m_is_2darray) {
00159
00160
00161
00162 ndarray<TOUT,2> out_ndarr = make_ndarray<TOUT>(NRows2x1, NCols2x1 * N2x1);
00163 typename ndarray<TOUT,2>::iterator it_out = out_ndarr.begin();
00164 for ( ndarray<const data_cspad_t,3>::iterator it=data_ndarr.begin(); it!=data_ndarr.end(); ++it, ++it_out) {
00165 *it_out = (TOUT)*it;
00166 }
00167 save2DArrayInEvent<TOUT>(evt, m_src, m_outkey, out_ndarr);
00168 }
00169 else {
00170
00171 ndarray<TOUT,3> out_ndarr = make_ndarray<TOUT>(NRows2x1, NCols2x1, N2x1);
00172 typename ndarray<TOUT,3>::iterator it_out = out_ndarr.begin();
00173 for ( ndarray<const data_cspad_t,3>::iterator it=data_ndarr.begin(); it!=data_ndarr.end(); ++it, ++it_out) {
00174 *it_out = (TOUT)*it;
00175 }
00176
00177 save3DArrInEvent<TOUT>(evt, m_src, m_outkey, out_ndarr);
00178 }
00179
00180 return true;
00181 }
00182 return false;
00183 }
00184
00185
00186
00187
00188
00189
00190
00191 template <typename TOUT>
00192 bool procEventForOutputType (Event& evt) {
00193
00194
00195 if ( procCSPad2x2DataForType <Psana::CsPad2x2::ElementV1, TOUT> (evt) ) return true;
00196
00197 return false;
00198 }
00199
00200
00201
00202 };
00203
00204 }
00205
00206 #endif // CSPADPIXCOORDS_CSPAD2X2NDARRPRODUCER_H