all detectors merged into slsDetector

git-svn-id: file:///afs/psi.ch/project/sls_det_software/svn/slsDetectorSoftware@83 951219d9-93cf-4727-9268-0efd64621fa3
This commit is contained in:
bergamaschi
2012-01-10 14:14:52 +00:00
parent ef65cc8b54
commit 9a93a5f019
12 changed files with 1509 additions and 142 deletions

View File

@ -13,7 +13,8 @@ INSTMODE= 0777
SRCS= server.c server_funcs.c communication_funcs.c firmware_funcs.c mcb_funcs.c trimming_funcs.c sharedmemory.c
OBJS= $(SRCS:%.c=%.o)
CFLAGS+= -Wall -DC_ONLY -DMCB_FUNCS -DVERBOSE
CFLAGS+= -Wall -DC_ONLY -DMCB_FUNCS
#-DVERBOSE
#-DVERYVERBOSE
#-Werror

View File

@ -434,11 +434,11 @@ int getNModBoard() {
u_int32_t val;
val=bus_r(FPGA_VERSION_REG)&0xff000000;
printf("version register %08x\n",val);
// printf("version register %08x\n",val);
nmodboard=val >> 24;
//#ifdef VERY_VERBOSE
#ifdef VERY_VERBOSE
printf("The board hosts %d modules\n",nmodboard);
//#endif
#endif
nModBoard=nmodboard;
//getNModBoard()=nmodboard;
return nmodboard;

View File

@ -20,6 +20,7 @@
#undef DEBUGOUT
extern int nModX;
extern int nModBoard;
extern int dataBytes;
extern int dynamicRange;
const int nChans=NCHAN;
@ -1024,11 +1025,13 @@ int getChannelbyNumber(sls_detector_channel* myChan) {
int getTrimbit(int imod, int ichip, int ichan) {
if (detectorChans) {
if (imod<getNModBoard() && imod>=0)
if (imod<nModBoard && imod>=0)
if (ichip<(detectorModules+imod)->nchip && ichan<(detectorModules+imod)->nchan/(detectorModules+imod)->nchip)
return (detectorChans[imod*NCHAN*NCHIP+ichip*NCHAN+ichan] & TRIM_DR);
} else
return -1;
} //else
return -1;
}
int initChannel(int ft,int cae, int ae, int coe, int ocoe, int counts, int imod){

View File

@ -2484,11 +2484,16 @@ int execute_trimming(int file_des) {
}
}
if (ret!=OK) {
printf("trimming failed\n");
if (ret<0) {
sprintf(mess,"can't set execute trimming\n");
ret=FAIL;
} else if (ret>0) {
sprintf(mess,"Could not trim %d channels\n", ret);
ret=FAIL;
} else if (differentClients)
ret=FORCE_UPDATE;
n = sendDataOnly(file_des,&ret,sizeof(ret));
if (ret==FAIL) {
n = sendDataOnly(file_des,mess,sizeof(mess));
@ -2638,6 +2643,10 @@ int send_update(int file_des) {
retval=setTrains(tns);
n = sendDataOnly(file_des,&retval,sizeof(int64_t));
if (lockStatus==0) {
strcpy(lastClientIP,thisClientIP);
}
return ret;

View File

@ -62,17 +62,20 @@ int trim_with_noise(int countlim, int nsigma, int im)
#ifdef VERBOSE
printf("trimming with noise.....\n");
#endif
retval2=trim_with_level(countlim, im);
if (retval1==OK)
retval2=trim_with_level(countlim, im);
else
retval2=-1;
#ifdef DEBUGOUT
printf("done\n");
#endif
if (retval1==OK && retval2==OK)
retval=OK;
else
retval=FAIL;
//if (retval1==OK && retval2==OK)
// retval=OK;
//else
// retval=FAIL;
return retval;
return retval2;
}
@ -94,18 +97,20 @@ int trim_with_beam(int countlim, int nsigma, int im) //rpc
#endif
retval1=choose_vthresh_and_vtrim(countlim,nsigma,im);
retval2=trim_with_median(TRIM_DR, im);
if (retval1==OK)
retval2=trim_with_median(TRIM_DR, im);
else return -1;
#ifdef DEBUGOUT
printf("done\n");
#endif
if (retval1==OK && retval2==OK)
retval=OK;
else
retval=FAIL;
// if (retval1==OK && retval2==OK)
// retval=OK;
//else
// retval=FAIL;
return retval;
return retval2;
}
@ -126,17 +131,19 @@ int trim_improve(int maxit, int par2, int im) //rpc
if (par2!=0 && im==ALLMOD)
retval1=choose_vthresh();
retval2=trim_with_median(2*maxit+1, im);
if (retval1==OK)
retval2=trim_with_median(2*maxit+1, im);
else
return -1;
#ifdef DEBUGOUT
printf("done\n");
#endif
if (retval1==OK && retval2==OK)
retval=OK;
else
retval=FAIL;
// if (retval1==OK && retval2==OK)
// retval=OK;
//else
//retval=FAIL;
return retval;
return retval2;
}
@ -328,7 +335,7 @@ int trim_with_level(int countlim, int im) {
u_int32_t *scan;
int *inttrim;
int modma, modmi, nm;
int retval=OK;
int retval=0;
int *fifodata;
sls_detector_channel myChan;
printf("trimming module number %d", im);
@ -411,10 +418,13 @@ int trim_with_level(int countlim, int im) {
for (ichan=0; ichan<nChans; ichan++) {
nextStrip(imod);
ich=ichan+imod*nChans*nChips+ichip*nChans;
if (*(inttrim+ich)==-1) {
*(inttrim+ich)=TRIM_DR;
//if (*(inttrim+ich)==-1) {
if (*(inttrim+ich)<1) {
if (*(inttrim+ich)==-1) {
*(inttrim+ich)=TRIM_DR;
}
// printf("could not trim channel %d chip %d module %d - set to %d\n", ichan, ichip, imod, *(inttrim+ich) );
retval=FAIL;
retval++;
}
#ifdef VERBOSE
// else
@ -433,35 +443,65 @@ int trim_with_level(int countlim, int im) {
#define ELEM_SWAP(a,b) { register int t=(a);(a)=(b);(b)=t; }
#define median(a,n) kth_smallest(a,n,(((n)&1)?((n)/2):(((n)/2)-1)))
int kth_smallest(int *a, int n, int k)
{
register int i,j,l,m ;
register float x ;
register int i,j,l,m ;
register float x ;
l=0 ; m=n-1 ;
while (l<m) {
x=a[k] ;
i=l ;
j=m ;
do {
while (a[i]<x) i++ ;
while (x<a[j]) j-- ;
if (i<=j) {
ELEM_SWAP(a[i],a[j]) ;
i++ ; j-- ;
}
} while (i<=j) ;
if (j<k) l=i ;
if (k<i) m=j ;
}
return a[k] ;
l=0 ; m=n-1 ;
while (l<m) {
x=a[k] ;
i=l ;
j=m ;
do {
while (a[i]<x) i++ ;
while (x<a[j]) j-- ;
if (i<=j) {
ELEM_SWAP(a[i],a[j]) ;
i++ ; j-- ;
}
} while (i<=j) ;
if (j<k) l=i ;
if (k<i) m=j ;
}
return a[k] ;
}
int median(int *a,int n) {
int i=0, k=n/2;
float k1=0.5*n;
//discard zeroes and 0xffffff
for (i=0; i<n; i++) {
if (a[i]==0)
k1+=0.5;
else if (a[i]==0xffffff)
k1-=0.5;
}
kth_smallest(a, n, k1);
/* for (k=0; k<n; k++) { */
/* printf("%d ",a[k]); */
/* } */
/* printf("\n"); */
k=k1;
return a[k] ;
}
int ave(int *a, int n)
{
int av=0,i;
@ -610,7 +650,7 @@ int choose_vthresh() {
int trim_with_median(int stop, int im) {
int retval=OK;
int retval=0;
#ifdef MCB_FUNCS
int ichan, imod, ichip, ich;
@ -726,12 +766,12 @@ int trim_with_median(int stop, int im) {
if (trim>TRIM_DR) {
trim=63;
printf("can't trim channel %d chip %d module %d to trim %d\n",ich, ichip, imod, trim);
retval=FAIL;
retval++;
}
if (trim<0) {
printf("can't trim channel %d chip %d module %d to trim %d\n",ich, ichip, imod, trim);
trim=0;
retval=FAIL;
retval++;
}
initChannel(trim,0,0,1,0,0,imod);
}

View File

@ -13,5 +13,5 @@ int trim_with_level(int countlim, int imod);
int trim_with_median(int stop, int imod);
int calcthr_from_vcal(int vcal);
int calccal_from_vthr(int vthr);
int median(int *a,int n);
#endif