areaDetector 1-9
/home/epics/devel/areaDetector/ADApp/pluginSrc/NDPluginStats.h
Go to the documentation of this file.
00001 #ifndef NDPluginStats_H
00002 #define NDPluginStats_H
00003 
00004 #include <epicsTypes.h>
00005 #include <asynStandardInterfaces.h>
00006 
00007 #include "NDPluginDriver.h"
00008 
00009 typedef struct NDStats {
00010     size_t  nElements;
00011     double  total;
00012     double  net;
00013     double  mean;
00014     double  sigma;
00015     double  min;
00016     size_t  minX;
00017     size_t  minY;    
00018     double  max;
00019     size_t  maxX;
00020     size_t  maxY;
00021 } NDStats_t;
00022 
00023 typedef enum {
00024     profAverage,
00025     profThreshold,
00026     profCentroid,
00027     profCursor
00028 } NDStatProfileType;
00029 #define MAX_PROFILE_TYPES profCursor+1
00030 
00031 typedef enum {
00032     TSMinValue,
00033     TSMinX,
00034     TSMinY,    
00035     TSMaxValue,
00036     TSMaxX,
00037     TSMaxY,
00038     TSMeanValue,
00039     TSSigmaValue,
00040     TSTotal,
00041     TSNet,
00042     TSCentroidX,
00043     TSCentroidY,
00044     TSSigmaX,
00045     TSSigmaY,
00046     TSSigmaXY
00047 } NDStatTSType;
00048 #define MAX_TIME_SERIES_TYPES TSSigmaXY+1
00049 
00050 typedef enum {
00051     TSEraseStart,
00052     TSStart,
00053     TSStop,
00054     TSRead
00055 } NDStatsTSControl_t;
00056 
00057 /* Statistics */
00058 #define NDPluginStatsComputeStatisticsString  "COMPUTE_STATISTICS"  /* (asynInt32,        r/w) Compute statistics? */
00059 #define NDPluginStatsBgdWidthString           "BGD_WIDTH"           /* (asynInt32,        r/w) Width of background region when computing net */
00060 #define NDPluginStatsMinValueString           "MIN_VALUE"           /* (asynFloat64,      r/o) Minimum counts in any element */
00061 #define NDPluginStatsMinXString               "MIN_X"               /* (asynFloat64,      r/o) X position of minimum counts */
00062 #define NDPluginStatsMinYString               "MIN_Y"               /* (asynFloat64,      r/o) Y position of minimum counts */
00063 #define NDPluginStatsMaxValueString           "MAX_VALUE"           /* (asynFloat64,      r/o) Maximum counts in any element */
00064 #define NDPluginStatsMaxXString               "MAX_X"               /* (asynFloat64,      r/o) X position of maximum counts */
00065 #define NDPluginStatsMaxYString               "MAX_Y"               /* (asynFloat64,      r/o) Y position of maximum counts */
00066 #define NDPluginStatsMeanValueString          "MEAN_VALUE"          /* (asynFloat64,      r/o) Mean counts of all elements */
00067 #define NDPluginStatsSigmaValueString         "SIGMA_VALUE"         /* (asynFloat64,      r/o) Sigma of all elements */
00068 #define NDPluginStatsTotalString              "TOTAL"               /* (asynFloat64,      r/o) Sum of all elements */
00069 #define NDPluginStatsNetString                "NET"                 /* (asynFloat64,      r/o) Sum of all elements minus background */
00070 
00071 /* Centroid */
00072 #define NDPluginStatsComputeCentroidString    "COMPUTE_CENTROID"    /* (asynInt32,        r/w) Compute centroid? */
00073 #define NDPluginStatsCentroidThresholdString  "CENTROID_THRESHOLD"  /* (asynFloat64,      r/w) Threshold when computing centroids */
00074 #define NDPluginStatsCentroidXString          "CENTROIDX_VALUE"     /* (asynFloat64,      r/o) X centroid */
00075 #define NDPluginStatsCentroidYString          "CENTROIDY_VALUE"     /* (asynFloat64,      r/o) Y centroid */
00076 #define NDPluginStatsSigmaXString             "SIGMAX_VALUE"        /* (asynFloat64,      r/o) Sigma X */
00077 #define NDPluginStatsSigmaYString             "SIGMAY_VALUE"        /* (asynFloat64,      r/o) Sigma Y */
00078 #define NDPluginStatsSigmaXYString            "SIGMAXY_VALUE"       /* (asynFloat64,      r/o) Sigma XY */
00079     
00080 /* Time series of basic statistics and centroid statistics */
00081 #define NDPluginStatsTSControlString          "TS_CONTROL"          /* (asynInt32,        r/w) Erase/start, stop, start */
00082 #define NDPluginStatsTSNumPointsString        "TS_NUM_POINTS"       /* (asynInt32,        r/w) Number of time series points to use */
00083 #define NDPluginStatsTSCurrentPointString     "TS_CURRENT_POINT"    /* (asynInt32,        r/o) Current point in time series */
00084 #define NDPluginStatsTSAcquiringString        "TS_ACQUIRING"        /* (asynInt32,        r/o) Acquiring time series */
00085 #define NDPluginStatsTSMinValueString         "TS_MIN_VALUE"        /* (asynFloat64Array, r/o) Series of minimum counts */
00086 #define NDPluginStatsTSMinXString             "TS_MIN_X"            /* (asynFloat64Array, r/o) Series of X position of minimum counts */
00087 #define NDPluginStatsTSMinYString             "TS_MIN_Y"            /* (asynFloat64Array, r/o) Series of Y position of minimum counts */
00088 #define NDPluginStatsTSMaxValueString         "TS_MAX_VALUE"        /* (asynFloat64Array, r/o) Series of maximum counts */
00089 #define NDPluginStatsTSMaxXString             "TS_MAX_X"            /* (asynFloat64Array, r/o) Series of X position of maximum counts */
00090 #define NDPluginStatsTSMaxYString             "TS_MAX_Y"            /* (asynFloat64Array, r/o) Series of Y position of maximum counts */
00091 #define NDPluginStatsTSMeanValueString        "TS_MEAN_VALUE"       /* (asynFloat64Array, r/o) Series of mean counts */
00092 #define NDPluginStatsTSSigmaValueString       "TS_SIGMA_VALUE"      /* (asynFloat64Array, r/o) Series of sigma */
00093 #define NDPluginStatsTSTotalString            "TS_TOTAL"            /* (asynFloat64Array, r/o) Series of total */
00094 #define NDPluginStatsTSNetString              "TS_NET"              /* (asynFloat64Array, r/o) Series of net */
00095 #define NDPluginStatsTSSeriesMaxString        "TS_MAX_SUM"          /* (asynFloat64Array, r/o) Series of max elements sum */
00096 #define NDPluginStatsTSCentroidXString        "TS_CENTROIDX_VALUE"  /* (asynFloat64Array, r/o) Series of X centroid */
00097 #define NDPluginStatsTSCentroidYString        "TS_CENTROIDY_VALUE"  /* (asynFloat64Array, r/o) Series of Y centroid */
00098 #define NDPluginStatsTSSigmaXString           "TS_SIGMAX_VALUE"     /* (asynFloat64Array, r/o) Series of sigma X */
00099 #define NDPluginStatsTSSigmaYString           "TS_SIGMAY_VALUE"     /* (asynFloat64Array, r/o) Series of sigma Y */
00100 #define NDPluginStatsTSSigmaXYString          "TS_SIGMAXY_VALUE"    /* (asynFloat64Array, r/o) Series of sigma XY */
00101 
00102 /* Profiles*/   
00103 #define NDPluginStatsComputeProfilesString    "COMPUTE_PROFILES"    /* (asynInt32,        r/w) Compute profiles? */
00104 #define NDPluginStatsProfileSizeXString       "PROFILE_SIZE_X"      /* (asynInt32,        r/o) X profile size */
00105 #define NDPluginStatsProfileSizeYString       "PROFILE_SIZE_Y"      /* (asynInt32,        r/o) Y profile size */
00106 #define NDPluginStatsCursorXString            "CURSOR_X"            /* (asynInt32,        r/w) X cursor position */
00107 #define NDPluginStatsCursorYString            "CURSOR_Y"            /* (asynInt32,        r/w) Y cursor position */
00108 #define NDPluginStatsProfileAverageXString    "PROFILE_AVERAGE_X"   /* (asynFloat64Array, r/o) X average profile array */
00109 #define NDPluginStatsProfileAverageYString    "PROFILE_AVERAGE_Y"   /* (asynFloat64Array, r/o) Y average profile array */
00110 #define NDPluginStatsProfileThresholdXString  "PROFILE_THRESHOLD_X" /* (asynFloat64Array, r/o) X average profile array after threshold */
00111 #define NDPluginStatsProfileThresholdYString  "PROFILE_THRESHOLD_Y" /* (asynFloat64Array, r/o) Y average profile array after threshold */
00112 #define NDPluginStatsProfileCentroidXString   "PROFILE_CENTROID_X"  /* (asynFloat64Array, r/o) X centroid profile array */
00113 #define NDPluginStatsProfileCentroidYString   "PROFILE_CENTROID_Y"  /* (asynFloat64Array, r/o) Y centroid profile array */
00114 #define NDPluginStatsProfileCursorXString     "PROFILE_CURSOR_X"    /* (asynFloat64Array, r/o) X cursor profile array */
00115 #define NDPluginStatsProfileCursorYString     "PROFILE_CURSOR_Y"    /* (asynFloat64Array, r/o) Y cursor profile array */
00116 
00117 /* Histogram */
00118 #define NDPluginStatsComputeHistogramString   "COMPUTE_HISTOGRAM"   /* (asynInt32,        r/w) Compute histogram? */
00119 #define NDPluginStatsHistSizeString           "HIST_SIZE"           /* (asynInt32,        r/w) Number of elements in histogram */
00120 #define NDPluginStatsHistMinString            "HIST_MIN"            /* (asynFloat64,      r/w) Minimum value for histogram */
00121 #define NDPluginStatsHistMaxString            "HIST_MAX"            /* (asynFloat64,      r/w) Maximum value for histogram */
00122 #define NDPluginStatsHistEntropyString        "HIST_ENTROPY"        /* (asynFloat64,      r/o) Image entropy calculcated from histogram */
00123 #define NDPluginStatsHistArrayString          "HIST_ARRAY"          /* (asynFloat64Array, r/o) Histogram array */
00124 
00125 
00126 /* Arrays of total and net counts for MCA or waveform record */   
00127 #define NDPluginStatsCallbackPeriodString     "CALLBACK_PERIOD"     /* (asynFloat64,      r/w) Callback period */
00128 
00134 class NDPluginStats : public NDPluginDriver {
00135 public:
00136     NDPluginStats(const char *portName, int queueSize, int blockingCallbacks, 
00137                  const char *NDArrayPort, int NDArrayAddr,
00138                  int maxBuffers, size_t maxMemory,
00139                  int priority, int stackSize);
00140     /* These methods override the virtual methods in the base class */
00141     void processCallbacks(NDArray *pArray);
00142     asynStatus writeInt32(asynUser *pasynUser, epicsInt32 value);
00143     asynStatus writeFloat64(asynUser *pasynUser, epicsFloat64 value);
00144     
00145     template <typename epicsType> void doComputeStatisticsT(NDArray *pArray, NDStats_t *pStats);
00146     int doComputeStatistics(NDArray *pArray, NDStats_t *pStats);
00147     template <typename epicsType> asynStatus doComputeCentroidT(NDArray *pArray);
00148     asynStatus doComputeCentroid(NDArray *pArray);
00149     template <typename epicsType> asynStatus doComputeProfilesT(NDArray *pArray);
00150     asynStatus doComputeProfiles(NDArray *pArray);
00151     template <typename epicsType> asynStatus doComputeHistogramT(NDArray *pArray);
00152     asynStatus doComputeHistogram(NDArray *pArray);
00153    
00154 protected:
00155     int NDPluginStatsComputeStatistics;
00156     #define FIRST_NDPLUGIN_STATS_PARAM NDPluginStatsComputeStatistics
00157     /* Statistics */
00158     int NDPluginStatsBgdWidth;
00159     int NDPluginStatsMinValue;
00160     int NDPluginStatsMinX;
00161     int NDPluginStatsMinY;            
00162     int NDPluginStatsMaxValue;
00163     int NDPluginStatsMaxX;
00164     int NDPluginStatsMaxY;        
00165     int NDPluginStatsMeanValue;
00166     int NDPluginStatsSigmaValue;
00167     int NDPluginStatsTotal;
00168     int NDPluginStatsNet;
00169 
00170     /* Centroid */
00171     int NDPluginStatsComputeCentroid;
00172     int NDPluginStatsCentroidThreshold;
00173     int NDPluginStatsCentroidX;
00174     int NDPluginStatsCentroidY;
00175     int NDPluginStatsSigmaX;
00176     int NDPluginStatsSigmaY;
00177     int NDPluginStatsSigmaXY;
00178 
00179     /* Time Series */
00180     int NDPluginStatsTSControl;
00181     int NDPluginStatsTSNumPoints;
00182     int NDPluginStatsTSCurrentPoint;
00183     int NDPluginStatsTSAcquiring;
00184     int NDPluginStatsTSMinValue;
00185     int NDPluginStatsTSMinX;
00186     int NDPluginStatsTSMinY;                
00187     int NDPluginStatsTSMaxValue;
00188     int NDPluginStatsTSMaxX;
00189     int NDPluginStatsTSMaxY;            
00190     int NDPluginStatsTSMeanValue;
00191     int NDPluginStatsTSSigmaValue;
00192     int NDPluginStatsTSTotal;
00193     int NDPluginStatsTSNet;
00194     int NDPluginStatsTSCentroidX;
00195     int NDPluginStatsTSCentroidY;
00196     int NDPluginStatsTSSigmaX;
00197     int NDPluginStatsTSSigmaY;
00198     int NDPluginStatsTSSigmaXY;
00199     
00200     /* Profiles */
00201     int NDPluginStatsComputeProfiles;
00202     int NDPluginStatsProfileSizeX;
00203     int NDPluginStatsProfileSizeY;
00204     int NDPluginStatsCursorX;
00205     int NDPluginStatsCursorY;
00206     int NDPluginStatsProfileAverageX;
00207     int NDPluginStatsProfileAverageY;
00208     int NDPluginStatsProfileThresholdX;
00209     int NDPluginStatsProfileThresholdY;
00210     int NDPluginStatsProfileCentroidX;
00211     int NDPluginStatsProfileCentroidY;
00212     int NDPluginStatsProfileCursorX;
00213     int NDPluginStatsProfileCursorY;
00214 
00215     /* Histogram */
00216     int NDPluginStatsComputeHistogram;
00217     int NDPluginStatsHistSize;
00218     int NDPluginStatsHistMin;
00219     int NDPluginStatsHistMax;
00220     int NDPluginStatsHistEntropy;
00221     int NDPluginStatsHistArray;
00222 
00223     #define LAST_NDPLUGIN_STATS_PARAM NDPluginStatsHistArray
00224                                 
00225 private:
00226     double  centroidThreshold;
00227     double  centroidX;
00228     double  centroidY;
00229     double  sigmaX;
00230     double  sigmaY;
00231     double  sigmaXY;
00232     double  *profileX[MAX_PROFILE_TYPES];
00233     double  *profileY[MAX_PROFILE_TYPES];
00234     double  *timeSeries[MAX_TIME_SERIES_TYPES];
00235     size_t profileSizeX;
00236     size_t profileSizeY;
00237     size_t cursorX;
00238     size_t cursorY;
00239     epicsInt32 *totalArray;
00240     epicsInt32 *netArray;
00241     size_t histogramSize;
00242     size_t histSizeNew;
00243     double *histogram;
00244     double histMin;
00245     double histMax;
00246     double histEntropy;
00247     void doTimeSeriesCallbacks();
00248 };
00249 #define NUM_NDPLUGIN_STATS_PARAMS ((int)(&LAST_NDPLUGIN_STATS_PARAM - &FIRST_NDPLUGIN_STATS_PARAM + 1))
00250     
00251 #endif