00001 #ifndef CSPADPIXCOORDS_CSPADNDARRPRODUCER_H
00002 #define CSPADPIXCOORDS_CSPADNDARRPRODUCER_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/CSPadConfigPars.h"
00027
00028
00029
00030
00031 #include "PSEvt/Source.h"
00032 #include "psddl_psana/cspad.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 CSPadNDArrProducer : public Module {
00069 public:
00070
00071 typedef CSPadPixCoords::CSPadConfigPars CONFIG;
00072
00073 const static uint32_t NQuadsMax = 4;
00074 const static uint32_t N2x1 = 8;
00075 const static uint32_t NRows2x1 = 185;
00076 const static uint32_t NCols2x1 = 388;
00077 const static uint32_t SizeOf2x1Arr = NRows2x1 * NCols2x1;
00078
00079
00080
00081
00082
00083
00084
00085
00086 CSPadNDArrProducer (const std::string& name) ;
00087
00088
00089 virtual ~CSPadNDArrProducer () ;
00090
00091
00092 virtual void beginJob(Event& evt, Env& env);
00093
00094
00095 virtual void beginRun(Event& evt, Env& env);
00096
00097
00098 virtual void beginCalibCycle(Event& evt, Env& env);
00099
00100
00101
00102 virtual void event(Event& evt, Env& env);
00103
00104
00105 virtual void endCalibCycle(Event& evt, Env& env);
00106
00107
00108 virtual void endRun(Event& evt, Env& env);
00109
00110
00111 virtual void endJob(Event& evt, Env& env);
00112
00113
00114 protected:
00115
00116 void printInputParameters();
00117 void procEvent(Event& evt, Env& env);
00118 void checkTypeImplementation();
00119
00120 private:
00121
00122
00123
00124 Pds::Src m_src;
00125 Source m_source;
00126 std::string m_inkey;
00127 std::string m_outkey;
00128 std::string m_outtype;
00129 bool m_is_fullsize;
00130 bool m_is_2darray;
00131 unsigned m_print_bits;
00132 long m_count;
00133 DATA_TYPE m_dtype;
00134 CONFIG* m_config;
00135
00136
00137
00138
00139
00140
00141
00142 template <typename TDATA, typename TELEMENT, typename TOUT>
00143 bool procCSPadDataForType (Event& evt) {
00144
00145 typedef int16_t data_cspad_t;
00146
00147 shared_ptr<TDATA> shp = evt.get(m_source, m_inkey, &m_src);
00148
00149 if (shp.get()) {
00150
00151
00152 const unsigned shape[] = {m_config->num2x1StoredInData(), NRows2x1, NCols2x1};
00153 ndarray<TOUT,3> out_ndarr(shape);
00154 std::fill(out_ndarr.begin(), out_ndarr.end(), TOUT(0));
00155
00156 typename ndarray<TOUT,3>::iterator it_out = out_ndarr.begin();
00157
00158
00159 uint32_t numQuads = shp->quads_shape()[0];
00160
00161 for (uint32_t q = 0; q < numQuads; ++ q) {
00162 const TELEMENT& el = shp->quads(q);
00163 const ndarray<const data_cspad_t,3>& quad_ndarr = el.data();
00164
00165
00166 for ( ndarray<const data_cspad_t,3>::iterator it=quad_ndarr.begin(); it!=quad_ndarr.end(); ++it, ++it_out) {
00167 *it_out = (TOUT)*it;
00168 }
00169 }
00170
00171 if (m_is_fullsize) {
00172 ndarray<TOUT,3> nda_det = m_config->getCSPadPixNDArrFromNDArrShapedAsData<TOUT>(out_ndarr);
00173
00174 if (m_is_2darray) {
00175
00176 ndarray<TOUT,2> arr2d = make_ndarray<TOUT>(NQuadsMax*N2x1*NRows2x1, NCols2x1);
00177 std::memcpy(arr2d.begin(), nda_det.begin(), sizeof(TOUT)*32*SizeOf2x1Arr);
00178 save2DArrayInEvent<TOUT>(evt, m_src, m_outkey, arr2d);
00179 }
00180 else save3DArrInEvent<TOUT>(evt, m_src, m_outkey, nda_det);
00181 }
00182 else save3DArrInEvent<TOUT>(evt, m_src, m_outkey, out_ndarr);
00183
00184 return true;
00185 }
00186 return false;
00187 }
00188
00189
00190
00191
00192
00193
00194
00195 template <typename TOUT>
00196 bool procEventForOutputType (Event& evt) {
00197
00198
00199 if ( procCSPadDataForType <Psana::CsPad::DataV1, Psana::CsPad::ElementV1, TOUT> (evt) ) return true;
00200 if ( procCSPadDataForType <Psana::CsPad::DataV2, Psana::CsPad::ElementV2, TOUT> (evt) ) return true;
00201 return false;
00202 }
00203
00204
00205
00206 };
00207
00208 }
00209
00210 #endif // CSPADPIXCOORDS_CSPADNDARRPRODUCER_H