mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-06-21 17:18:00 +02:00
Creating Classes, Libraries and Functions for the Common SLS Detector GUI
git-svn-id: file:///afs/psi.ch/project/sls_det_software/svn/slsDetectorGui@1 af1100a4-978c-4157-bff7-07162d2ba061
This commit is contained in:
122
slsDetectorGui/slsDetectorPlotting/src/SlsQt2DHist.cxx
Normal file
122
slsDetectorGui/slsDetectorPlotting/src/SlsQt2DHist.cxx
Normal file
@ -0,0 +1,122 @@
|
||||
|
||||
/**
|
||||
* @author Ian Johnson
|
||||
* @version 1.0
|
||||
*/
|
||||
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include "SlsQt2DHist.h"
|
||||
|
||||
using std::cout;
|
||||
using std::endl;
|
||||
|
||||
SlsQt2DHist::SlsQt2DHist(int nbinsx, double xmin, double xmax, int nbinsy, double ymin, double ymax, double* d,double zmin,double zmax):QwtRasterData(){
|
||||
interp=0;
|
||||
nx_array=ny_array=0;data=0;
|
||||
SetData(nbinsx,xmin,xmax,nbinsy,ymin,ymax,d,zmin,zmax);
|
||||
}
|
||||
|
||||
|
||||
SlsQt2DHist::~SlsQt2DHist(){if(data) delete data;}
|
||||
|
||||
int SlsQt2DHist::GetBinIndex(int bx, int by){
|
||||
int b = bx*ny+by;
|
||||
if(b<0 || b>=nb){
|
||||
cout<<"GetBinIndex:: Incorrect indicies bx and by returning overflow bin;"<<endl;
|
||||
return nb;
|
||||
}
|
||||
return b;
|
||||
}
|
||||
|
||||
int SlsQt2DHist::FindBinIndex(double x, double y){
|
||||
return GetBinIndex(int((x-x_min)/x_width),int((y-y_min)/y_width));
|
||||
}
|
||||
|
||||
double SlsQt2DHist::GetBinValue(int bx,int by){
|
||||
return data[GetBinIndex(bx,by)];
|
||||
}
|
||||
|
||||
|
||||
void SlsQt2DHist::SetBinValue(int bx,int by,double v){
|
||||
z_mean_has_been_calculated = 0;
|
||||
data[GetBinIndex(bx,by)] = v;
|
||||
}
|
||||
|
||||
void SlsQt2DHist::SetData(int nbinsx, double xmin, double xmax, int nbinsy,double ymin, double ymax, double *d,double zmin,double zmax){
|
||||
z_mean_has_been_calculated = 0;
|
||||
if(xmax<xmin||ymax<ymin) cout<<"Warning input range invalid."<<endl;
|
||||
|
||||
x_width = (xmax - xmin)/nbinsx;
|
||||
y_width = (ymax - ymin)/nbinsy;
|
||||
|
||||
if(x_min!=xmin||x_max!=xmax||y_min!=ymin||y_max!=ymax){
|
||||
x_min=xmin;x_max=xmax;
|
||||
y_min=ymin;y_max=ymax;
|
||||
setBoundingRect(QwtDoubleRect(xmin,ymin,x_max-x_min,y_max-y_min));
|
||||
}
|
||||
|
||||
if(nbinsx*nbinsy<1){
|
||||
cout<<"Exitting: SlsQt2DHist::SetData() number of bins must be greater than zero."<<endl;
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if(nbinsx*nbinsy>nx_array*ny_array){
|
||||
if(data) delete data;
|
||||
data = new double [nbinsx*nbinsy+1]; //one for under/overflow bin
|
||||
nx_array = nbinsx;
|
||||
ny_array = nbinsy;
|
||||
}
|
||||
nx=nbinsx;
|
||||
ny=nbinsy;
|
||||
nb=nx*ny;
|
||||
data[nb]=0;//set over flow to zero
|
||||
|
||||
if(d){
|
||||
memcpy(data,d,nb*sizeof(double));
|
||||
SetMinMax(zmin,zmax);
|
||||
}
|
||||
}
|
||||
|
||||
void SlsQt2DHist::SetMinMax(double zmin,double zmax){
|
||||
if(zmin<zmax){
|
||||
z_min=zmin;
|
||||
z_max=zmax;
|
||||
}else{
|
||||
z_mean_has_been_calculated = 1;
|
||||
z_min=data[0];
|
||||
z_mean=0;
|
||||
z_max=data[0];
|
||||
for(int i=0;i<nb;i++){
|
||||
if(data[i]<z_min) z_min=data[i];
|
||||
if(data[i]>z_max) z_max=data[i];
|
||||
z_mean+=data[i];
|
||||
}
|
||||
z_mean/=nb;
|
||||
if(z_min>0) z_min/=1.02; else z_min*=1.02;
|
||||
if(z_max>0) z_max*=1.02; else z_max/=1.02;
|
||||
}
|
||||
}
|
||||
|
||||
double SlsQt2DHist::GetMean(){
|
||||
if(!z_mean_has_been_calculated){
|
||||
z_mean_has_been_calculated = 1;
|
||||
z_mean=0;
|
||||
for(int i=0;i<nb;i++) z_mean+=data[i];
|
||||
z_mean/=nb;
|
||||
}
|
||||
|
||||
return z_mean;
|
||||
}
|
||||
|
||||
double SlsQt2DHist::SetMinimumToFirstGreaterThanZero(){
|
||||
z_min=abs(z_max)+1;
|
||||
for(int i=0;i<nb;i++){
|
||||
if(data[i]>0&&data[i]<z_min) z_min=data[i];
|
||||
}
|
||||
return z_min;
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user