#ifndef SINGLE_PHOTON_HIT_H #define SINGLE_PHOTON_HIT_H #include #include typedef double double32_t; typedef float float32_t; typedef int int32_t; #ifndef DEF_QUAD #define DEF_QUAD enum quadrant { TOP_LEFT=0, TOP_RIGHT=1, BOTTOM_LEFT=2, BOTTOM_RIGHT=3, UNDEFINED_QUADRANT=-1 }; #endif class single_photon_hit { /** @short Structure for a single photon hit */ public: /** constructor, instantiates the data array -- all class elements are public! \param nx cluster size in x direction \param ny cluster size in y direction (defaults to 1 for 1D detectors) */ single_photon_hit(int nx=3, int ny=3): dx(nx), dy(ny) {data=new int[dx*dy];}; ~single_photon_hit(){delete [] data;}; /**< destructor, deletes the data array */ /** binary write to file of all elements of the structure, except size of the cluster \param myFile file descriptor */ size_t write(FILE *myFile) { //fwrite((void*)this, 1, 3*sizeof(int)+4*sizeof(double)+sizeof(quad), myFile); // if (fwrite((void*)this, 1, sizeof(int)+2*sizeof(int16_t), myFile)) //#ifdef OLDFORMAT if (fwrite((void*)&iframe, 1, sizeof(int), myFile)) {}; //#endif #ifndef WRITE_QUAD //printf("no quad "); if (fwrite((void*)&x, 2, sizeof(int16_t), myFile)) return fwrite((void*)data, 1, dx*dy*sizeof(int), myFile); #endif #ifdef WRITE_QUAD // printf("quad "); int qq[4]; switch(quad) { case TOP_LEFT: qq[0]=data[3]; qq[1]=data[4]; qq[2]=data[6]; qq[3]=data[7]; x=x-1; y=y; break; case TOP_RIGHT: qq[0]=data[4]; qq[1]=data[5]; qq[2]=data[7]; qq[3]=data[8]; x=x; y=y; break; case BOTTOM_LEFT: qq[0]=data[0]; qq[1]=data[1]; qq[2]=data[3]; qq[3]=data[4]; x=x-1; y=y-1; break; case BOTTOM_RIGHT: qq[0]=data[1]; qq[1]=data[2]; qq[2]=data[4]; qq[3]=data[5]; x=x; y=y-1; break; default: ; } if (fwrite((void*)&x, 2, sizeof(int16_t), myFile)) return fwrite((void*)qq, 1, 4*sizeof(int), myFile); #endif return 0; }; /** binary read from file of all elements of the structure, except size of the cluster. The structure is then filled with those args \param myFile file descriptor */ size_t read(FILE *myFile) { //fread((void*)this, 1, 3*sizeof(int)+4*sizeof(double)+sizeof(quad), myFile); //#ifdef OLDFORMAT if (fread((void*)&iframe, 1, sizeof(int), myFile)) {} //#endif #ifndef WRITE_QUAD // printf( "no quad \n"); if (fread((void*)&x, 2, sizeof(int16_t), myFile)) return fread((void*)data, 1, dx*dy*sizeof(int), myFile); #endif #ifdef WRITE_QUAD int qq[4]; // printf( "quad \n"); if (fread((void*)&x, 2, sizeof(int16_t), myFile)) if (fread((void*)qq, 1, 4*sizeof(int), myFile)) { quad=TOP_RIGHT; int mm=qq[0]; for (int i=1; i<4; i++) { if (qq[i]0) dx=nx; if (ny>0) dy=ny; delete [] data; data=new int[dx*dy];}; void get_cluster_size(int &nx, int &ny) {nx=dx; ny=dy;}; void get_pixel(int &x1, int &y1) {x1=x; y1=y;}; /** gets the value to the element of the cluster matrix, with relative coordinates where the center of the cluster is (0,0) \param ix coordinate x within the cluster (center is (0,0)) \param iy coordinate y within the cluster (center is (0,0)) \returns value of the cluster element */ double get_data(int ix, int iy=0){return data[(iy+dy/2)*dx+ix+dx/2];}; int *get_cluster() {return data;}; int iframe; /**< frame number */ int16_t x; /**< x-coordinate of the center of hit */ int16_t y; /**< x-coordinate of the center of hit */ double rms; /**< noise of central pixel l -- at some point it can be removed*/ double ped; /**< pedestal of the central pixel -- at some point it can be removed*/ double tot; /**< sum of the 3x3 cluster */ quadrant quad; /**< quadrant where the photon is located */ double quadTot; /**< sum of the maximum 2x2cluster */ int dx; /**< size of data cluster in x */ int dy; /**< size of data cluster in y */ int *data; /**< pointer to data */ }; #endif