37 for(i_bin=0; i_bin<(int)
m_xbins.size(); i_bin++){
82 if(iBinx < 0 || iBinx >= (
int)
m_CoeffSet.size())
return false;
84 std::cout<<
"CaloLocalHadCoeff::LocalHadDimension::getBinAdjusted() -> Error! Wrong indexes vector size in isNeighbour: "<< v_indx.size()<<std::endl;
87 std::vector<int> xidx;
89 for(
unsigned int i=0; i<xidx.size(); ++i) {
90 if(abs(v_indx[i]-xidx[i]) == 1)
return true;
120 std::cout<<
"CaloLocalHadCoeff::isFilled() -> Error! Unknown area typ: "<<
getAreaFromBin(
bin)->
getType()<<
" in isFilled !!"<<std::endl;
140 int ndim = (int)
m_dims.size();
141 for(
int i=0; i<ndim; i++){
146 for(
int i_dim=0; i_dim<ndim; i_dim++){
148 for(
int j=i_dim+1; j<ndim; j++){
149 xloc = xloc*
m_dims[j].getNbins();
164 static_assert(std::is_nothrow_move_constructible<CaloLocalHadCoeff>::value);
165 static_assert(std::is_nothrow_move_constructible<LocalHadArea>::value);
166 static_assert(std::is_nothrow_move_constructible<LocalHadDimension>::value);
180 for(
unsigned int i_area=0; i_area<
m_AreaSet.size(); i_area++){
186 pars.resize(theArea.
getNpars(), 0.0);
187 for(
int i_size=0; i_size<theArea.
getLength(); i_size++){
203 if(n_area >= 0 && n_area<(
int)
m_AreaSet.size() ) {
215 for(i_area=0; i_area<narea; i_area++) {
228 for(i_area=0; i_area<narea; i_area++) {
251 if ( iBin >= 0 && iBin < (
int)
m_CoeffSet.size() ) {
261 int iBin =
getBin(n_area, vars);
277 int iBin =
area->getOffset();
278 for(
int i_dim=0; i_dim<
area->getNdim(); i_dim++){
279 int i_bin_dim =
area->getDimension(i_dim)->getBin( vars[i_dim] );
280 if(i_bin_dim < 0)
return -1;
281 iBin += i_bin_dim*
area->getDimLoc(i_dim);
292 int iBin =
area->getOffset();
293 for(
int i_dim=0; i_dim<
area->getNdim(); i_dim++){
294 if(v_indexes[i_dim] < 0)
return -1;
295 iBin += v_indexes[i_dim]*
area->getDimLoc(i_dim);
304 v_dim_indx.resize(theArea->
getNdim(),0);
305 for(
int i_dim=0; i_dim<theArea->
getNdim(); i_dim++){
307 for(
int j=0; j<i_dim; j++){
308 x0 += v_dim_indx[j]*theArea->
getDimLoc(j);
318 std::vector<double> &xadj, std::vector<unsigned int> &gbin)
const {
320 if(n_area<0 || n_area >= (
int)
m_AreaSet.size())
return false;
323 std::cout <<
"CaloLocalHadCoeff::getInterpArrays() -> Error! Empty dimension list" << std::endl;
325 }
else if( (
int)dim.size() >
area->getNdim()) {
326 std::cout <<
"CaloLocalHadCoeff::getInterpArrays() -> Error! Vector of dimensions to interpolate exceed defined in area." << std::endl;
329 int ndim = dim.size();
331 if((
int)
x.size()!=
area->getNdim()) {
332 std::cout<<
"CaloLocalHadCoeff::getInterpArrays() -> Error! Wrong size of phase space point !!!"<<std::endl;
337 unsigned int ncorners = (1<<ndim);
338 gbin.resize(ncorners);
343 std::vector<int> vTmp;
344 std::vector<int> vIdx(
area->getNdim());
345 std::vector<std::vector<int> > vpW;
346 for(i=0; i<ndim; i++){
347 ibin = (
area->getDimension(dim[i]))->getBinAdjusted(
x[dim[i]],xa);
351 vTmp.push_back(ibin);
352 if(ibin< (
area->getDimension(dim[i]))->getNbins()-1) vTmp.push_back(ibin+1);
353 else vTmp.push_back(ibin);
357 for(i=0; i<
area->getNdim(); ++i){
358 if(std::find(dim.begin(),dim.end(),i) != dim.end())
continue;
359 vIdx[i] =
area->getDimension(i)->getBin(
x[i]);
365 for(i_len=0; i_len<ncorners; ++i_len){
366 for( i=0; i<ndim; i++){
368 if(i==0) vIdx[dim[i]] = vpW[i][i_len%2];
369 else vIdx[dim[i]] = vpW[i][int(i_len/
int(
pow(2,i)))%int(
pow(2,i))];
374 ibin =
getBin(n_area,vIdx);
constexpr int pow(int base, int exp) noexcept
Definition of correction area.
int getDimLoc(int i_dim) const
get dimension locator coefficient
std::vector< LocalHadDimension > m_dims
vector of defined dimensions
int getLength() const
return area length
int m_length
length of area data block (product of m_nbins over all dimensions defined)
int getNdim() const
get number of dimensions
int getNpars() const
return number of parameters
std::vector< int > m_dims_loc
locator index for dimensions
int getOffset() const
return area offset
void addDimension(LocalHadDimension &dim)
to add new dimension
unsigned int getType() const
return area type
void setOffset(int offset)
set area offset
Class defines binning for user dimension.
float m_xmin
minimum value for the first bin
float m_dx
bin size (in the case of equidistant binning)
std::vector< float > m_xbins
bins borders (if dimension has non-equidistant binning), vector of size m_nbins+1
int m_nbins
number of bins
float m_xmax
maximum value for the last bin
int getBin(float &x) const
return bin number
int getBinAdjusted(float &x, float &xadj) const
CaloLocalHadCoeff()
Default constructor.
const LocalHadCoeff * getCoeff(const int &iBin) const
get data for given general bin number
bool isFilled(const int iBin) const
check if general bin is filled
const LocalHadArea * getArea(int n_area) const
return area
void addArea(LocalHadArea &theArea)
add new area
bool isNeighbour(const int iBinx, std::vector< int > &v_indx) const
are this bins is neighbour to this indexes vector (any of their indexes differ per one ?...
void setCoeff(const int iBin, const LocalHadCoeff &theCoeff)
set new data
int bin2indexes(const int iBin, std::vector< int > &v_dim_indx) const
expand general bin into vector of bins for defined dimensions
const LocalHadArea * getAreaFromBin(int iBin) const
return area defined for given general iBin
void setArea(const int n_area, const LocalHadArea &theArea)
replace existing area with another one
int getBin(const int n_area, std::vector< float > &vars) const
calculate general bin from vector of input cluster variables
bool getInterpArrays(const int n_area, const std::vector< int > &dim, std::vector< float > &x, std::vector< double > &xadj, std::vector< unsigned int > &gbin) const
for interpolation, build the vector of relative x, and global bins for interpolated array for area n_...
std::vector< float > LocalHadCoeff
Correction parameters for one general bin.
std::vector< LocalHadArea > m_AreaSet
vector of correction areas
std::vector< LocalHadCoeff > m_CoeffSet
vector of correction coefficients
void getOffset(boost::tokenizer< boost::char_separator< char > >::iterator &token, uint32_t &offset)