Пример #1
0
def Fblock(a, first):  # read Ascii block of Floats
    line1 = a[first]
    line2 = a[first + 1]
    val = ExtractInt(line2)
    numb = val[0]
    lines = numb / 5
    last = numb - 5 * lines
    if line1.startswith('F'):
        error = ''
    else:
        error = 'NOT an F block starting at line ' + str(first)
        logger.information('ERROR *** ' + error)
        sys.exit(error)
    fval = []
    for m in range(0, lines):
        mm = first + 2 + m
        val = ExtractFloat(a[mm])
        for n in range(0, 5):
            fval.append(val[n])
    mm += 1
    val = ExtractFloat(a[mm])
    for n in range(0, last):
        fval.append(val[n])
    mm += 1
    return mm, fval  # values as list
Пример #2
0
def ReadInxGroup(asc, n, lgrp):  # read ascii x,y,e
    x = []
    y = []
    e = []
    first = n * lgrp
    last = (n + 1) * lgrp
    val = ExtractFloat(asc[first + 2])
    Q = val[0]
    for m in range(first + 4, last):
        val = ExtractFloat(asc[m])
        x.append(val[0] / 1000.0)
        y.append(val[1])
        e.append(val[2])
    npt = len(x)
    return Q, npt, x, y, e  # values of x,y,e as lists
Пример #3
0
def IN13Read(instr, run, ana, refl, Plot, Save):  # Ascii start routine
    workdir = config['defaultsave.directory']

    path, fname = getFilePath(run, '.asc', instr)

    logger.information('Reading file : ' + path)

    asc = loadFile(path)

    # header block
    text = asc[1]
    run = text[:8]
    text = asc[4]  # run line
    instr = text[:4]
    next, Ival = Iblock(asc, 5)
    nsubsp = Ival[0]
    nspec = Ival[153] - 2
    # text block
    text = asc[25]
    title = text[:20]
    # para1 block
    next, Fval = Fblock(asc, 32)
    ntemp = int(Fval[6])
    f1 = ntemp / 10
    ltemp = int(f1)
    f2 = f1 - 10 * ltemp
    if f2 >= 0.:
        ltemp = ltemp + 1
    wave = 2.0 * Fval[81]

    logger.information('No. sub-spectra : ' + str(nsubsp))
    logger.information('No. spectra : ' + str(nspec))
    logger.information('Scan type : ' + str(int(Fval[8])) +
                       ' ; Average energy : ' + str(Fval[9]))
    logger.information('CaF2 lattice : ' + str(Fval[81]) +
                       ' ; Graphite lattice : ' + str(Fval[82]))
    logger.information('Wavelength : ' + str(wave))
    logger.information('No. temperatures : ' + str(ntemp))
    logger.information('No. temperature lines : ' + str(ltemp))

    # para2 block
    next, Fval = Fblock(asc, next)
    angles = Fval[:nspec]
    logger.information('Angles : ' + str(angles))
    lspec = 4 + ltemp
    # monitors
    psd = next + (nspec + 2048) * lspec
    l1m1 = psd + 1
    l2m1 = l1m1 + 3
    mon1 = ExtractFloat(asc[l2m1])
    logger.information('Mon1 : Line ' + str(l2m1) + ' : ' + asc[l2m1])
    # raw spectra
    first = next
    xDat = angles
    y2D = []
    e2D = []
    for n in range(0, nspec):
        ylist = []
        elist = []
        l1 = first + lspec * n + 1
        logger.information('Line ' + str(l1) + ' : ' + asc[l1])
        for l in range(0, ltemp):
            l2 = l1 + 3 + l
            val = ExtractFloat(asc[l2])
            nval = len(val)
            for m in range(0, nval):
                ylist.append(val[m] / mon1[m])
                elist.append(math.sqrt(val[m]) / mon1[m])
        y2D.append(ylist)
        e2D.append(elist)
    # create WS
    npt = len(xDat)
    xDat.append(2 * xDat[npt - 1] - xDat[npt - 2])
    ascWS = fname + '_' + ana + refl + '_ang'
    outWS = fname + '_' + ana + refl + '_q'
    xD = np.array(xDat)
    k0 = 4 * math.pi / wave
    Q = []
    for n in range(0, nspec):
        if angles[n] >= 180.0:
            angles[n] = 360.0 - angles[n]
        theta = math.radians(angles[n] / 2.)
        qq = k0 * math.sin(theta)
        Q.append(qq)
    Qa = np.array(Q)
    sorted_indices = Qa.argsort()
    sorted_Q = Qa[sorted_indices]
    lxdq = len(sorted_Q)
    xlast = 2 * sorted_Q[lxdq - 1] - sorted_Q[lxdq - 2]
    sorted_Q = np.append(sorted_Q, xlast)
    xDq = sorted_Q
    for m in range(0, nval):
        ylist = []
        elist = []
        for n in range(0, nspec):
            ylist.append(y2D[n][m])
            elist.append(e2D[n][m])
        y1D = np.array(ylist)
        e1D = np.array(elist)
        y1Dq = y1D[sorted_indices]
        e1Dq = e1D[sorted_indices]
        if m == 0:
            xData = xD
            yData = y1D
            eData = e1D
            xDq = sorted_Q
            yDq = y1Dq
            eDq = e1Dq
        else:
            xData = np.append(xData, xD)
            yData = np.append(yData, y1D)
            eData = np.append(eData, e1D)
            xDq = np.append(xDq, sorted_Q)
            yDq = np.append(yDq, y1Dq)
            eDq = np.append(eDq, e1Dq)
    CreateWorkspace(OutputWorkspace=ascWS,
                    DataX=xData,
                    DataY=yData,
                    DataE=eData,
                    Nspec=3,
                    UnitX='MomentumTransfer')
    IN13Paras(ascWS, run, title, wave)
    CreateWorkspace(OutputWorkspace=outWS,
                    DataX=xDq,
                    DataY=yDq,
                    DataE=eDq,
                    Nspec=3,
                    UnitX='MomentumTransfer')
    IN13Paras(outWS, run, title, wave)
    if Save:
        opath = os.path.join(workdir, outWS + '.nxs')
        SaveNexusProcessed(InputWorkspace=outWS, Filename=opath)
        logger.information('Output file : ' + opath)
    if Plot != 'None':
        plotForce(outWS, Plot)
    return outWS