00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "Detector/NDArrProducerCSPAD2X2.h"
00015
00016
00017
00018 namespace Detector {
00019
00020 typedef NDArrProducerCSPAD2X2::data_t data_t;
00021
00022
00023
00024 NDArrProducerCSPAD2X2::NDArrProducerCSPAD2X2(const PSEvt::Source& source, const unsigned& mode, const unsigned& pbits, const float& vdef)
00025 : NDArrProducerBase(source, mode, pbits, vdef)
00026 , m_count_ent(0)
00027 , m_count_msg(0)
00028 {
00029
00030 m_as_data = true;
00031 }
00032
00033
00034
00035 NDArrProducerCSPAD2X2::~NDArrProducerCSPAD2X2 ()
00036 {
00037 }
00038
00039
00040
00041 void
00042 NDArrProducerCSPAD2X2::print_warning(const char* msg)
00043 {
00044 m_count_msg++;
00045 if (m_count_msg < 11 && m_pbits) {
00046 MsgLog(name(), warning, "CsPad2x2::ElementV1 object"
00047 << " is not available in this run/event for source:" << m_source);
00048 if (m_count_msg == 10) MsgLog(name(), warning, "STOP PRINT WARNINGS for source:" << m_source);
00049 }
00050 }
00051
00052
00053
00054 ndarray<const data_t,3>
00055 NDArrProducerCSPAD2X2::data_nda_int16_3(PSEvt::Event& evt, PSEnv::Env& env)
00056 {
00057 ndarray<const data_t,3> nda1 = getNDArrForType<Psana::CsPad2x2::ElementV1, data_t>(evt, env);
00058 if ( ! nda1.empty()) return nda1;
00059
00060 print_warning();
00061 ndarray<data_t,3> nda;
00062 return nda;
00063 }
00064
00065
00066
00067 void
00068 NDArrProducerCSPAD2X2::print_config(PSEvt::Event& evt, PSEnv::Env& env)
00069 {
00070 printConfigFromData(evt);
00071
00072 boost::shared_ptr<Psana::CsPad2x2::ConfigV1> config1 = env.configStore().get(m_source);
00073 if (config1) {
00074 WithMsgLog(name(), info, str) {
00075 str << "CsPad2x2::ConfigV1:";
00076 str << "\n concentratorVersion = " << config1->concentratorVersion();
00077 str << "\n protectionEnable = " << config1->protectionEnable();
00078 str << "\n protectionThreshold:";
00079 str << "\n adcThreshold= " << config1->protectionThreshold().adcThreshold()
00080 << "\n pixelCountThreshold= " << config1->protectionThreshold().pixelCountThreshold();
00081 str << "\n inactiveRunMode = " << config1->inactiveRunMode();
00082 str << "\n activeRunMode = " << config1->activeRunMode();
00083 str << "\n tdi = " << config1->tdi();
00084 str << "\n payloadSize = " << config1->payloadSize();
00085 str << "\n badAsicMask1 = " << config1->badAsicMask();
00086 str << "\n asicMask = " << config1->asicMask();
00087 str << "\n numAsicsRead = " << config1->numAsicsRead();
00088 str << "\n roiMask = " << config1->roiMask();
00089 str << "\n numAsicsStored = " << config1->numAsicsStored();
00090 const Psana::CsPad2x2::ConfigV1QuadReg& quad = config1->quad();
00091 str << "\n quad:";
00092 str << "\n shiftSelect = " << quad.shiftSelect();
00093 str << "\n edgeSelect = " << quad.edgeSelect();
00094 str << "\n readClkSet = " << quad.readClkSet();
00095 str << "\n readClkHold = " << quad.readClkHold();
00096 str << "\n dataMode = " << quad.dataMode();
00097 str << "\n prstSel = " << quad.prstSel();
00098 str << "\n acqDelay = " << quad.acqDelay();
00099 str << "\n intTime = " << quad.intTime();
00100 str << "\n digDelay = " << quad.digDelay();
00101 str << "\n ampIdle = " << quad.ampIdle();
00102 str << "\n injTotal = " << quad.injTotal();
00103 str << "\n rowColShiftPer = " << quad.rowColShiftPer();
00104 str << "\n ampReset = " << quad.ampReset();
00105 str << "\n digCount = " << quad.digCount();
00106 str << "\n digPeriod = " << quad.digPeriod();
00107 str << "\n PeltierEnable = " << quad.PeltierEnable();
00108 str << "\n kpConstant = " << quad.kpConstant();
00109 str << "\n kiConstant = " << quad.kiConstant();
00110 str << "\n kdConstant = " << quad.kdConstant();
00111 str << "\n humidThold = " << quad.humidThold();
00112 str << "\n setPoint = " << quad.setPoint();
00113 str << "\n digitalPots = " << quad.dp().pots();
00114 str << "\n readOnly = shiftTest: " << quad.ro().shiftTest() << " verstion: " << quad.ro().version();
00115 str << "\n gainMap = " << quad.gm().gainMap();
00116 }
00117 return;
00118 }
00119
00120 boost::shared_ptr<Psana::CsPad2x2::ConfigV2> config2 = env.configStore().get(m_source);
00121 if (config2) {
00122 WithMsgLog(name(), info, str) {
00123 str << "CsPad2x2::ConfigV2:";
00124 str << "\n concentratorVersion = " << config2->concentratorVersion();
00125 str << "\n protectionEnable = " << config2->protectionEnable();
00126 str << "\n protectionThreshold:";
00127 str << "\n adcThreshold= " << config2->protectionThreshold().adcThreshold()
00128 << "\n pixelCountThreshold= " << config2->protectionThreshold().pixelCountThreshold();
00129 str << "\n inactiveRunMode = " << config2->inactiveRunMode();
00130 str << "\n activeRunMode = " << config2->activeRunMode();
00131 str << "\n runTriggerDelay = " << config2->runTriggerDelay();
00132 str << "\n tdi = " << config2->tdi();
00133 str << "\n payloadSize = " << config2->payloadSize();
00134 str << "\n badAsicMask1 = " << config2->badAsicMask();
00135 str << "\n asicMask = " << config2->asicMask();
00136 str << "\n numAsicsRead = " << config2->numAsicsRead();
00137 str << "\n roiMask = " << config2->roiMask();
00138 str << "\n numAsicsStored = " << config2->numAsicsStored();
00139 const Psana::CsPad2x2::ConfigV2QuadReg& quad = config2->quad();
00140 str << "\n quad:";
00141 str << "\n shiftSelect = " << quad.shiftSelect();
00142 str << "\n edgeSelect = " << quad.edgeSelect();
00143 str << "\n readClkSet = " << quad.readClkSet();
00144 str << "\n readClkHold = " << quad.readClkHold();
00145 str << "\n dataMode = " << quad.dataMode();
00146 str << "\n prstSel = " << quad.prstSel();
00147 str << "\n acqDelay = " << quad.acqDelay();
00148 str << "\n intTime = " << quad.intTime();
00149 str << "\n digDelay = " << quad.digDelay();
00150 str << "\n ampIdle = " << quad.ampIdle();
00151 str << "\n injTotal = " << quad.injTotal();
00152 str << "\n rowColShiftPer = " << quad.rowColShiftPer();
00153 str << "\n ampReset = " << quad.ampReset();
00154 str << "\n digCount = " << quad.digCount();
00155 str << "\n digPeriod = " << quad.digPeriod();
00156 str << "\n biasTuning = " << quad.biasTuning();
00157 str << "\n pdpmndnmBalance = " << quad.pdpmndnmBalance();
00158 str << "\n PeltierEnable = " << quad.PeltierEnable();
00159 str << "\n kpConstant = " << quad.kpConstant();
00160 str << "\n kiConstant = " << quad.kiConstant();
00161 str << "\n kdConstant = " << quad.kdConstant();
00162 str << "\n humidThold = " << quad.humidThold();
00163 str << "\n setPoint = " << quad.setPoint();
00164 str << "\n digitalPots = " << quad.dp().pots();
00165 str << "\n readOnly = shiftTest: " << quad.ro().shiftTest() << " verstion: " << quad.ro().version();
00166 str << "\n gainMap = " << quad.gm().gainMap();
00167 }
00168 return;
00169 }
00170
00171 MsgLog(name(), info, "CsPad2x2::ConfigV1,2 is not found for source " << m_source);
00172 }
00173
00174
00175
00176 void
00177 NDArrProducerCSPAD2X2::printConfigFromData(PSEvt::Event& evt) {
00178
00179 boost::shared_ptr<Psana::CsPad2x2::ElementV1> elem1 = evt.get(m_source, m_key);
00180 if (elem1) {
00181 WithMsgLog(name(), info, str) {
00182 str << "CsPad2x2::ElementV1:";
00183 str << "\n virtual_channel = " << elem1->virtual_channel() ;
00184 str << "\n lane = " << elem1->lane() ;
00185 str << "\n tid = " << elem1->tid() ;
00186 str << "\n acq_count = " << elem1->acq_count() ;
00187 str << "\n op_code = " << elem1->op_code() ;
00188 str << "\n quad = " << elem1->quad() ;
00189 str << "\n seq_count = " << elem1->seq_count() ;
00190 str << "\n ticks = " << elem1->ticks() ;
00191 str << "\n fiducials = " << elem1->fiducials() ;
00192 str << "\n frame_type = " << elem1->frame_type() ;
00193
00194 str << "\n sb_temp = " << elem1->sb_temp();
00195
00196 const ndarray<const int16_t, 3>& data = elem1->data();
00197 str << "\n common_mode = [ ";
00198 for (unsigned i = 0; i != data.shape()[2]; ++ i) {
00199 str << elem1->common_mode(i) << ' ';
00200 }
00201 str << "]";
00202 str << "\n data = " << data;
00203 }
00204 }
00205 }
00206
00207
00208 }
00209