/** * This is module which fixes the storgae of the 2D detector at RITA. * I wish to store a 3D array, 2 detector coordinates against NP, the number * of scan points. However, intermediate storage can only be as snapshots * of 2D arrays against scan points. This has to be formatted to a proper * 3D data set in C storage order. This is to slow in tcl, therefore this * has to be done in in C. * * copyright: see file COPYRIGHT * * Mark Koennecke, August 2006 */ #include #include /*---------------------------------------------------------------------------*/ static int RitaFix(SConnection *pCon, SicsInterp *pSics, void *pData, int argc, char *argv[]){ int x, y, np, scanDim, wrongpos, goodpos, val, *iData = NULL; int wrongmult, wrongconst; pSICSData intermediate = NULL, result = NULL; char buffer[256]; if(argc < 4){ SCWrite(pCon,"ERROR: not enough arguments to RitaFix",eError); return 0; } intermediate = FindCommandData(pSics,argv[1],"SICSData"); if(intermediate == NULL){ snprintf(buffer,255,"ERROR: %s is no SICSdata",argv[1]); SCWrite(pCon,buffer,eError); return 0; } result = FindCommandData(pSics,argv[2],"SICSData"); if(result == NULL){ snprintf(buffer,255,"ERROR: %s is no SICSdata",argv[2]); SCWrite(pCon,buffer,eError); return 0; } scanDim = atoi(argv[3]); scanDim ++; clearSICSData(result); /* * ensure enough memory in order to avoid memory allocation in the * loop */ iData = getSICSDataPointer(result,0,(128*128*scanDim) +1); wrongpos = 128*128*scanDim; if(intermediate->dataUsed < wrongpos || iData == NULL){ SCWrite(pCon,"ERROR: source data buffer to short or out of mem", eError); return 0; } wrongmult = 128*128; for(x = 0; x < 128; x++){ for(y = 0; y < 128; y++){ goodpos = x*128*scanDim + y*scanDim; wrongconst = y*128 + x; for(np = 0; np < scanDim; np++, goodpos++){ /* wrongpos = 128*128*np + y*128 + x; goodpos = x*128*scanDim + y*scanDim + np; */ wrongpos = wrongmult*np + wrongconst; result->data[goodpos] = intermediate->data[wrongpos]; } } } SCSendOK(pCon); return 1; } /*---------------------------------------------------------------------------*/ int MakeRitaFix(SConnection *pCon, SicsInterp *pSics, void *pData, int argc, char *argv[]){ AddCommand(pSics,"ritafixstorage",RitaFix,NULL,NULL); return 1; }