00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include "AIDA_DataPointSetIterator.h"
00032 #include "AIDA_Function_FML/AIDA_RangeSet.h"
00033
00034 # include "AIDA/IAxis.h"
00035 # include "AIDA/IDataPointSet.h"
00036 # include "AIDA/IDataPoint.h"
00037 # include "AIDA/IMeasurement.h"
00038
00039 # include "FML/debug.h"
00040
00041 #ifdef __sun
00042 #include <assert.h>
00043 #endif
00044
00045
00046
00047 namespace Anaphe {
00048 namespace AIDA_Fitter_FML {
00049
00050
00051 AIDA_DataPointSetIterator::AIDA_DataPointSetIterator(const AIDA::IDataPointSet& dps, std::vector<int> indeces, int valIndex) :
00052 m_data(&dps) ,
00053 m_indeces(indeces),
00054 m_val_index(valIndex)
00055 {
00056 m_dim = indeces.size();
00057 assert (m_dim < m_data->dimension() );
00058 }
00059
00060 AIDA_DataPointSetIterator::~AIDA_DataPointSetIterator()
00061 {
00062 }
00063
00064 AIDA_DataPointSetIterator::AIDA_DataPointSetIterator(const AIDA_DataPointSetIterator &)
00065 {
00066 }
00067
00068 AIDA_DataPointSetIterator & AIDA_DataPointSetIterator::operator = (const AIDA_DataPointSetIterator &rhs)
00069 {
00070 if (this == &rhs) return *this;
00071
00072 return *this;
00073 }
00074
00075
00076
00077 void AIDA_DataPointSetIterator::fillData(const std::vector<Anaphe::AIDA_Function_FML::AIDA_RangeSet * > & ranges)
00078 {
00079 int n = ranges.size();
00080 if (n != m_dim) {
00081 INFO_MSG(" AIDA_DataPointSetIterator::fillData invalid dimension for rangeset - cannot feed data in FNL");
00082 return;
00083 }
00084
00085 for (int i = 0; i < m_dim; ++i) {
00086 if (!ranges[i]) {
00087 INFO_MSG(" AIDA_DataPointSetIterator::fillData invalid rangeset - cannot feed data in FNL");
00088 return;
00089 }
00090 }
00091
00092 std::auto_ptr<FML::DataVector> vptr (new FML::DataVector());
00093
00094 std::vector<double> x(m_dim);
00095
00096
00097
00098 int nPointsInRange = 0;
00099 for(int ipoint = 0; ipoint < m_data->size(); ++ipoint)
00100 {
00101 const AIDA::IDataPoint* p = m_data->point( ipoint );
00102
00103 bool validPoint = true;
00104 for (int idim = 0; idim < m_dim; ++idim)
00105 {
00106 const AIDA::IMeasurement* m = p->coordinate( m_indeces[idim] );
00107 x[idim] = m->value();
00108 validPoint = validPoint && ranges[idim]->isInRange(x[idim]);
00109 }
00110
00111 if (validPoint) {
00112
00113 const AIDA::IMeasurement* m = p->coordinate(m_val_index);
00114 double value = m->value();
00115 double eplus = m->errorPlus();
00116 double eminus = m->errorMinus();
00117
00118 vptr->push_back(x, value, eplus, eminus);
00119 nPointsInRange++;
00120 }
00121
00122 }
00123
00124
00125 vptr->setRange(FML::DataRange( nPointsInRange ));
00126
00127 setVector(vptr);
00128
00129 }
00130 }
00131 }