Blame |
Last modification |
View Log
| RSS feed
#include "H2D.h"
#include "H1D.h"
#include "inifile.h"
#include <utility.h>
#include <ansi_c.h>
#include <cvirte.h>
#include <userint.h>
#include "petdemo_uir.h"
#include "daq.h"
#include "PETProjDataMgr.h"
#include <math.h>
#define uSMC_USB
#ifdef uSMC_USB
# include "uSMC.h"
# define uSMC_SERIAL "0000000000005660"
const char serials
[3][16]= {uSMC_SERIAL
};
#endif /* uSMC_USB */
static int node
;
static int CurPos
= 0;
int p1
;
#define MAX_THREADS 10
static CmtThreadPoolHandle poolHandle
= 0;
int ctrl_c
=0;
int daq_on
=0;
int gadcchannel
;
static int tfID
;
static int controlID
;
static int plothandle
[0xFF];
char strbuf
[0xFF];
int gLog
=0;
int printf(const char *format
, ...
) {
va_list aptr
;
int ret
;
FILE
*flog
;
va_start(aptr
, format
);
ret
= vsprintf(strbuf
, format
, aptr
);
va_end(aptr
);
SetCtrlVal
(p1
,P1_STDIO
,strbuf
);
if (gLog
) {
flog
= fopen ("stdio.log", "a");
fprintf (flog
, "%s", strbuf
);
fclose (flog
);
}
return(ret
);
}
void CVICALLBACK EndOfThread
( CmtThreadPoolHandle poolhandle
,
CmtThreadFunctionID functionID
, unsigned int event
,
int value
, void *callbackData
) {
daq_on
=0;
//SetDimming(0);
printf("End of Thread \n");
return ;
}
int __stdcall WinMain
(HINSTANCE hInstance
, HINSTANCE hPrevInstance
,
LPSTR lpszCmdLine
, int nCmdShow
) {
if (InitCVIRTE
(hInstance
, 0, 0) == 0)
return -1; /* out of memory */
if ((p1
= LoadPanel
(0, "petdemo_uir.uir", P1
)) < 0)
return -1;
SetStdioPort
(CVI_STDIO_WINDOW
);
SetSleepPolicy
(VAL_SLEEP_MORE
);
CmtNewThreadPool
(MAX_THREADS
, &poolHandle
);
#ifdef uSMC_USB
uSMC_Open
();
node
=uSMC_FindSerial
(serials
)+1;
uSMC_Init
(node
,1);
SetCtrlVal
(p1
, P1_STAGELED
,1);
uSMC_GetPosition
(node
,&CurPos
);
SetCtrlVal
(p1
,P1_CPOSITION
,CurPos
);
SetCtrlVal
(p1
, P1_STAGELED
,0);
#endif /* uSMC_USB */
DisplayPanel
(p1
);
RunUserInterface
();
DiscardPanel
(p1
);
CmtDiscardThreadPool
(poolHandle
);
#ifdef uSMC_USB
uSMC_PowerOff
(node
);
uSMC_Close
();
#endif /* uSMC_USB */
return 0;
}
int addheader
(FILE
*fp
, int type
, int *data
) {
time_t t
;
switch(type
) {
case RUNREC_ID
: {
RUNREC runrec
; // start header: appears once at the start of the file
runrec.
id = RUNREC_ID
;
runrec.
length = sizeof(runrec
);
runrec.
fver = 0x10000;
time(&t
);
runrec.
time=t
;
runrec.
num_events = data
[6];
runrec.
num_channels = NUM_CHANNELS
;
runrec.
pedestal = PEDESTAL
;
runrec.
xy = SCAN_TYPE
; // 0 -> single data scan :: 1 -> XY position scan
runrec.
nx = data
[0];
runrec.
x0 = data
[1];
runrec.
dx = data
[2];
runrec.
ny = data
[3];
runrec.
y0 = data
[4];
runrec.
dy = data
[5];
printf("Writing header to file\n");
printf("RECID = %u\n",runrec.
id);
printf("Length = %u\n",runrec.
length);
printf("File version = %u\n",runrec.
fver);
printf("Time = %u\n",runrec.
time);
printf("Number of events per step = %u\n",runrec.
num_events);
printf("Number of channels measured = %u\n",runrec.
num_channels);
printf("Pedestal = %u\n",runrec.
pedestal);
printf("Scan type = %u :: 0 -> single data scan :: 1 -> XY position scan\n",runrec.
xy);
printf("Number of steps in X = %d\n",runrec.
nx);
printf("Start position X = %d\n",runrec.
x0);
printf("Step size direction X = %d\n",runrec.
dx);
printf("Number of steps in Y = %d\n",runrec.
ny);
printf("Start position Y = %d\n",runrec.
y0);
printf("Step size direction Y = %d\n",runrec.
dy);
if (fp
) fwrite(&runrec
, runrec.
length,1,fp
);
}
break;
case ENDREC_ID
: {
ENDREC endrec
; // end header: appears once at the end of the file
endrec.
id = ENDREC_ID
;
endrec.
length = sizeof(endrec
);
time(&t
);
endrec.
time=t
;
printf("Writing header to file\n");
printf("RECID = %u\n",endrec.
id);
printf("Length = %u\n",endrec.
length);
printf("Time = %u\n",endrec.
time);
if (fp
) fwrite(&endrec
, endrec.
length,1,fp
);
break;
}
case POSREC_ID
: {
POSREC posrec
; // position header: appears at every change of position
posrec.
id = POSREC_ID
;
posrec.
length = sizeof(posrec
);
time(&t
);
posrec.
time = t
;
posrec.
num_iter_x = data
[0];
posrec.
mikro_pos_x = data
[1];
posrec.
set_pos_x = data
[2];
posrec.
num_iter_y = data
[3];
posrec.
mikro_pos_y = data
[4];
posrec.
set_pos_y = data
[5];
printf("Writing header to file\n");
printf("RECID = %u\n",posrec.
id);
printf("Length = %u\n",posrec.
length);
printf("Time = %u\n",posrec.
time);
printf("Iteration X = %d\n",posrec.
num_iter_x);
printf("MIKRO Position X = %d\n",posrec.
mikro_pos_x);
printf("Set position X = %d\n",posrec.
set_pos_x);
printf("Iteration Y = %d\n",posrec.
num_iter_y);
printf("MIKRO Position Y = %d\n",posrec.
mikro_pos_y);
printf("Set position Y = %d\n",posrec.
set_pos_y);
if (fp
) fwrite(&posrec
, posrec.
length,1,fp
);
break;
}
}
return 0;
}
int CVICALLBACK ExitCB
(int panel
, int control
, int event
,
void *callbackData
, int eventData1
, int eventData2
) {
switch (event
) {
case EVENT_COMMIT
:
QuitUserInterface
(0);
break;
}
return 0;
}
int Fi2Pos
(float x
) {
// x in degrees
return (int) (x
/360*NSTEPS
);
}
int mdaq_init
(const char *fname
){
IniText iniText
;
char pathName
[MAX_PATHNAME_LEN
];
char dirName
[MAX_PATHNAME_LEN
];
/* set up the pathName for the .ini file */
GetProjectDir
(dirName
);
MakePathname
(dirName
, fname
, pathName
);
/* create object for holding the value/tag pairs */
iniText
= Ini_New
(TRUE
); /* TRUE for automatic sorting */
/* read in the tag/value pairs */
Ini_ReadFromFile
(iniText
, pathName
);
/* create the in–memory tag/value pairs */
Ini_GetInt
(iniText
, "scintillator", "nofcrystalsx", &conf.
nofcrystalsx);
Ini_GetInt
(iniText
, "scintillator", "nofcrystalsy", &conf.
nofcrystalsy);
Ini_GetDouble
(iniText
, "scintillator", "crystalpitchx", &conf.
crystalpitchx);
Ini_GetDouble
(iniText
, "scintillator", "crystalpitchy", &conf.
crystalpitchy);
Ini_GetStringCopy
(iniText
, "sensor", "modules", &conf.
modules);
Ini_GetStringCopy
(iniText
, "sensor", "channels", &conf.
channels);
Ini_GetStringCopy
(iniText
, "calibration", "sumpedestals", &conf.
sumpedestals);
Ini_GetStringCopy
(iniText
, "calibration", "pedestals", &conf.
pedestals);
Ini_GetStringCopy
(iniText
, "calibration", "photopeak", &conf.
photopeak);
Ini_GetStringCopy
(iniText
, "calibration", "channelcalibration", &conf.
channelcalibration);
Ini_GetInt
(iniText
, "calibration", "adcthreshold", &conf.
adcthreshold);
/* dispose of the in–memory tag/value pairs */
Ini_Dispose
(iniText
);
return 0;
}
void ReadModuleMap
(const char *fname
){
int id
;
float r
,phi
;
char line
[400];
const int ndim
=400;
FILE
*fp
=fopen(fname
,"r");
if (!fp
) return;
while (fgets(line
,ndim
,fp
)!=NULL
) {
sscanf(line
,"%d%f%f",&id
,&r
,&phi
);
if (id
<16) {
conf.
module[id
].
r=r
;
conf.
module[id
].
phi=phi
*Pi
()/180.
;
if (debug
) printf("%s %d %f %f\n",fname
,id
, r
, phi
);
}
}
fclose(fp
);
}
void ReadChannelMap
(const char *fname
){
int id
;
int ix
, iy
;
char line
[400];
const int ndim
=400;
FILE
*fp
=fopen(fname
,"r");
if (!fp
) return;
while (fgets(line
,ndim
,fp
)!=NULL
) {
sscanf(line
,"%d%d%d",&id
,&ix
,&iy
);
if (id
<16) {
conf.
channel[id
].
ix=ix
;
conf.
channel[id
].
iy=iy
;
if (debug
) printf("%s %d %d %d\n",fname
,id
, ix
, iy
);
}
}
fclose(fp
);
}
int readfile
(const char *fname
, float *x
, int nmax
, int defaultvalue
){
int id
;
float ix
;
char line
[400];
const int ndim
=400;
FILE
*fp
=fopen(fname
,"r");
for (int i
=0;i
<nmax
;i
++){
x
[i
]=defaultvalue
;
}
if (!fp
) return -1;
while (fgets(line
,ndim
,fp
)!=NULL
) {
sscanf(line
,"%d%f",&id
,&ix
);
if (id
<nmax
) x
[id
]=ix
;
if (debug
) printf("%s %d %f\n",fname
,id
, ix
);
}
fclose(fp
);
return 0;
}
int Geometry
(const char *fnameconfig
){
mdaq_init
(fnameconfig
);
ReadModuleMap
(conf.
modules);
ReadChannelMap
(conf.
channels);
printf( "Reading ...%s\n " ,conf.
channelcalibration );
/*
m_calibration = new TFile(m_calibrationrootName);
for (int i=0; i<4;i++) {
char hn[256];
sprintf(hn,"pmt1%d_calib",i);
m_crystalid[i]= (TH1I *) m_calibration->Get(hn);
m_crystalid[i]->ls();
}
*/
conf.
peakscaling=3000;
readfile
(conf.
pedestals,conf.
apedestals,4*16, 0);
readfile
(conf.
photopeak,conf.
apeak,4*16, conf.
peakscaling);
return 0;
};
int CVICALLBACK mdaq
(void *functionData
) {
double dfi
, fi0
;
unsigned int nsteps
;
char filename
[0xFF];
char fname
[0xFF];
int daqtime
;
daq_on
= 1;
ctrl_c
=0;
GetCtrlVal
(p1
,P1_DFI
, &dfi
);
GetCtrlVal
(p1
,P1_FI0
, &fi0
);
GetCtrlVal
(p1
,P1_NFI
, &nsteps
);
GetCtrlVal
(p1
,P1_DAQTIME
, &daqtime
);
GetCtrlVal
(p1
,P1_FILENAME
, filename
);
GetCtrlVal
(p1
,P1_DEBUG
, &debug
);
sprintf(fname
,"%s.dat", filename
);
Geometry
("config.ini");
HistogramsInit
();
PETProjDataMgrFree
();
PETProjDataMgrInit
();
SetDebug
(debug
);
SetRingDiameter
(2*conf.
module[0].
r);
FILE
*fp
= fopen(fname
, "wb");
int runhdr
[7]= {nsteps
, Fi2Pos
(fi0
), Fi2Pos
(dfi
), 1,0,1, -daqtime
};
addheader
(fp
,RUNREC_ID
, runhdr
);
vmconnect
();
for (int i
=0; i
<nsteps
; i
++) {
double fi
=fi0
+dfi
*i
;
conf.
rotation = fi
*Pi
()/180;
#ifdef uSMC_USB
SetCtrlVal
(p1
,P1_STAGELED
,1);
int SetPos
= Fi2Pos
(fi
);
uSMC_MoveTo
(node
,SetPos
);
uSMC_GetPosition
(node
,&CurPos
);
SetCtrlVal
(p1
,P1_CPOSITION
,CurPos
);
SetCtrlVal
(p1
,P1_STAGELED
,0);
if (ctrl_c
) break;
int poshdr
[6]= {i
, CurPos
, SetPos
, 0,0,0};
addheader
(fp
, POSREC_ID
, poshdr
);
vmacquire
(-daqtime
,fp
, NULL
);
#endif /* uSMC_USB */
SetCtrlVal
(p1
,P1_CEVE
,i
);
printf("Step =%d angle =%f\n", i
, fi
);
}
addheader
(fp
, ENDREC_ID
, NULL
);
fclose(fp
);
daq_on
= 1;
WriteInterfile
(filename
);
sprintf(fname
,"%s.sroot", filename
);
HistogramsWrite
(fname
);
vmdisconnect
();
return 0;
}
int CVICALLBACK StartCB
(int panel
, int control
, int event
,
void *callbackData
, int eventData1
, int eventData2
) {
ThreadFunctionPtr mythread
= NULL
;
switch (event
) {
case EVENT_COMMIT
:
controlID
=0;
if (panel
== p1
&& control
== P1_START
) {
mythread
= mdaq
;
controlID
= control
;
}
if (mythread
!=NULL
) {
printf("New Thread panel=%d button=%d\n", panel
, control
);
// SetDimming(1);
if (!daq_on
) CmtScheduleThreadPoolFunctionAdv
(poolHandle
, mythread
, &controlID
,
DEFAULT_THREAD_PRIORITY
,
EndOfThread
,
EVENT_TP_THREAD_FUNCTION_END
,
NULL
, RUN_IN_SCHEDULED_THREAD
,
&tfID
);
}
break;
}
return 0;
}
int CVICALLBACK StopCB
(int panel
, int control
, int event
,
void *callbackData
, int eventData1
, int eventData2
) {
switch (event
) {
case EVENT_COMMIT
:
ctrl_c
=1;
break;
}
return 0;
}
int CVICALLBACK DebugCB
(int panel
, int control
, int event
,
void *callbackData
, int eventData1
, int eventData2
) {
switch (event
) {
case EVENT_COMMIT
:
GetCtrlVal
(p1
,P1_DEBUG
, &debug
);
break;
}
return 0;
}
int CVICALLBACK RedrawCB
(int panel
, int control
, int event
,
void *callbackData
, int eventData1
, int eventData2
) {
int pmtid
;
switch (event
) {
case EVENT_COMMIT
:
case EVENT_TIMER_TICK
:
GetCtrlVal
(p1
,P1_CH
, &gadcchannel
);
pmtid
= gadcchannel
/16;
if (H1D_Exist
(m_Adc
[gadcchannel
])) H1D_Draw
(m_Adc
[gadcchannel
], p1
,P1_GADC
, &plothandle
[0]);
if (H2D_Exist
( m_CenterOfGravity
[pmtid
])) H2D_Draw
(m_CenterOfGravity
[pmtid
], p1
,P1_GXY
, &plothandle
[1]);
if (H1D_Exist
(m_AdcSum
[pmtid
])) H1D_Draw
(m_AdcSum
[pmtid
], p1
,P1_GSUMADC
, &plothandle
[2]);
break;
}
return 0;
}