implemented dezinger with pyfai separate function, changes related to the id9 logfile and the way the information is stored inside azav data storage
This commit is contained in:
parent
35757665ad
commit
45e6e44549
52
xray/azav.py
52
xray/azav.py
|
@ -63,9 +63,10 @@ def ai_as_str(ai):
|
|||
"# rot[1,2,3] [rad]: %.3f,%.3f,%.3f" % (ai.rot1,ai.rot2,ai.rot3) ]
|
||||
return "\n".join(s)
|
||||
|
||||
def do1d(ai, imgs, mask = None, npt_radial = 600, method = 'csr',safe=True,dark=10., polCorr = 1):
|
||||
def do1d(ai, imgs, mask = None, npt_radial = 600, method = 'csr',safe=True,dark=10., polCorr = 1,dezinger=None):
|
||||
""" ai is a pyFAI azimuthal intagrator
|
||||
it can be defined with pyFAI.load(ponifile)
|
||||
dezinger: None or float (used as percentile of ai.separate)
|
||||
mask: True are points to be masked out """
|
||||
# force float to be sure of type casting for img
|
||||
if isinstance(dark,int): dark = float(dark);
|
||||
|
@ -73,6 +74,9 @@ def do1d(ai, imgs, mask = None, npt_radial = 600, method = 'csr',safe=True,dark=
|
|||
out_i = np.empty( ( len(imgs), npt_radial) )
|
||||
out_s = np.empty( ( len(imgs), npt_radial) )
|
||||
for _i,img in enumerate(imgs):
|
||||
if dezinger is not None and dezinger > 0:
|
||||
_,img=ai.separate(img,npt_rad=npt_radial,npt_azim=512,unit='q_A^-1',
|
||||
method=method,mask=mask,percentile=dezinger)
|
||||
q,i, sig = ai.integrate1d(img-dark, npt_radial, mask= mask, safe = safe,\
|
||||
unit="q_A^-1", method = method, error_model = "poisson",
|
||||
polarization_factor = polCorr)
|
||||
|
@ -202,14 +206,14 @@ def removeBackground(data,qlims=(0,10),max_iter=30,background_regions=[],force=F
|
|||
storageFile=None,save=True,**removeBkg):
|
||||
""" similar function to the zray.utils one, this works on dataset created by
|
||||
doFolder """
|
||||
idx = utils.findSlice(data.q_orig,qlims)
|
||||
idx = utils.findSlice(data.orig.q,qlims)
|
||||
# see if there are some to do ...
|
||||
if force:
|
||||
idx_start = 0
|
||||
else:
|
||||
idx_start = len(data.data)
|
||||
if idx_start < len(data.data_orig):
|
||||
_q,_data = utils.removeBackground(data.q_orig[idx],data.data_orig[:,idx],
|
||||
if idx_start < len(data.orig.data):
|
||||
_q,_data = utils.removeBackground(data.orig.q[idx],data.orig.data[:,idx],
|
||||
max_iter=max_iter,background_regions=background_regions,**removeBkg)
|
||||
data.q = _q
|
||||
data.data = np.concatenate( (data.data,_data ) )
|
||||
|
@ -218,8 +222,9 @@ def removeBackground(data,qlims=(0,10),max_iter=30,background_regions=[],force=F
|
|||
return data
|
||||
|
||||
|
||||
def doFolder(folder,files='*.edf*',nQ = 1500,force=False,mask=None,dark=10,norm='auto',save_pyfai=False,
|
||||
saveChi=True,poni='pyfai.poni',storageFile='auto',save=True,diagnostic=None,skip_first=0,last=None):
|
||||
def doFolder(folder,files='*.edf*',nQ = 1500,force=False,mask=None,dark=10,
|
||||
norm='auto',save_pyfai=False,saveChi=True,poni='pyfai.poni',
|
||||
storageFile='auto',save=True,logDict=None,dezinger=None,skip_first=0,last=None):
|
||||
""" calc 1D curves from files in folder, returning a dictionary of stuff
|
||||
nQ : number of Q-points (equispaced)
|
||||
force : if True, redo from beginning even if previous data are found
|
||||
|
@ -227,7 +232,9 @@ def doFolder(folder,files='*.edf*',nQ = 1500,force=False,mask=None,dark=10,norm=
|
|||
mask : can be a list of [filenames|array of booleans|mask string]
|
||||
pixels that are True are dis-regarded
|
||||
saveChi: self-explanatory
|
||||
save_pyfai: save all pyfai's internal arrays (~110 MB)
|
||||
dezinger: None or 0 to disable; good value is ~50. Needs good center and mask
|
||||
logDict: dictionary(-like) structure. has to have 'file' key
|
||||
save_pyfai: store all pyfai's internal arrays (~110 MB)
|
||||
poni : could be:
|
||||
→ an AzimuthalIntegrator instance
|
||||
→ a filename that will be look for in
|
||||
|
@ -248,16 +255,19 @@ def doFolder(folder,files='*.edf*',nQ = 1500,force=False,mask=None,dark=10,norm=
|
|||
else:
|
||||
saved = None
|
||||
|
||||
files = utils.getFiles(folder,files)[skip_first:last]
|
||||
if saved is not None:
|
||||
files = [f for f in files if utils.getBasename(f) not in saved["files"]]
|
||||
files = utils.getFiles(folder,files)
|
||||
if logDict is not None:
|
||||
files = [f for f in files if utils.getBasename(f) in logDict['file'] ]
|
||||
files = files[skip_first:last]
|
||||
|
||||
if diagnostic is not None:
|
||||
key = list( diagnostic.keys() )[0]
|
||||
files_diagnostic = list(diagnostic[key].keys())
|
||||
files = [ f for f in files if utils.getBasename(f) in files_diagnostic ]
|
||||
|
||||
if saved is not None:
|
||||
files = [f for f in files if f not in saved["files"]]
|
||||
log.info("Will do azimuthal integration for %d files"%(len(files)))
|
||||
|
||||
files = np.asarray(files)
|
||||
basenames = np.asarray( [ utils.getBasename(file) for file in files] )
|
||||
|
||||
if len(files) > 0:
|
||||
# which poni file to use:
|
||||
ai = getAI(poni,folder)
|
||||
|
@ -277,22 +287,20 @@ def doFolder(folder,files='*.edf*',nQ = 1500,force=False,mask=None,dark=10,norm=
|
|||
chi_fname = utils.removeExt(fname) + ".chi"
|
||||
utils.saveTxt(chi_fname,q,np.vstack((i,e)),info=ai_as_str(ai),overwrite=True)
|
||||
|
||||
files = [ utils.getBasename(f) for f in files ]
|
||||
files = np.asarray(files)
|
||||
if saved is not None:
|
||||
files = np.concatenate( (saved["files"] ,files ) )
|
||||
files = np.concatenate( (saved["files"] ,basenames ) )
|
||||
data = np.concatenate( (saved["data"] ,data ) )
|
||||
err = np.concatenate( (saved["err"] ,err ) )
|
||||
ret = dict(q=q,folder=folder,files=files,data=data,err=err,
|
||||
data_orig=data.copy(),err_orig=err.copy(),q_orig=q.copy(),
|
||||
orig = dict(data=data.copy(),err=err.copy(),q=q.copy()),
|
||||
pyfai=ai_as_dict(ai),pyfai_info=ai_as_str(ai),mask=mask)
|
||||
if not save_pyfai: del ret['pyfai']
|
||||
|
||||
# add info from diagnostic if provided
|
||||
if diagnostic is not None:
|
||||
for k in diagnostic:
|
||||
ret[k] = np.asarray( [diagnostic[k][f] for f in ret['files']] )
|
||||
ret = storage.DataStorage(ret)
|
||||
|
||||
# add info from logDict if provided
|
||||
if logDict is not None:
|
||||
ret['log']=logDict
|
||||
# sometime saving is not necessary (if one has to do it after subtracting background
|
||||
if storageFile is not None and save: ret.save(storageFile)
|
||||
else:
|
||||
|
|
44
xray/id9.py
44
xray/id9.py
|
@ -33,7 +33,7 @@ def _readDiagnostic(fname,retry=3):
|
|||
# it should not arrive here
|
||||
raise ValueError("Could not read diagnostic file after %d attempts"%retry)
|
||||
|
||||
def readDelayFromDiagnostic(fname):
|
||||
def readDiagnostic(fname):
|
||||
""" return an ordered dict dictionary of filename; for each key a rounded
|
||||
value of delay is associated """
|
||||
if os.path.isdir(fname): fname += "/diagnostics.log"
|
||||
|
@ -44,9 +44,10 @@ def readDelayFromDiagnostic(fname):
|
|||
# skip lines that cannot be interpreted as float (like done, etc)
|
||||
idx_ok = np.isfinite( delays )
|
||||
files = files[idx_ok]
|
||||
files = np.asarray( [utils.getBasename(f) for f in files])
|
||||
delays = delays[idx_ok]
|
||||
delays = np.round(delays.astype(float),12)
|
||||
return collections.OrderedDict( zip(files,delays) )
|
||||
return dict( file = files, scan = delays)
|
||||
|
||||
def _findDark(line):
|
||||
_,value = line.split(":")
|
||||
|
@ -98,27 +99,27 @@ def readLogFile(fnameOrFolder,subtractDark=False,skip_first=0,asDataStorage=True
|
|||
|
||||
|
||||
def doFolder_azav(folder,nQ=1500,files='*.edf*',force=False,mask=None,
|
||||
saveChi=True,poni='pyfai.poni',storageFile='auto',dark=9.9,zingerFilter=30,qlims=(0,10),
|
||||
removeBack=False,removeBack_kw=dict()):
|
||||
saveChi=True,poni='pyfai.poni',storageFile='auto',dark=9.9,dezinger=None,
|
||||
qlims=(0,10),removeBack=False,removeBack_kw=dict(),skip_first=0,
|
||||
last=None):
|
||||
""" very small wrapper around azav.doFolder, essentially just reading
|
||||
the diagnostics.log """
|
||||
the id9 logfile or diagnostics.log """
|
||||
|
||||
diag = dict( delays = readDelayFromDiagnostic(folder) )
|
||||
try:
|
||||
loginfo = readLogFile(folder,skip_first=skip_first,last=last)
|
||||
except Exception as e:
|
||||
log.warn("Could not read log file, trying to read diagnostics.log")
|
||||
loginfo = readDiagnostic(folder)
|
||||
if storageFile == 'auto' : storageFile = folder + "/" + "pyfai_1d" + default_extension
|
||||
|
||||
data = azav.doFolder(folder,files=files,nQ=nQ,force=force,mask=mask,
|
||||
saveChi=saveChi,poni=poni,storageFile=storageFile,diagnostic=diag,dark=dark,save=False)
|
||||
saveChi=saveChi,poni=poni,storageFile=storageFile,logDict=loginfo,dark=dark,save=False,dezinger=dezinger)
|
||||
#try:
|
||||
# if removeBack is not None:
|
||||
# _,data.data = azav.removeBackground(data,qlims=qlims,**removeBack_kw)
|
||||
#except Exception as e:
|
||||
# log.error("Could not remove background, error was %s"%(str(e)))
|
||||
|
||||
if zingerFilter > 0:
|
||||
data.data = filters.removeZingers(data.data,threshold=zingerFilter)
|
||||
#data.save(storageFile); it does not save err ?
|
||||
|
||||
|
||||
# idx = utils.findSlice(data.q,qlims)
|
||||
# n = np.nanmean(data.data[:,idx],axis=1)
|
||||
# data.norm_range = qlims
|
||||
|
@ -135,7 +136,15 @@ def doFolder_azav(folder,nQ=1500,files='*.edf*',force=False,mask=None,
|
|||
|
||||
def doFolder_dataRed(azavStorage,monitor=None,funcForAveraging=np.nanmean,
|
||||
qlims=None,outStorageFile='auto',reference='min'):
|
||||
""" azavStorage if a DataStorage instance or the filename to read """
|
||||
""" azavStorage if a DataStorage instance or the filename to read
|
||||
monitor : normalization vector that can be given as
|
||||
1. numpy array
|
||||
2. a list (interpreted as q-range normalization)
|
||||
3. a string to look for as key in the log, e.g.
|
||||
monitor="pd2ic" would reult in using
|
||||
azavStorage.log.pd2ic
|
||||
|
||||
"""
|
||||
|
||||
if isinstance(azavStorage,storage.DataStorage):
|
||||
data = azavStorage
|
||||
|
@ -156,11 +165,11 @@ def doFolder_dataRed(azavStorage,monitor=None,funcForAveraging=np.nanmean,
|
|||
data.err = data.err[:,idx]
|
||||
data.q = data.q[idx]
|
||||
|
||||
|
||||
if isinstance(monitor,str): monitor = data['log'][monitor]
|
||||
|
||||
# calculate differences
|
||||
diffs = dataReduction.calcTimeResolvedSignal(data.delays,data.data,err=data.err,
|
||||
q=data.q,reference=reference,monitor=monitor,
|
||||
diffs = dataReduction.calcTimeResolvedSignal(data.log.delay,data.data,
|
||||
err=data.err,q=data.q,reference=reference,monitor=monitor,
|
||||
funcForAveraging=funcForAveraging)
|
||||
|
||||
# save txt and npz file
|
||||
|
@ -171,7 +180,7 @@ def doFolder_dataRed(azavStorage,monitor=None,funcForAveraging=np.nanmean,
|
|||
|
||||
return data,diffs
|
||||
|
||||
def doFolder(folder,azav_kw = dict(), datared_kw = dict(),online=True, retryMax=20):
|
||||
def doFolder(folder,azav_kw = dict(), datared_kw = dict(),online=True, retryMax=20,force=False):
|
||||
import matplotlib.pyplot as plt
|
||||
if folder == "./": folder = os.path.abspath(folder)
|
||||
fig = plt.figure()
|
||||
|
@ -196,6 +205,7 @@ def doFolder(folder,azav_kw = dict(), datared_kw = dict(),online=True, retryMax=
|
|||
else:
|
||||
retryNum += 1
|
||||
plt.pause(30)
|
||||
if force: force=False; # does not make sense to have always True ...
|
||||
except KeyboardInterrupt:
|
||||
keepGoing = False
|
||||
if not online: keepGoing = False
|
||||
|
|
Loading…
Reference in New Issue