/** This software was developed by the University of Tennessee as part of the Distributed Data Analysis of Neutron Scattering Experiments (DANSE) project funded by the US National Science Foundation. If you use DANSE applications to do scientific research that leads to publication, we ask that you acknowledge the use of the software with the following sentence: "This work benefited from DANSE software developed under NSF award DMR-0520547." copyright 2009, University of Tennessee */ #include "smearer.hh" #include #include using namespace std; /** * Constructor for BaseSmearer * * @param qmin: minimum Q value * @param qmax: maximum Q value * @param nbins: number of Q bins */ BaseSmearer :: BaseSmearer(double qmin, double qmax, int nbins) { // Number of bins this->nbins = nbins; this->qmin = qmin; this->qmax = qmax; // Flag to keep track of whether we have a smearing matrix or // whether we need to compute one has_matrix = false; even_binning = true; }; /** * Constructor for BaseSmearer * * Used for uneven binning * @param q: array of Q values * @param nbins: number of Q bins */ BaseSmearer :: BaseSmearer(double* q, int nbins) { // Number of bins this->nbins = nbins; this->q_values = q; // Flag to keep track of whether we have a smearing matrix or // whether we need to compute one has_matrix = false; even_binning = false; }; /** * Constructor for SlitSmearer * * @param width: slit width in Q units * @param height: slit height in Q units * @param qmin: minimum Q value * @param qmax: maximum Q value * @param nbins: number of Q bins */ SlitSmearer :: SlitSmearer(double width, double height, double qmin, double qmax, int nbins) : BaseSmearer(qmin, qmax, nbins){ this->height = height; this->width = width; }; /** * Constructor for SlitSmearer * * @param width: slit width in Q units * @param height: slit height in Q units * @param q: array of Q values * @param nbins: number of Q bins */ SlitSmearer :: SlitSmearer(double width, double height, double* q, int nbins) : BaseSmearer(q, nbins){ this->height = height; this->width = width; }; /** * Constructor for QSmearer * * @param width: array slit widths for each Q point, in Q units * @param qmin: minimum Q value * @param qmax: maximum Q value * @param nbins: number of Q bins */ QSmearer :: QSmearer(double* width, double qmin, double qmax, int nbins) : BaseSmearer(qmin, qmax, nbins){ this->width = width; }; /** * Constructor for QSmearer * * @param width: array slit widths for each Q point, in Q units * @param q: array of Q values * @param nbins: number of Q bins */ QSmearer :: QSmearer(double* width, double* q, int nbins) : BaseSmearer(q, nbins){ this->width = width; }; /** * Compute the slit smearing matrix * * For even binning (q_min to q_max with nbins): * * step = (q_max-q_min)/(nbins-1) * first bin goes from q_min to q_min+step * last bin goes from q_max to q_max+step * * For binning according to q array: * * Each q point represents a bin going from half the distance between it * and the previous point to half the distance between it and the next point. * * Example: bin i goes from (q_values[i-1]+q_values[i])/2 to (q_values[i]+q_values[i+1])/2 * * The exceptions are the first and last bins, which are centered at the first and * last q-values, respectively. The width of the first and last bins is the distance between * their respective neighboring q-value. */ void SlitSmearer :: compute_matrix(){ weights = new vector(nbins*nbins,0); // Check the length of the data if (nbins<2) return; // Loop over all q-values for(int i=0; i0 ? npts : 1; int npts_w = width>0 ? npts : 1; // If both height and width are great than zero, // modify the number of points in each direction so // that the total number of points is still what // the user would expect (downgrade resolution) if(npts_h>1 && npts_w>1){ npts_h = (int)ceil(sqrt((double)npts)); npts_w = npts_h; } double shift_h, shift_w; for(int k=0; k=q_low && q_shifted(nbins*nbins,0); // Loop over all q-values double step = (qmax-qmin)/((double)nbins-1.0); double q, q_min, q_max; double q_j, q_jmax, q_jmin; for(int i=0; i=0 && i0.0) ? sum/counts : 0; } }