Commit c8e3f3a5 authored by Zolnierczuk, Piotr's avatar Zolnierczuk, Piotr
Browse files

fixed issue #4 (incorrect i00 assignment)

the problem was that i00 (main SC current) is slowly changing and not all
echo phases had a i00 entered in the /entry/DASlogs/BL15:Bruker:ReadOutCurrent)

So, if empty 'slice' pick the last known value.

Also run pylint police in test subdirectory.
parent 3ffdcd27
Loading
Loading
Loading
Loading

misc/plot_daslog2.py

0 → 100755
+28 −0
Original line number Diff line number Diff line
#!/usr/bin/env python3

import sys
import os
import subprocess
import h5py

import numpy as np
import matplotlib.pyplot as plt


filename=sys.argv[1]
skip=4

nxsfile = h5py.File(filename)

for var in sys.argv[2:]:
    times  = nxsfile[f"/entry/DASlogs/{var}/time"]
    values = nxsfile[f"/entry/DASlogs/{var}/value"]
    times  = np.asarray(times)
    values = np.asarray(values)
    plt.plot(times, values, 'o--', ms=2, label=var)
plt.legend()
plt.show()



+23 −18
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import numpy as np
import h5py

from pysen import MICRO, ANGSTROM, tof2lambda
from pysen.config import Ltot

TDC_SHIFT =    10
TDC_MAXCH = 0x3FF
@@ -36,6 +37,8 @@ Y0_PIX = 518
XWID2     =   813//2 # 410 # half-width
YWID2     =   821//2 # 410

LTOT_P2 = Ltot.get('p2')

MOTORS    = ('mophi', 'mopsi', 'mo_z', 'moana', 'mo_l', 'moatt')

