55 std::vector<const confmodel::DaqModule*> modules;
59 std::map<std::string, const confmodel::GeoId*> geo_ids;
64 if (d2d_conn->is_disabled(*
session)) {
65 TLOG_DEBUG(7) <<
"Ignoring disabled DetectorToDaqConnection " << d2d_conn->UID();
69 TLOG_DEBUG(6) <<
"Processing DetectorToDaqConnection " << d2d_conn->UID();
73 if (d2d_conn->contained_resources().empty()) {
74 throw(BadConf(
ERS_HERE,
"DetectorToDaqConnection does not contain senders or receivers"));
77 auto det_senders = d2d_conn->get_felix_senders();
80 for (
const auto* felix_sender : det_senders) {
82 if ( felix_sender->is_disabled(*
session) ) {
83 TLOG() <<
"Skipping disabled sender: " << felix_sender->UID();
87 auto ip = felix_sender -> get_control_host();
91 auto streams = felix_sender -> get_streams();
93 for (
const auto * det_s : streams ) {
95 if ( det_s->is_disabled(*
session) ) {
96 TLOG() <<
"Skipping disabled DetStream: " << det_s->UID();
100 if (!geo_ids.contains(ip)) {
101 geo_ids[ip] = det_s->get_geo_id();
110 for (
const auto & [ip, geo] : geo_ids ) {
112 auto slot = geo->get_slot_id();
114 const auto raw_conf = daphne_conf->get_json().at(ip);
117 std::vector<const conffwk::ConfigObject*> channels;
118 const auto raw_channels = raw_conf[
"channel_analog_conf"];
119 const auto raw_ids = raw_channels[
"ids"].get<std::vector<uint8_t>>();
120 const auto raw_gains = raw_channels[
"gains"].get<std::vector<uint8_t>>();
121 const auto raw_offsets = raw_channels[
"offsets"].get<std::vector<uint16_t>>();
122 const auto raw_trims = raw_channels[
"trims"].get<std::vector<uint16_t>>();
123 for (
size_t i = 0; i < raw_ids.size(); ++i ) {
124 auto id = raw_ids[i];
126 channel_obj.
set_by_val<uint8_t>(
"channel_id", id);
127 channel_obj.
set_by_val<uint8_t>(
"gain", raw_gains[i]);
128 channel_obj.
set_by_val<uint16_t>(
"offset", raw_offsets[i]);
129 channel_obj.
set_by_val<uint16_t>(
"trim", raw_trims[i]);
135 std::vector<const conffwk::ConfigObject*> afes;
136 const auto raw_afes = raw_conf[
"afes"];
137 const auto raw_afe_ids = raw_afes[
"ids"].get<std::vector<size_t>>();
138 const auto raw_afe_attenuators = raw_afes[
"attenuators"].get<std::vector<uint16_t>>();
139 const auto raw_afe_biases = raw_afes[
"v_biases"].get<std::vector<uint16_t>>();
140 const auto raw_adcs = raw_afes[
"adcs"];
141 const auto raw_adc_res = raw_adcs[
"resolution"].get<std::vector<uint16_t>>();
142 const auto raw_adc_format = raw_adcs[
"output_format"].get<std::vector<uint16_t>>();
143 const auto raw_adc_SB = raw_adcs[
"SB_first"].get<std::vector<uint16_t>>();
144 const auto raw_lnas = raw_afes[
"lnas"];
145 const auto raw_lna_clamps = raw_lnas[
"clamp"].get<std::vector<uint8_t>>();
146 const auto raw_lna_gains = raw_lnas[
"gain"].get<std::vector<uint8_t>>();
147 const auto raw_lna_integrators = raw_lnas[
"integrator_disable"].get<std::vector<uint16_t>>();
148 const auto raw_pgas = raw_afes[
"pgas"];
149 const auto raw_pga_cuts = raw_pgas[
"lpf_cut_frequency"].get<std::vector<uint8_t>>();
150 const auto raw_pga_integrators = raw_pgas[
"integrator_disable"].get<std::vector<uint16_t>>();
151 const auto raw_pga_gains = raw_pgas[
"gain"].get<std::vector<uint16_t>>();
152 for (
size_t i = 0; i < raw_afe_ids.size(); ++i ) {
153 auto id = raw_afe_ids[i];
157 adc_obj.
set_by_val<
bool>(
"low_resolution", raw_adc_res[i] > 0);
158 adc_obj.
set_by_val<
bool>(
"output_offset_binary", raw_adc_format[i] > 0 );
159 adc_obj.
set_by_val<
bool>(
"MSB_first", raw_adc_SB[i] > 0);
164 lna_obj.
set_by_val<uint8_t>(
"clamp", raw_lna_clamps[i]);
165 lna_obj.set_by_val<uint8_t>(
"gain", raw_lna_gains[i]);
166 lna_obj.set_by_val<
bool>(
"integrator_disable", raw_lna_integrators[i]>0);
171 pga_obj.
set_by_val<uint8_t>(
"lpf_cut_frequency", raw_pga_cuts[i]);
172 pga_obj.set_by_val<
bool>(
"gain", raw_pga_gains[i]>0);
173 pga_obj.set_by_val<
bool>(
"integrator_disable", raw_pga_integrators[i]>0);
179 afe_obj.set_by_val<uint16_t>(
"attenuator", raw_afe_attenuators[i]);
180 afe_obj.set_by_val<uint16_t>(
"v_bias", raw_afe_biases[i]);
190 board_obj.
set_by_val<uint16_t>(
"bias_ctrl", raw_conf.at(
"bias_ctrl"));
191 board_obj.
set_by_val<uint64_t>(
"self_trigger_threshold", raw_conf.at(
"self_trigger_threshold"));
192 board_obj.
set_by_val<std::vector<uint8_t>>(
"full_stream_channels",
193 raw_conf.at(
"full_stream_channels").
get<std::vector<uint8_t>>());
194 board_obj.
set_by_val<uint64_t>(
"self_trigger_xcorr", raw_conf.at(
"self_trigger_xcorr"));
195 board_obj.
set_by_val<uint32_t>(
"tp_conf", raw_conf.at(
"tp_conf"));
196 board_obj.
set_by_val<uint64_t>(
"compensator", raw_conf.at(
"compensator"));
197 board_obj.
set_by_val<uint64_t>(
"inverter", raw_conf.at(
"inverter"));
198 board_obj.
set_by_val<uint16_t>(
"slot_id", geo->get_slot_id());
199 board_obj.
set_by_val<uint16_t>(
"crate_id", geo->get_crate_id());
200 board_obj.
set_by_val<uint16_t>(
"detector_id", geo->get_detector_id());
201 board_obj.
set_objs(
"active_channels", channels);
202 board_obj.
set_objs(
"active_afes", afes);
203 board_obj.
set_obj(
"default_channel", & daphne_conf->get_default_v2_settings()->get_default_channel()->config_object());
204 board_obj.
set_obj(
"default_afe", & daphne_conf->get_default_v2_settings()->get_default_afe()->config_object());
208 module_obj.
set_by_val<std::string>(
"address", ip);
209 module_obj.set_obj(
"daphne_conf", & daphne_conf ->
config_object() );
210 module_obj.set_obj(
"board_conf", & conf ->
config_object() );
212 auto module = obj_fac.get_dal<appmodel::DaphneV2ControllerModule>(module_obj);
213 modules.push_back(module);