00001 #ifndef PSDDL_HDF2PSANA_CSPAD_H
00002 #define PSDDL_HDF2PSANA_CSPAD_H 1
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "psddl_hdf2psana/cspad.ddl.h"
00025 #include "psddl_hdf2psana/ChunkPolicy.h"
00026
00027
00028 namespace psddl_hdf2psana {
00029 namespace CsPad {
00030
00031
00032 class DataV1_v0_Element : public Psana::CsPad::ElementV1 {
00033 public:
00034 typedef Psana::CsPad::ElementV1 PsanaType;
00035
00036 DataV1_v0_Element() {}
00037 DataV1_v0_Element(const CsPad::ns_ElementV1_v0::dataset_element& ds_elem,
00038 ndarray<int16_t, 3> ds_data, ndarray<float, 1> ds_cm)
00039 : m_ds_elem(ds_elem), m_ds_data(ds_data), m_ds_cm(ds_cm) {}
00040
00041 virtual ~DataV1_v0_Element() {}
00042
00043 virtual uint32_t virtual_channel() const { return m_ds_elem.virtual_channel; }
00044 virtual uint32_t lane() const { return m_ds_elem.lane; }
00045 virtual uint32_t tid() const { return m_ds_elem.tid; }
00046 virtual uint32_t acq_count() const { return m_ds_elem.acq_count; }
00047 virtual uint32_t op_code() const { return m_ds_elem.op_code; }
00048 virtual uint32_t quad() const { return m_ds_elem.quad; }
00049 virtual uint32_t seq_count() const { return m_ds_elem.seq_count; }
00050 virtual uint32_t ticks() const { return m_ds_elem.ticks; }
00051 virtual uint32_t fiducials() const { return m_ds_elem.fiducials; }
00052 virtual ndarray<const uint16_t, 1> sb_temp() const {
00053 ndarray<uint16_t, 1> res = make_ndarray<uint16_t>(4);
00054 std::copy(m_ds_elem.sb_temp, m_ds_elem.sb_temp+4, res.begin());
00055 return res;
00056 }
00057 virtual uint32_t frame_type() const { return m_ds_elem.frame_type; }
00058 virtual ndarray<const int16_t, 3> data() const { return m_ds_data; }
00059 virtual uint32_t sectionMask() const { return m_ds_elem.sectionMask; }
00060
00061
00062
00063 float common_mode(uint32_t section) const { return m_ds_cm[section]; }
00064
00065 private:
00066
00067 CsPad::ns_ElementV1_v0::dataset_element m_ds_elem;
00068 ndarray<const int16_t, 3> m_ds_data;
00069 ndarray<float, 1> m_ds_cm;
00070 };
00071
00072
00073 template <typename Config>
00074 class DataV1_v0 : public Psana::CsPad::DataV1 {
00075 public:
00076 typedef Psana::CsPad::DataV1 PsanaType;
00077 DataV1_v0() {}
00078 DataV1_v0(hdf5pp::Group group, hsize_t idx, const boost::shared_ptr<Config>& cfg)
00079 : m_group(group), m_idx(idx), m_cfg(cfg) {}
00080 virtual ~DataV1_v0() {}
00081
00082
00083
00084 virtual const Psana::CsPad::ElementV1& quads(uint32_t i0) const;
00085
00086 virtual std::vector<int> quads_shape() const;
00087
00088 private:
00089
00090 mutable hdf5pp::Group m_group;
00091 hsize_t m_idx;
00092 boost::shared_ptr<Config> m_cfg;
00093
00094 mutable ndarray<DataV1_v0_Element, 1> m_elements;
00095 void read_elements() const;
00096 };
00097
00098
00099
00100 void make_datasets_DataV1_v0(const Psana::CsPad::DataV1& obj,
00101 hdf5pp::Group group, const ChunkPolicy& chunkPolicy, int deflate, bool shuffle);
00102 void store_DataV1_v0(const Psana::CsPad::DataV1* obj, hdf5pp::Group group, long index, bool append);
00103
00104
00105
00106
00107 class DataV2_v0_Element : public Psana::CsPad::ElementV2 {
00108 public:
00109 typedef Psana::CsPad::ElementV2 PsanaType;
00110
00111 DataV2_v0_Element() {}
00112 DataV2_v0_Element(const CsPad::ns_ElementV2_v0::dataset_element& ds_elem,
00113 ndarray<int16_t, 3> ds_data, ndarray<float, 1> ds_cm)
00114 : m_ds_elem(ds_elem), m_ds_data(ds_data), m_ds_cm(ds_cm) {}
00115
00116 virtual ~DataV2_v0_Element() {}
00117
00118 virtual uint32_t virtual_channel() const { return m_ds_elem.virtual_channel; }
00119 virtual uint32_t lane() const { return m_ds_elem.lane; }
00120 virtual uint32_t tid() const { return m_ds_elem.tid; }
00121 virtual uint32_t acq_count() const { return m_ds_elem.acq_count; }
00122 virtual uint32_t op_code() const { return m_ds_elem.op_code; }
00123 virtual uint32_t quad() const { return m_ds_elem.quad; }
00124 virtual uint32_t seq_count() const { return m_ds_elem.seq_count; }
00125 virtual uint32_t ticks() const { return m_ds_elem.ticks; }
00126 virtual uint32_t fiducials() const { return m_ds_elem.fiducials; }
00127 virtual ndarray<const uint16_t, 1> sb_temp() const {
00128 ndarray<uint16_t, 1> res = make_ndarray<uint16_t>(4);
00129 std::copy(m_ds_elem.sb_temp, m_ds_elem.sb_temp+4, res.begin());
00130 return res;
00131 }
00132 virtual uint32_t frame_type() const { return m_ds_elem.frame_type; }
00133 virtual ndarray<const int16_t, 3> data() const { return m_ds_data; }
00134 virtual uint32_t sectionMask() const { return m_ds_elem.sectionMask; }
00135
00136
00137
00138 float common_mode(uint32_t section) const { return m_ds_cm[section]; }
00139
00140 private:
00141
00142 CsPad::ns_ElementV2_v0::dataset_element m_ds_elem;
00143 ndarray<const int16_t, 3> m_ds_data;
00144 ndarray<float, 1> m_ds_cm;
00145 };
00146
00147
00148
00149
00150 template <typename Config>
00151 class DataV2_v0 : public Psana::CsPad::DataV2 {
00152 public:
00153 typedef Psana::CsPad::DataV1 PsanaType;
00154 DataV2_v0() {}
00155 DataV2_v0(hdf5pp::Group group, hsize_t idx, const boost::shared_ptr<Config>& cfg)
00156 : m_group(group), m_idx(idx), m_cfg(cfg) {}
00157 virtual ~DataV2_v0() {}
00158
00159
00160
00161 virtual const Psana::CsPad::ElementV2& quads(uint32_t i0) const;
00162
00163 virtual std::vector<int> quads_shape() const;
00164
00165 private:
00166
00167 mutable hdf5pp::Group m_group;
00168 hsize_t m_idx;
00169 boost::shared_ptr<Config> m_cfg;
00170
00171 mutable ndarray<DataV2_v0_Element, 1> m_elements;
00172 void read_elements() const;
00173 };
00174
00175 void make_datasets_DataV2_v0(const Psana::CsPad::DataV2& obj,
00176 hdf5pp::Group group, const ChunkPolicy& chunkPolicy, int deflate, bool shuffle);
00177 void store_DataV2_v0(const Psana::CsPad::DataV2* obj, hdf5pp::Group group, long index, bool append);
00178
00179 }
00180 }
00181
00182 #endif // PSDDL_HDF2PSANA_CSPAD_H