Files
sicspsi/ritastorage.c
koennecke eb72d5c486 - Adapted indenation to new agreed upon system
- Fixed bad status in poldi zug driver
2009-02-13 09:01:03 +00:00

83 lines
2.5 KiB
C

/**
* 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 <sics.h>
#include <sicsdata.h>
/*---------------------------------------------------------------------------*/
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;
}