File Mutrig3Config.cpp

File List > libmudaq > Mutrig3Config.cpp

Go to the documentation of this file

#include <cstring>
#include <iostream>
#include <iomanip>

#include "Mutrig3Config.h"
#include "odbxx.h"

using midas::odb;

namespace mutrig {


odb Mutrig3Config::MUTRIG_TDC_SETTINGS = {
//    {"vnpfc", std::array<uint16_t, 2>()},
//    {"vnpfc_offset", std::array<uint16_t, 2>()},
//    {"vnpfc_scale", std::array<bool, 2>()},
//    {"vncnt", std::array<uint16_t, 2>()},
//    {"vncnt_offset", std::array<uint16_t, 2>()},
//    {"vncnt_scale", std::array<bool, 2>()},
//    {"vnvcobuffer", std::array<uint16_t, 2>()},
//    {"vnvcobuffer_offset", std::array<uint16_t, 2>()},
//    {"vnvcobuffer_scale", std::array<bool, 2>()},
//    {"vnd2c", std::array<uint16_t, 2>()},
//    {"vnd2c_offset", std::array<uint16_t, 2>()},
//    {"vnd2c_scale", std::array<bool, 2>()},
//    {"vnpcp", std::array<uint16_t, 2>()},
//    {"vnpcp_offset", std::array<uint16_t, 2>()},
//    {"vnpcp_scale", std::array<bool, 2>()},
//    {"vnhitlogic", std::array<uint16_t, 2>()},
//    {"vnhitlogic_offset", std::array<uint16_t, 2>()},
//    {"vnhitlogic_scale", std::array<bool, 2>()},
//    {"vncntbuffer", std::array<uint16_t, 2>()},
//    {"vncntbuffer_offset", std::array<uint16_t, 2>()},
//    {"vncntbuffer_scale", std::array<bool, 2>()},
//    {"vnvcodelay", std::array<uint16_t, 2>()},
//    {"vnvcodelay_offset", std::array<uint16_t, 2>()},
//    {"vnvcodelay_scale", std::array<bool, 2>()},
//    {"latchbias", std::array<uint16_t, 2>()},
//    {"ms_limits", std::array<uint16_t, 2>()},
//    {"ms_switch_sel", std::array<bool, 2>()},
//    {"amon_en", std::array<bool, 2>()},
//    {"amon_dac", std::array<uint16_t, 2>()},
//    {"dmon_select", std::array<int16_t, 2>()}, //MT: New (channel wise before). Combine with enable flag ; disable when <
//    {"dmon_sw", std::array<bool, 2>()}, //MT: New (channel wise before)
//    {"dmon_1_en", std::array<bool, 2>()},
//    {"dmon_1_dac", std::array<uint16_t, 2>()},
//    {"dmon_2_en", std::array<bool, 2>()},
//    {"dmon_2_dac", std::array<uint16_t, 2>()},
//    {"lvds_tx_vcm", std::array<uint16_t, 2>()},
//    {"lvds_tx_bias", std::array<uint16_t, 2>()},
//    {"coin_xbar_lower_rx_ena", std::array<bool, 2>()},
//    {"coin_xbar_lower_tx_ena", std::array<bool, 2>()},
//    {"coin_xbar_lower_tx_vdac", std::array<uint16_t, 2>()},
//    {"coin_xbar_lower_tx_idac", std::array<uint16_t, 2>()},
//    {"coin_mat_xbl", std::array<uint16_t, 2>()},
//    {"coin_mat_xbu", std::array<uint16_t, 2>()},
//    {"coin_xbar_upper_rx_ena", std::array<bool, 2>()},
//    {"coin_xbar_upper_tx_ena", std::array<bool, 2>()},
//    {"coin_xbar_upper_tx_vdac", std::array<uint16_t, 2>()},
//    {"coin_xbar_upper_tx_idac", std::array<uint16_t, 2>()},
//    {"coin_wnd", std::array<uint16_t, 2>()},
    {"vnpfc", 8},
    {"vnpfc_offset", 3},
    {"vnpfc_scale", false},
    {"vncnt", 40},
    {"vncnt_offset", 3},
    {"vncnt_scale", false},
    {"vnvcobuffer", 0},
    {"vnvcobuffer_offset", 0},
    {"vnvcobuffer_scale", false},
    {"vnd2c", 31},
    {"vnd2c_offset", 3},
    {"vnd2c_scale", false},
    {"vnpcp", 24},
    {"vnpcp_offset", 3},
    {"vnpcp_scale", false},
    {"vnhitlogic", 24},
    {"vnhitlogic_offset", 3},
    {"vnhitlogic_scale", false},
    {"vncntbuffer", 7},
    {"vncntbuffer_offset", 3},
    {"vncntbuffer_scale", false},
    {"vnvcodelay", 22},
    {"vnvcodelay_offset", 3},
    {"vnvcodelay_scale", false},
    {"latchbias", 1800},
    {"ms_limits", 0},
    {"ms_switch_sel", false},
    {"amon_en", true},
    {"amon_dac", 63},
    {"dmon_select", -1}, //MT3: New (channel wise before). Combine with enable flag ; disable when <0
    {"dmon_sw", true}, //MT3: New (channel wise before)
    {"dmon_1_en", true},
    {"dmon_1_dac", 31},
    {"dmon_2_en", false},
    {"dmon_2_dac", 5},
    {"lvds_tx_vcm", 160},
    {"lvds_tx_bias", 1},
    {"coin_xbar_lower_rx_ena", false},
    {"coin_xbar_lower_tx_ena", false},
    {"coin_xbar_lower_tx_vdac", 0},
    {"coin_xbar_lower_tx_idac", 0},
    {"coin_mat_xbl", 0},
    {"coin_mat_xbu", 0},
    {"coin_xbar_upper_rx_ena", false},
    {"coin_xbar_upper_tx_ena", false},
    {"coin_xbar_upper_tx_vdac", 0},
    {"coin_xbar_upper_tx_idac", 0},
    {"coin_wnd", 0},

};

odb Mutrig3Config::MUTRIG_GLOBAL_SETTINGS = {
    {"ext_trig_mode", false},
    {"ext_trig_endtime_sign", false},
    {"ext_trig_offset", 8},
    {"ext_trig_endtime", 8},
    {"gen_idle", true},
    {"ms_debug", false},
    {"tx_mode",0},
/* removed in mutrig3 / replaced by tx_mode
    {"prbs_debug", false},
    {"prbs_single", false},
*/
    {"sync_ch_rst", true},
    {"disable_coarse", false},
    {"pll_setcoarse", false},
    {"pll_envomonitor", false},
    {"pll_lol_dbg", false},
    {"en_ch_evt_cnt", false},
};

odb Mutrig3Config::MUTRIG_CH_SETTINGS = {
//    {"mask",std::array<bool, 2>()},
//    {"recv_all",std::array<bool, 2>()},
//    {"tthresh", std::array<uint16_t, 2>()},
//    {"tthresh_sc", std::array<uint16_t, 2>()},
//    {"tthresh_offset", std::array<uint16_t, 2>()},
//    {"ethresh", std::array<uint16_t, 2>()},
//    {"ebias", std::array<uint16_t, 2>()},
//    {"sipm", std::array<uint16_t, 2>()},
//    {"inputbias", std::array<uint16_t, 2>()},
//    {"pole", std::array<uint16_t, 2>()},
//    {"pole_sc", std::array<uint16_t, 2>()},
//    {"ampcom", std::array<uint16_t, 2>()},
//    {"ampcom_sc", std::array<uint16_t, 2>()},
//    {"cml", std::array<uint16_t, 2>()},
//    {"cml_sc", std::array<uint16_t, 2>()},
//    {"amonctrl", std::array<uint16_t, 2>()},
//    {"comp_spi", std::array<uint16_t, 2>()},
//    {"coin_mat", std::array<uint16_t, 2>()},
//    {"tdctest_n",std::array<bool, 2>()},
//    {"sswitch",std::array<bool, 2>()},
//    {"delay",std::array<bool, 2>()},
//    {"pole_en_n",std::array<bool, 2>()},
//    {"energy_c_en",std::array<bool, 2>()},
//    {"energy_r_en",std::array<bool, 2>()},
//    {"cm_sensing_high_r",std::array<bool, 2>()},
//    {"amon_en_n",std::array<bool, 2>()},
//    {"edge",std::array<bool, 2>()},
//    {"edge_cml",std::array<bool, 2>()},
    {"mask", true},
    {"recv_all", false},
    {"tthresh", 0},
    {"tthresh_sc", 0},
    {"tthresh_offset", 0},
    {"ethresh", 0},
    {"ebias", 3},
    {"sipm", 32},
    {"inputbias", 4},
    {"pole", 15},
    {"pole_sc", 0},
    {"ampcom", 20},
    {"ampcom_sc", 2},
    {"cml", 0},
    {"cml_sc", 1},
    {"amonctrl", 0},
    {"comp_spi", 2},
    {"coin_mat", 0},
    {"tdctest_n", false},
    {"sswitch", true},
    {"delay", true},
    {"pole_en_n", false},
    {"energy_c_en", false},
    {"energy_r_en", false},
    {"cm_sensing_high_r", false},
    {"amon_en_n", true},
    {"edge", true},
    {"edge_cml", true},
};


Mutrig3Config::paras_t Mutrig3Config::parameters_tdc = {
        make_param("vnd2c_scale",        1, 1),
        make_param("vnd2c_offset",       2, 1),
        make_param("vnd2c",              6, 1),
        make_param("vncntbuffer_scale",  1, 1),
        make_param("vncntbuffer_offset", 2, 1),
        make_param("vncntbuffer",        6, 1),
        make_param("vncnt_scale",        1, 1),
        make_param("vncnt_offset",       2, 1),
        make_param("vncnt",              6, 1),
        make_param("vnpcp_scale",        1, 1),
        make_param("vnpcp_offset",       2, 1),
        make_param("vnpcp",              6, 1),
        make_param("vnvcodelay_scale",   1, 1),
        make_param("vnvcodelay_offset",  2, 1),
        make_param("vnvcodelay",         6, 1),
        make_param("vnvcobuffer_scale",  1, 1),
        make_param("vnvcobuffer_offset", 2, 1),
        make_param("vnvcobuffer",        6, 1),
        make_param("vnhitlogic_scale",   1, 1),
        make_param("vnhitlogic_offset",  2, 1),
        make_param("vnhitlogic",         6, 1),
        make_param("vnpfc_scale",        1, 1),
        make_param("vnpfc_offset",       2, 1),
        make_param("vnpfc",              6, 1),
        make_param("latchbias",          12, 0)
    };

Mutrig3Config::paras_t Mutrig3Config::parameters_ch = {
        make_param("energy_c_en",       1, 1), //old name: anode_flag
        make_param("energy_r_en",       1, 1), //old name: cathode_flag
        make_param("sswitch",           1, 1),
        make_param("cm_sensing_high_r", 1, 1), //old name: SorD; should be always '0'
        make_param("amon_en_n",         1, 1), //old name: SorD_not; 0: enable amon in the channel
        make_param("edge",              1, 1),
        make_param("edge_cml",          1, 1),
        make_param("cml_sc",            1, 1),
        //make_param("dmon_en",           1, 1),
        //make_param("dmon_sw",           1, 1),
        make_param("tdctest_n",         1, 1),
        make_param("amonctrl",          3, 1),
        make_param("comp_spi",          2, 1),
        make_param("tthresh_offset_1",  1, 1), //was sipm_sc. MT3: Repurposed
        make_param("sipm",              6, 1),
        make_param("tthresh_offset_2",  1, 1), //was part of tthreshold scale. MT3: Repurposed
        make_param("tthresh_sc",        2, 1), //was 3 bits long. MT3: Repurposed
        make_param("tthresh",           6, 1),
        make_param("ampcom_sc",         2, 1),
        make_param("ampcom",            6, 1),
        make_param("tthresh_offset_0",  1, 1), //was inputbias_sc. MT3: Repurposed
        make_param("inputbias",         6, 1),
        make_param("ethresh",           8, 1),
        make_param("ebias",             3, 1),
        make_param("pole_sc",           1, 1),
        make_param("pole",              6, 1),
        make_param("cml",               4, 1),
        make_param("delay",             1, 1),
        make_param("pole_en_n",         1, 1), //old name: dac_delay_bit1; 0: DAC_pole on
        make_param("mask",              1, 1),
        make_param("recv_all",          1, 1) //new in mutrig2
     };

Mutrig3Config::paras_t Mutrig3Config::parameters_header = {
        make_param("gen_idle",              1, 1),
        make_param("sync_ch_rst",           1, 1), // mutrig2: was recv_all, now setting to enable on-chip reset synchronizer
        make_param("ext_trig_mode",         1, 1), // new
        make_param("ext_trig_endtime_sign", 1, 1), // sign of the external trigger matching window, 1: end time is after the trigger; 0: end time is before the trigger
        make_param("ext_trig_offset",       4, 0), // offset of the external trigger matching window
        make_param("ext_trig_endtime",      4, 0), // end time of external trigger matching window
        make_param("ms_limits",             5, 0),
        make_param("ms_switch_sel",         1, 1),
        make_param("ms_debug",              1, 1),
        make_param("tx_mode",               3, 0), //MT3: combine flags to get more options
        make_param("pll_setcoarse",         1, 1),
        make_param("pll_envomonitor",       1, 1),
        make_param("disable_coarse",        1, 1),
        make_param("pll_lol_dbg",           1, 1),
        make_param("en_ch_evt_cnt",         1, 1),
        make_param("dmon_sel",              5, 1),
        make_param("dmon_sel_enable",       1, 1),
        make_param("dmon_sw",               1, 1)
    };

Mutrig3Config::paras_t Mutrig3Config::parameters_footer = {
//coincidence logic crossbar / lower
        make_param("coin_xbar_lower_rx_ena",  1, 1),
        make_param("coin_xbar_lower_tx_ena",  1, 1),
        make_param("coin_xbar_lower_tx_vdac", 8, 1),
        make_param("coin_xbar_lower_tx_idac", 6, 1),
//coincidence logic matrix
        make_param("coin_mat_xbl", 3, 1),
        make_param("coin_mat_0", 6, 1),
        make_param("coin_mat_1", 6, 1),
        make_param("coin_mat_2", 6, 1),
        make_param("coin_mat_3", 6, 1),
        make_param("coin_mat_4", 6, 1),
        make_param("coin_mat_5", 6, 1),
        make_param("coin_mat_6", 6, 1),
        make_param("coin_mat_7", 6, 1),
        make_param("coin_mat_8", 6, 1),
        make_param("coin_mat_9", 6, 1),
        make_param("coin_mat_10", 6, 1),
        make_param("coin_mat_11", 6, 1),
        make_param("coin_mat_12", 6, 1),
        make_param("coin_mat_13", 6, 1),
        make_param("coin_mat_14", 6, 1),
        make_param("coin_mat_15", 6, 1),
        make_param("coin_mat_16", 6, 1),
        make_param("coin_mat_17", 6, 1),
        make_param("coin_mat_18", 6, 1),
        make_param("coin_mat_19", 6, 1),
        make_param("coin_mat_20", 6, 1),
        make_param("coin_mat_21", 6, 1),
        make_param("coin_mat_22", 6, 1),
        make_param("coin_mat_23", 6, 1),
        make_param("coin_mat_24", 6, 1),
        make_param("coin_mat_25", 6, 1),
        make_param("coin_mat_26", 6, 1),
        make_param("coin_mat_27", 6, 1),
        make_param("coin_mat_28", 6, 1),
        make_param("coin_mat_29", 6, 1),
        make_param("coin_mat_30", 6, 1),
        make_param("coin_mat_31", 6, 1),
        make_param("coin_mat_xbu", 3, 1),
//coincidence logic crossbar / upper
        make_param("coin_xbar_upper_rx_ena",  1, 1),
        make_param("coin_xbar_upper_tx_ena",  1, 1),
        make_param("coin_xbar_upper_tx_vdac", 8, 1),
        make_param("coin_xbar_upper_tx_idac", 6, 1),

        make_param("coin_wnd",      1, 1),

        make_param("amon_en",       1, 1),
        make_param("amon_dac",      8, 1),
        make_param("dmon_1_en",     1, 1),
        make_param("dmon_1_dac",    8, 1),
        make_param("dmon_2_en",     1, 1),
        make_param("dmon_2_dac",    8, 1),
        make_param("lvds_tx_vcm",   8, 1), // new
        make_param("lvds_tx_bias",  6, 1)  // new
    };


Mutrig3Config::Mutrig3Config() {
    // populate name/offset map

    length_bits = 0;
    // header
    for(const auto& para : parameters_header )
        addPara(para, "");
    for(unsigned int ch = 0; ch < NMUTRIGCHANNELS; ++ch) {
        for(const auto& para : parameters_ch )
            addPara(para, "_"+std::to_string(ch));
    }
    for(const auto& para : parameters_tdc )
        addPara(para, "");
    for(const auto& para : parameters_footer )
        addPara(para, "");

    if(length_bits != 2662) {
        cm_msg(MERROR,"MutrigConfig","Bitpattern is not the correct size : %ld", length_bits);
    }
    // allocate memory for bitpattern
    length = length_bits/8;
    if( length_bits%8 > 0 ) length++;
    length_32bits = length/4;
    if( length%4 > 0 ) length_32bits++;
    bitpattern_r = new uint8_t[length_32bits*4];
    bitpattern_w = new uint8_t[length_32bits*4];
    reset();
}

Mutrig3Config::~Mutrig3Config() {
    delete[] bitpattern_r;
    delete[] bitpattern_w;
}

//JK: Doing a rewrite here

void Mutrig3Config::setParameterODBpp(std::string paraName, odb& o){
    setParameter(paraName, o[paraName]);
}

void Mutrig3Config::setASICParameterODBpp(std::string paraName, odb& o, int num){
    setParameter(paraName, o[paraName][num]);
}

void Mutrig3Config::setCHParameterODBpp(std::string paraName, odb& o, int channel, int gchannel){
    setParameter(paraName + "_" + std::to_string(channel) , o[paraName][gchannel]);
}



void Mutrig3Config::Parse_GLOBAL_from_struct(odb& o){
    //hard coded in order to avoid macro magic
//    setParameter("", mt_g.n_asics);
//    setParameter("", mt_g.n_channels);
    Mutrig3Config::setParameterODBpp("ext_trig_mode", o);
    Mutrig3Config::setParameterODBpp("ext_trig_endtime_sign", o);
    Mutrig3Config::setParameterODBpp("ext_trig_offset", o);
    Mutrig3Config::setParameterODBpp("ext_trig_endtime", o);
    Mutrig3Config::setParameterODBpp("gen_idle", o);
    Mutrig3Config::setParameterODBpp("ms_debug", o);
    Mutrig3Config::setParameterODBpp("tx_mode", o);
    Mutrig3Config::setParameterODBpp("sync_ch_rst", o);
    Mutrig3Config::setParameterODBpp("disable_coarse", o);
    Mutrig3Config::setParameterODBpp("pll_setcoarse", o);
    Mutrig3Config::setParameterODBpp("pll_envomonitor", o);
}

void Mutrig3Config::Parse_TDC_from_struct(odb& o, int tdc){
    Mutrig3Config::setASICParameterODBpp("vnpfc", o, tdc);
    Mutrig3Config::setASICParameterODBpp("vnpfc_offset", o, tdc);
    Mutrig3Config::setASICParameterODBpp("vnpfc_scale", o, tdc);
    Mutrig3Config::setASICParameterODBpp("vncnt", o, tdc);
    Mutrig3Config::setASICParameterODBpp("vncnt_offset", o, tdc);
    Mutrig3Config::setASICParameterODBpp("vncnt_scale", o, tdc);
    Mutrig3Config::setASICParameterODBpp("vnvcobuffer", o, tdc);
    Mutrig3Config::setASICParameterODBpp("vnvcobuffer_offset", o, tdc);
    Mutrig3Config::setASICParameterODBpp("vnvcobuffer_scale", o, tdc);
    Mutrig3Config::setASICParameterODBpp("vnd2c", o, tdc);
    Mutrig3Config::setASICParameterODBpp("vnd2c_offset", o, tdc);
    Mutrig3Config::setASICParameterODBpp("vnd2c_scale", o, tdc);
    Mutrig3Config::setASICParameterODBpp("vnpcp", o, tdc);
    Mutrig3Config::setASICParameterODBpp("vnpcp_offset", o, tdc);
    Mutrig3Config::setASICParameterODBpp("vnpcp_scale", o, tdc);
    Mutrig3Config::setASICParameterODBpp("vnhitlogic", o, tdc);
    Mutrig3Config::setASICParameterODBpp("vnhitlogic_offset", o, tdc);
    Mutrig3Config::setASICParameterODBpp("vnhitlogic_scale", o, tdc);
    Mutrig3Config::setASICParameterODBpp("vncntbuffer", o, tdc);
    Mutrig3Config::setASICParameterODBpp("vncntbuffer_offset", o, tdc);
    Mutrig3Config::setASICParameterODBpp("vncntbuffer_scale", o, tdc);
    Mutrig3Config::setASICParameterODBpp("vnvcodelay", o, tdc);
    Mutrig3Config::setASICParameterODBpp("vnvcodelay_offset", o, tdc);
    Mutrig3Config::setASICParameterODBpp("vnvcodelay_scale", o, tdc);
    Mutrig3Config::setASICParameterODBpp("latchbias", o, tdc);
    Mutrig3Config::setASICParameterODBpp("ms_limits", o, tdc);
    Mutrig3Config::setASICParameterODBpp("ms_switch_sel", o, tdc);
    Mutrig3Config::setASICParameterODBpp("amon_en", o, tdc);
    Mutrig3Config::setASICParameterODBpp("amon_dac", o, tdc);
    Mutrig3Config::setASICParameterODBpp("dmon_sw", o, tdc);
    Mutrig3Config::setASICParameterODBpp("dmon_1_en", o, tdc);
    Mutrig3Config::setASICParameterODBpp("dmon_1_dac", o, tdc);
    Mutrig3Config::setASICParameterODBpp("dmon_2_en", o, tdc);
    Mutrig3Config::setASICParameterODBpp("dmon_2_dac", o, tdc);
    Mutrig3Config::setASICParameterODBpp("lvds_tx_vcm", o, tdc);
    Mutrig3Config::setASICParameterODBpp("lvds_tx_bias", o, tdc);
    Mutrig3Config::setASICParameterODBpp("coin_xbar_lower_rx_ena", o, tdc);
    Mutrig3Config::setASICParameterODBpp("coin_xbar_lower_tx_ena", o, tdc);
    Mutrig3Config::setASICParameterODBpp("coin_xbar_lower_tx_vdac", o, tdc);
    Mutrig3Config::setASICParameterODBpp("coin_xbar_lower_tx_idac", o, tdc);
    Mutrig3Config::setASICParameterODBpp("coin_xbar_upper_rx_ena", o, tdc);
    Mutrig3Config::setASICParameterODBpp("coin_xbar_upper_tx_ena", o, tdc);
    Mutrig3Config::setASICParameterODBpp("coin_xbar_upper_tx_vdac", o, tdc);
    Mutrig3Config::setASICParameterODBpp("coin_xbar_upper_tx_idac", o, tdc);
    Mutrig3Config::setASICParameterODBpp("coin_mat_xbl", o, tdc);
    Mutrig3Config::setASICParameterODBpp("coin_mat_xbu", o, tdc);
    Mutrig3Config::setASICParameterODBpp("coin_wnd", o, tdc);
    //special assignments
    int dmon_select = o["dmon_select"][tdc];
    bool dmon_enable = (dmon_select >0);
    Mutrig3Config::setParameter("dmon_sel_enable", dmon_enable);
    Mutrig3Config::setParameter("dmon_sel", (dmon_select & 0x1f));

}

void Mutrig3Config::Parse_CH_from_struct(odb& o, int tdc, int channel){
    auto gchannel = tdc * 32 + channel;
    Mutrig3Config::setCHParameterODBpp("mask", o, channel, gchannel);
    Mutrig3Config::setCHParameterODBpp("recv_all", o, channel, gchannel);
    Mutrig3Config::setCHParameterODBpp("tthresh", o, channel, gchannel);
    Mutrig3Config::setCHParameterODBpp("tthresh_sc", o, channel, gchannel);
    Mutrig3Config::setCHParameterODBpp("ethresh", o, channel, gchannel);
    Mutrig3Config::setCHParameterODBpp("ebias", o, channel, gchannel);
    Mutrig3Config::setCHParameterODBpp("sipm", o, channel, gchannel);
    Mutrig3Config::setCHParameterODBpp("inputbias", o, channel, gchannel);
    Mutrig3Config::setCHParameterODBpp("pole", o, channel, gchannel);
    Mutrig3Config::setCHParameterODBpp("pole_sc", o, channel, gchannel);
    Mutrig3Config::setCHParameterODBpp("ampcom", o, channel, gchannel);
    Mutrig3Config::setCHParameterODBpp("ampcom_sc", o, channel, gchannel);
    Mutrig3Config::setCHParameterODBpp("cml", o, channel, gchannel);
    Mutrig3Config::setCHParameterODBpp("cml_sc", o, channel, gchannel);
    Mutrig3Config::setCHParameterODBpp("amonctrl", o, channel, gchannel);
    Mutrig3Config::setCHParameterODBpp("comp_spi", o, channel, gchannel);
    Mutrig3Config::setCHParameterODBpp("tdctest_n", o, channel, gchannel);
    Mutrig3Config::setCHParameterODBpp("sswitch", o, channel, gchannel);
    Mutrig3Config::setCHParameterODBpp("delay", o, channel, gchannel);
    Mutrig3Config::setCHParameterODBpp("pole_en_n", o, channel, gchannel);
    Mutrig3Config::setCHParameterODBpp("energy_c_en", o, channel, gchannel);
    Mutrig3Config::setCHParameterODBpp("energy_r_en", o, channel, gchannel);
    Mutrig3Config::setCHParameterODBpp("cm_sensing_high_r", o, channel, gchannel);
    Mutrig3Config::setCHParameterODBpp("amon_en_n", o, channel, gchannel);
    Mutrig3Config::setCHParameterODBpp("edge", o, channel, gchannel);
    Mutrig3Config::setCHParameterODBpp("edge_cml", o, channel, gchannel);
    Mutrig3Config::setCHParameterODBpp("coin_mat", o, channel, gchannel);
//special assignments
    uint8_t tthresh_offset=o["tthresh_offset"][gchannel];
    setParameter("tthresh_offset_2_" + std::to_string(channel), (tthresh_offset>>0)&1);
    setParameter("tthresh_offset_1_" + std::to_string(channel), (tthresh_offset>>1)&1);
    setParameter("tthresh_offset_0_" + std::to_string(channel), (tthresh_offset>>2)&1);
}

void Mutrig3Config::MapConfigFromDB(odb& settings_asics, int asic) {
    reset();
    // get global asic settings from odb;
    Parse_GLOBAL_from_struct(settings_asics["Global"]);

    // get tdcs asic settings from odb
    std::string path ="TDCs/";//+std::to_string(asic); This belongs to the previous ODB structure
    Parse_TDC_from_struct(settings_asics[path], asic);

    // get channels asic settings from odb
    for(unsigned int ch = 0; ch < NMUTRIGCHANNELS; ch++) {
        std::string path2 ="Channels/";
        //this is still the local channel
        Parse_CH_from_struct(settings_asics[path2], asic, ch);
    }
}

} // namespace mutrig