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_Histogram3DIterator.h"
00032 #include "AIDA_Function_FML/AIDA_RangeSet.h"
00033
00034 # include "AIDA/IAxis.h"
00035 # include "AIDA/IHistogram3D.h"
00036
00037 # include "FML/debug.h"
00038
00039
00040 namespace Anaphe {
00041 namespace AIDA_Fitter_FML {
00042
00043
00044 AIDA_Histogram3DIterator::AIDA_Histogram3DIterator(const AIDA::IHistogram3D& h, int ix, int iy, int iz) :
00045 m_hist(&h),
00046 m_dim(h.dimension()),
00047 xIndex(ix), yIndex(iy), zIndex(iz)
00048 {
00049 }
00050
00051 AIDA_Histogram3DIterator::~AIDA_Histogram3DIterator()
00052 {
00053 }
00054
00055 AIDA_Histogram3DIterator::AIDA_Histogram3DIterator(const AIDA_Histogram3DIterator &)
00056 {
00057 }
00058
00059 AIDA_Histogram3DIterator & AIDA_Histogram3DIterator::operator = (const AIDA_Histogram3DIterator &rhs)
00060 {
00061 if (this == &rhs) return *this;
00062
00063 return *this;
00064 }
00065
00066
00067
00068 void AIDA_Histogram3DIterator::fillData(const std::vector<Anaphe::AIDA_Function_FML::AIDA_RangeSet * > & ranges )
00069 {
00070 int n = ranges.size();
00071 if (n != m_dim) {
00072 INFO_MSG(" AIDA_Histogram3DIterator::fillData invalid dimension for rangeset - cannot feed data in FNL");
00073 return;
00074 }
00075 if (!ranges[0]) {
00076 INFO_MSG(" AIDA_Histogram3DIterator::fillData invalid rangeset - cannot feed data in FNL");
00077 return;
00078 }
00079 if (xIndex >= m_dim || yIndex >= m_dim || zIndex >= m_dim) {
00080 INFO_MSG(" AIDA_Histogram3DIterator::fillData invalid indices - cannot feed data in FNL");
00081 return;
00082 }
00083
00084
00085 std::auto_ptr<FML::DataVector> vptr (new FML::DataVector());
00086
00087 std::vector<double> x(m_dim);
00088
00089 int nPoints = 0;
00090 for(int i = 0; i<m_hist->xAxis().bins(); ++i)
00091 {
00092 for(int j = 0; j<m_hist->yAxis().bins(); ++j)
00093 {
00094 for(int k = 0; k<m_hist->zAxis().bins(); ++k)
00095 {
00096 x[xIndex] = m_hist->binMeanX(i,j,k);
00097 x[yIndex] = m_hist->binMeanY(i,j,k);
00098 x[zIndex] = m_hist->binMeanY(i,j,k);
00099 if (ranges[0]->isInRange(x[0]) &&
00100 ranges[1]->isInRange(x[1]) &&
00101 ranges[2]->isInRange(x[2]) )
00102 {
00103 vptr->push_back(x, m_hist->binHeight(i,j,k), m_hist->binError(i,j,k), m_hist->binError(i,j,k));
00104 nPoints++;
00105 }
00106 }
00107
00108 }
00109 }
00110
00111 vptr->setRange(FML::DataRange( nPoints ));
00112
00113 setVector(vptr);
00114
00115 }
00116 }
00117 }