areaDetector 1-8
|
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 int nElements; 00011 double total; 00012 double net; 00013 double mean; 00014 double sigma; 00015 double min; 00016 int minX; 00017 int minY; 00018 double max; 00019 int maxX; 00020 int 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 int profileSizeX; 00236 int profileSizeY; 00237 int cursorX; 00238 int cursorY; 00239 epicsInt32 *totalArray; 00240 epicsInt32 *netArray; 00241 int histogramSize; 00242 int histSizeNew; 00243 double *histogram; 00244 double histMin; 00245 double histMax; 00246 double histEntropy; 00247 void doTimeSeriesCallbacks(); 00248 }; 00249 #define NUM_NDPLUGIN_STATS_PARAMS (&LAST_NDPLUGIN_STATS_PARAM - &FIRST_NDPLUGIN_STATS_PARAM + 1) 00250 00251 #endif