- Renamed tasdrive to ptasdrive in order to help debugging
- Added ritastorage in order to solve storage order problem for RITA's area detector
This commit is contained in:
81
ritastorage.c
Normal file
81
ritastorage.c
Normal file
@ -0,0 +1,81 @@
|
||||
/**
|
||||
* 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;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user