B_SENSORS = {'b_sample': 'sample'  ,
@@ -69,17 +72,6 @@ def timevalue_array(nexus_file, vname, prefix="/entry/DASlogs", dtype=TimeFloatV
    v_value = nexus_file[f"{prefix}/{vname}/value"][:]
    return np.array(list(zip(v_time,v_value)), dtype=dtype)

def get_average(val, begin, end):
    """
    calculate average between two time stamps
    """
    sel = np.logical_and(begin<val['time'],   val['time']<end)
    sel = val[sel]
    if sel.size:
        avg = np.average(sel['value'])
    else:
        avg = np.average(val['value'])
    return avg

def time_format(ctime, fmt='%c'):
    "convert 'nexus' time to 'echo' time format"
@@ -117,8 +109,9 @@ def get_run_info(nxsfile):
            value = default_value
        return value
    # FIXME: put these in some confg list
    res['mo_l']  = get_average_value('/entry/DASlogs/BL15:Mot:mo_l',  21.3)
    res['mophi'] = get_average_value('/entry/DASlogs/BL15:Mot:mophi', None)
    for motor in ('mophi', 'mopsi', 'mo_z', 'moana', 'mo_l', 'moatt'):
        default_value = LTOT_P2 if motor=='mo_l' else None
        res[motor] = get_average_value(f"/entry/DASlogs/BL15:Mot:{motor}", default_value)
    res['qmin' ] = get_average_value('/entry/DASlogs/BL15:Mot:Qmin', 0.1)
    res['lmin' ] = get_average_value('/entry/DASlogs/BL15:Chop:Skf1:WavelengthSet', None)
    res['lmax' ] = get_average_value('/entry/DASlogs/BL15:Chop:Skf4:WavelengthSet', None)
@@ -145,6 +138,20 @@ def print_nexus_info(runinfo):
            res = res + f"\n{k:16}: {v}"
    return res

def get_slice_average(key, val, begin, end=np.inf):
    """ calculate average between two time stamps """
    sel = np.logical_and(begin<val['time'],   val['time']<end)
    sel = val[sel]
    if sel.size:
        return np.average(sel['value'])
    # empty slice
    # FIXME: assuming there will be data before
    last_time = val['time']<=end
    last_val  = val[last_time]['value'][-1]
    logging.getLogger('nexus').warning("key '%s': empty slice, last known value: %s", key, last_val)
    return last_val


def process_scan_point(events, pcharge, ltot, begin=None, end=None, values=None):
    "get data for one phase point"
    ev_t0   = events['event_time_zero']
@@ -158,7 +165,7 @@ def process_scan_point(events, pcharge, ltot, begin=None, end=None, values=None)

    # other stuff
    for key, val in values.items():
        res[key] = get_average(val, begin, end)
        res[key] = get_slice_average(key, val, begin, end)

    # events selection
    ev_sel = np.logical_and(begin<ev_t0,ev_t0<end)
@@ -212,8 +219,6 @@ def process_nexus(filename, **kwargs):
        'i00'  : timevalue_array(nxsfile, 'BL15:Bruker:ReadOutCurrent'),
        'phase': timevalue_array(nxsfile, 'BL15:CAENELS5:ActualCurrent'),
    }
    for motor in ('mophi', 'mopsi', 'mo_z', 'moana', 'mo_l', 'moatt'):
        values[motor] = timevalue_array(nxsfile, f"BL15:Mot:{motor}")
    for bsens in ('sample', 'encl1', 'encl2', 'ext1','ext2', 'ext3','ext4','ext5'):
        values['b_'+bsens] = timevalue_array(nxsfile, f"BL15:PLC:Mag:{bsens}")

@@ -227,7 +232,7 @@ def process_nexus(filename, **kwargs):
                res = process_scan_point(events, pcharge, ltot=info['mo_l'],
                        begin=scan_index[i]['time'], end=scan_index[k]['time'],
                        values=values)
                # FIXME: get tau ....
                # FIXME: get tau, j1, j2
                for key in ('tau', 'j1', 'j2'):
                    it =  info[key]['time']<=scan_index[i]['time']   # tau set before scan
                    res[key] = info[key][it]['value'][-1]
+33 −2
Original line number Diff line number Diff line
@@ -2,16 +2,22 @@
pysen I/O utils module
"""

# based recipe on stack overflow http://bit.ly/2cv5wpk
#
import os.path
import bz2
import gzip
import mimetypes

import h5py

# based recipe on stack overflow http://bit.ly/2cv5wpk
magic_dict = {
    #"\x50\x4b\x03\x04": "zip"
    b"\x1f\x8b\x08"    : gzip.open, # GZIP
    b"\x42\x5a\x68"    : bz2.open , # BZIP2
}



max_len = max(len(x) for x in magic_dict)

def get_open_file(filename):
@@ -22,3 +28,28 @@ def get_open_file(filename):
        if file_start == magic:
            return magic_dict.get(magic, open)
    return open


def get_nsefiletype(filename):
    "get filetype"
    base, ext = os.path.splitext(os.path.basename(filename))
    if ext=='.echo':
        return "application/nse-echo"
    if ext=='.h5':
        _, ext2 = os.path.splitext(base)
        if not ext2:
            return "application/nse-echo-hdf"
        nxsfile = h5py.File(filename, 'r')
        try:
            notes   = nxsfile['/entry/notes']
            notes   = bytes(notes[0]).decode('ascii').lower()
            if 'scan=transmission' in notes:
                return "application/nexus-transmission"
            if 'scan=diffraction' in notes:
                return "application/nexus-diffraction"
            if 'scan=echo' in notes:
                return "application/nexus-nse-echo"

        except KeyError:
            pass
    return mimetypes.guess_type(filename)[0]
+10 −8
Original line number Diff line number Diff line
@@ -166,10 +166,12 @@ class EchoWriter(EchoScan):
            phasesens   = self.info.get('phasesens')
            for it,tau in enumerate(self.data):
                self.log.info("%s: writing tau=%2d", self.echofile, tau)
                res    = self.data[tau][-1] # last phase
                ftau   = res['tau']*NANO
                j1, j2 = res['j1'],  res['j2']
                i0, i5 = res['i00'], res['phase']
                #res1   = self.data[tau][ 0] # first phase
                res2   = self.data[tau][-1] # last phase
                ftau   = res2['tau']*NANO
                j1, j2 = res2['j1'],  res2['j2']
                i5     = res2['phase']
                i0     = res2['i00'] # FIXME - bug here, often i00 is missig per phase point

                fd.write(f"c p{it}\n")
                #
@@ -180,12 +182,12 @@ class EchoWriter(EchoScan):
                #
                fd.write( "c bsensors (x,y,z) aimed | actual\n")
                for bsens in B_SENSORS:
                    bfld = res[bsens]*MICRO/GAUSS
                    bfld = res2[bsens]*MICRO/GAUSS
                    fd.write(f"* {bsens:8s} 7.7 7.7 7.7 {bfld:14.6f} 0.0 0.0\n")
                #
                fd.write( "c motors\n")
                for mot in MOTORS:
                    pos = res[mot]
                    pos = self.info[mot]
                    if mot=='mo_l': # mo_l => convert to mm from m
                        pos = pos*1000.0
                    fd.write(f"* {mot:8s} {pos:9.3f} {pos:9.3f}\n")
@@ -208,8 +210,8 @@ class EchoWriter(EchoScan):
                fd.write( "lambdaTable = \n")
                for lam in lambda_tab:
                    fd.write(f"   {lam:g}\n")
                phi = res['mophi']
                psi = res['mopsi']
                phi = self.info['mophi']
                psi = self.info['mopsi']
                sx = +np.sin(np.radians(phi))
                cx = -np.cos(np.radians(phi))
                fd.write(f"phi =    {phi:g} \n")
+3 −3
Original line number Diff line number Diff line
@@ -275,15 +275,15 @@ def plot_atari(hdfile, iecho=None, **kwargs):
        minud, maxud = None, None
        try:
            tmp = np.hstack((pha,up,dn))
            minud = 10**np.floor(np.log10(min(tmp)))
            maxud = 10**np.ceil (np.log10(max(tmp)))
            #minud = min(0.0,0.8*min(tmp)) # 10**np.floor(np.log10(min(tmp)))
            #maxud = max(0.0,1.2*max(tmp)) # 10**np.ceil (np.log10(max(tmp)))
        except ValueError as exc:
            log.warning("cannot determine echo min/max: %s",exc)
            only_echo =True

        if only_echo:
            _txt = r'$A(Q,t)$=%.3g$\pm$%.3g' % res['amplitude']
            minud, maxud = None, None
            #minud, maxud = None, None
            log.info("Phase=%.4g(%.4g) Amp=%.4g(%.4g) Average=%.4g(%.4g)",
                phase_ef, phase_err,
                res['amplitude'][0], res['amplitude'][1],
Loading