//----------------------------------------------------------- // File and Version Information: // $Id$ // // Description: // Implementation of class BiCubSplineFitter // see BiCubSplineFitter.h for details // // Environment: // Software developed for the PANDA Detector at FAIR. // // Author List: // Felix Boehmer TUM (original author) // //----------------------------------------------------------- // Panda Headers ---------------------- // This Class' Header ------------------ #include "BiCubSplineFitter.h" // C/C++ Headers ---------------------- #include #include #include // Collaborating Class Headers -------- #include "BSpline.h" #include "TVectorD.h" // Class Member definitions ----------- /*TODO: redesign & make use of std::maps! write init method instead of huge constructor to for ex. be able to turn off and on error handling after constructing */ BiCubSplineFitter::BiCubSplineFitter(BiCubSpline* BCSP, const std::vector*>* data) { _BCSP = BCSP; _data = std::vector*>(data->size(), NULL); for(int i=0; isize(); ++i) _data[i] = new std::vector(*(data->at(i))); _emptycols=false; _newmat=NULL; unsigned int NData = _data.size(); //# of data points unsigned int lSx = _BCSP->_M.size(); //# of knots - 4 unsigned int lSy = _BCSP->_N.size(); unsigned int prod = lSx*lSy; //will be used a lot ... _mData = TArrayD(prod*NData); std::cout<<"\nBiCubSplineFitter: Initialising -------------------------------" <<"----------"<size() == 4) continue; else Warning("BiCubSplineFitter:", "Wrong data format! Aborting..."); } //resolve sorting on the data: std::cout<<"\nBiCubSplineFitter: Sorting the data... "<at(0); double y_r = _data.at(r)->at(1); double sigma_r = _data.at(r)->at(3); if(sigma_r < 1e-10) { sigma_r = 1; count++; } for(int j=0; j_M[i]->eval(x_r)*_BCSP->_N[j]->eval(y_r)*1/sigma_r; } } } _matrix = new TMatrixD(NData, prod, _mData.GetArray()); std::cout<<"\n Spline Matrix initialised."<0) { _emptycols=true; std::cout<<"Removing empty columns ... "; std::cout.flush(); TArrayD temp = TArrayD((prod-_rc.size())*NData); //cleaned matrix array int counter = 0; for(int j=0; jSetMatrixArray(temp.GetArray()); std::cout<<" done."<Decompose()) { std::cout<<"success"<at(3); if(sigma_k == 0) sigma_k = 1; val[k] = _data.at(k)->at(2)/sigma_k; } TVectorD copy = TVectorD(val); std::cout<<"BiCubSplineFitter::solve(): solving... "; std::cout.flush(); if(_householder->Solve(copy)) { std::cout<<"found a solution"< sol; int Nfound=0; for (int v=0; v* const vec1, std::vector* const vec2) { return (vec1->at(0) < vec2->at(0)); } bool ySort(std::vector* const vec1, std::vector* const vec2) { return (vec1->at(1) < vec2->at(1)); //"<=" gives seg fault during execution } void BiCubSplineFitter::sortData() { //first sort data in y direction std::sort(_data.begin(), _data.end(), ySort); //define cuts in y: int yCuts = (int)(double)std::sqrt((double)_data.size()); double yCutWidth = (double) (_data.at((_data.size())-1)->at(1)-(_data.at(0))->at(1))/yCuts; int startMarker = 0; int endMarker = 0; //sort each y-slice in x for(int i=0; iat(1) < (i+1)*yCutWidth) endMarker++; std::sort(_data.begin()+startMarker, _data.begin()+endMarker, xSort); } std::cout<<"BiCubSplineFitter::sortData(): "<