esrf

Beamline Instrument Software Support
SPEC Macro documentation: [ Macro Index | BCU Home ]



# 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"