psddl_hdf2psana/include/cspad.h

Go to the documentation of this file.
00001 #ifndef PSDDL_HDF2PSANA_CSPAD_H
00002 #define PSDDL_HDF2PSANA_CSPAD_H 1
00003 
00004 //--------------------------------------------------------------------------
00005 // File and Version Information:
00006 //      $Id: cspad.h 7035 2013-10-31 19:57:40Z salnikov@SLAC.STANFORD.EDU $
00007 //
00008 // Description:
00009 //      Hand-written supporting types for DDL-HDF5 mapping.
00010 //
00011 //------------------------------------------------------------------------
00012 
00013 //-----------------
00014 // C/C++ Headers --
00015 //-----------------
00016 
00017 //----------------------
00018 // Base Class Headers --
00019 //----------------------
00020 
00021 //-------------------------------
00022 // Collaborating Class Headers --
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   /** Common mode value for a given section, section number can be 0 to config.numAsicsRead()/2.
00062                 Will return 0 for data read from XTC, may be non-zero after calibration. */
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   /** Data objects, one element per quadrant. The size of the array is determined by
00083             the numQuads() method of the configuration object. */
00084   virtual const Psana::CsPad::ElementV1& quads(uint32_t i0) const;
00085   /** Method which returns the shape (dimensions) of the data returned by quads() method. */
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   /** Common mode value for a given section, section number can be 0 to config.numSect().
00137                 Will return 0 for data read from XTC, may be non-zero after calibration. */
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   /** Data objects, one element per quadrant. The size of the array is determined by
00160             the numQuads() method of the configuration object. */
00161   virtual const Psana::CsPad::ElementV2& quads(uint32_t i0) const;
00162   /** Method which returns the shape (dimensions) of the data returned by quads() method. */
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 } // namespace CsPad
00180 } // namespace psddl_hdf2psana
00181 
00182 #endif // PSDDL_HDF2PSANA_CSPAD_H

Generated on 19 Dec 2016 for PSDMSoftware by  doxygen 1.4.7