10#include <svd/calibration/SVDLocalCalibrationsImporter.h>
14#include <svd/online/SVDOnlineToOfflineMap.h>
17#include <framework/database/Database.h>
18#include <framework/database/DBObjPtr.h>
19#include <framework/database/PayloadFile.h>
20#include <framework/database/IntervalOfValidity.h>
21#include <framework/database/DBImportObjPtr.h>
24#include <framework/logging/Logger.h>
26#include <framework/utilities/FileSystem.h>
29#include <svd/calibration/SVDNoiseCalibrations.h>
30#include <svd/calibration/SVDPedestalCalibrations.h>
31#include <svd/calibration/SVDPulseShapeCalibrations.h>
32#include <svd/calibration/SVDHotStripsCalibrations.h>
33#include <svd/calibration/SVDFADCMaskedStrips.h>
35#include <vxd/dataobjects/VxdID.h>
37#include <boost/property_tree/ptree.hpp>
38#include <boost/property_tree/xml_parser.hpp>
43using boost::property_tree::ptree;
45void SVDLocalCalibrationsImporter::importSVDChannelMapping(
const std::string& fileName)
50 B2INFO(
"Importing the svd online -> offline map " << fileName <<
"\n");
52 const std::string payloadname =
"SVDChannelMapping.xml";
56 B2INFO(
"Failure :( ua uaa uaa uaa uaaaa)");
70 xmlFileName,
"noises",
71 -1.0, errorTollerant);
77 xmlFileName,
"pedestals",
78 -1.0, errorTollerant);
84 xmlFileName,
"hot_strips",
85 false, errorTollerant);
92 false, errorTollerant);
98template<
class SVDcalibration >
100 const std::string& xmlFileName,
101 const std::string& xmlTag,
102 typename SVDcalibration::t_perSideContainer::calibrationType defaultValue,
109 OnlineToOfflineMapFileName.hasChanged();
111 std::unique_ptr<SVDOnlineToOfflineMap> map =
112 std::make_unique<SVDOnlineToOfflineMap>(OnlineToOfflineMapFileName->getFileName());
114 payload.construct(defaultValue, xmlFileName);
121 read_xml(xmlFileName, pt);
123 for (ptree::value_type
const& backEndLayoutChild :
124 pt.get_child(
"cfg_document.back_end_layout")) {
126 if (backEndLayoutChild.first ==
"fadc") {
128 std::string FADCidString = backEndLayoutChild.second.get<std::string>(
"<xmlattr>.id");
129 std::stringstream ss;
130 ss << std::hex << FADCidString;
133 for (ptree::value_type
const& fadcChild : backEndLayoutChild.second.get_child(
"")) {
134 if (fadcChild.first ==
"adc") {
135 int ADCid = fadcChild.second.get<
int>(
"<xmlattr>.id") ;
136 B2DEBUG(1,
" ADC id = " << ADCid);
138 int layerId = fadcChild.second.get<
int>(
"<xmlattr>.layer_id");
139 B2DEBUG(1,
" layer_id = " << layerId);
141 int ladderId = fadcChild.second.get<
int>(
"<xmlattr>.ladder_id") ;
142 B2DEBUG(1,
" ladder_id = " << ladderId);
144 int hybridId = fadcChild.second.get<
int>(
"<xmlattr>.hybrid_id");
145 B2DEBUG(1,
" hybrid_id = " << hybridId);
147 B2DEBUG(1,
" delay25 = " <<
148 fadcChild.second.get<
int>(
"<xmlattr>.delay25"));
150 for (ptree::value_type
const& apvChild : fadcChild.second.get_child(
"")) {
151 if (apvChild.first ==
"apv25") {
152 int apv25ADCid = apvChild.second.get<
int>(
"<xmlattr>.id");
153 std::string valuesString = apvChild.second.get<std::string>(xmlTag) ;
154 B2DEBUG(10, xmlTag <<
" APV25ID" << apv25ADCid <<
" "
155 << valuesString <<
"\n~~~~~~~~\n");
157 std::stringstream ssn;
160 for (
int apvChannel = 0 ; apvChannel < 128; apvChannel ++) {
163 map->getSensorInfo(FADCid, ADCid * 6 + apv25ADCid);
165 short strip = map->getStripNumber(apvChannel, info);
166 int side = info.m_uSide ?
167 SVDcalibration::Uindex :
168 SVDcalibration::Vindex ;
169 int layer = info.m_sensorID.getLayerNumber();
170 int ladder = info.m_sensorID.getLadderNumber();
171 int sensor = info.m_sensorID.getSensorNumber();
172 if (apvChannel % 127 == 0)
173 B2DEBUG(100, layer <<
"_" << ladder <<
"_" <<
174 sensor <<
"_" << side <<
"_" << strip <<
"( " <<
175 apvChannel <<
") " << value);
176 if (errorTollerant || layer != layerId || ladder != ladderId
180 B2FATAL(
"Inconsistency among maps: xml files tells \n" <<
181 "layer " << layerId <<
" ladder " << ladderId <<
182 " hybridID " << hybridId <<
"\n" <<
183 "while the basf2 map tells \n" <<
184 "layer " << layer <<
" ladder " << ladder <<
185 " sensor " << sensor <<
"\n");
188 payload->set(layer, ladder, sensor, side, strip, value);
204 B2RESULT(
"Imported to database.");
218 OnlineToOfflineMapFileName.hasChanged();
220 std::unique_ptr<SVDOnlineToOfflineMap> map =
221 std::make_unique<SVDOnlineToOfflineMap>(OnlineToOfflineMapFileName->getFileName());
230 read_xml(xmlFileName, pt);
232 for (ptree::value_type
const& backEndLayoutChild :
233 pt.get_child(
"cfg_document.back_end_layout")) {
235 if (backEndLayoutChild.first ==
"fadc") {
237 std::string FADCidString = backEndLayoutChild.second.get<std::string>(
"<xmlattr>.id");
238 std::stringstream ss;
239 ss << std::hex << FADCidString;
242 for (ptree::value_type
const& fadcChild : backEndLayoutChild.second.get_child(
"")) {
243 if (fadcChild.first ==
"adc") {
244 int ADCid = fadcChild.second.get<
int>(
"<xmlattr>.id") ;
245 B2DEBUG(1,
" ADC id = " << ADCid);
247 int layerId = fadcChild.second.get<
int>(
"<xmlattr>.layer_id");
248 B2DEBUG(1,
" layer_id = " << layerId);
250 int ladderId = fadcChild.second.get<
int>(
"<xmlattr>.ladder_id") ;
251 B2DEBUG(1,
" ladder_id = " << ladderId);
253 int hybridId = fadcChild.second.get<
int>(
"<xmlattr>.hybrid_id");
254 B2DEBUG(1,
" hybrid_id = " << hybridId);
256 B2DEBUG(1,
" delay25 = " << fadcChild.second.get<
int>(
"<xmlattr>.delay25"));
258 for (ptree::value_type
const& apvChild : fadcChild.second.get_child(
"")) {
259 if (apvChild.first ==
"apv25") {
260 int apv25ADCid = apvChild.second.get<
int>(
"<xmlattr>.id");
261 std::string ampString = apvChild.second.get<std::string>(
"cal_peaks") ;
262 std::string widthString = apvChild.second.get<std::string>(
"cal_width") ;
263 std::string peakTimeString = apvChild.second.get<std::string>(
"cal_peak_time") ;
265 std::stringstream ssAmp;
268 std::stringstream ssWidth;
269 ssWidth << widthString;
271 std::stringstream ssPeak;
272 ssPeak << peakTimeString;
274 double amp, width, peakTime;
275 for (
int apvChannel = 0 ; apvChannel < 128; apvChannel ++) {
282 short strip = map->getStripNumber(apvChannel, info);
283 int side = info.m_uSide ?
284 SVDPulseShapeCalibrations::t_calAmp_payload::Uindex :
285 SVDPulseShapeCalibrations::t_calAmp_payload::Vindex;
287 int layer = info.m_sensorID.getLayerNumber();
288 int ladder = info.m_sensorID.getLadderNumber();
289 int sensor = info.m_sensorID.getSensorNumber();
290 if (errorTollerant || layer != layerId || ladder != ladderId
293 B2ERROR(
"Inconsistency among maps: xml files tels \n" <<
294 "layer " << layerId <<
" ladder " << ladderId <<
" hybridID " << hybridId <<
"\n" <<
295 "while the basf2 map tels \n" <<
296 "layer " << layer <<
" ladder " << ladder <<
" sensor " << sensor <<
"\n");
300 stripCalAmp.
gain = amp / 22500.;
301 stripCalAmp.
peakTime = peakTime * 31.44 / 8;
303 pulseShapes->set(layer, ladder, sensor, side, strip, stripCalAmp);
318 pulseShapes.import(iov);
320 B2RESULT(
"Imported to database.");
Class for importing a single object to the database.
Class for accessing objects in the database.
static std::string findFile(const std::string &path, bool silent=false)
Search for given file or directory in local or central release directory, and return absolute path if...
A class that describes the interval of experiments/runs for which an object in the database is valid.
static std::string name
name of the SVDFADCMaskedStrips payload
static std::string name
name of the SVDHotStripsCalibrations payload
void importSVDNoiseCalibrationsFromXML(const std::string &xmlFileName, bool errorTollerant=false)
This method import to the database the strip noise from the pedestal local runs.
void importSVDFADCMaskedStripsFromXML(const std::string &xmlFileName, bool errorTollerant=false)
This method import to the database the list of strips masked at FADC level.
int m_lastExperiment
Last experiment.
void importSVDCalibrationsFromXML(const std::string &condDbname, const std::string &xmlFileName, const std::string &xmlTag, typename SVDcalibration::t_perSideContainer::calibrationType defaultValue, bool errorTollerant)
This method import to the database the strip noise from the noise local runs.
void importSVDCalAmpCalibrationsFromXML(const std::string &xmlFileName, bool errorTollerant=false)
This method import to the database the strip pulse width, time and gain from the injection local runs...
int m_firstExperiment
The interval of validity coordinates are defined as private members.
void importSVDPedestalCalibrationsFromXML(const std::string &xmlFileName, bool errorTollerant=false)
This method import to the database the strip pedestal from the pedestal local runs.
void importSVDHotStripsCalibrationsFromXML(const std::string &xmlFileName, bool errorTollerant=false)
This method import to the database the list of hot strips flagged online and written in the local run...
static std::string name
name of the SVDNoiseCalibrations payload
static std::string name
name of the SVDPedestalCalibrations payload
static std::string calAmp_name
name of the SVDStripCalAmp payload
static Database & Instance()
Instance of a singleton Database.
Abstract base class for different kinds of events.
Struct to hold data about a sensor.
contains the parameter of the APV pulse
float pulseWidth
pulseWidth (in ns) is the width of the shaper output TO BE CLARIFIED: how this width is defined?
float peakTime
peakTimes (in ns) is the time at wich the shaper output reach the maximum.
float gain
gain is expressed in ADC counts / # electrons injected in the channel