//----------------------------------------------------------- // 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! write init method instead of huge constructor to be able to //for ex. turn off and on error handling after constructing BiCubSplineFitter::BiCubSplineFitter(BiCubSpline* BCSP, std::vector*>* data) { _BCSP = BCSP; _data = data; _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(lSx*lSy*NData); std::cout<<"\nBiCubSplineFitter: Initialising -------------------------------" <<"----------"<at(i)->size() == 4) continue; else Warning("BiCubSplineFitter:", "Wrong data format! Aborting..."); } //resolve sorting on the data: //TODO: make _data const and resolve sorting on a new data vec _sorted_data! std::cout<<"\nBiCubSplineFitter: Sorting the data... "<at(r)->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, lSx*lSy, _mData.GetArray()); std::cout<<"\n Spline Matrix initialised."<0) { _emptycols=true; std::cout<<"Removing empty columns ... "; std::cout.flush(); TArrayD temp = TArrayD((lSx*lSy-_rc.size())*NData); //cleaned matrix array int counter = 0; for(int j=0; jSetMatrixArray(temp.GetArray()); std::cout<<" done."<Decompose()) { std::cout<<"success"<size()); for(int k=0; k<_data->size(); k++) { double sigma_k = _data->at(k)->at(3); if(sigma_k == 0) sigma_k = 1; val[k] = _data->at(k)->at(2)*1/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) std::floor((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(startMarker+endMarker))->at(1) < (i+1)*yCutWidth) endMarker++; std::sort(_data->begin()+startMarker, _data->begin()+endMarker, xSort); } std::cout<<"BiCubSplineFitter::sortData(): "<