# Macros to generate fake scans
# Able to simulate a zapline (at least data and variables needed to plot a
# zap and use cenpiccurs)
#
#
# ex : define toto as a pseudo-counter
# genescan_setup toto gauss 1
# genescan_setup [<cnt_mne>] [<theory>] [<as_a_zap>]
# plotselect toto
# ascan mot 0 1 30 0.1
def genescan_setup '{
global GENESCAN_PAR
# GENESCAN_PAR["key"]
# GENESCAN_PAR["mne"]
# GENESCAN_PAR["theory"]
# GENESCAN_PAR[""]
GENESCAN_PAR["key"] = "_genescan_key_"
GENESCAN_PAR["mne"] = "$1"
GENESCAN_PAR["theory"] = "$2"
GENESCAN_PAR["zap"] = "$3"
cdef("user_getcounts", "_genescan_getcounts() \n", GENESCAN_PAR["key"])
cdef("user_scan_tail", "_genescan_scan_tail() \n", GENESCAN_PAR["key"])
}'
def _genescan_scan_tail() '{
print "_genescan_scan_tail()"
local _tmp_var
if (GENESCAN_PAR["zap"] == 1){
print "make it a zap"
local cnt_index
global ZAP_PLOT[]
global ZAP_PAR[]
ZAP_PAR["fast"]["nbp"] = NPTS-1
ZAP_PAR["fast"]["mne"] = _m[0]
ZAP_PAR["fast"]["start"] = _s[0]
ZAP_PAR["fast"]["stop"] = _f[0]
# let it be a continuous scan.
_stype = 320
ZAP_PLOT["X"] = X_L
ZAP_PLOT["Y"] = sprintf("arr_%s", PLOT_SEL["0"])
printf( sprintf("Allocates glob f array ZAP_PLOTARR[2][%d]\n", NPTS))
eval(sprintf("global float array ZAP_PLOTARR[2][%d]", NPTS))
printf("Copy data from SCAN_D into ZAP_PLOTARR \n")
cnt_index = cnt_num(PLOT_SEL["0"])+ PLOT_MOTS
for (ii=0; ii<NPTS; ii++) {
ZAP_PLOTARR[0][ii] = SCAN_D[ii][0]
}
for (ii=0 ; ii<NPTS ; ii++) {
ZAP_PLOTARR[1][ii] = SCAN_D[ii][cnt_index]
}
print ZAP_PLOTARR
}
}'
#
def genescan_unsetup '{
cdef("user_getcounts", "", GENESCAN_PAR["key"], "delete")
cdef("user_scan_tail", "", GENESCAN_PAR["key"], "delete")
}'
#
def genescan_gaus(x, mu, sigma) '{
local _val
if (sigma==0){
print "genescan_gaus : ERROR : division by zero ; sigma==0"
print "-->exit"
exit
}
else{
_val = ( 1/(sigma*sqrt(2*3.14)) ) * exp( -pow(((x-mu)/sigma),2) / 2 )
}
return _val
}'
def _genescan_getcounts() '{
local _val _val1 _val2
local _begin _end _intervals _step_size
local _min _max _noise _scale
local _ord_orig _coef
local _mu _sigma _g_max
local _mu2 _sigma2 _g_max2
if(cnt_num(GENESCAN_PAR["mne"]) == -1){
print "undefined counter : " GENESCAN_PAR["mne"]
}
else{
_begin = _s[0]
_end = _f[0]
_intervals = _n1
_step_size = (_end - _begin ) / _intervals
_ix = _begin + NPTS * _step_size
_noisy = 0.5
_noise = rand(10000)/10000 * _noisy
if(0){
# linear
# ???
_min = 3
_max = 18
_coef = (_min - _max)/(_begin - _end)
_ord_orig = ((_begin * _max)-(_min *_end ))/(_begin - _end)
_val = _coef * _ix + _ord_orig
_val = _val + _noise
}
if(0){
# gaussian
_mu = (_end + _begin ) / 2
_sigma = (_end - _begin ) / 10
_g_max = 1/(_sigma*sqrt(2*3.14))
_val = genescan_gaus(_ix, _mu, _sigma)
_val = _val + _noise*_g_max/20
}
if(1){
# two gaussians
_mu = ((_end + _begin ) / 2) - (_end-_begin)/8
_sigma = (_end - _begin ) / 10
_g_max = 1/(_sigma*sqrt(2*3.14))
_mu2 = ((_end + _begin ) / 2) + (_end-_begin)/8
_sigma2 = (_end - _begin ) / 8
_g_max2 = 1/(2*(_sigma2*sqrt(2*3.14)))
_val1 = genescan_gaus(_ix, _mu, _sigma)
_val2 = genescan_gaus(_ix, _mu2, _sigma2)
_scale = 1300
_val = (_val1 + _val2 + _noise*_g_max/20 ) * _scale
}
S[cnt_num(GENESCAN_PAR["mne"])] = _val
}
}'
#%IU% (x1, y1, x2, y2)
#%MDESC%
# Draw a vertical red line from (x1,y1) to (x2,y2).
def plot_line(x1, y1, x2, y2) '{
float array cen_line[2][2]
cen_line[0][0]= x1; cen_line[1][0] = x2
cen_line[0][1]= y1; cen_line[1][1] = y2
#plot_cntl("filter1,open")
plot_cntl("addline")
plot_cntl("colors=::::3")
array_plot(cen_line)
}'
def ohoh '{
mv m1 pow(2,3)
}'
# Fills an array of <resolution> points with a gaussian distribution.
# Plots this array.
def plot_gaussian(min, max, mu, sigma, scale) '{
local _x iii _nb_points
_nb_points = 100
global float array _gaus_arr[_nb_points+1][2]
printf("Plot a gaussian : min=%f max=%f mu=%f sigma=%f\n",\
min, max, mu, sigma)
_range = max - min
_step = _range / _nb_points
for (_x = min,iii=0 ; _x< max ; _x=_x + _step,iii++ ){
_result = genescan_gaus(_x, mu, sigma)
_gaus_arr[iii][0] = _x
_gaus_arr[iii][1] = _result * scale
}
plot_cntl("colors=::::9")
plot_cntl("addline")
array_plot(_gaus_arr)
}'
def plotingage '{
global float array _pdat[13][2]
for (i=0; i<13; i++){
_pdat[i][0] = i/10
_pdat[i][1] = i*i/100.0
}
plot_cntl("addline")
# plot_cntl("filter1,open")
# splot
plot_cntl("+lines")
# plot_cntl("colors=17:14:24:72:11")
# plot_cntl("erase")
array_plot(_pdat)
}'
def fitbox_setup '{
global FITBOX
FITBOX["theory"] = "Gaussians"
FITBOX["fwhm_width"] = 16
FITBOX["background"] = "Linear"
FITBOX["sensitivity"] = 2
FITBOX["auto_fwhm"] = "0"
FITBOX["stat"]["fwhm"] = "999"
FITBOX["stat"]["pos1"] = "999"
FITBOX["stat"]["min"] = "999"
FITBOX["stat"]["max"] = "999"
FITBOX["stat"]["height"] = "999"
}'
def fitbox_dofit '{
global FITBOX
local parameters[]
local _res
print "Start fitting"
# p specfitservergetconf(SPECFIT_DEV)
parameters["AutoFwhm"] = FITBOX["auto_fwhm"]
parameters["FwhmPoints"] = FITBOX["fwhm_width"]
parameters["AutoScaling"] = 1
parameters["Sensitivity"] = FITBOX["sensitivity"]
parameters["fitbkg"] = "Linear"
parameters["fittheory"] = FITBOX["theory"]
parameters["SameFwhmFlag"] = "0"
_res = specfitserver_plotfitscan(SPECFIT_DEV,PLOT_SEL[0],parameters)
if (parameters["fittheory"] == "Area Pseudo-Voigt"){
FITBOX["fit"]["const"] = _res[2]
FITBOX["fit"]["slope"] = _res[4]
if (_res["13"] == "Area2"){
# 2 or more curves.
# fitres["0"] = 10
# fitres["1"] = "Constant"
# fitres["2"] = 0.0465942
# fitres["3"] = "Slope"
# fitres["4"] = 0.00787279
# fitres["5"] = "Area1"
# fitres["6"] = 1.09038
# fitres["7"] = "Position1"
# fitres["8"] = -0.42878
# fitres["9"] = "Fwhm1"
# fitres["10"] = 1.02864
# fitres["11"] = "Eta1"
# fitres["12"] = -0.190559
# fitres["13"] = "Area2"
# fitres["14"] = 0.797764
# fitres["15"] = "Position2"
# fitres["16"] = 0.606836
# fitres["17"] = "Fwhm2"
# fitres["18"] = 1.02864
# fitres["19"] = "Eta2"
# fitres["20"] = -0.0811697
FITBOX["fit"]["nb"] = 2
delete FITBOX["fit1"]["height"]
delete FITBOX["fit2"]["height"]
FITBOX["fit1"]["area"] = _res[6]
FITBOX["fit1"]["position"] = _res[8]
FITBOX["fit1"]["fwhm"] = _res[10]
FITBOX["fit1"]["Eta"] = _res[12]
FITBOX["fit2"]["area"] = _res[14]
FITBOX["fit2"]["position"] = _res[16]
FITBOX["fit2"]["fwhm"] = _res[18]
FITBOX["fit2"]["Eta"] = _res[20]
}
else{
# 1 P-Voigt
# fitres["0"] = 6
# fitres["1"] = "Constant"
# fitres["2"] = 0.0339416
# fitres["3"] = "Slope"
# fitres["4"] = 0.000881656
# fitres["5"] = "Area1"
# fitres["6"] = 0.963446
# fitres["7"] = "Position1"
# fitres["8"] = 0.0221393
# fitres["9"] = "Fwhm1"
# fitres["10"] = 0.954922
# fitres["11"] = "Eta1"
# fitres["12"] = -0.114842
FITBOX["fit"]["nb"] = 1
delete FITBOX["fit1"]["height"]
delete FITBOX["fit2"]["height"]
FITBOX["fit1"]["area"] = _res[6]
FITBOX["fit1"]["position"] = _res[8]
FITBOX["fit1"]["fwhm"] = _res[10]
FITBOX["fit1"]["Eta"] = _res[12]
}
}
else if (parameters["fittheory"] == "Gaussians" || \
parameters["fittheory"] == "Lorentz"){
FITBOX["fit"]["const"] = _res[2]
FITBOX["fit"]["slope"] = _res[4]
if (_res["11"] == "Height2"){
# 2 gaussians
# fitres["0"] = 8
# fitres["1"] = "Constant"
# fitres["2"] = 0.0303326
# fitres["3"] = "Slope"
# fitres["4"] = 0.00922199
# fitres["5"] = "Height1"
# fitres["6"] = 1.07402
# fitres["7"] = "Position1"
# fitres["8"] = -0.430826
# fitres["9"] = "FWHM1"
# fitres["10"] = 1.0303
# fitres["11"] = "Height2"
# fitres["12"] = 0.738428
# fitres["13"] = "Position2"
# fitres["14"] = 0.608316
# fitres["15"] = "FWHM2"
# fitres["16"] = 1.0303
FITBOX["fit"]["nb"] = 2
delete FITBOX["fit1"]["area"]
delete FITBOX["fit2"]["area"]
FITBOX["fit1"]["height"] = _res[6]
FITBOX["fit1"]["position"] = _res[8]
FITBOX["fit1"]["fwhm"] = _res[10]
FITBOX["fit2"]["height"] = _res[12]
FITBOX["fit2"]["position"] = _res[14]
FITBOX["fit2"]["fwhm"] = _res[16]
}
else if (_res["5"] == "Height1"){
# 1 gaussians
# _res["0"] = 5
# _res["1"] = "Constant"
# _res["2"] = 0.026718
# _res["3"] = "Slope"
# _res["4"] = 0.000831269
# _res["5"] = "Height1"
# _res["6"] = 0.99398
# _res["7"] = "Position1"
# _res["8"] = 0.0221194
# _res["9"] = "FWHM1"
# _res["10"] = 0.953623
FITBOX["fit"]["nb"] = 1
delete FITBOX["fit1"]["area"]
FITBOX["fit1"]["height"] = _res[6]
FITBOX["fit1"]["position"] = _res[8]
FITBOX["fit1"]["fwhm"] = _res[10]
}
else{
print "Too many gaussians... not implemented."
}
}
else{
print ""
print "Not implemented theory:" parameters["fittheory"]
print ""
}
local _fwhm _pos _min _max _sigma _mu _scale
print "Fitted gaussian characteristics:"
_fwhm = FITBOX["fit1"]["fwhm"]
_pos = FITBOX["fit1"]["position"]
_height = FITBOX["fit1"]["height"]
printf(" FWHM=%f POS=%f HEIGHT=%f\n", _fwhm, _pos, _height)
# Plots fitted gaussian.
printf("Plotting fitted gaussian\n")
_sigma = _fwhm / 2.3548
_mu = _pos
_min = _s[0]
_max = _f[0]
_scale = 1300
plot_gaussian(_min, _max, _mu, _sigma, _scale)
printf("Draws fwhm line.\n")
plot_line(_pos-(_fwhm/2), _height/2, _pos+(_fwhm/2), _height/2)
}'
def fitbox_clear '{
FITBOX["fit"]["nb"] = 0
delete FITBOX["fit1"]["height"]
delete FITBOX["fit1"]["position"]
delete FITBOX["fit1"]["fwhm"]
delete FITBOX["fit2"]["height"]
delete FITBOX["fit2"]["position"]
delete FITBOX["fit2"]["fwhm"]
}'
# fitres["20"] = 0.0170693
#
# 41.FIT> p fitres["22"]
# 0
#
# 42.FIT> whats fitres["22"]
# Not an element of an array.
#
# 43.FIT> whats fitres["21"]
# Not an element of an array.
#
# 44.FIT> whats fitres["1"]
# A global associative-array element with string attributes.
#
#
# 514.CYRIL> p specfitservergetconf(SPECFIT_DEV)
# tmp["AutoFwhm"] = "0"
# tmp["AutoScaling"] = "1"
# tmp["BackgroundIndex"] = "1"
# tmp["DeltaPositionFwhmUnits"] = "0.5"
# tmp["EtaFlag"] = "0"
# tmp["FileAction"] = "0"
# tmp["FwhmPoints"] = "16"
# tmp["Geometry"] = "600x400+50+50"
# tmp["HeightAreaFlag"] = "1"
# tmp["HypermetTails"] = "15"
# tmp["InitialLongTailAreaRatio"] = "0.05"
# tmp["InitialLongTailSlopeRatio"] = "20"
# tmp["InitialShortTailAreaRatio"] = "0.05"
# tmp["InitialShortTailSlopeRatio"] = "0.7"
# tmp["InitialStepTailHeightRatio"] = "0.002"
# tmp["MaxFwhm2InputRatio"] = "1.5"
# tmp["MaxLongTailAreaRatio"] = "0.3"
# tmp["MaxLongTailSlopeRatio"] = "50"
# tmp["MaxShortTailAreaRatio"] = "0.1"
# tmp["MaxShortTailSlopeRatio"] = "2"
# tmp["MaxStepTailHeightRatio"] = "0.01"
# tmp["McaMode"] = "0"
# tmp["MinFwhm2InputRatio"] = "0.4"
# tmp["MinGaussArea4LongTail"] = "1000"
# tmp["MinGaussArea4ShortTail"] = "50000"
# tmp["MinGaussHeight4StepTail"] = "5000"
# tmp["MinLongTailAreaRatio"] = "0.01"
# tmp["MinLongTailSlopeRatio"] = "5"
# tmp["MinShortTailAreaRatio"] = "0.001"
# tmp["MinShortTailSlopeRatio"] = "0.5"
# tmp["MinStepTailHeightRatio"] = "0.0001"
# tmp["NoConstrainsFlag"] = "0"
# tmp["PosFwhmFlag"] = "1"
# tmp["PositionFlag"] = "1"
# tmp["QuotedFwhmFlag"] = "0"
# tmp["QuotedPositionFlag"] = "1"
# tmp["ResidualsFlag"] = "0"
# tmp["SameAreaRatioFlag"] = "1"
# tmp["SameFwhmFlag"] = "1"
# tmp["SameSlopeRatioFlag"] = "1"
# tmp["Sensitivity"] = "2.5"
# tmp["WeightFlag"] = "0"
# tmp["Xscaling"] = "1"
# tmp["Yscaling"] = "1"
# tmp["fitbkg"] = "Linear"
# tmp["fittheory"] = "Area Pseudo-Voigt"
# tmp["infile"] = "/users/blissadm/.specfitdefaults.py"
# tmp["outfile"] = "/users/blissadm/.specfitdefaults.py"
|