int ManipulateReadingCallback(int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { channelPtr chan; double reading, min_x, max_x, min_y, max_y; int handle, index, scatter, mode, i; if (event == EVENT_VAL_CHANGED) { chan = callbackData; GetGraphCursorIndex (chanview.p1, CHANVIEW_GRAPH, 1, &handle, &index); GetCtrlVal (panel, control, &reading); GetCtrlVal (panel, MANIP_INDEX, &index); chan->readings[index] = reading; GetCtrlVal (chanview.p1, CHANVIEW_SCATTER, &scatter); channel_UpdateViewGraph(chan, scatter); GetAxisRange (chanview.p1, CHANVIEW_GRAPH, &mode, &min_x, &max_x, &mode, &min_y, &max_y); MaxMin1D (chan->readings + (int)min_x, (int)(max_x - min_x + 1), &max_y, &i, &min_y, &i); SetAxisRange (chanview.p1, CHANVIEW_GRAPH, VAL_NO_CHANGE, 0.0, 1.0, VAL_MANUAL, min_y, max_y); SetGraphCursor (chanview.p1, CHANVIEW_GRAPH, 1, index, reading); } return 0; }
static void chanfunc_CalcStatistics (channelPtr chan) { double mean, std_dev, variance, rms, moment, median, mode, min, max; int err, order, min_i, max_i, intervals; char newnote[256]; Fmt (chanfunc.note, ""); err = MaxMin1D (chan->readings, chan->pts, &max, &max_i, &min, &min_i); SetInputMode (chanfunc.p, STATISTICS_MIN, !err); SetCtrlVal (chanfunc.p, STATISTICS_MIN, min); SetInputMode (chanfunc.p, STATISTICS_MAX, !err); SetCtrlVal (chanfunc.p, STATISTICS_MAX, max); if (err == NoErr) { Fmt (chanfunc.note, "%s<Min: %f[e2p5]\n", min); Fmt (chanfunc.note, "%s[a]<Max: %f[e2p5]\n", max); } err = Mean (chan->readings, chan->pts, &mean); SetInputMode (chanfunc.p, STATISTICS_MEAN, !err); SetCtrlVal (chanfunc.p, STATISTICS_MEAN, mean); if (err == NoErr) Fmt (chanfunc.note, "%s[a]<Mean: %f[e2p5]\n", mean); err = StdDev (chan->readings, chan->pts, &mean, &std_dev); SetInputMode (chanfunc.p, STATISTICS_STDDEV, !err); SetCtrlVal (chanfunc.p, STATISTICS_STDDEV, std_dev); if (err == NoErr) Fmt (chanfunc.note, "%s[a]<StdDev: %f[e2p5]\n", std_dev); err = Variance (chan->readings, chan->pts, &mean, &variance); SetInputMode (chanfunc.p, STATISTICS_VAR, !err); SetCtrlVal (chanfunc.p, STATISTICS_VAR, variance); if (err == NoErr) Fmt (chanfunc.note, "%s[a]<Variance: %f[e2p5]\n", variance); err = RMS (chan->readings, chan->pts, &rms); SetInputMode (chanfunc.p, STATISTICS_RMS, !err); SetCtrlVal (chanfunc.p, STATISTICS_RMS, rms); if (err == NoErr) Fmt (chanfunc.note, "%s[a]<RMS: %f[e2p5]\n", rms); GetCtrlVal (chanfunc.p, STATISTICS_ORDER, &order); err = Moment (chan->readings, chan->pts, order, &moment); SetInputMode (chanfunc.p, STATISTICS_MOMENT, !err); SetInputMode (chanfunc.p, STATISTICS_ORDER, !err); SetCtrlVal (chanfunc.p, STATISTICS_MOMENT, moment); if (err == NoErr) Fmt (chanfunc.note, "%s[a]<Moment: %f[e2p5] (order: %i)\n", moment, order); err = Median (chan->readings, chan->pts, &median); SetInputMode (chanfunc.p, STATISTICS_MEDIAN, !err); SetCtrlVal (chanfunc.p, STATISTICS_MEDIAN, median); if (err == NoErr) Fmt (chanfunc.note, "%s[a]<Median: %f[e2p5]\n", median); GetCtrlVal (chanfunc.p, STATISTICS_INTERVAL, &intervals); err = Mode (chan->readings, chan->pts, min, max, intervals, &mode); SetInputMode (chanfunc.p, STATISTICS_INTERVAL, !err); SetInputMode (chanfunc.p, STATISTICS_MODE, !err); SetCtrlVal (chanfunc.p, STATISTICS_INTERVAL, intervals); SetCtrlVal (chanfunc.p, STATISTICS_MODE, mode); if (err == NoErr) Fmt (chanfunc.note, "%s[a]<Mode: %f[e2p5] (intervals: %i)\n", mode, intervals); }
void fit_data (void) { int Npoints, num; double slope, intercept, residue, coef[4], value; GetCtrlVal (ERG_panel, ERG_panel_start_val, &start); GetCtrlVal (ERG_panel, ERG_panel_points_num, &Npoints); double fit[Npoints]; int maximumIndex, minimumIndex; CNVData data=0; CNVWriter writer = 0; for (int k = 0; k < Npoints; k++) fit[k] = 0; /////////////////////////////////////////////////////////////// //////////////mto do : create specific function for background subtraction int pix_num,bckgrd_satus; double bckgrd_val; GetCtrlVal (ERG_panel, ERG_panel_bckgrd_sub, &bckgrd_satus); if (bckgrd_satus==1) { GetCtrlVal (ERG_panel, ERG_panel_bckgrd, &pix_num); Mean (&data2fit[pix_num-50], 100, &bckgrd_val); j=0; while (j<10000) { buffer[j] = data2fit[j]-bckgrd_val; j++; } } else { j=0; while (j<10000) { buffer[j] = data2fit[j]; j++; } } ////////////////////////////////////////////////////////////// generate_xarray (); PlotXY (ERG_panel, ERG_panel_scope, &xarray[start], &buffer[start], Npoints, VAL_DOUBLE, VAL_DOUBLE, VAL_THIN_LINE, VAL_SOLID_SQUARE, VAL_SOLID, 1, VAL_GREEN); GetCtrlVal (ERG_panel, ERG_panel_fit_function, &j); if (j==0) { MaxMin1D(&buffer[start], Npoints, &maximumValue, &maximumIndex, &minimumValue, &minimumIndex); Npoints= minimumIndex; LinearFitEx (&xarray[start], &buffer[start], NULL, Npoints, LEAST_SQUARE, 0.0001, fit, &slope, &intercept, &residue); ////////////to do: create separated function for uploading network variable///////////// //write optimization value (slope) as a network variable CNVCreateWriter ("\\\\localhost\\ERG\\optimisation_value", 0, 0, 10000, 0, &writer); CNVCreateScalarDataValue (&data, CNVDouble, slope); // Delay(0.5); CNVWrite (writer, data, 5000); CNVDisposeData (data); Delay(0.5); // printf("Slope=%f\n", slope); } if (j==1) { Mean (&buffer[start-100], 100, &baseline); MaxMin1D(&buffer[start], Npoints, &maximumValue, &maximumIndex, &minimumValue, &minimumIndex); Npoints= minimumIndex; Mean (&buffer[start+minimumIndex-5], 10, &minimumValue); coef[0]= start+minimumIndex; coef[1]= minimumIndex/2; // printf("base=%f, min=%f\n",baseline, minimumValue); NonLinearFitWithMaxIters (&xarray[start], &buffer[start], fit, Npoints, 100, ModelFunct, coef, 2, &residue); // printf("coef1=%f, coef2=%f\n",coef[0], coef[1]); //write optimization value (rise time; coef[1]) as a network variable // coef[1]=coef[1]/10; CNVCreateWriter ("\\\\localhost\\ERG\\optimisation_value", 0, 0, 10000, 0, &writer); CNVCreateScalarDataValue (&data, CNVDouble, coef[1]/10000); CNVWrite (writer, data, 5000); CNVDisposeData (data); Delay(0.5); } if (j==2) { MaxMin1D(&buffer[start], Npoints, &maximumValue, &maximumIndex, &minimumValue, &minimumIndex); value= maximumValue - minimumValue; if (minimumIndex < maximumIndex) { Npoints=maximumIndex-minimumIndex; Copy1D (&buffer[minimumIndex+start], Npoints, fit); start= minimumIndex+start; value= maximumValue - minimumValue; } else { value= 0; } CNVCreateWriter ("\\\\localhost\\ERG\\optimisation_value", 0, 0, 10000, 0, &writer); CNVCreateScalarDataValue (&data, CNVDouble, value); CNVWrite (writer, data, 5000); CNVDisposeData (data); Delay(0.5); } PlotXY (ERG_panel, ERG_panel_scope, &xarray[start], fit, Npoints, VAL_DOUBLE, VAL_DOUBLE, VAL_THIN_LINE, VAL_SOLID_SQUARE, VAL_SOLID, 1, VAL_RED); }