24 #include "boost/io/ios_state.hpp"
41 for(
int i_area=0; i_area<
coeff->getSizeAreaSet(); i_area++) {
42 if(sname ==
coeff->getArea(i_area)->getTitle()) {
44 return coeff->getArea(i_area);
47 std::cout <<
"CaloLCCoeffHelper::getAreaFromName() -> Error! No such area '" << sname <<
"'" << std::endl;
58 std::optional<CaloLocalHadCoeff>
data=std::make_optional<CaloLocalHadCoeff>();
63 std::cout <<
"CaloLCCoeffHelper::InitDataFromFile - Reading file '" <<
filename <<
"'." << std::endl;
67 std::cout <<
"CaloLCCoeffHelper::InitDataFromFile - Can't open file '" <<
filename <<
"'." << std::endl;
72 std::istringstream ist;
73 while(
fin.getline(cLine,
sizeof(cLine)-1)) {
74 if( strlen(cLine)==0 || cLine[0] ==
'#' || cLine[0] ==
'\n')
continue;
78 ist.clear(); ist.str(sLine);
79 std::string sdummy, area_title;
80 int area_indx(0), area_type(0), area_npars(0);
81 if( !(ist >> sdummy >> area_indx >> area_title >> area_type >> area_npars) ||
82 area_npars < 0 || area_npars > 1000 ) {
83 std::cout <<
"CaloLCCoeffHelper::initDataFromFile() -> Error! Could not parse line '" << cLine <<
"' at p1." << std::endl;
90 while(
fin.getline(cLine,
sizeof(cLine)-1)){
91 if( cLine[0] ==
'#')
continue;
93 if(sLine.find(
"break") != std::string::npos) {
98 std::cout <<
"CaloLCCoeffHelper::initDataFromFile() ->Error! Could not parse line '" << sLine <<
"' at p2a." << std::endl;
103 data->addArea(theArea);
106 for(
int i_len=0; i_len<theArea.
getLength(); i_len++){
107 if(!
fin.getline(cLine,
sizeof(cLine)-1)) {
108 std::cout <<
"panic " << std::endl;
112 ist.clear(); ist.str(sLine);
114 if( !(ist >> idummy) ) {
115 std::cout <<
"CaloLCCoeffHelper::initDataFromFile() -> Warning! Area " << theArea.
getTitle() <<
" doesn't have parameters." << std::endl;
119 std::cout <<
"CaloLCCoeffHelper::initDataFromFile() ->Error! Could not parse line '" << cLine <<
"' at p3." << std::endl;
122 for(
int j=0; j<theArea.
getNdim(); j++) {
123 if(!(ist >> idummy)) {
124 std::cout <<
"CaloLCCoeffHelper::initDataFromFile() -> panic!" << std::endl;
130 for(
int j=0; j<theArea.
getNpars(); j++) {
131 if( !(ist >>
pars[j]) ) {
132 std::cout <<
"CaloLCCoeffHelper::initDataFromFile() ->Error! Could not parse line '" << cLine <<
"' at p4." << std::endl;
133 std::cout <<
" dmArea.m_title" << theArea.
getTitle() << std::endl;
165 boost::io::ios_base_all_saver ifs (
fout);
168 "# Coefficients for local hadronic calibration .\n\n"
174 for(
int i_area=0; i_area <
data->getSizeAreaSet(); i_area++){
176 fout <<
"area " << i_area <<
" " <<
area->getTitle() <<
" " <<
area->getType() <<
" " <<
area->getNpars() << std::endl;
177 for(
int i_dim=0; i_dim<
area->getNdim(); i_dim++){
180 "%-6s %2d %6.3f %12.3f ",
dim->getTitle().c_str(),
dim->getNbins(),
dim->getXmin(),
dim->getXmax() );
181 std::string sline(
line);
196 fout <<
"break" << std::endl;
199 for(
int i_data=0; i_data<
area->getLength(); i_data++) {
200 int indx =
area->getOffset() + i_data;
203 std::cout <<
"CaloLCCoeffHelper::PrintData() -> Error! Wrong bin number" << std::endl;
206 fout << std::setw(5) << indx <<
" ";
207 std::vector<int > v_dim_indexes;
208 data->bin2indexes(indx, v_dim_indexes);
209 for(
unsigned int i_dim=0; i_dim<v_dim_indexes.size(); i_dim++){
210 fout << std::setw(4) << v_dim_indexes[i_dim] <<
" ";
213 for(
unsigned int i_par=0; i_par<(*pars).size(); i_par++) {
214 fout << std::fixed << std::setprecision(6) << std::setw(12) << (*pars)[i_par] <<
" ";
233 const std::vector<int> &
dim,
double xfit)
236 if( n_area >= (
unsigned int)
data->getSizeAreaSet())
return false;
238 if(!
data->isFilled(
data->getBin(n_area,
x))) {
245 std::cout <<
"CaloLCCoeffHelper::Interpolate() -> Error! Empty vector of dimensions to interpolate trough." << std::endl;
247 }
else if ( (
int)
dim.size() >
area->getNdim()){
248 std::cout <<
"CaloLCCoeffHelper::Interpolate() -> Error! Vector of dimensions to interpolate exceed defined in area." << std::endl;
250 }
else ndim=
dim.size();
251 unsigned int ncorners = (1<<ndim);
253 std::vector<double > vXadj(ndim);
254 std::vector<unsigned int > vgbins(ncorners);
255 std::vector<double > vWeights(ncorners);
256 std::vector<int> ebindx;
260 switch (
area->getType()) {
262 nip =
data->getCoeff(
area->getOffset()+1)->size();
266 nip =
data->getCoeff(
area->getOffset()+1)->size();
269 for(
unsigned int ip=0;
ip<nip; ++
ip) {
270 bool isa =
data->getInterpArrays(n_area,
dim,
x,vXadj,vgbins);
272 std::cout<<
"No arrays for x: ";
273 for(
unsigned int l=0;
l<
x.size(); ++
l) std::cout<<
x[
l]<<
" ";
274 std::cout<<std::endl;
277 for(
unsigned int i_len=0; i_len<ncorners; ++i_len){
279 if(
data->isFilled(vgbins[i_len])) {
281 data->getCoeff(vgbins[i_len]);
284 vWeights[i_len] = (*lpars)[0] + (*lpars)[1]*
pow(xfit,(*lpars)[2]);
286 vWeights[i_len] = (*lpars)[
ip];
292 vWeights[i_len] = 0.;
293 unsigned int icount = 0;
294 data->bin2indexes(vgbins[i_len],ebindx);
297 for(
unsigned int blen=0; blen<ncorners; ++blen){
298 if(blen == i_len)
continue;
299 if(!
data->isFilled(vgbins[blen])){
300 data->bin2indexes(vgbins[i_len],
bx);
305 if(
data->isNeighbour(vgbins[blen], ebindx)) {
307 data->getCoeff(vgbins[blen]);
309 vWeights[i_len] = (*lpars)[0] + (*lpars)[1]*
pow(xfit,(*lpars)[2]);
311 vWeights[i_len] += (*lpars)[
ip];
318 vWeights[i_len] /= icount;
329 std::cout<<
"Not implemented yet for this Area type !!!"<<std::endl;
344 std::optional<CaloLocalHadCoeff::LocalHadDimension>
dim{std::nullopt};
345 std::istringstream ist(sLine.c_str());
347 std::string dim_title;
349 int dim_nbins(0), dim_type(0);
350 float dim_xmax(0), dim_xmin(0);
352 if( !(ist >> dim_title >> dim_nbins >> dim_xmin >> dim_xmax >> stype) ){
353 std::cout <<
"CaloHadDMCoeffHelper::parse_dim() -> Error! Could not parse line '" << sLine <<
"' at p1." << std::endl;
360 else if (dim_nbins > 10000)
363 if(stype.find(
"flat") != std::string::npos) {
365 dim.emplace(dim_title.c_str(), dim_type, dim_nbins, dim_xmin, dim_xmax);
366 }
else if(stype.find(
"hand") != std::string::npos) {
368 std::vector<float> x_bins;
370 for(
int i=0;
i<dim_nbins+1;
i++) {
372 std::cout <<
"CaloHadDMCoeffHelper::parse_dim() -> Error! Could not parse line '" << sLine <<
"' at p2." << std::endl;
378 dim.emplace(dim_title.c_str(), dim_type, x_bins);
380 std::cout <<
"CaloHadDMCoeffHelper::parse_dim() -> Error! Could not parse line '" << sLine <<
"' at p3." << std::endl;