#include "module.c" #include #include #include #include #include const char *CHANNEL_NAMES[] = {"EVENT_NUM", "EVENT_I", "EVENT_J", "EVENT_CHARGE", "EVENT_ETA_X", "EVENT_ETA_Y", "EVENT_I_INTERP", "EVENT_J_INTERP"}; const int MAX_NUM_EVENTS= 100; // max number of events per frame const int EVENT_CHANNELS = 7; struct events_double func_ph_1d_double( double *frame, int i_dim, int j_dim, double *th_m); //struct decl. struct events_double { double **evnt_ijc; int evnt_num; }; //def process_image(image, pulse_id, timestamp, x_axis, y_axis, parameters, bsdata=None): PyObject *process(PyObject *self, PyObject *args) { PyArrayObject *image; long pulse_id; PyObject /*double*/ *timestamp; long seconds, nanos; PyArrayObject *x_axis; PyArrayObject *y_axis; PyObject *pars; PyObject *bsdata; //if (!PyArg_ParseTuple(args, "OldOOO|O", &image, &pulse_id, ×tamp, &x_axis, &y_axis, &pars, &bsdata)) if ( !PyArg_ParseTuple(args, "OlOOOO|O", &image, &pulse_id, ×tamp, &x_axis, &y_axis, &pars, &bsdata) || !PyArg_ParseTuple(timestamp, "ll", &seconds, &nanos) ) return NULL; if (pulse_id < 0) { PyErr_SetString(moduleErr, "Invalid Pulse ID"); return NULL; } //Acessing image int element_size = image->descr->elsize; int dims = image->nd; int size_x = image->dimensions[1]; int size_y = image->dimensions[0]; unsigned short* img_data = (unsigned short*)image->data; int i,j,l; int i_dim=size_y; int j_dim=size_x; double *threshold = malloc(i_dim*j_dim*sizeof(double)); for(i=0; i=MAX_NUM_EVENTS){ break; } for(j=0;j=MAX_NUM_EVENTS){ break; } // 2x2 version charge = frame[i*j_dim+j]+frame[(i+1)*j_dim+j] + frame[i*j_dim+(j+1)]+frame[(i+1)*j_dim+j+1]; //pixel by pixel threshold th = th_m[i*j_dim +j]; //check if charge above threshold if(charge>th) { eta_x = (frame[(i+1)*j_dim + j ]+frame[(i+1)*j_dim + (j+1)])/charge; eta_y = (frame[ i*j_dim + (j+1)]+frame[(i+1)*j_dim + (j+1)])/charge; i_interp = i + (C[0] + C[1]*eta_x+ C[2]*pow(eta_x,2) + C[3]*pow(eta_x,3) + C[4]*pow(eta_x,4)+ C[5]*pow(eta_x,5) + C[6]*pow(eta_x,6) + C[7]*pow(eta_x,7)); j_interp = j + (D[0] + D[1]*eta_y+ D[2]*pow(eta_y,2) + D[3]*pow(eta_y,3) + D[4]*pow(eta_y,4)+ D[5]*pow(eta_y,5) + D[6]*pow(eta_y,6) + D[7]*pow(eta_y,7)); // 1st case: first event if(evt_i==0){ evt_p[0][evt_i] = i; evt_p[1][evt_i] = j; evt_p[2][evt_i] = charge; evt_p[3][evt_i] = eta_x; evt_p[4][evt_i] = eta_y; evt_p[5][evt_i] = i_interp; // evt_p[6][evt_i] = j_interp; // evt_i++; } else { // 2nd case: not 1st event. we check if it is a neighbourg of the previos events and if charge is larger n=0; evt_m_i = evt_i; for(m=0; m