#%TITLE% ccdutils.mac
#%NAME%
# Macros for testing purposes. Most of these macros are now obsolete
# Check with BLISS before using them
#%CATEGORY% Detection, ccd
#%SETUP%
# Run the macro %B%ccdsetup%B% to setup the camera
#%DESCRIPTION%
# Configuration
# Macros for testing purposes.
#%DL%
# %DT% ccdinit %DD% Initializes ccd
# %DT% sdv
# %DT% ccdsdv 'sdv'
# %DT% vxi
# %DT% ccdvxi 'vxi'
# %DT% ccdstatus
# %DT% Xstatus_update '
# %DT% ccdstatus_normal
# %DT% ccdserial
# %DT% ccdstatus_mpp
# %DT% ccdstatus_init_normal
# %DT% ccdstatus_init_mpp
# %DT% ccdtest
# %DT% ccdvxitest
# %DT% ccdoffset
# %DT% ccd_1channel(cha,level,tol,bin,mode)
#%XDL%
#Graphical user interface.Frelon camera
#%DL%
# %DT% xfrelon %DD% Update SpecGUI values
# %DT% xbinroi %DD% Binning and roi. when button pressed
# %DT% xroi %DD% Roi change
# %DT% xbin %DD% Bining change
# %DT% xacquire %DD% Acquisition. Called from ACQUIRE button
# %DT% xupdcurrent %DD% Updates current image on film
# %DT% xupdstate %DD% Updates CCD state
# %DT% xcontinuous %DD% Continuous acquisition. Called from button
# %DT% xbloom %DD% Sets antiblooming option on and off
# %DT% xshutter %DD% Opens and close the camera shutter
# %DT% xtunning %DD% Camera started continuously whitout acquiring images
# %DT% xfilm %DD% Starts a film on the images after a ACQUIRE action
# %DT% xnext %DD% Shows next image in film
# %DT% xprev %DD% Shows previous image in film
# %DT% xwaitacq %DD% Will catch action on STOP button (~)
# %DT% xstopacq %DD% STOP button is pressed.
# %DT% xupdsetup %DD% Updates all variables in setup panel
# %DT% xtrigger %DD% Sets external trigger on or off
# %DT% xcmdout %DD% called from radio buttons
# %DT% ccdsv %DD%
# %DT% xclosedacs %DD% close dacs pannel
#%XDL%
#%DL%
# %DT% ccdpars %DD% send configuration (images sweeps op_mode)
# %DT% ccdreadset %DD% Read roi and bin parameters from frelon
# %DT% xdacs %DD% for managing the dacs pannel
# %DT% xdacs_send_A %DD% xdacs_send_B ...... xdacs_send_G
# %DT% xdacs_send_all
# %DT% bumm_clear %DD% For tesing purposes of accum mode
# %DT% bumm_clear_always %DD% For tesing purposes of accum mode
#%DL%
# %DT% ccdsaveconf %DD% Save dac values to a file
# %DT% ccdgetconf %DD% Restore DAC values from file
#%EXAMPLE%
# Some examples of macros
#%PRE%
# NERON.213> ccdpars 0 1 1
#%PRE%
#
#%LOG%
# $Revision: 1.7 $
# $Log: ccdutils.mac,v $
# Revision 1.7 2011/07/07 09:01:19 perez
# Fix bug in xflip
#
# Revision 1.6 2008/02/27 13:15:02 rey
# documentation changes
#
#Revision 1.5 2006/02/28 16:33:46 ahoms
#Force binning in ccdoffset after setting hw_par
#
#Revision 1.4 2005/01/18 15:51:44 fernande
#ccdoffset. Gain set to 0 at the begining (the maximun) to avoid
#problems with the new algorithm
#
#Revision 1.3 2004/10/01 14:22:48 claustre
#The real version modified by David on racine (BM05) to add more ccdoffset
#modes (13,23,34 ...) + restore some macros like setfrelon2000 used by Xtomo.mac
#
#HISTORY
# 2002-Nov-18 DFC
# xfrelon added xflip value to update
# 2005-01-18 AH + DFC
# ccdoffset (ccd_1channel). First gain changed from 2000
# to 0. Under some conditions on some cameras in some channels
# with the new algorithm (NEW_CCDOFFSET=1) gain = 2000 gave a
# output level = 0 preventing the algorithm from converge
# Now starting with the gain at the maximun level gain=0 this
# should be fixed .
#%END%
#%UU%
#%MDESC%
# Runs fast1024 to initialize SDV card. Loads xilinx.
def ccdinit '{
on("/dev/null");offt
u /opt/EDTsdv/fast1024
ont;close("/dev/null")
}'
#%IU%
#%MDESC%
# Configures the camera as SDV type
def sdv '{
ccdinit
getconf sdv
}'
#%IU%
#%MDESC%
# Same as %B%sdv%B%
#
def ccdsdv 'sdv'
def vxi '{
getconf vxi
#ccd_frelonsetup 0
image_par(CCD_U,"input_channel",15)
}'
def ccdvxi 'vxi'
global ARRAYNAME
def _my_sersleep ' sleep(0.3) '
def ccdstatus '{
local answer retval
local label min max val xal
local bla,flo,vac,ccdtmp,vdd,vss,vdr,vgs,vld,vpad,vpd,vssd,pcbtemp
ccdserial
if (FRELON2000) {
ccdstatus_init_2000
} else {
if (CCDSERNO == 5 ) {
ccdstatus_init_mpp
} else if (CCDSERNO == 1 || CCDSERNO == 4) {
ccdstatus_init_mpp_new
} else {
ccdstatus_init_normal
}
}
for(;;) if ( image_par(CCD_U,"talk") == "" ) break;
image_par(CCD_U,"talk","V\r\n") ; _my_sersleep
answer = image_par(CCD_U,"talk")
split(answer,bla,":")
n_ret = split(bla[1],retval,",")
if (FRELON2000) {
ccdstatus_2000
} else {
if (CCDSERNO == 5 ) {
ccdstatus_mpp
} else if (CCDSERNO == 1 || CCDSERNO == 4) {
ccdstatus_mpp_new
} else {
ccdstatus_normal
}
}
for (i =0;i<12;i++) {
if ( val[i] < min[i] || val[i] > max[i] ) {
xal[i] = "On"
} else {
xal[i] = "-"
}
}
if (GUI_RUN) {
Xstatus_update
}
printf("CCDSTATUS:\n")
tty_cntl("md")
printf("\t %10s\t\t %10s %3s\n","Range","Measured","Alarm")
tty_cntl("me")
for(i=0;i<12;i++) {
if (label[i] != "") {
lim = sprintf("( %6s , %6s )",sprintf("%4.2f",min[i]),sprintf("%4.2f",max[i]))
printf(" %10s %19s %6s \t%3s\n", \
label[i],lim,sprintf("%4.2f",val[i]),xal[i])
}
}
# test
# if (CCDSERNO == 1) {
# xdacs_norm
# p
# printf(" %10s (Low=80e ,Norm=20e) %6s\n", \
# "Gain",GAIN? "Normal":"Low")
#
# }
}'
def Xstatus_update '
if (FRELON2000) {
Xval("xccdtemp",sprintf("%3.2f",val[0]))
} else {
Xval("xccdtemp",sprintf("%3.2f",val[2]))
}
for (i=0;i<12;i++) {
if (label[i] != "") {
Xval(sprintf("\"xsta%d\"",i+1),sprintf("%3.2f",val[i]))
Xval(sprintf("\"xran%d\"",i+1),sprintf("\( %3.2f, %3.2f \)", min[i],max[i]))
Xval(sprintf("\"xal%d\"",i+1),xal[i])
Xval(sprintf("\"xlab%d\"",i+1),label[i])
}
}
'
def ccdstatus_normal '{
vac = retval[1]/102.4
# if ( vac <= 8.20) {
# val[1] = 37E-4 * pow(vac,4) -4E-2 * pow(vac,3) + 18.1E-2 * pow(vac,2) -15E-2 * vac + 7E-2
# } else {
# val[1] = 99.66 * pow(vac,4)- 3526.4 * pow(vac,3) + 46762 * pow(vac,2) -275404 * vac + 607810
# }
val[1]=retval[1]
val[0] = 1.8 * (retval[0]/1.57)/2.2
val[2] = retval[2] * 0.1525 - 74.6
val[3] = -0.012926 + retval[3] * 0.00983
val[4] = -0.01906 - retval[4] * 0.009764
val[5] = 2.455 + retval[5] * 0.000404
val[6] = 0.03543 - retval[6] * 0.009731
val[7] = 0.17267 + retval[7] * 0.002463
val[8] = 1.2622 + retval[8] * 0.0049145
val[9] = 1.9692 - retval[9] * 0.00486
val[10] = -0.209 - retval[10] * 0.0094355
val[11] = retval[11] * 0.4883
}'
def ccdstatus_2000 '{
# vac = retval[2]/409.6
# if ( vac <= 8.20) {
# val[2] = 37E-4 * pow(vac,4) -4E-2 * pow(vac,3) + 18.1E-2 * pow(vac,2) -15E-2 * vac + 7E-2
# } else {
# val[2] = 99.66 * pow(vac,4)- 3526.4 * pow(vac,3) + 46762 * pow(vac,2) -275404 * vac + 607810
# }
# modified by VBD and DFC 1/02/2001
# val[0] = (retval[0] * 0.03853 - 75.24)*1.065
val[0] = (101/16) * (((retval[0]*5000/4096)/200)-4)-50
# modified by VBD and DFC 1/02/2001
# val[1] = (retval[1]*0.006414 - 0.3163)*0.74 #Frelon2000(11)
val[1] = retval[1]*5/4096.0
val[2] = retval[2] * 1000 / 4096
# modified by VBD and DFC 1/02/2001
# val[3] = retval[3] * 0.02442 - 0.00814
val[3] = retval[3] * 100/4096
val[4] = retval[4]*5/4096.0
val[5] = retval[5]*5/4096.0
val[6] = retval[6]*5/4096.0
val[7] = retval[7]*5/4096.0
# val[8] = retval[8]
# val[9] = retval[9]
# val[10] = retval[10]
# val[3] = -0.012926 + retval[3] * 0.00983
# val[4] = -0.01906 - retval[4] * 0.009764
# val[6] = 0.03543 - retval[6] * 0.009731
# val[7] = 0.17267 + retval[7] * 0.002463
# val[8] = 1.2622 + retval[8] * 0.0049145
# val[9] = 1.9692 - retval[9] * 0.00486
# val[10] = -0.209 - retval[10] * 0.0094355
# val[11] = retval[11] * 0.4883
}'
def ccdserial '{
global CCDSERNO
f3send OFF
_my_sersleep
image_par(CCD_U,"talk","?\r\n")
_my_sersleep
answer = image_par(CCD_U,"talk")
sscanf(answer,"%s %s\t:%d",bof,bof2,serno)
CCDSERNO = serno
}'
def ccdstatus_mpp '
vac=retval[1]/102.4
# if (vac<=8.20){
# val[1]=37E-4*pow(vac,4)-4E-2*pow(vac,3)+18.1E-2*pow(vac,2)-15E-2*vac+7E-2
# } else
# val[1]=99.66*pow(vac,4)-3526.4*pow(vac,3)+46762*pow(vac,2)-275404*vac+607810
val[1]=retval[1]
val[0] = 1.8*(retval[0]/1.57)/2.2
val[2] = retval[2] * 0.1525-74.6
#val[2] = (retval[2] -488)/6.48
val[3] = retval[3] * 0.009766
val[4] = -retval[4] * 0.009766
val[5] = retval[5] * 0.009766
val[6] = -retval[6] * 0.009766
val[7] = -(retval[9] * 0.004883)-5
val[8] = -(retval[10] * 0.009766)-12
val[9] = retval[11] * 0.4883
'
def ccdstatus_mpp_new '
global GAIN
val[1]=retval[1]
val[0] = 1.8*(retval[0]/1.57)/2.2
val[2] = (retval[2] -488)/6.48
val[3] = retval[3] * 0.009766
val[4] = -retval[4] * 0.009766
val[5] = retval[5] * 0.009766
val[6] = -retval[6] * 0.009766
val[7] = retval[7] * 0.004883
val[8] = -(retval[9] * 0.004883)-5
val[9] = -(retval[10] * 0.009766)-12
val[10] = retval[11] * 0.09765
'
def ccdstatus_init_normal '
min[0] = 10 ; max[0] = 30 ; label[0] = "Water flow"
min[1] = 100 ; max[1] = 670 ; label[1] = "Vacuum"
min[2] = -21 ; max[2] = -19 ; label[2] = "CCD Temp"
min[3] = 8.5 ; max[3] = 9.5 ; label[3] = "VDD"
min[4] = -10.1 ; max[4] = -9.8 ; label[4] = "VSS"
min[5] = 2 ; max[5] = 3 ; label[5] = "VDR"
min[6] = -10 ; max[6] = -8.0 ; label[6] = "VGS"
min[7] = 0.2 ; max[7] = 0.6 ; label[7] = "VLD"
min[8] = 2.3 ; max[8] = 2.6 ; label[8] = "VPAD"
min[9] = -1.7 ; max[9] = -1.4 ; label[9] = "VPD"
min[10] = -9.7 ; max[10] = -9.4 ; label[10] = "VSSD"
min[11] = 25 ; max[11] = 65 ; label[11] = "PCB Temp"
'
def ccdstatus_init_mpp_new '
min[0] = 18 ; max[0] = 40 ; label[0] = "Water flow"
min[1] = 100 ; max[1] = 670 ; label[1] = "Vacuum"
min[2] = -21 ; max[2] = -17 ; label[2] = "CCD Temp"
min[3] = 8.5 ; max[3] = 9.5 ; label[3] = "VDD"
min[4] = -10.1 ; max[4] = -9.8 ; label[4] = "VSS"
min[5] = 2 ; max[5] = 3 ; label[5] = "VDR"
min[6] = -10 ; max[6] = -8.0 ; label[6] = "VGS"
min[7] = 0 ; max[7] = 5 ; label[7] = "Pelt Cur"
min[8] = -9 ; max[8] = -7 ; label[8] = "VLH"
min[9] = -22 ; max[9] = -18 ; label[9] = "VSS2"
min[10] = 25 ; max[10] = 65 ; label[10] = "PCB Temp"
min[11] = "" ; max[11] = "" ; label[11] = ""
'
def ccdstatus_init_mpp '
min[0] = 18 ; max[0] = 40 ; label[0] = "Water flow"
min[1] = 100 ; max[1] = 670 ; label[1] = "Vacuum"
min[2] = -21 ; max[2] = -17 ; label[2] = "CCD Temp"
min[3] = 8.5 ; max[3] = 9.5 ; label[3] = "VDD"
min[4] = -10.1 ; max[4] = -9.8 ; label[4] = "VSS"
min[5] = 2 ; max[5] = 3 ; label[5] = "VDR"
min[6] = -10 ; max[6] = -8.0 ; label[6] = "VGS"
min[7] = -9 ; max[7] = -7 ; label[7] = "VLH"
min[8] = -22 ; max[8] = -18 ; label[8] = "VSS2"
min[9] = 25 ; max[9] = 65 ; label[9] = "PCB Temp"
min[10] = "" ; max[10] = "" ; label[10] = ""
min[11] = "" ; max[11] = "" ; label[11] = ""
'
def ccdstatus_init_2000 '
min[0] = -21 ; max[0] = -17 ; label[0] = "CCDTEMP"
min[1] = 2.5 ; max[1] = 4.5 ; label[1] = "PELTCUR"
min[2] = 100 ; max[2] = 670 ; label[2] = "VACUUM"
min[3] = 25 ; max[3] = 65 ; label[3] = "PCBTEMP"
min[4] = 0 ; max[4] = 5 ; label[4] = "VDR1"
min[5] = 0 ; max[5] = 5 ; label[5] = "VDR2"
min[6] = 0 ; max[6] = 5 ; label[6] = "VDR3"
min[7] = 0 ; max[7] = 5 ; label[7] = "VDR4"
min[8] = "" ; max[8] = "" ; label[8] = ""
min[9] = "" ; max[9] = "" ; label[9] = ""
min[10] = "" ; max[10] = "" ; label[10] = ""
min[11] = "" ; max[11] = "" ; label[11] = ""
'
def ccdrst '{
f3send RST
}'
def ccdtest '{
f3send X7
xacquire 1 1 0 0
p "Setting old Taxi mode = " CCD_TAXI_MODE
f3send X"CCD_TAXI_MODE"
#f3send X6
}'
def ccdvxitest '{
image_par(CCD_U,"test_mode",2)
ARRAYNAME=sprintf("image_data%d",CCD_U)
image_get(CCD_U,@ARRAYNAME)
image_par(CCD_U,"test_mode",0)
}'
#
# Set of macros to ajust the offset
#
def setfrelon2000 '
global FRELON2000
if (image_par(CCD_U,"type")&0x10) {
FRELON2000=1
} else {
FRELON2000=0
}
'
#
# DFC 2004/09/10 Added channels 13 24 in ccdoffset
#
#
#
def ccdoffset '{
global FRELON2000
local thech _mirror _ccdtrig _ccdkinetics _ccdroi
if (GUI_RUN) Xval("xstrout","")
if (!$#) {
channel = getval("Channel to adjust ( 0 = all )",4)
level = getval("Desired output level",100)
itime = getval("Integration time (in msec)",100)
tolera = getval("Error tolerance",0.5)
} else {
channel = $1
level = $2
itime = $3
tolera = $4
}
if (channel == 5 )
channel = 12
if (channel == 6 )
channel = 13
if (channel == 7 )
channel = 23
if (channel == 8 )
channel = 34
if ((channel!=0) && (channel!=1) && (channel!=2) && (channel!=3) && \
(channel!=4) && (channel!=12) && (channel !=13) && (channel !=23) \
&& (channel!=34) ) {
printf("Channel must be between one of 0,1,2,3,4,12,13,23,34")
exit
}
if ( level < 10 || level > 15000 ) {
printf("Wrong value for output level ")
exit
}
setfrelon2000
p "Setting Internal Trigger"
_ccdtrig = image_par(CCD_U,"ext_trig")
image_par(CCD_U,"ext_trig",0)
p "Setting Kinetics off"
_ccdkinetics = image_par(CCD_U,"kinetics")
image_par(CCD_U,"kinetics",0)
_ccdroi[1] = image_par(CCD_U,"row_beg")
_ccdroi[2] = image_par(CCD_U,"row_end")
_ccdroi[3] = image_par(CCD_U,"col_beg")
_ccdroi[4] = image_par(CCD_U,"col_end")
if ((_ccdroi[2] - _ccdroi[1] != image_par(CCD_U, "rows")-1 ) || \
_ccdroi[4] - _ccdroi[3] != image_par(CCD_U, "cols")-1 ) {
_ccdroi[0] = 1
} else {
_ccdroi[0] = 1
}
p "Setting ROI off"
ccdroi 0 0 2047 0 2047
binn = 0
print
if ( image_par(CCD_U,"row_bin") == 2 ) {
if ( image_par(CCD_U,"col_bin") == 2 ) {
binn = 1
printf("Binning\n")
}
} else {
printf("No Binning\n")
}
printf("Closing SHUTTER...\n")
image_par(CCD_U,"images",1)
f3send U0
if (image_par(CCD_U,"controller")=="CCD_PC") {
local _res _myresult
_res = image_par(CCD_U,"hw_par")
split(_res,_myresult," ")
_mirror = _myresult[0]
image_par(CCD_U,"hw_par",sprintf("%d %d %d %d", 0, _myresult[1], _myresult[2],_myresult[3]))
if (binn) {
ccdbin 1 1
ccdbin 2 2
}
} else {
_mirror = image_par(CCD_U,"flip")
image_par(CCD_U,"flip",0)
}
printf("Make sure that the image is not mirrored \n")
printf("mirror was %d \n",_mirror)
if (image_par(CCD_U,"controller")=="CCD_PC")
f3_dump
sleep(0.5)
# image_par(CCD_U,"preset",itime/1000)
# image_par(CCD_U,"run")
# sleep(0.2)
# stop(4)
# It makes the macro stops working with certain cameras (ID11 MPP)
if ( channel == 0 ) {
mode = 1
#ccd_frelonsetup 0
image_par(CCD_U,"input_channel",15)
sleep(1)
for ( ii = 1;ii<5;ii++) {
ccd_1channel(ii,level,tolera,binn,mode)
}
} else if ((channel==1)||(channel==2)||(channel==3)||(channel==4)) {
mode = 0
#ccd_frelonsetup channel
image_par(CCD_U,"input_channel",(channel == 0)?15:pow(2,channel-1))
sleep(1)
ccd_1channel(channel,level,tolera,binn,mode)
} else if (channel == 12) {
mode = 2
#ccd_frelonsetup channel
image_par(CCD_U,"input_channel",3)
sleep(1)
ccd_1channel(1,level,tolera,binn,mode)
ccd_1channel(2,level,tolera,binn,mode)
} else if (channel == 13) {
mode = 2
#ccd_frelonsetup channel
image_par(CCD_U,"input_channel",5)
sleep(1)
ccd_1channel(1,level,tolera,binn,mode)
ccd_1channel(3,level,tolera,binn,mode)
} else if (channel == 23) {
mode = 2
#ccd_frelonsetup channel
image_par(CCD_U,"input_channel",6)
sleep(1)
ccd_1channel(2,level,tolera,binn,mode)
ccd_1channel(3,level,tolera,binn,mode)
} else if (channel == 34) {
mode = 2
#ccd_frelonsetup channel
image_par(CCD_U,"input_channel",12)
sleep(1)
ccd_1channel(3,level,tolera,binn,mode)
ccd_1channel(4,level,tolera,binn,mode)
}
printf ("\n\n*****OFFSET CALIBRATION FINISHED*****\n")
#image_data0[0][0]=image_data0[0][0]
print "Shutter control from Frelon active "
f3send U1
if (_mirror) {
printf("Reseting flip in mux to %d \n",_mirror)
if (image_par(CCD_U,"controller")=="CCD_PC") {
local _res _myresult
_res = image_par(CCD_U,"hw_par")
split(_res,_myresult," ")
_mirror = _myresult[0]
image_par(CCD_U,"hw_par",sprintf("%d %d %d %d", _mirror, _myresult[1], _myresult[2],_myresult[3]))
} else {
image_par(CCD_U,"flip",_mirror)
}
}
if (_ccdroi[0]) {
printf("Reseting roi to %d %d %d %d\n",_ccdroi[1], _ccdroi[2], _ccdroi[3], _ccdroi[4])
ccdroi _ccdroi[0] _ccdroi[1] _ccdroi[2] _ccdroi[3] _ccdroi[4]
}
if (_ccdtrig) {
printf("Reseting External trigger\n")
image_par(CCD_U,"ext_trig",_ccdtrig)
}
if (_ccdkinetics) {
printf("Reseting Kinetics (window size = %d)\n",\
image_par(CCD_U,"kinwinsize"))
image_par(CCD_U,"kinetics",_ccdkinetics)
}
xfrelon
}'
def ccd_1channel(cha,level,tol,bin,mode) '{
local outerror thech cmd
local gain total diff aver oldgain olddiff
local FACTOR first
global NEW_CCDOFFSET
NEW_CCDOFFSET = 1
thech = cha - 1
tty_cntl("md")
printf("\n\nAdjusting channel--> ")
printf(" %d ",cha)
tty_cntl("me")
printf("\n\n%d\n",FRELON2000)
if (FRELON2000) {
cmd[0] = "DI"
cmd[1] = "DJ"
cmd[2] = "DK"
cmd[3] = "DL"
} else {
cmd[0] = "DA"
cmd[1] = "DB"
cmd[2] = "DC"
cmd[3] = "DD"
}
gain = 0
iter = 0
outerror = 16000
first = 1
if (!bin) {
if (mode == 0) { # One channel - no binning
fx = 100 ; fy = 100
lx = 399 ; ly = 399
}
if (mode == 1 || mode == 2) { # Four channels - no binning
if (cha == 1 ) { fx = 125 ; fy = 125 }
if (cha == 2 ) { fx = 125 ; fy = 625 }
if (cha == 3 ) { fx = 625 ; fy = 125 }
if (cha == 4 ) { fx = 625 ; fy = 625 }
lx = fx + 250 ; ly = fy + 250
}
} else {
if (mode == 0) { # One channel - binning
fx = 50 ; fy = 50
lx = 199 ; ly = 199
}
if (mode == 1 || mode == 2) { # Four channels. binning
if (cha == 1 ) { fx = 62 ; fy = 62 }
if (cha == 2 ) { fx = 62 ; fy = 317 }
if (cha == 3 ) { fx = 317 ; fy = 62 }
if (cha == 4 ) { fx = 317 ; fy = 317 }
lx = fx + 125 ; ly = fy + 125
}
}
# If FRELON 2000 (2048 x 2048 )
if (FRELON2000) {
FACTOR=2
} else { # If FRELON (1024 x 1024 )
FACTOR=1
}
fx*=FACTOR; fy*=FACTOR; lx*=FACTOR; ly*=FACTOR
n_pixels = ( lx - fx + 1) * ( ly - fy + 1)
print
while ( outerror > tol ) {
newcmd = sprintf("%s%d",cmd[thech],gain)
iter ++
printf("\t - %2d. %s --> ",iter,newcmd)
strout = sprintf("Ch%d-(%d) %4d -> ",thech+1,iter,gain)
image_par(CCD_U,"talk",sprintf("%s\r\n",newcmd))
if (GUI_RUN)
Xval("xccdstate",sprintf("Sending %s",newcmd))
sleep(0.3)
for(;(res =image_par(CCD_U,"talk"))!="";) {
substr(res,0,3)
if (res=="!OK"){
if (GUI_RUN)
Xval("xccdstate",sprintf("WARN: Error sending %s",newcmd))
else
p "WARN: Error sending " newcmd
}
}
image_par(CCD_U,"run")
waitacq
ARRAYNAME=sprintf("image_data%d",CCD_U)
image_get(CCD_U,@ARRAYNAME)
total = array_op("sum",@ARRAYNAME[fx:lx][fy:ly])
aver = total / n_pixels
printf("\tAverage = %3.2f",aver)
strout= sprintf("%s av= %3.2f",strout,aver)
diff = aver - level
outerror=fabs(diff)
if (NEW_CCDOFFSET) {
if (first) {
olddiff = diff
oldgain = gain
gain = int(gain + diff*2.4)
first = 0
# it estimates the gain considering a factor 2.4
# to calculate the next point we use the ecuation of a line
# from the previous two points.
#
# Marco Di Michie
} else {
#
# y = mx + q
# y ---> diff x ----> gain
# it calculates two points and of a line and then it goes to the
# third one (where diff is 0)
#
local _tmp
if (olddiff != diff)
_tmp = gain - diff * (oldgain -gain) / (olddiff - diff)
else
_tmp = gain
olddiff = diff
oldgain = gain
gain = _tmp
}
} else {
oldgain = gain
gain = int(gain + diff*4)
}
if (gain>4095) gain=4095
if (gain<=0) gain = int(oldgain/2)
strout = sprintf("%s. er = %3.3f", strout,outerror)
printf(". Diff. = %3.3f \r", outerror)
if (iter > 40) {
printf ("\nCANNOT CONVERGE. Sorry\n")
strout = sprintf ("CANNOT CONVERGE. Sorry")
break
}
if (GUI_RUN) Xval("xstrout",strout)
}
if (iter < 40 )
if (GUI_RUN) Xval("xstrout","Calibration: DONE")
}'
#
# Macros for Frelon CCD used from SpecGUI panels.
# ( for demo on "Salon de la Physique 7-9 Oct 1997 )
#
# Author: V.Rey
#
# Date: October 1997
#
global CCD_STATE CCD_CURRENT BINNING MULTIout
global CCD_LINE CCD_ROIY CCDINTF CCDINTFL
#
# FRELON.PAN
#
#%UU%
#%MDESC%
# Update SpecGUI values
# ( called when panel opened and at other several places )
#
def xfrelon '{
global CCD_TAXI_MODE
local ccdsize ccdtrig ccdtrig_state inch ccdinch xout
local ccdxbin ccdybin ccdrbeg ccdrend ccdcbeg ccdcend
local answer ccdtemp talkval
local _bla,_n,_i,_f,_t,_rlb,_rlw,_rpb,_rpw,_sln,_sinn
local _p,_l,_m,_z,_r,_rf,_bl,_bv,_bh,_su,_u;
if (whatis("CCDINTF") & 0x8000000 ) CCDINTF = "NONE"
ccdsize = sprintf("%dx%d",image_par(CCD_U,"rows"),image_par(CCD_U,"cols"))
ccdtrig = image_par(CCD_U,"ext_trig")?"Int":"Ext"
ccdtrig_state = \
image_par(CCD_U,"ext_trig")?"Trig.is ext.(TTL)":"Trig.is int.(Spec)"
inch = image_par(CCD_U,"input_channel")
if (inch == 15) { ccdinch = "all" }
else {
if ( inch & 1 ) ccdinch = sprintf("1 ")
if ( inch & 2 ) ccdinch = sprintf("%s2 ",ccdinch)
if ( inch & 4 ) ccdinch = sprintf("%s3 ",ccdinch)
if ( inch & 8 ) ccdinch = sprintf("%s4 ",ccdinch)
}
for(;(res =image_par(CCD_U,"talk"))!="";); # clear buffer (f3_dumm)
image_par(CCD_U,"talk",sprintf("DUM\r\n")); # f3send DUMM
sleep(.3)
for(i=0;i<5;i++) {res =image_par(CCD_U,"talk")}
sscanf(res,"%3s:%d",_bla,CCD_TAXI_MODE)
sleep(.3); res =image_par(CCD_U,"talk")
if (FRELON2000) {
sscanf(res,"%3s:%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,\
%d,%d,%d,%d,%d,%d",_bla,_n,_i,_f,_t,_rlb,_rlw,_rpb,_rpw, \
_sln,_sinn,_p,_l,_m,_z,_r,_rf,_bl,_bv,_bh,_su,_u)
} else {
# Commented out by V.Rey. 4/6/1999 - I do not see the need for this
# and when left overwrites res with nothing and the sscanf does
# not work
#res =image_par(CCD_U,"talk");
sscanf(res,"%3s:%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,\
%d,%d,%d,%d,%d",_bla,_n,_i,_f,_t,_rlb,_rlw,_rpb,_rpw, \
_sln,_sinn,_p,_l,_m,_z,_r,_rf,_bl,_bv,_bh,_u) # without _su
}
for(;(res =image_par(CCD_U,"talk"))!="";); # clear buffer (f3_dumm)
#
# I have commented out the actualization of the shutter state because
# there was a problem with _su (some cameras have it some dont)
# So we trurst the Shutter command, and we dont read the real state
# in the camera
# DFC 2/3/2001
# if (_u==0) {
# Xval("xsh","On")
# Xval("shutter_state","Shutter is OFF")
# }
# else {
# Xval("xsh","Off")
# Xval("shutter_state","Shutter is ON")
# }
if (_bl==0) {
Xval("xblo","On")
Xval("bloom_state","Antibloom. is OFF")
}
else {
Xval("xblo","Off")
Xval("bloom_state","Antibloom. is ON")
}
if (_bv || _bh ) {
Xval("xroilist",3)
BINNING=1
if (!_bv || !_bh)
Xval("xccdstate","WARN: Either BV or BH not set!!!!" )
sleep(1)
if ( _r) {
Xval("xccdstate","WARN: Both ROI&BINNING are set!!!!" )
sleep(1)
}
} else {
BINNING=0
if( _r) {
if (_rf) Xval("xroilist",1)
else Xval("xroilist",2)
} else
Xval("xroilist",0)
}
if (_r) {
Xval("xccdrbeg",_rlb)
Xval("xccdrend",_rlb+_rlw-1)
Xval("xccdcbeg",_rpb)
Xval("xccdcend",_rpb+_rpw-1)
} else {
Xval("xccdrbeg","")
Xval("xccdrend","")
Xval("xccdcbeg","")
Xval("xccdcend","")
}
ccdstatus
# In the lab they want to see the values in the camera (not in spec)
# ccdrbin = image_par(CCD_U,"row_bin")
# ccdcbin = image_par(CCD_U,"col_bin")
#
ccdrbeg = image_par(CCD_U,"row_beg")
ccdrend = image_par(CCD_U,"row_end")
ccdcbeg = image_par(CCD_U,"col_beg")
ccdcend = image_par(CCD_U,"col_end")
#if ( image_par(CCD_U,"rows") == ccdrend - ccdrbeg + 1) {
# if ( image_par(CCD_U,"cols") == ccdcend - ccdcbeg + 1 ) {
# CCD_ROIY = 0
# }
#}
if (ccdinch == "" ) ccdinch = "none"
Xval("xccdsize",ccdsize)
Xval("xsetuptrig",ccdtrig)
Xval("trigger_state",ccdtrig_state)
Xval("xccdinch",ccdinch)
Xval("xroilist",CCD_ROIY)
# Xval("xccdrbin",ccdrbin)
# Xval("xccdcbin",ccdcbin)
Xval("xccdrbeg",ccdrbeg)
Xval("xccdrend",ccdrend)
Xval("xccdcbeg",ccdcbeg)
Xval("xccdcend",ccdcend)
Xval("xccdintf",CCDINTF)
Xval("xccdintfl",CCDINTFL)
Xval("xccdstate","Idle")
xkinetics
inch = image_par(CCD_U,"input_channel")
if (inch == 15 ) { xout = 0 ;MULTIout=1}
else if ( inch == 1 ) { xout = 1 ;MULTIout=0}
else if ( inch == 2 ) { xout = 2 ;MULTIout=0}
else if ( inch == 4 ) { xout = 3 ;MULTIout=0}
else if ( inch == 8 ) { xout = 4 ;MULTIout=0}
else if ( inch == 3 ) { xout = 5 ;MULTIout=1}
else if ( inch == 5 ) { xout = 6 ;MULTIout=1}
else if ( inch == 10 ) { xout = 7 ;MULTIout=1}
else if ( inch == 12 ) { xout = 8 ;MULTIout=1}
else { xout = 0 ;MULTIout=0}
Xval("xout",xout)
Xval("xflip",XFLIP)
}'
#%UU%
#%MDESC%
# Binning and roi.
# ( called when APPLY button pressed )
#
def xbinroi '{
if ($1==3) {
xbin 2 2
xroi 0 $2 $3 $4 $5
CCD_ROIY = 3
xfrelon
Xval("xccdstate","Info: Binning doesnt allow ROI" )
} else {
xbin 1 1
xroi $1 $2 $3 $4 $5
xfrelon
if (MULTIout && $1) {
Xval("xccdstate","ROI & MultiOutput not available" )
}
}
}'
#%UU%
#%MDESC%
# ROI change
# ( called when REGION OF INTEREST list is changed or from xbinroi macro)
#
def xroi '{
if ($1 == 1) {
print "Fast ROI"
CCD_ROIY = 1
f3send R1 #----
f3send RF1
}
if ($1 == 2) {
print "Slow ROI"
CCD_ROIY = 2
f3send R1 #----
f3send RF0
}
if ($1 == 0) {
CCD_ROIY = 0
print "No ROI"
f3send R0 #----
}
ccdroi $1 $2 $3 $4 $5
}'
#
# Binning. Called from xbinroi
#
def xbin '{
local robin cobin
if ($1 != 2 ) {
robin = 1
f3send BH0
} else {
robin = $1
f3send BH1
}
sleep(0.3)
if ($2 != 2 ) {
cobin = 1
f3send BV0
} else {
cobin = $1
f3send BV1
}
ccdbin robin cobin
}'
#
# Send ROI values directly to the camera (Det Lab)
def send_roi_col_beg'{
f3send RPB"$1"
image_par(CCD_U,"col_beg",$1)
}'
def send_roi_row_beg'{
f3send RLB"$1"
image_par(CCD_U,"row_beg",$1)
}'
def send_roi_col_width '{
local col_width
col_width=$1-$2
if (col_width <= 0)
printf ("Column end - column begin must be positive \n")
else {
f3send RPW"col_width"
image_par(CCD_U,"col_end",$1)
}
}'
def send_roi_row_width '{
local row_width
row_width=$1-$2
if (row_width <= 0)
printf ("Row end - row begin must be positive \n")
else {
f3send RLW"row_width"
image_par(CCD_U,"row_end",$1)
}
}'
#
# Acquisition. Called from ACQUIRE button
#
def xacquire '{
local noimg nsweeps sto_mode exptime
if ( $1 == 0 ) {
exptime = 1
} else {
exptime = $1
}
if ( int($2) == 0 ) {
noimg = 1
} else {
noimg = int($2)
}
if ( int($3) < 0 ) {
nsweeps = 0
} else {
nsweeps = int($3)
}
if ($# == 4 )
sto_mode = $4
image_par(CCD_U,"get_offset",0)
if (CCDINTFL==4)
image_par(CCD_U,"storage",0)
if (sto_mode == 0 ) {
image_par(CCD_U,"sweeps",0)
} else {
if ( nsweeps > 1 ) {
if (CCDINTFL==4) image_par(CCD_U,"storage",sto_mode+1)
image_par(CCD_U,"sweeps",nsweeps)
printf("\tAccumulation for %d sweeps ( \"%s\" mode ) \n",nsweeps, \
(sto_mode==1)?"C":"D/E")
printf("\ttotal number of images = %d \n",nsweeps * noimg )
}
}
CCD_CURRENT = 1; xupdcurrent
image_par(CCD_U,"preset",exptime)
image_par(CCD_U,"images",noimg)
ccd_createarray
image_par(CCD_U,"run")
aaa = time()
CCD_STATE = "Acquiring"; xupdstate
xwaitacq
CCD_STATE = "Reading"; xupdstate
ttime = time() - aaa
atime = noimg/ttime
ARRAYNAME=sprintf("image_data%d",CCD_U)
image_get(CCD_U,@ARRAYNAME)
CCD_STATE = sprintf("Idle.__%2.2f_i/sec",atime); xupdstate
xfrelon
}'
#
# Updates current image on film
#
def xupdcurrent '{
Xval("xcurrent",CCD_CURRENT)
}'
#
# Updates CCD state
#
def xupdstate '{
Xval("xccdstate",CCD_STATE)
}'
#
# Continuous acquisition.
# (called from CONTINUOUS button. )
#
def xcontinuous '{
local acqtime
if ($1 == 0 ) {
acqtime = 1
} else {
acqtime = $1
}
print "Acquiring continuous. Exposure: " acqtime "sec."
image_par(CCD_U,"images",1)
image_par(CCD_U,"preset",acqtime)
CCD_CURRENT = 1; xupdcurrent
aaa = time()
rdef cleanup \'ccd_cleancont\'
for (ctr=1;;ctr++) {
image_par(CCD_U,"run")
xwaitacq
ARRAYNAME=sprintf("image_data%d",CCD_U)
image_get(CCD_U,@ARRAYNAME)
if (ctr%5 == 0) {
ttime = time() - aaa
aaa = time()
rate = 5 / ttime
CCD_STATE = sprintf("%3.2f__im/sec",rate)
xupdstate
}
}
}'
def ccd_cleancont '{
printf("xcontinuous stop\n")
Xval("xccdstate","Idle")
rdef cleanup ""
}'
#
# Sets antiblooming option on and off
# ( called from AntiBLOOM button )
def xbloom '{
if ( "$1" == "On" ) {
f3send BL1
Xval("xblo","Off")
Xval("bloom_state","Antibloom. is ON")
} else {
f3send BL0
Xval("xblo","On")
Xval("bloom_state","Antibloom. is OFF")
}
}'
#
# Opens and close the camera shutter
# ( called from SHUTTER button )
def xshutter '{
if ( "$1" == "On" ) {
print "Setting Shutter ON"
sleep(0.5)
f3send U1
Xval("xsh","Off")
Xval("shutter_state","Shutter is ON")
} else {
print "Setting Shutter OFF"
sleep(0.5)
f3send U0
Xval("xsh","On")
Xval("shutter_state","Shutter is Off")
}
}'
#
# sends acquisition time directly to the camera
#
def send_acq_time'{
local ptime
ptime=$1*1000
image_par(CCD_U,"preset","$1")
f3send I"ptime"
}'
#
# sends Number of images directly to the camera
#
def send_no_images'{
image_par(CCD_U,"images","$1")
f3send N"$1"
}'
#
# Starts stop tunning mode (automatic start)
# ( called from TUNNING button )
def xtunning_on_off '{
local e_time
if ( "$1" == "Tunning_Start" ) {
print "Starting tunning"
e_time=$2*1000
f3send I"e_time"
f3send N0
f3send S
Xval("xtunning","Tunning_Stop")
CCD_STATE = "Tunning ON"; xupdstate
} else {
print "Stopping tunning"
f3send N1
Xval("xtunning","Tunning_Start")
CCD_STATE = "Tunning OFF"; xupdstate
}
}'
#
# Starts a film on the images after a ACQUIRE action
# ( called from Film button )
def xfilm '{
local filmtime
if ($1 == 0 ) {
filmtime = 1
} else {
filmtime = $1
}
for (i=0;i<image_par(CCD_U,"images");i++) {
CCD_CURRENT = i + 1; xupdcurrent
image_par(CCD_U,"get_offset",i)
ARRAYNAME=sprintf("image_data%d",CCD_U)
image_get(CCD_U,@ARRAYNAME)
#if ( (ch = input(-1) ) != "")
# if (ch == "~")
# break
sleep(filmtime)
}
}'
#
# Shows next image in film
# ( NEXT button )
def xnext '{
local nimages
nimages = image_par(CCD_U,"images")
CCD_CURRENT = image_par(CCD_U,"get_offset") + 1
if (CCD_CURRENT < nimages ) {
image_par(CCD_U,"get_offset",CCD_CURRENT)
ARRAYNAME=sprintf("image_data%d",CCD_U)
image_get(CCD_U,@ARRAYNAME)
CCD_CURRENT++; xupdcurrent
}
}'
#
# Shows previous image in film
# ( PREV button )
def xprev '{
local nimages
nimages = image_par(CCD_U,"images")
CCD_CURRENT = image_par(CCD_U,"get_offset") + 1
if (CCD_CURRENT > 1 ) {
image_par(CCD_U,"get_offset",CCD_CURRENT-2)
ARRAYNAME=sprintf("image_data%d",CCD_U)
image_get(CCD_U,@ARRAYNAME)
CCD_CURRENT--; xupdcurrent
}
}'
#
# Polling on acquisition.
# Will catch action on STOP button (~)
#
def xwaitacq '{
while (wait(0x24)) {
sleep(0.1)
}
user_waitacq
}'
#
# Will stop current acquisition if
# STOP button is pressed.
def xstopacq '{
print "Stop requested"
stop(4)
}'
#
# Sets external trigger on or off
# ( called from TRIGGER button )
def xtrigger '{
local new_trig
if ( "$1" == "Ext" ) {
image_par(CCD_U,"ext_trig",1)
} else {
image_par(CCD_U,"ext_trig",0)
}
xfrelon
}'
#
# Selects
# ( called from radio buttons )
def xcmdout '{
local thech chanout chansend
thech = $1
if (thech == 0 ) { chanout = 15 }
else if ( thech == 1 ) { chanout = 1 }
else if ( thech == 2 ) { chanout = 2 }
else if ( thech == 3 ) { chanout = 4 }
else if ( thech == 4 ) { chanout = 8 }
else if ( thech == 5 ) { chanout = 3 }
else if ( thech == 6 ) { chanout = 5 }
else if ( thech == 7 ) { chanout = 10 }
else if ( thech == 8 ) { chanout = 12 }
else { chanout = 0 }
image_par(CCD_U,"input_channel",chanout)
if (thech == 0 ) { chansend = 9 }
else if ( thech == 1 ) { chansend = 1 }
else if ( thech == 2 ) { chansend = 2 }
else if ( thech == 3 ) { chansend = 3 }
else if ( thech == 4 ) { chansend = 4 }
else if ( thech == 5 ) { chansend = 7 }
else if ( thech == 6 ) { chansend = 5 }
else if ( thech == 7 ) { chansend = 6 }
else if ( thech == 8 ) { chansend = 8 }
else { chansend = 0 }
f3send M"chansend"
xfrelon
}'
def ccdsv '{
p "ccdsv " "$*"
if ($1 == 0) {
CCDINTF = "SDV"
CCDINTFL = 0
u /opt/EDTsdv/fast1024
u cp /users/j/specadm/local/userconf/sdv /users/j/specadm/spec.d/neron/config
} else if ($1==1) {
CCDINTF = "SDV_MUX"
CCDINTFL = 1
u /opt/EDTsdv/fastmux
u cp /users/j/specadm/local/userconf/sdv /users/j/specadm/spec.d/neron/config
} else if ($1==2) {
CCDINTF = "SDV_MUX_S"
CCDINTFL = 2
u /opt/EDTsdv/fastmux
u cp /users/j/specadm/local/userconf/sdv_ser /users/j/specadm/spec.d/neron/config
}
# } else if ($1==2) {
# CCDINTF = "VXI"
# CCDINTFL = 4
# u cp /users/j/specadm/local/userconf/vxi /users/j/specadm/spec.d/neron/config
# }
sleep(3);
reconfig
ccd_createarray;
#ccd_frelonsetup CCD_INCH[0] 0
#xfrelon
#xupdsetup
}'
def xclosedacs '{
# bpipe openclosepanel dacs close; epipe
}'
def ccdpars '{
if ($# != 3 ) {
print "usage: ccdpars images sweeps sto_mode"
exit
}
image_par(CCD_U,"images",$1)
image_par(CCD_U,"storage",0)
if ( $3 > 1 ) {
if ($2 > 1) {
image_par(CCD_U,"storage",$3+1)
image_par(CCD_U,"sweeps",$2)
}
} else {
image_par(CCD_U,"storage",0)
image_par(CCD_U,"sweeps",0)
}
ccd_createarray
}'
def Xccdsize '{
if ($1==0) {
MANUALSIZE=0
} else if ($1==1){
MANUALSIZE=1
FRELON2000=0
} else if ($1==2){
MANUALSIZE=1
FRELON2000=1
}
}'
#%IU%
#%MDESC%
# Send command DUM. Get answers: two readings are necessary
# for each string.
# First string: dac values ( non binning )
# Second string: dac values ( binning )
# then clear serial line buffer and updata GUI values
def xdacs '{
if (FRELON2000) {
sleep(0.3)
xdacs_2000
}else {
xdacs_norm
}
}'
def xdacs_norm '{
local bla,i
local dac
local dbin
for(;(res =image_par(CCD_U,"talk"))!="";) ; # clear buffer (f3_dumm)
image_par(CCD_U,"talk",sprintf("D\r\n")) # f3send D
res =image_par(CCD_U,"talk")
for (i=0;i<4;i++)
{
res =image_par(CCD_U,"talk")
sscanf(res,"%2s;%s%s\t:%d",bla,bla,bla,dac[i])
}
for (i=4;i<6;i++)
{
res =image_par(CCD_U,"talk")
sscanf(res,"%2s;%s%s%s%s\t:%d",bla,bla,bla,bla,bla,dac[i])
}
for (i=6;i<12;i++)
{
res =image_par(CCD_U,"talk")
sscanf(res,"%2s;%s%s%s\t:%d",bla,bla,bla,bla,dac[i])
}
res =image_par(CCD_U,"talk")
sscanf(res,"%2s;%s%s\t:%d",bla,bla,bla,dac[i])
for (i=13;i<16;i++)
{
res =image_par(CCD_U,"talk")
sscanf(res,"%2s;%s%s%s\t:%d",bla,bla,bla,bla,dac[i])
}
for (i=16;i<20;i++)
{
res =image_par(CCD_U,"talk")
sscanf(res,"%2s;%s\t:%d",bla,bla,dac[i])
}
for(;(res =image_par(CCD_U,"talk"))!="";); # clear buffer (f3_dumm)
Xval("xda_name","DA: Offset B1")
Xval("xdb_name","DB: Offset B2")
Xval("xdc_name","DC: Offset A3")
Xval("xdd_name","DD: Offset A4")
Xval("xde_name","DE: Duty Cycle phi L1")
Xval("xdf_name","DF: Duty Cycle phi L2")
Xval("xdg_name","DG: Position phi L")
Xval("xdh_name","DH: Position phi R")
Xval("xdi_name","DI: Offset Preamp B1")
Xval("xdj_name","DJ: Offset Preamp B2")
Xval("xdk_name","DK: Offset Preamp A3")
Xval("xdl_name","DL: Offset Preamp A4")
Xval("xdm_name","DM: CDS Position")
Xval("xdn_name","DN: signal gate pos.")
Xval("xdp_name","DP: CDS gate width")
Xval("xdq_name","DQ: data convert pos.")
Xval("xdr_name","DR: VDD")
Xval("xds_name","DS: VDR")
Xval("xdt_name","DT: VSSD")
Xval("xdu_name","DU: VSS")
Xval("xdv_name","DV: -------")
Xval("xdw_name","DW: -------")
Xval("xdx_name","DX: -------")
Xval("xdy_name","DY: -------")
Xval("xdz_name","DZ: -------")
Xval("xdaa_name","Da: -------")
Xval("xdab_name","Db: -------")
Xval("xdac_name","Dc: -------")
Xval("xda",dac[0])
Xval("xdb",dac[1])
Xval("xdc",dac[2])
Xval("xdd",dac[3])
Xval("xde",dac[4])
Xval("xdf",dac[5])
Xval("xdg",dac[6])
Xval("xdh",dac[7])
Xval("xdi",dac[8])
Xval("xdj",dac[9])
Xval("xdk",dac[10])
Xval("xdl",dac[11])
Xval("xdm",dac[12])
Xval("xdn",dac[13])
Xval("xdp",dac[14])
Xval("xdq",dac[15])
Xval("xdr",dac[16])
Xval("xds",dac[17])
Xval("xdt",dac[18])
Xval("xdu",dac[19])
GAIN=dac[19]
}'
def xdacs_2000 '{
global bla dac
local i
local dbin
for(;(res =image_par(CCD_U,"talk"))!="";) ; # clear buffer (f3_dumm)
sleep(0.3)
image_par(CCD_U,"talk",sprintf("DUM\r\n")) # f3send D
sleep(0.3)
if (BINNING) { # data are two lines after
res =image_par(CCD_U,"talk");sleep(0.3)
res =image_par(CCD_U,"talk");sleep(0.3)
}
res =image_par(CCD_U,"talk")
split(res,bla,":")
n_ret = split(bla[1],dac,",")
sscanf(dac["27"],"%d\\r\\n",dac["27"]) # takes \r and \n out
for(;(res =image_par(CCD_U,"talk"))!="";); # clear buffer (f3_dumm)
Xval("xda_name","DA: PREAMP OFFSET B1")
Xval("xdb_name","DB: PREAMP OFFSET B2")
Xval("xdc_name","DC: PREAMP OFFSET A3")
Xval("xdd_name","DD: PREAMP OFFSET A4")
Xval("xde_name","DE: PREAMP GAIN B1")
Xval("xdf_name","DF: PREAMP GAIN B2")
Xval("xdg_name","DG: PREAMP GAIN A3")
Xval("xdh_name","DH: PREAMP GAIN A4")
Xval("xdi_name","DI: BACKGROUND LEVEL B1")
Xval("xdj_name","DJ: BACKGROUND LEVEL B2")
Xval("xdk_name","DK: BACKGROUND LEVEL A3")
Xval("xdl_name","DL: BACKGROUND LEVEL A4")
Xval("xdm_name","DM: CDS POSITION")
Xval("xdn_name","DN: SIGNAL GATE POSITION")
Xval("xdp_name","DP: CDS GATE WIDTH")
Xval("xdq_name","DQ: DATA CONVERT POSITION")
Xval("xdr_name","DR: VDR B1")
Xval("xds_name","DS: VDR B2")
Xval("xdt_name","DT: VDR A3")
Xval("xdu_name","DU: VDR A4")
Xval("xdv_name","DV: PHI R POSITION")
Xval("xdw_name","DW: PHI R WIDTH")
Xval("xdx_name","DX: PHI LA1 POSITION")
Xval("xdy_name","DY: PHI LA1 WIDTH")
Xval("xdz_name","DZ: PHI LA2 WIDTH")
Xval("xdaa_name","Da: PHI LB1 POSITION")
Xval("xdab_name","Db: PHI LB1 WIDTH")
Xval("xdac_name","Dc: PHI LB2 WIDTH")
Xval("xda",dac[0])
Xval("xdb",dac[1])
Xval("xdc",dac[2])
Xval("xdd",dac[3])
Xval("xde",dac[4])
Xval("xdf",dac[5])
Xval("xdg",dac[6])
Xval("xdh",dac[7])
Xval("xdi",dac[8])
Xval("xdj",dac[9])
Xval("xdk",dac[10])
Xval("xdl",dac[11])
Xval("xdm",dac[12])
Xval("xdn",dac[13])
Xval("xdp",dac[14])
Xval("xdq",dac[15])
Xval("xdr",dac[16])
Xval("xds",dac[17])
Xval("xdt",dac[18])
Xval("xdu",dac[19])
Xval("xdv",dac[20])
Xval("xdw",dac[21])
Xval("xdx",dac[22])
Xval("xdy",dac[23])
Xval("xdz",dac[24])
Xval("xd_a",dac[25])
Xval("xd_b",dac[26])
Xval("xd_c",dac[27])
}'
#
# Send values from specGUI to each DAC
# Test version does not check the return string
# "xdacs clears" clears the buffer at the beguining
def xdacs_send_A '{ image_par(CCD_U,"talk",sprintf("DA%d\r\n",$1)); xdacs }'
def xdacs_send_B '{ image_par(CCD_U,"talk",sprintf("DB%d\r\n",$1)); xdacs }'
def xdacs_send_C '{ image_par(CCD_U,"talk",sprintf("DC%d\r\n",$1)); xdacs }'
def xdacs_send_D '{ image_par(CCD_U,"talk",sprintf("DD%d\r\n",$1)); xdacs }'
def xdacs_send_E '{ image_par(CCD_U,"talk",sprintf("DE%d\r\n",$1)); xdacs }'
def xdacs_send_F '{ image_par(CCD_U,"talk",sprintf("DF%d\r\n",$1)); xdacs }'
def xdacs_send_G '{ image_par(CCD_U,"talk",sprintf("DG%d\r\n",$1)); xdacs }'
def xdacs_send_H '{ image_par(CCD_U,"talk",sprintf("DH%d\r\n",$1)); xdacs }'
def xdacs_send_I '{ image_par(CCD_U,"talk",sprintf("DI%d\r\n",$1)); xdacs }'
def xdacs_send_J '{ image_par(CCD_U,"talk",sprintf("DJ%d\r\n",$1)); xdacs }'
def xdacs_send_K '{ image_par(CCD_U,"talk",sprintf("DK%d\r\n",$1)); xdacs }'
def xdacs_send_L '{ image_par(CCD_U,"talk",sprintf("DL%d\r\n",$1)); xdacs }'
def xdacs_send_M '{ image_par(CCD_U,"talk",sprintf("DM%d\r\n",$1)); xdacs }'
def xdacs_send_N '{ image_par(CCD_U,"talk",sprintf("DN%d\r\n",$1)); xdacs }'
def xdacs_send_P '{ image_par(CCD_U,"talk",sprintf("DP%d\r\n",$1)); xdacs }'
def xdacs_send_Q '{ image_par(CCD_U,"talk",sprintf("DQ%d\r\n",$1)); xdacs }'
def xdacs_send_R '{ image_par(CCD_U,"talk",sprintf("DR%d\r\n",$1)); xdacs }'
def xdacs_send_S '{ image_par(CCD_U,"talk",sprintf("DS%d\r\n",$1)); xdacs }'
def xdacs_send_T '{ image_par(CCD_U,"talk",sprintf("DT%d\r\n",$1)); xdacs }'
def xdacs_send_U '{ image_par(CCD_U,"talk",sprintf("DU%d\r\n",$1)); xdacs }'
def xdacs_send_V '{ image_par(CCD_U,"talk",sprintf("DV%d\r\n",$1)); xdacs }'
def xdacs_send_W '{ image_par(CCD_U,"talk",sprintf("DW%d\r\n",$1)); xdacs }'
def xdacs_send_X '{ image_par(CCD_U,"talk",sprintf("DX%d\r\n",$1)); xdacs }'
def xdacs_send_Y '{ image_par(CCD_U,"talk",sprintf("DY%d\r\n",$1)); xdacs }'
def xdacs_send_Z '{ image_par(CCD_U,"talk",sprintf("DZ%d\r\n",$1)); xdacs }'
def xdacs_send_a '{ image_par(CCD_U,"talk",sprintf("Da%d\r\n",$1)); xdacs }'
def xdacs_send_b '{ image_par(CCD_U,"talk",sprintf("Db%d\r\n",$1)); xdacs }'
def xdacs_send_c '{ image_par(CCD_U,"talk",sprintf("Dc%d\r\n",$1)); xdacs }'
# Send new values from SpecGUI to frelon
# Test version
def xdacs_send_all '{
local res
image_par(CCD_U,"talk",sprintf("DA%d\r\n",$1))
Xval("xccdstate","Sending DA")
sleep(0.3);
for(;(res =image_par(CCD_U,"talk"))!="";) {
if (substr(res,0,3)!="!OK")
Xval("xccdstate","WARN: Error sending DA")
}
image_par(CCD_U,"talk",sprintf("DB%d\r\n",$2))
Xval("xccdstate","Sending DB")
sleep(0.3)
for(;(res =image_par(CCD_U,"talk"))!="";) {
if (substr(res,0,3)!="!OK")
Xval("xccdstate","WARN: Error sending DB")
}
image_par(CCD_U,"talk",sprintf("DC%d\r\n",$3))
Xval("xccdstate","Sending DC")
sleep(0.3)
for(;(res =image_par(CCD_U,"talk"))!="";) {
if (substr(res,0,3)!="!OK")
Xval("xccdstate","WARN: Error sending DC")
}
image_par(CCD_U,"talk",sprintf("DD%d\r\n",$4))
Xval("xccdstate","Sending DD")
sleep(0.3)
for(;(res =image_par(CCD_U,"talk"))!="";) {
if (substr(res,0,3)!="!OK")
Xval("xccdstate","WARN: Error sending DD")
}
image_par(CCD_U,"talk",sprintf("DE%d\r\n",$5))
Xval("xccdstate","Sending DE")
sleep(0.3)
for(;(res =image_par(CCD_U,"talk"))!="";) {
if (substr(res,0,3)!="!OK")
Xval("xccdstate","WARN: Error sending DE")
}
image_par(CCD_U,"talk",sprintf("DF%d\r\n",$6))
Xval("xccdstate","Sending DF")
sleep(0.3)
for(;(res =image_par(CCD_U,"talk"))!="";) {
if (substr(res,0,3)!="!OK")
Xval("xccdstate","WARN: Error sending DF")
}
image_par(CCD_U,"talk",sprintf("DG%d\r\n",$7))
Xval("xccdstate","Sending DG")
sleep(0.3)
for(;(res =image_par(CCD_U,"talk"))!="";) {
if (substr(res,0,3)!="!OK")
Xval("xccdstate","WARN: Error sending DG")
}
image_par(CCD_U,"talk",sprintf("DH%d\r\n",$8))
Xval("xccdstate","Sending DH")
sleep(0.3)
for(;(res =image_par(CCD_U,"talk"))!="";) {
if (substr(res,0,3)!="!OK")
Xval("xccdstate","WARN: Error sending DH")
}
image_par(CCD_U,"talk",sprintf("DI%d\r\n",$9))
Xval("xccdstate","Sending DI")
sleep(0.3)
for(;(res =image_par(CCD_U,"talk"))!="";) {
if (substr(res,0,3)!="!OK")
Xval("xccdstate","WARN: Error sending DI")
}
image_par(CCD_U,"talk",sprintf("DJ%d\r\n",$10))
Xval("xccdstate","Sending DJ")
sleep(0.3)
for(;(res =image_par(CCD_U,"talk"))!="";) {
if (substr(res,0,3)!="!OK")
Xval("xccdstate","WARN: Error sending DJ")
}
image_par(CCD_U,"talk",sprintf("DK%d\r\n",$11))
Xval("xccdstate","Sending DK")
sleep(0.3)
for(;(res =image_par(CCD_U,"talk"))!="";) {
if (substr(res,0,3)!="!OK")
Xval("xccdstate","WARN: Error sending DK")
}
image_par(CCD_U,"talk",sprintf("DL%d\r\n",$12))
Xval("xccdstate","Sending DL")
sleep(0.3)
for(;(res =image_par(CCD_U,"talk"))!="";) {
if (substr(res,0,3)!="!OK")
Xval("xccdstate","WARN: Error sending DL")
}
image_par(CCD_U,"talk",sprintf("DM%d\r\n",$13))
Xval("xccdstate","Sending DM")
sleep(0.3)
for(;(res =image_par(CCD_U,"talk"))!="";) {
if (substr(res,0,3)!="!OK")
Xval("xccdstate","WARN: Error sending DM")
}
image_par(CCD_U,"talk",sprintf("DN%d\r\n",$14))
Xval("xccdstate","Sending DN")
sleep(0.3)
for(;(res =image_par(CCD_U,"talk"))!="";) {
if (substr(res,0,3)!="!OK")
Xval("xccdstate","WARN: Error sending DN")
}
image_par(CCD_U,"talk",sprintf("DP%d\r\n",$15))
Xval("xccdstate","Sending DP")
sleep(0.3)
for(;(res =image_par(CCD_U,"talk"))!="";) {
if (substr(res,0,3)!="!OK")
Xval("xccdstate","WARN: Error sending DP")
}
image_par(CCD_U,"talk",sprintf("DQ%d\r\n",$16))
Xval("xccdstate","Sending DQ")
sleep(0.3)
for(;(res =image_par(CCD_U,"talk"))!="";) {
if (substr(res,0,3)!="!OK")
Xval("xccdstate","WARN: Error sending DQ")
}
image_par(CCD_U,"talk",sprintf("DR%d\r\n",$17))
Xval("xccdstate","Sending DR")
sleep(0.3)
for(;(res =image_par(CCD_U,"talk"))!="";) {
if (substr(res,0,3)!="!OK")
Xval("xccdstate","WARN: Error sending DR")
}
image_par(CCD_U,"talk",sprintf("DS%d\r\n",$18))
Xval("xccdstate","Sending DS")
sleep(0.3)
for(;(res =image_par(CCD_U,"talk"))!="";) {
if (substr(res,0,3)!="!OK")
Xval("xccdstate","WARN: Error sending DS")
}
image_par(CCD_U,"talk",sprintf("DT%d\r\n",$19))
Xval("xccdstate","Sending DT")
sleep(0.3)
for(;(res =image_par(CCD_U,"talk"))!="";) {
if (substr(res,0,3)!="!OK")
Xval("xccdstate","WARN: Error sending DT")
}
image_par(CCD_U,"talk",sprintf("DU%d\r\n",$20))
Xval("xccdstate","Sending DU")
sleep(0.3)
for(;(res =image_par(CCD_U,"talk"))!="";) {
if (substr(res,0,3)!="!OK")
Xval("xccdstate","WARN: Error sending DU")
}
image_par(CCD_U,"talk",sprintf("DV%d\r\n",$21))
Xval("xccdstate","Sending DV")
sleep(0.3)
for(;(res =image_par(CCD_U,"talk"))!="";) {
if (substr(res,0,3)!="!OK")
Xval("xccdstate","WARN: Error sending DV")
}
image_par(CCD_U,"talk",sprintf("DW%d\r\n",$22))
Xval("xccdstate","Sending DW")
sleep(0.3)
for(;(res =image_par(CCD_U,"talk"))!="";) {
if (substr(res,0,3)!="!OK")
Xval("xccdstate","WARN: Error sending DW")
}
image_par(CCD_U,"talk",sprintf("DX%d\r\n",$23))
Xval("xccdstate","Sending DX")
sleep(0.3)
for(;(res =image_par(CCD_U,"talk"))!="";) {
if (substr(res,0,3)!="!OK")
Xval("xccdstate","WARN: Error sending DX")
}
image_par(CCD_U,"talk",sprintf("DY%d\r\n",$24))
Xval("xccdstate","Sending DY")
sleep(0.3)
for(;(res =image_par(CCD_U,"talk"))!="";) {
if (substr(res,0,3)!="!OK")
Xval("xccdstate","WARN: Error sending DY")
}
image_par(CCD_U,"talk",sprintf("DZ%d\r\n",$25))
Xval("xccdstate","Sending DZ")
sleep(0.3)
for(;(res =image_par(CCD_U,"talk"))!="";) {
if (substr(res,0,3)!="!OK")
Xval("xccdstate","WARN: Error sending DZ")
}
image_par(CCD_U,"talk",sprintf("Da%d\r\n",$26))
Xval("xccdstate","Sending Da")
sleep(0.3)
for(;(res =image_par(CCD_U,"talk"))!="";) {
if (substr(res,0,3)!="!OK")
Xval("xccdstate","WARN: Error sending Da")
}
image_par(CCD_U,"talk",sprintf("Db%d\r\n",$27))
Xval("xccdstate","Sending Db")
sleep(0.3)
for(;(res =image_par(CCD_U,"talk"))!="";) {
if (substr(res,0,3)!="!OK")
Xval("xccdstate","WARN: Error sending Db")
}
image_par(CCD_U,"talk",sprintf("Dc%d\r\n",$28))
Xval("xccdstate","Sending Dc")
sleep(0.3)
for(;(res =image_par(CCD_U,"talk"))!="";) {
if (substr(res,0,3)!="!OK")
Xval("xccdstate","WARN: Error sending Dc")
}
xdacs # refresh values
}'
# For testing purposes (of specGUI panels)
# to be deleted
def bumm_clear '{
image_par(CCD_U,"bumm_clear")
ARRAYNAME=sprintf("image_data%d",CCD_U)
image_get(CCD_U,@ARRAYNAME)
}'
def bumm_clear_always '{image_par(CCD_U,"bumm_clear_always",$1) }'
def xresetmux '{image_par(CCD_U,"reset_mux") }'
def xflip '{
global XFLIP
if ($# !=1 || $1 > 3 || $1 <0) {
p "usage xflip <[0 1 2 3]>"
}
if (image_par(CCD_U,"controller")=="CCD_PC") {
local _res _myresult
local cmd i n
_res = image_par(CCD_U,"hw_par")
n=split(_res,_myresult," ")
cmd="$1"
for(i=1;i<n;i++) { cmd=sprintf("%s %s",cmd,_myresult[i]) }
image_par(CCD_U,"hw_par",cmd)
} else {
image_par(CCD_U,"flip",$1)
}
XFLIP = $1
}'
def flip_set '{
}'
def ccd_hwpars '{
global CCD_FLIP CCD_KINBEGIN CCD_KINSTRIPES
local _mystring
if (image_par(CCD_U,"controller")=="CCD_PC") {
_mystring = image_par(CCD_U,"hw_par")
printf ( "hw parameters are : %s\n", _mystring)
sscanf(_mystring, "%d %d %d", CCD_FLIP, CCD_KINBEGIN, CCD_KINSTRIPES)
}
if ($# == 2) {
if ("$1" == "flip" || "$1" == "FLIP") {
if ($2 >= 0 && $2 <=3 ) {
p "Setting flip to $2"
image_par(CCD_U,"hw_par",sprintf("%d %d %d", $2, CCD_KINBEGIN, CCD_KINSTRIPES))
}else
printf("Error setting flip to the camera. It has to be in [0,1,2,3]\n")
}
if ($1 == "kinbegin" || $1 == "kinbegin") {
if ($2 >= 0 && $2 <1024 ){
p "Setting kinbegin to $2"
image_par(CCD_U,"hw_par",sprintf("%d %d %d", CCD_FLIP, $2, CCD_KINSTRIPES))
}else
printf("Error setting flip to the camera. It has to be in [0..1023]\n")
}
if ($1 == "kinstripes" || $1 == "kinstripes") {
if ($2 >= 0 && $2 <1024 ) {
p "Setting kinstripes to $2"
image_par(CCD_U,"hw_par",sprintf("%d %d %d", CCD_FLIP, CCD_KINBEGIN, $2))
}else
printf("Error setting flip to the camera. It has to be in [0..1023]\n")
}
}
}'
def xsetkinetics '{
if ($# !=1 || $1 > 2 || $1 <0) {
p "usage xsetkinetics <[0 1 2]>"
exit
}
image_par(CCD_U,"kinetics",$1)
ccd_createarray
if ($1 && image_par(CCD_U,"input_channel")==15) {
p "Kinetics does not work with all 4 channels!!!!"
if (GUI_RUN)
Xval("xstrout","Kinetics does NOT work with 4 ch!!!")
}
xkinetics
}'
def xsetkinbegin '{
if ($# !=1 || $1 > 1024) {
p "usage xsetkinbegin <[0..1024]>"
exit
}
image_par(CCD_U,"kinbegin",$1)
if (GUI_RUN) Xval("xstrout","Line begining changed")
}'
def xsetkinwinsize '{
if ($# !=1 || $1 > 2048) {
p "usage xsetkinwinsize <[1..2048]>"
exit
}
image_par(CCD_U,"kinwinsize",$1)
ccd_createarray
if (GUI_RUN) Xval("xstrout","Window size changed")
xkinetics
}'
def xsetkinstripes '{
if ($# !=1 || $1 > 2048) {
p "usage xsekinstripes <[1..2048]>"
exit
}
image_par(CCD_U,"kinstripes",$1)
if (image_par(CCD_U,"kinetics")==2 && \
image_par(CCD_U,"kinstripes")>0) {
p "Stripes>0 not possible in pipeline"
if (GUI_RUN)
Xval("xstrout","Stripes not possible in pipeline")
}
}'
def xkinetics '{
local strout _res _my_result _kinbegin _kinstripes
strout = sprintf("Stripes must be in [0..2048]")
if (image_par(CCD_U,"controller")=="CCD_PC") {
_res = image_par(CCD_U,"hw_par")
split(_res,_myresult," ")
_kinbegin = _myresult[1]
_kinstripes = _myresult[2]
} else {
_kinbegin = image_par(CCD_U,"kinbegin")
_kinstripes = image_par(CCD_U,"kinstripes")
}
Xval("xkinstate",image_par(CCD_U,"kinetics"))
Xval("xkinwinsize",sprintf("%d",image_par(CCD_U,"kinwinsize")))
Xval("xkinbegin",sprintf("%d",_kinbegin))
Xval("xkinstripes",sprintf("%d",_kinstripes))
}'
def ccdgetconf '{
local nmfl
local nmflbinn
f3send OFF
sleep(0.1)
ccdserial
if (!BINNING) { # NON BINNING
if (SPECBL=="det") {
nmfl=sprintf("~camera/FRELON%d/frelon%d.cfg",CCDSERNO,CCDSERNO)
} else {
nmfl=sprintf("~specadm/local/userconf/frelon%d.cfg",CCDSERNO,CCDSERNO)
}
nmfl=getval("Filename (NO BINNING) :",nmfl)
line=getline(nmfl,0)
if (line==-1) {
printf("Not such file or empty (%s)\n",nmfl )
}
else {
p line
sleep(0.3)
image_par(CCD_U,"talk",sprintf("%s\r\n",line))
for (;(line=getline(nmfl))!=-1;) {
p line
sleep(0.3)
image_par(CCD_U,"talk",sprintf("%s\r\n",line))
}
for(;(res =image_par(CCD_U,"talk"))!="";); # clear buffer (f3_dump)
}
} else {
if (SPECBL=="det") {
nmflbinn=sprintf("~camera/FRELON%d/frelon%dbinn.cfg",CCDSERNO,CCDSERNO)
} else {
nmflbinn=sprintf("~specadm/local/userconf/frelon%dbinn.cfg",CCDSERNO,CCDSERNO)
}
nmflbinn=getval("Filename (BINNING):",nmflbinn)
line=getline(nmflbinn,0)
if (line==-1) {
printf("Not such file or empty (%s)\n",nmfl )
} else {
p line
sleep(0.3)
image_par(CCD_U,"talk",sprintf("%s\r\n",line))
for (;(line=getline(nmflbinn))!=-1;) {
p line
sleep(0.3)
image_par(CCD_U,"talk",sprintf("%s\r\n",line))
}
for(;(res =image_par(CCD_U,"talk"))!="";); # clear buffer (f3_dump)
}
}
}'
# Save Camera DAC values to a file
def ccdsaveconf '{
local nmfl
local nmflbinn bla bla2
f3send OFF
sleep(0.1)
image_par(CCD_U,"talk",sprintf("DUM\r\n"))
sleep(0.3)
res = image_par(CCD_U,"talk")
if (FRELON2000) {
sscanf(res,"%3s:%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,\
%d,%d,%d,%d,%d,%d,%d,%d",\
bla,DA,DB,DC,DD,DE,DF,DG,DH,DI,DJ,DK,DL,DM,DN,DP,DQ,DR,DS,DT,DU,\
DV,DW,DX,DY,DZ,Da,Db,Dc)
} else {
sscanf(res,"%3s:%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",\
bla,DA,DB,DC,DD,DE,DF,DG,DH,DI,DJ,DK,DL,DM,DN,DP,DQ,DR,DS,DT,DU)
}
res = image_par(CCD_U,"talk")
res = image_par(CCD_U,"talk")
if (FRELON2000) {
sscanf(res,"%3s:%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,\
%d,%d,%d,%d,%d,%d,%d,%d",\
bla,DAb,DBb,DCb,DDb,DEb,DFb,DGb,DHb,DIb,DJb,DKb,DLb,DMb,DNb,\
DPb,DQb,DRb,DSb,DTb,DUb,DVb,DWb,DXb,DYb,DZb,Dab,Dbb,Dcb)
} else {
sscanf(res,"%3s:%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,",\
bla,DAb,DBb,DCb,DDb,DEb,DFb,DGb,DHb,DIb,DJb,DKb,DLb,DMb,DNb,\
DPb,DQb,DRb,DSb,DTb,DUb)
}
for(;(res =image_par(CCD_U,"talk"))!="";); # clear buffer (f3_dump)
ccdserial
if (SPECBL=="det") {
nmfl=sprintf("~camera/FRELON%d/frelon%d.cfg",CCDSERNO,CCDSERNO)
} else {
nmfl=sprintf("~specadm/local/userconf/frelon%d.cfg",CCDSERNO,CCDSERNO)
}
nmfl=getval("Filename:",nmfl)
close(nmfl)
if (file_info(nmfl)) unix(sprintf("rm %s",nmfl))
on (nmfl)
printf ("DA%d\n",DA)
printf ("DB%d\n",DB)
printf ("DC%d\n",DC)
printf ("DD%d\n",DD)
printf ("DE%d\n",DE)
printf ("DF%d\n",DF)
printf ("DG%d\n",DG)
printf ("DH%d\n",DH)
printf ("DI%d\n",DI)
printf ("DJ%d\n",DJ)
printf ("DK%d\n",DK)
printf ("DL%d\n",DL)
printf ("DM%d\n",DM)
printf ("DN%d\n",DN)
printf ("DP%d\n",DP)
printf ("DQ%d\n",DQ)
printf ("DR%d\n",DR)
printf ("DS%d\n",DS)
printf ("DT%d\n",DT)
printf ("DU%d\n",DU)
printf ("DV%d\n",DV)
printf ("DW%d\n",DW)
printf ("DX%d\n",DX)
printf ("DY%d\n",DY)
printf ("DZ%d\n",DZ)
printf ("Da%d\n",Da)
printf ("Db%d\n",Db)
printf ("Dc%d\n",Dc)
close (nmfl)
if (SPECBL=="det") {
nmflbinn=sprintf("~camera/FRELON%d/frelon%dbinn.cfg",CCDSERNO,CCDSERNO)
} else {
nmflbinn=sprintf("~specadm/local/userconf/frelon%dbinn.cfg",CCDSERNO,CCDSERNO)
}
nmflbinn=getval("Filename:",nmflbinn)
close(nmflbinn)
if (file_info(nmflbinn)) unix(sprintf("rm %s",nmflbinn))
on (nmflbinn)
printf ("DA%d\n",DAb)
printf ("DB%d\n",DBb)
printf ("DC%d\n",DCb)
printf ("DD%d\n",DDb)
printf ("DE%d\n",DEb)
printf ("DF%d\n",DFb)
printf ("DG%d\n",DGb)
printf ("DH%d\n",DHb)
printf ("DI%d\n",DIb)
printf ("DJ%d\n",DJb)
printf ("DK%d\n",DKb)
printf ("DL%d\n",DLb)
printf ("DM%d\n",DMb)
printf ("DN%d\n",DNb)
printf ("DP%d\n",DPb)
printf ("DQ%d\n",DQb)
printf ("DR%d\n",DRb)
printf ("DS%d\n",DSb)
printf ("DT%d\n",DTb)
printf ("DU%d\n",DUb)
printf ("DV%d\n",DVb)
printf ("DW%d\n",DWb)
printf ("DX%d\n",DXb)
printf ("DY%d\n",DYb)
printf ("DZ%d\n",DZb)
printf ("Da%d\n",Dab)
printf ("Db%d\n",Dbb)
printf ("Dc%d\n",Dcb)
close (nmflbinn)
f3send ON
}'
#%MACROS%
#%IMACROS%
#%SETUP%
# The macro ccd.mac has to be loaded
# The frelon ccd has to be configured in config
#
#%AUTHOR% David Fernandez and the DETECTOR/BLISS cooperation group
#%TOC%
|