Added support for three detector banks for FOCUS

This commit is contained in:
cvs
2000-03-03 15:51:05 +00:00
parent 499af28298
commit 4cf814d179
16 changed files with 1591 additions and 135 deletions

472
fowrite.c
View File

@@ -6,6 +6,10 @@
copyright: see copyright.h
Mark Koennecke, November 1998
Added code for three detector banks.
Mark Koennecke, March 2000
-----------------------------------------------------------------------------*/
#include <stdlib.h>
#include <assert.h>
@@ -24,6 +28,7 @@
#include "scan.h"
#include "sicsvar.h"
#include "fitcenter.h"
#include "fomerge.h"
/* the name of the SICS chopper controller object */
#define CHOPPERNAME "choco"
@@ -41,6 +46,8 @@
char *pDictFile;
pFit pFitter;
float fElastic;
int iUpper, iMiddle, iLower;
/* detector availability flags */
} FoWrite, *pFoWrite;
/* ------------------- forward declaration of task function --------------*/
static int FoTask(void *pData);
@@ -170,7 +177,7 @@
float fVal, *fArray;
const float *fTime;
float *fTime2 = NULL;
char pBuffer[50];
/* get a filename */
if(self->pFile)
@@ -179,7 +186,8 @@
self->pFile = SNXMakeFileName(pServ->pSics,pCon);
if(!self->pFile)
{
SCWrite(pCon,"ERROR: Extra severe: failed to create data file name",eError);
SCWrite(pCon,"ERROR: Extra severe: failed to create data file name",
eError);
return 0;
}
@@ -256,7 +264,6 @@
/* detector banks */
/* currently the one and only bank */
fTime = GetHistTimeBin(self->pHist,&iLength);
fTime2 = (float *)malloc(iLength*sizeof(float));
if(fTime2)
@@ -267,7 +274,29 @@
}
sprintf(pBueffel,"%d",iLength);
NXDupdate(pDict,"timebin",pBueffel);
NXDputalias(pFile,pDict,"dtime",fTime2);
if(self->iMiddle)
{
NXDupdate(pDict,"bank","bank1");
NXDputalias(pFile,pDict,"dtime",fTime2);
}
if(self->iUpper)
{
NXDupdate(pDict,"bank","upperbank");
NXDputalias(pFile,pDict,"dtime",fTime2);
}
if(self->iLower)
{
NXDupdate(pDict,"bank","lowerbank");
NXDputalias(pFile,pDict,"dtime",fTime2);
}
if( (self->iLower || self->iUpper) && self->iMiddle)
{
NXDupdate(pDict,"bank","merged");
NXDputalias(pFile,pDict,"dtime",fTime2);
}
NXDupdate(pDict,"bank","bank1");
/* calculate theoretical position of elastic peak */
fVal = CalculateElastic(self,pCon);
self->fElastic = (fVal - fTime2[0]) / (fTime2[1] - fTime2[0]);
@@ -282,21 +311,45 @@
SNXSPutVariable(pServ->pSics,pCon,pFile,pDict,"ddist","detectordist");
/* theta array */
fArray = (float *)malloc(150*sizeof(float));
if(fArray)
/* theta arrays */
if(self->iMiddle)
{
for(i = 0; i < 75; i++)
{
fArray[i] = 0.80219*i + 9.2503;
}
for(i = 75; i< 150; i++)
{
fArray[i] = 0.80219*i + 11.9343;
}
NXDputalias(pFile,pDict,"dtheta",fArray);
free(fArray);
NXDupdate(pDict,"bank","bank1");
iLength = getFMdim(MIDDLE);
sprintf(pBuffer,"%d",iLength);
NXDupdate(pDict,"noofdetectors",pBuffer);
fArray = getFMBankTheta(MIDDLE);
NXDputalias(pFile,pDict,"dtheta",fArray);
}
if(self->iLower)
{
NXDupdate(pDict,"bank","lowerbank");
iLength = getFMdim(LOWER);
sprintf(pBuffer,"%d",iLength);
NXDupdate(pDict,"noofdetectors",pBuffer);
fArray = getFMBankTheta(LOWER);
NXDputalias(pFile,pDict,"dtheta",fArray);
}
if(self->iUpper)
{
NXDupdate(pDict,"bank","upperbank");
iLength = getFMdim(UPPER);
sprintf(pBuffer,"%d",iLength);
NXDupdate(pDict,"noofdetectors",pBuffer);
fArray = getFMBankTheta(UPPER);
NXDputalias(pFile,pDict,"dtheta",fArray);
}
if(self->iMiddle && ( self->iLower || self->iUpper) )
{
NXDupdate(pDict,"bank","merged");
iLength = getFMdim(MERGED);
sprintf(pBuffer,"%d",iLength);
NXDupdate(pDict,"noofdetectors",pBuffer);
fArray = getFMBankTheta(MERGED);
NXDputalias(pFile,pDict,"dtheta",fArray);
}
NXDupdate(pDict,"bank","bank1");
SNXSPutVariable(pServ->pSics,pCon,pFile,pDict,"ddelay","delay");
@@ -369,89 +422,188 @@
lVal = GetHistMonitor(self->pHist,2,pCon);
NXDputalias(pFile,pDict,"cnmon2",&lVal);
/* histogram */
/* histogram with three detector banks */
fTime = GetHistTimeBin(self->pHist,&iInt);
iTime = iInt;
sprintf(pBueffel,"%d",iInt);
NXDupdate(pDict,"timebin",pBueffel);
iInt = GetHistLength(self->pHist);
lData = (HistInt *)malloc(iInt*sizeof(HistInt));
if(!lData)
lData = GetHistogramPointer(self->pHist,pCon);
setFMDataPointer(lData,iTime);
if(self->iUpper)
{
SCWrite(pCon,"ERROR: out of memory, failed to write histogram",eError);
return;
NXDupdate(pDict,"bank","upperbank");
iDet = getFMdim(UPPER);
sprintf(pBueffel,"%d",iDet);
NXDupdate(pDict,"noofdetectors",pBueffel);
lData = getFMBankPointer(UPPER);
NXDputalias(pFile,pDict,"dcounts",lData);
/* summed counts for each detector */
iSum = (int *)malloc(iDet*sizeof(int));
if(iSum)
{
memset(iSum,0,iDet*sizeof(int));
for(i = 0; i < iDet; i++)
{
iIndex = i * iTime;
for(j = 0; j < iTime; j++)
{
iSum[i] += lData[iIndex+j];
}
}
NXDputalias(pFile,pDict,"dsums",iSum);
free(iSum);
}
else
{
SCWrite(pCon,"WARNING: out of memory, failed to do sums",
eWarning);
}
}
memset(lData,0,iInt*sizeof(HistInt));
GetHistogram(self->pHist,pCon, 0,0,iInt,lData,iInt*sizeof(HistInt));
NXDputalias(pFile,pDict,"dcounts",lData);
/* summed counts for each detector */
iSum = (int *)malloc(iTime*sizeof(int));
iDet = iInt/iTime; /* number of detectors */
if(iSum)
/* middle bank */
if(self->iMiddle)
{
memset(iSum,0,iTime*sizeof(int));
for(i = 0; i < iDet; i++)
{
iIndex = i * iTime;
for(j = 0; j < iTime; j++)
{
iSum[i] += lData[iIndex+j];
}
}
NXDputalias(pFile,pDict,"dsums",iSum);
free(iSum);
NXDupdate(pDict,"bank","bank1");
iDet = getFMdim(MIDDLE);
sprintf(pBueffel,"%d",iDet);
NXDupdate(pDict,"noofdetectors",pBueffel);
lData = getFMBankPointer(MIDDLE);
NXDputalias(pFile,pDict,"dcounts",lData);
/* summed counts for each detector */
iSum = (int *)malloc(iDet*sizeof(int));
if(iSum)
{
memset(iSum,0,iDet*sizeof(int));
for(i = 0; i < iDet; i++)
{
iIndex = i * iTime;
for(j = 0; j < iTime; j++)
{
iSum[i] += lData[iIndex+j];
}
}
NXDputalias(pFile,pDict,"dsums",iSum);
free(iSum);
}
else
{
SCWrite(pCon,"WARNING: out of memory, failed to do sums",
eWarning);
}
}
else
if(self->iLower)
{
SCWrite(pCon,"WARNING: out of memory, failed to do sums",eWarning);
NXDupdate(pDict,"bank","lowerbank");
iDet = getFMdim(LOWER);
sprintf(pBueffel,"%d",iDet);
NXDupdate(pDict,"noofdetectors",pBueffel);
lData = getFMBankPointer(LOWER);
NXDputalias(pFile,pDict,"dcounts",lData);
/* summed counts for each detector */
iSum = (int *)malloc(iDet*sizeof(int));
if(iSum)
{
memset(iSum,0,iDet*sizeof(int));
for(i = 0; i < iDet; i++)
{
iIndex = i * iTime;
for(j = 0; j < iTime; j++)
{
iSum[i] += lData[iIndex+j];
}
}
NXDputalias(pFile,pDict,"dsums",iSum);
free(iSum);
}
else
{
SCWrite(pCon,"WARNING: out of memory, failed to do sums",
eWarning);
}
}
/* merged data */
if( (self->iUpper || self->iLower) && self->iMiddle)
{
NXDupdate(pDict,"bank","merged");
iDet = getFMdim(MERGED);
sprintf(pBueffel,"%d",iDet);
NXDupdate(pDict,"noofdetectors",pBueffel);
lData = getFMBankPointer(MERGED);
NXDputalias(pFile,pDict,"dcounts",lData);
/* summed counts for each detector */
iSum = (int *)malloc(iDet*sizeof(int));
if(iSum)
{
memset(iSum,0,iDet*sizeof(int));
for(i = 0; i < iDet; i++)
{
iIndex = i * iTime;
for(j = 0; j < iTime; j++)
{
iSum[i] += lData[iIndex+j];
}
}
NXDputalias(pFile,pDict,"dsums",iSum);
free(iSum);
}
else
{
SCWrite(pCon,"WARNING: out of memory, failed to do sums",
eWarning);
}
}
/* calculate elastic peak position */
lSum = (long *)malloc(iTime *sizeof(long));
fAxis = (float *)malloc(iTime *sizeof(float));
if( lSum && fAxis)
NXDupdate(pDict,"bank","bank1");
lData = getFMBankPointer(MIDDLE);
if(lData)
{
memset(lSum,0,iTime*sizeof(long));
memset(fAxis,0,iTime*sizeof(float));
for(i = 5; i < iDet - 5; i++)
{
iIndex = i * iTime;
for(j = 0; j < iTime; j++)
lSum = (long *)malloc(iTime *sizeof(long));
fAxis = (float *)malloc(iTime *sizeof(float));
if( lSum && fAxis)
{
memset(lSum,0,iTime*sizeof(long));
memset(fAxis,0,iTime*sizeof(float));
for(i = 5; i < iDet - 5; i++)
{
iIndex = i * iTime;
for(j = 0; j < iTime; j++)
{
lSum[j] += lData[iIndex+j];
}
}
for(i = 0; i < iTime; i++)
{
lSum[j] += lData[iIndex+j];
}
}
for(i = 0; i < iTime; i++)
{
fAxis[i] = (float)i;
}
iStat = CalculateFitFromData(self->pFitter,fAxis,lSum,iTime);
if(iStat != 1)
{
SCWrite(pCon,"WARNING: problem locating elastic peak",eWarning);
}
GetFitResults(self->pFitter,&fCenter,&fStdDev,&fFWHM,&fVal);
fVal = fCenter - self->fElastic;
if(fVal < 0.)
fVal = - fVal;
/* bad value, leave at theoretical value */
if(fVal > 10.)
{
SCWrite(pCon,
fAxis[i] = (float)i;
}
iStat = CalculateFitFromData(self->pFitter,fAxis,lSum,iTime);
if(iStat != 1)
{
SCWrite(pCon,"WARNING: problem locating elastic peak",eWarning);
}
GetFitResults(self->pFitter,&fCenter,&fStdDev,&fFWHM,&fVal);
fVal = fCenter - self->fElastic;
if(fVal < 0.)
fVal = - fVal;
/* bad value, leave at theoretical value */
if(fVal > 10.)
{
SCWrite(pCon,
"WARNING: bad fit result, using theoretical elastic peak position",
eWarning);
}
else
{
self->fElastic = fCenter;
}
free(lSum);
free(fAxis);
}
else
{
SCWrite(pCon,"WARNING: out of memory, failed to do sums",eWarning);
eWarning);
}
else
{
self->fElastic = fCenter;
}
free(lSum);
free(fAxis);
}
else
{
SCWrite(pCon,"WARNING: out of memory, failed to do sums",eWarning);
}
}
sprintf(pBueffel,"Elastic peak found at detector: %f",self->fElastic);
SCWrite(pCon,pBueffel,eWarning);
@@ -479,7 +631,7 @@
int iStat;
char pBueffel[512];
/* open everything agaian */
/* open everything again */
NXopen(self->pFile,NXACC_RDWR,&pFile);
if(!pFile)
{
@@ -498,12 +650,41 @@
NXclose(&pFile);
return;
}
NXDaliaslink(pFile,pDict,"dana","dcounts");
NXDaliaslink(pFile,pDict,"dana","dtime");
NXDaliaslink(pFile,pDict,"dana","dtheta");
NXDaliaslink(pFile,pDict,"dana","cnmon1");
if(self->iUpper)
{
NXDupdate(pDict,"bank","upperbank");
NXDaliaslink(pFile,pDict,"dana","dcounts");
NXDaliaslink(pFile,pDict,"dana","dtime");
NXDaliaslink(pFile,pDict,"dana","dtheta");
NXDaliaslink(pFile,pDict,"dana","cnmon1");
}
if(self->iMiddle)
{
NXDupdate(pDict,"bank","bank1");
NXDaliaslink(pFile,pDict,"dana","dcounts");
NXDaliaslink(pFile,pDict,"dana","dtime");
NXDaliaslink(pFile,pDict,"dana","dtheta");
NXDaliaslink(pFile,pDict,"dana","cnmon1");
}
if(self->iLower)
{
NXDupdate(pDict,"bank","lowerbank");
NXDaliaslink(pFile,pDict,"dana","dcounts");
NXDaliaslink(pFile,pDict,"dana","dtime");
NXDaliaslink(pFile,pDict,"dana","dtheta");
NXDaliaslink(pFile,pDict,"dana","cnmon1");
}
if( (self->iUpper || self->iLower) && self->iMiddle)
{
NXDupdate(pDict,"bank","merged");
NXDaliaslink(pFile,pDict,"dana","dcounts");
NXDaliaslink(pFile,pDict,"dana","dtime");
NXDaliaslink(pFile,pDict,"dana","dtheta");
NXDaliaslink(pFile,pDict,"dana","cnmon1");
}
/* close everything */
NXclose(&pFile);
NXDclose(pDict,NULL);
@@ -574,11 +755,14 @@
if(self->pFitter)
DeleteFitCenter(self->pFitter);
/* free fomerge */
killFM();
free(self);
}
/*-----------------------------------------------------------------------*/
int FoInstall(SConnection *pCon, SicsInterp *pSics, void *pData,
int FoInstall(SConnection *pCon, SicsInterp *pSics, void *pData,
int argc, char *argv[])
{
@@ -589,7 +773,7 @@
pDummy pDum;
/* check arguments */
if(argc < 3 )
if(argc < 4 )
{
SCWrite(pCon,"ERROR: Insufficient number of arguments to FoInstall",
eError);
@@ -603,6 +787,12 @@
return 0;
}
if(!initializeFM(argv[3]))
{
SCWrite(pCon,"ERROR: bad merge data file",eError);
return 0;
}
/* allocate data structure */
pNew = (pFoWrite)malloc(sizeof(FoWrite));
if(!pNew)
@@ -621,13 +811,16 @@
pNew->pHist = pHist;
pNew->pDictFile = strdup(argv[2]);
pNew->iInterval = 20*60;
pNew->iMiddle =1;
/* install callbacks */
pDum = (pDummy)pHist;
pCall = (pICallBack)pDum->pDescriptor->GetInterface(pHist,CALLBACKINTERFACE);
pCall = (pICallBack)pDum->pDescriptor->GetInterface(pHist,
CALLBACKINTERFACE);
if(!pCall)
{
SCWrite(pCon,"ERROR: no callback interface found at your histogram memory",
SCWrite(pCon,
"ERROR: no callback interface found at your histogram memory",
eError);
KillFoWrite(pNew);
return 0;
@@ -710,6 +903,93 @@
return 1;
}
}
else if(strcmp(argv[1],"middle") == 0)
{
if(argc > 2) /* set value */
{
if(!SCMatchRights(pCon,usMugger))
{
return 0;
}
iRet = Tcl_GetInt(pSics->pTcl,argv[2],&iVal);
if(iRet != TCL_OK)
{
sprintf(pBueffel,"ERROR: cannot convert --> %s <-- to number ",
argv[2]);
SCWrite(pCon,pBueffel,eError);
return 0;
}
if(iVal < 0) iVal = 0;
self->iMiddle = iVal;
setFMconfiguration(self->iUpper,self->iMiddle,self->iLower);
SCSendOK(pCon);
return 1;
}
else /* read the value */
{
sprintf(pBueffel,"storefocus.middle = %d",self->iMiddle);
SCWrite(pCon,pBueffel,eValue);
return 1;
}
}
else if(strcmp(argv[1],"lower") == 0)
{
if(argc > 2) /* set value */
{
if(!SCMatchRights(pCon,usMugger))
{
return 0;
}
iRet = Tcl_GetInt(pSics->pTcl,argv[2],&iVal);
if(iRet != TCL_OK)
{
sprintf(pBueffel,"ERROR: cannot convert --> %s <-- to number ",
argv[2]);
SCWrite(pCon,pBueffel,eError);
return 0;
}
if(iVal < 0) iVal = 0;
self->iLower = iVal;
setFMconfiguration(self->iUpper,self->iMiddle,self->iLower);
SCSendOK(pCon);
return 1;
}
else /* read the value */
{
sprintf(pBueffel,"storefocus.lower = %d",self->iLower);
SCWrite(pCon,pBueffel,eValue);
return 1;
}
}
else if(strcmp(argv[1],"upper") == 0)
{
if(argc > 2) /* set value */
{
if(!SCMatchRights(pCon,usMugger))
{
return 0;
}
iRet = Tcl_GetInt(pSics->pTcl,argv[2],&iVal);
if(iRet != TCL_OK)
{
sprintf(pBueffel,"ERROR: cannot convert --> %s <-- to number ",
argv[2]);
SCWrite(pCon,pBueffel,eError);
return 0;
}
if(iVal < 0) iVal = 0;
self->iUpper = iVal;
setFMconfiguration(self->iUpper,self->iMiddle,self->iLower);
SCSendOK(pCon);
return 1;
}
else /* read the value */
{
sprintf(pBueffel,"storefocus.upper = %d",self->iUpper);
SCWrite(pCon,pBueffel,eValue);
return 1;
}
}
SCWrite(pCon,"ERROR: subcommand to storefocus not recognized",eError);
return 0;
}