15 #include "pdsdata/xtc/Xtc.hh"
16 #include "pdsdata/xtc/BldInfo.hh"
17 #include "pdsdata/bld/bldData.hh"
18 #include "pdsdata/epics/EpicsPvData.hh"
19 #include "pdsdata/evr/DataV3.hh"
20 #include "pdsdata/ipimb/DataV2.hh"
21 #include "pdsdata/xtc/DetInfo.hh"
22 #include "pdsdata/lusi/IpmFexV1.hh"
23 #include "pdsdata/lusi/IpmFexConfigV2.hh"
24 #include "pdsdata/control/ConfigV1.hh"
25 #include "pdsdata/control/PVControl.hh"
26 #include "pdsdata/psddl/usdusb.ddl.h"
67 template <
int valtype>
69 Device::epicsDataMap_t::iterator first)
71 const Pds::EpicsPvTime<valtype> &p
72 (
reinterpret_cast<const Pds::EpicsPvTime<valtype>&
>(epicsData));
73 const typename Pds::EpicsDbrTools::DbrTypeFromInt<valtype>::TDbr*
value(&p.value);
74 for(
int i=0; i<epicsData.iNumElements; ++i)
75 first++->second = *value++;
91 template <
int valtype>
93 Device::epicsDataMap_t::iterator storefirst,
94 Device::epicsDataMap_t::iterator cassfirst)
96 const Pds::EpicsPvTime<valtype> &p
97 (
reinterpret_cast<const Pds::EpicsPvTime<valtype>&
>(epicsData));
98 const typename Pds::EpicsDbrTools::DbrTypeFromInt<valtype>::TDbr*
value(&p.value);
99 for(
int i=0; i<epicsData.iNumElements; ++i)
101 const double val(*value++);
102 storefirst++->second = val;
103 cassfirst++->second = val;
120 Device::epicsDataMap_t::iterator ,
121 Device::epicsDataMap_t::iterator )
142 : _key(((static_cast<uint64_t>(src.phy())&0xffffffff)<<32) | (index&0xffffffff))
152 return _key < other.
_key;
165 _pdsTypeList.push_back(Pds::TypeId::Id_Epics);
166 _pdsTypeList.push_back(Pds::TypeId::Id_FEEGasDetEnergy);
167 _pdsTypeList.push_back(Pds::TypeId::Id_EBeam);
168 _pdsTypeList.push_back(Pds::TypeId::Id_PhaseCavity);
169 _pdsTypeList.push_back(Pds::TypeId::Id_EvrData);
170 _pdsTypeList.push_back(Pds::TypeId::Id_IpimbData);
171 _pdsTypeList.push_back(Pds::TypeId::Id_IpmFex);
172 _pdsTypeList.push_back(Pds::TypeId::Id_ControlConfig);
173 _pdsTypeList.push_back(Pds::TypeId::Id_Spectrometer);
174 _pdsTypeList.push_back(Pds::TypeId::Id_UsdUsbFexConfig);
175 _pdsTypeList.push_back(Pds::TypeId::Id_UsdUsbFexData);
177 _epicsType2convFunc[DBR_TIME_SHORT] = &epicsValToCassVal<DBR_SHORT>;
178 _epicsType2convFunc[DBR_TIME_FLOAT] = &epicsValToCassVal<DBR_FLOAT>;
179 _epicsType2convFunc[DBR_TIME_ENUM] = &epicsValToCassVal<DBR_ENUM>;
180 _epicsType2convFunc[DBR_TIME_LONG] = &epicsValToCassVal<DBR_LONG>;
181 _epicsType2convFunc[DBR_TIME_DOUBLE] = &epicsValToCassVal<DBR_DOUBLE>;
188 switch (xtc->contains.id())
192 case(Pds::TypeId::Id_FEEGasDetEnergy):
195 uint32_t version (xtc->contains.version());
196 const Pds::BldDataFEEGasDetEnergy &gasdet =
197 *
reinterpret_cast<const Pds::BldDataFEEGasDetEnergy*
>(xtc->payload());
202 md.BeamlineData()[
"f_64_ENRC"] = gasdet.f_64_ENRC;
204 md.BeamlineData()[
"f_11_ENRC"] = gasdet.f_11_ENRC;
205 md.BeamlineData()[
"f_12_ENRC"] = gasdet.f_12_ENRC;
206 md.BeamlineData()[
"f_21_ENRC"] = gasdet.f_21_ENRC;
207 md.BeamlineData()[
"f_22_ENRC"] = gasdet.f_22_ENRC;
216 case(Pds::TypeId::Id_EBeam):
219 uint32_t version (xtc->contains.version());
220 const Pds::BldDataEBeam &beam =
221 *
reinterpret_cast<const Pds::BldDataEBeam*
>(xtc->payload());
226 "' using latest known version '7'");
236 if(!(Pds::BldDataEBeam::EbeamPhotonEnergyDamage & beam.uDamageMask))
237 md.BeamlineData()[
"EbeamPhotonEnergy"]= beam.fEbeamPhotonEnergy;
242 md.BeamlineData()[
"fEbeamLTU250"]= beam.fEbeamLTU250;
247 md.BeamlineData()[
"EbeamLTU450"]= beam.fEbeamLTU450;
254 if(!(Pds::BldDataEBeam::EbeamXTCAVAmplDamage & beam.uDamageMask))
255 md.BeamlineData()[
"EbeamXTCAVAmpl"]= beam.fEbeamXTCAVAmpl;
259 if(!(Pds::BldDataEBeam::EbeamXTCAVPhaseDamage & beam.uDamageMask))
260 md.BeamlineData()[
"EbeamXTCAVPhase"]= beam.fEbeamXTCAVPhase;
264 if(!(Pds::BldDataEBeam::EbeamDumpChargeDamage & beam.uDamageMask))
265 md.BeamlineData()[
"EbeamDumpCharge"]= beam.fEbeamDumpCharge;
271 if(!(Pds::BldDataEBeam::EbeamUndPosXDamage & beam.uDamageMask))
272 md.BeamlineData()[
"EbeamUndPosX"]= beam.fEbeamUndPosX;
276 if(!(Pds::BldDataEBeam::EbeamUndPosYDamage & beam.uDamageMask))
277 md.BeamlineData()[
"EbeamUndPosY"]= beam.fEbeamUndPosY;
281 if(!(Pds::BldDataEBeam::EbeamUndAngXDamage & beam.uDamageMask))
282 md.BeamlineData()[
"EbeamUndAngX"]= beam.fEbeamUndAngX;
286 if(!(Pds::BldDataEBeam::EbeamUndAngYDamage & beam.uDamageMask))
287 md.BeamlineData()[
"EbeamUndAngY"]= beam.fEbeamUndAngY;
293 if(!(Pds::BldDataEBeam::EbeamPkCurrBC1Damage & beam.uDamageMask))
294 md.BeamlineData()[
"EbeamPkCurrBC1"]= beam.fEbeamPkCurrBC1;
298 if(!(Pds::BldDataEBeam::EbeamEnergyBC1Damage & beam.uDamageMask))
299 md.BeamlineData()[
"fEbeamEnergyBC1"]= beam.fEbeamEnergyBC1;
305 if(!(Pds::BldDataEBeam::EbeamEnergyBC2Damage & beam.uDamageMask))
306 md.BeamlineData()[
"EbeamEnergyBC2"]= beam.fEbeamEnergyBC2;
312 if(!(Pds::BldDataEBeam::EbeamPkCurrBC2Damage & beam.uDamageMask))
313 md.BeamlineData()[
"EbeamPkCurrBC2"]= beam.fEbeamPkCurrBC2;
319 if(!(Pds::BldDataEBeam::EbeamChargeDamage & beam.uDamageMask))
320 md.BeamlineData()[
"EbeamCharge"] = beam.fEbeamCharge;
324 if(!(Pds::BldDataEBeam::EbeamL3EnergyDamage & beam.uDamageMask))
325 md.BeamlineData()[
"EbeamL3Energy"] = beam.fEbeamL3Energy;
329 if(!(Pds::BldDataEBeam::EbeamLTUAngXDamage & beam.uDamageMask))
330 md.BeamlineData()[
"EbeamLTUAngX"] = beam.fEbeamLTUAngX;
334 if(!(Pds::BldDataEBeam::EbeamLTUAngYDamage & beam.uDamageMask))
335 md.BeamlineData()[
"EbeamLTUAngY"] = beam.fEbeamLTUAngY;
339 if(!(Pds::BldDataEBeam::EbeamLTUPosXDamage & beam.uDamageMask))
340 md.BeamlineData()[
"EbeamLTUPosX"] = beam.fEbeamLTUPosX;
344 if(!(Pds::BldDataEBeam::EbeamLTUPosYDamage & beam.uDamageMask))
345 md.BeamlineData()[
"EbeamLTUPosY"] = beam.fEbeamLTUPosY;
355 case(Pds::TypeId::Id_PhaseCavity):
358 const Pds::BldDataPhaseCavity &cavity =
359 *
reinterpret_cast<const Pds::BldDataPhaseCavity*
>(xtc->payload());
361 md.BeamlineData()[
"Charge2"] = cavity.fCharge2;
362 md.BeamlineData()[
"FitTime1"] = cavity.fFitTime1;
363 md.BeamlineData()[
"FitTime2"] = cavity.fFitTime2;
368 case(Pds::TypeId::Id_Epics):
374 const Pds::EpicsPvHeader& epicsData =
375 *
reinterpret_cast<const Pds::EpicsPvHeader*
>(xtc->payload());
381 if ( dbr_type_is_CTRL(epicsData.iDbrType) )
383 const Pds::EpicsPvCtrlHeader& ctrl =
384 static_cast<const Pds::EpicsPvCtrlHeader&
>(epicsData);
388 string epicsVariableName(ctrl.sPvName);
389 _index2name[key] = epicsVariableName;
393 if (ctrl.iNumElements > 1)
399 for (
int i=0;i<ctrl.iNumElements;++i)
401 std::stringstream entryname;
402 entryname << epicsVariableName <<
"[" << i <<
"]";
403 _store.EpicsData()[entryname.str()] = 0.;
405 "' is available in Epics Data");;
411 _store.EpicsData()[epicsVariableName] = 0.;
413 "' is available in Epics Data");
417 else if(dbr_type_is_TIME(epicsData.iDbrType))
424 KeyMap_t::const_iterator eIt(_index2name.find(key));
425 if (eIt == _index2name.end())
427 toString(epicsData.iPvId) +
"' was not defined");
430 string epicsVariableName(eIt->second);
435 if (epicsData.iNumElements > 1)
436 epicsVariableName.append(
"[0]");
442 Device::epicsDataMap_t::iterator storeIt =
443 _store.EpicsData().find(epicsVariableName);
444 Device::epicsDataMap_t::iterator cassIt =
445 md.EpicsData().find(epicsVariableName);
447 if (storeIt == _store.EpicsData().end() || cassIt == md.EpicsData().end())
449 toString(epicsData.iPvId) +
"' was not found in store or cassevent");
453 _epicsType2convFunc[epicsData.iDbrType](epicsData,storeIt,cassIt);
456 md.epicsFilled() =
true;
463 case(Pds::TypeId::Id_EvrData):
467 std::fill(md.EvrData().begin(),md.EvrData().end(),
false);
469 const Pds::EvrData::DataV3 &evrData =
470 *
reinterpret_cast<const Pds::EvrData::DataV3*
>(xtc->payload());
472 const uint32_t nbrFifoEvents = evrData.numFifoEvents();
474 for (
size_t i=0;i<nbrFifoEvents;++i)
476 const Pds::EvrData::DataV3::FIFOEvent& fifoEvent = evrData.fifoEvent(i);
477 uint32_t eventcode = fifoEvent.EventCode;
479 if (md.EvrData().size() < eventcode )
480 md.
EvrData().resize(eventcode+1,
false);
481 md.EvrData()[eventcode]=
true;
487 case(Pds::TypeId::Id_IpimbData):
490 const Pds::DetInfo&
info = *(Pds::DetInfo*)(&xtc->src);
491 string detector(Pds::DetInfo::name(info.detector()));
492 const Pds::Ipimb::DataV2& ipimbData =
493 *
reinterpret_cast<const Pds::Ipimb::DataV2*
>(xtc->payload());
494 md.BeamlineData()[detector +
"_Channel0"] = ipimbData.channel0Volts();
495 md.BeamlineData()[detector +
"_Channel1"] = ipimbData.channel1Volts();
496 md.BeamlineData()[detector +
"_Channel2"] = ipimbData.channel2Volts();
497 md.BeamlineData()[detector +
"_Channel3"] = ipimbData.channel3Volts();
502 case(Pds::TypeId::Id_IpmFex):
505 const Pds::DetInfo&
info = *(Pds::DetInfo*)(&xtc->src);
506 string detector(Pds::DetInfo::name(info.detector()));
507 const Pds::Lusi::IpmFexV1& ipmfex =
508 *
reinterpret_cast<const Pds::Lusi::IpmFexV1*
>(xtc->payload());
509 for(
size_t i=0; i<Pds::Lusi::IpmFexConfigV2::NCHANNELS; i++)
512 ss << detector <<
"_CorrectChannel" << i;
513 md.BeamlineData()[ss.str()] = ipmfex.channel[i];
515 md.BeamlineData()[detector +
"_sum"] = ipmfex.sum;
516 md.BeamlineData()[detector +
"_xPos"] = ipmfex.xpos;
517 md.BeamlineData()[detector +
"_yPos"] = ipmfex.ypos;
522 case(Pds::TypeId::Id_ControlConfig):
527 const Pds::ControlData::ConfigV1& config = *
reinterpret_cast<const Pds::ControlData::ConfigV1*
>(xtc->payload());
528 string log(
"MachineData::Converter: Calibcylce: [" +
529 toString(config.npvControls())+
" values]: ");
530 for (
unsigned int i = 0; i < config.npvControls(); i++)
532 const Pds::ControlData::PVControl &pvControlCur = config.pvControl(i);
533 _store.BeamlineData()[pvControlCur.name()] = pvControlCur.value();
535 md.BeamlineData()[pvControlCur.name()] = pvControlCur.value();
536 log += string(pvControlCur.name()) +
" = " +
toString(pvControlCur.value()) +
"; ";
543 case(Pds::TypeId::Id_Spectrometer):
546 uint32_t version(xtc->contains.version());
548 (Pds::BldInfo::name(reinterpret_cast<const Pds::BldInfo&>(xtc->src)));
549 Device::spectrometer_t::mapped_type &horiz
550 (md.spectrometers()[specname +
"_horiz"]);
551 Device::spectrometer_t::mapped_type &vert
552 (md.spectrometers()[specname +
"_vert"]);
557 const Pds::BldDataSpectrometerV0 &spec
558 (*reinterpret_cast<const Pds::BldDataSpectrometerV0*>(xtc->payload()));
559 horiz.assign(spec._hproj,spec._hproj+1024);
560 vert.assign(spec._vproj,spec._vproj+256);
565 const Pds::BldDataSpectrometerV1 *spec
566 (reinterpret_cast<const Pds::BldDataSpectrometerV1*>(xtc->payload()));
567 const uint32_t* first(reinterpret_cast<const uint32_t*>(reinterpret_cast<const char*>(spec)+48));
568 const uint32_t* last(first + spec->_width);
569 horiz.assign(first,last);
574 "'. Skipping reading of Spectrometer data.");
581 case(Pds::TypeId::Id_EOrbits):
584 uint32_t version(xtc->contains.version());
589 const Pds::BldDataEOrbitsV0 *
data
590 (reinterpret_cast<const Pds::BldDataEOrbitsV0*>(xtc->payload()));
593 const double* x_first(reinterpret_cast<const double*>(reinterpret_cast<const char*>(data)+offset));
594 const double* x_last(x_first + data->_nBPMS);
596 offset = 4+(8*(data->_nBPMS));
597 const double* y_first(reinterpret_cast<const double*>(reinterpret_cast<const char*>(data)+offset));
598 const double* y_last(y_first + data->_nBPMS);
600 offset = (4+(8*(data->_nBPMS)))+(8*(data->_nBPMS));
601 const double* tmit_first(reinterpret_cast<const double*>(reinterpret_cast<const char*>(data)+offset));
602 const double* tmit_last(tmit_first + data->_nBPMS);
607 "'. Skipping reading of EOrbits data.");
613 case(Pds::TypeId::Id_UsdUsbFexConfig):
615 switch(xtc->contains.version())
620 toString(xtc->contains.version()) +
"' ignoring data");
626 const Pds::UsdUsb::FexConfigV1& usbcfg =
627 *
reinterpret_cast<const Pds::UsdUsb::FexConfigV1*
>(xtc->payload());
628 for (
int i(0); i<(Pds::UsdUsb::FexConfigV1::NCHANNELS); ++i)
630 string name(Pds::DetInfo::name(reinterpret_cast<const Pds::DetInfo&>(xtc->src)));
632 name += usbcfg._name[i];
635 "' is available in Beamline Data");
642 case(Pds::TypeId::Id_UsdUsbFexData):
647 switch(xtc->contains.version())
652 toString(xtc->contains.version()) +
"' ignoring data");
658 const Pds::UsdUsb::FexDataV1& usbdata =
659 *
reinterpret_cast<const Pds::UsdUsb::FexDataV1*
>(xtc->payload());
660 for (
int i(0); i<(Pds::UsdUsb::FexDataV1::Encoder_Inputs); ++i)
662 KeyMap_t::const_iterator it(_index2name.find(
XTCDataKey(xtc->src,i)));
663 if (it == _index2name.end())
666 Pds::DetInfo::name(reinterpret_cast<const Pds::DetInfo&>(xtc->src)) +
667 "' with encoder '" +
toString(i) +
"' was not defined");
672 bld[it->second] = usbdata._encoder_value[i];
700 Device::bldMap_t::iterator bi (md.BeamlineData().begin());
701 Device::bldMap_t::const_iterator bEnd (md.BeamlineData().end());
702 for (; bi != bEnd ;++bi)
706 md.EpicsData() = _store.EpicsData();
711 Device::bldMap_t::const_iterator it (_store.BeamlineData().begin());
712 Device::bldMap_t::const_iterator End (_store.BeamlineData().end());
713 for(; it != End; ++it)
714 md.BeamlineData()[it->first] = it->second;
715 md.spectrometers().clear();
contains xtc converter for machine data
Event to store all LCLS Data.
uint64_t _key
the combined key
void epicsValToNothing(const Pds::EpicsPvHeader &, Device::epicsDataMap_t::iterator, Device::epicsDataMap_t::iterator)
convert epics variable to nothing
static ConversionBackend::shared_pointer _instance
the singleton container
file contains declaration of the CASSEvent
bool operator<(const pp240::indexf_t &lhs, const pp240::indexf_t::first_type rhs)
operates less of an indices to a scalar
static void add(Level level, const std::string &line)
add a string to the log
Container for all Machine related Data.
bool epicsFilled() const
getter
devices_t & devices()
setters
void convertEpicsToDouble(const Pds::EpicsPvHeader &epicsData, Device::epicsDataMap_t::iterator first)
convert epics variable to double
std::string toString(const Type &t)
convert any type to a string
auxiliary data[Processor]
std::tr1::shared_ptr< ConversionBackend > shared_pointer
typedef
Key for the xtc data lookup map.
std::map< std::string, double > bldMap_t
define the beamline data container
void operator()(const Pds::Xtc *xtc, cass::CASSEvent *evt)
called for appropriate xtc part.
void epicsValToCassVal(const Pds::EpicsPvHeader &epicsData, Device::epicsDataMap_t::iterator storefirst, Device::epicsDataMap_t::iterator cassfirst)
convert epics variable to double and fill store and cassevent
const evrStatus_t & EvrData() const
getter
definitions of a machine device
static QMutex _mutex
singleton locker for mutithreaded requests
XTCDataKey(const Pds::Src &src, uint32_t index)
constructor
static ConversionBackend::shared_pointer instance()
create singleton if doesnt exist already
void prepare(CASSEvent *evt)
called before the conversion
Converter for Beamline-, Cavity-, Epics- and EVR Data.
contains a logger for cass
void finalize(CASSEvent *evt)
called at the end of the conversion
check if there is some light in the chamber based upon the GMD value
const bldMap_t & BeamlineData() const
getter