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) ] |       "# rot[1,2,3] [rad]: %.3f,%.3f,%.3f" % (ai.rot1,ai.rot2,ai.rot3) ] | ||||||
|   return "\n".join(s) |   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  |     """ ai is a pyFAI azimuthal intagrator  | ||||||
|               it can be defined with pyFAI.load(ponifile) |               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 """ |         mask: True are points to be masked out """ | ||||||
|     # force float to be sure of type casting for img |     # force float to be sure of type casting for img | ||||||
|     if isinstance(dark,int): dark = float(dark); |     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_i = np.empty( ( len(imgs), npt_radial) ) | ||||||
|     out_s = np.empty( ( len(imgs), npt_radial) ) |     out_s = np.empty( ( len(imgs), npt_radial) ) | ||||||
|     for _i,img in enumerate(imgs): |     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,\ |       q,i, sig = ai.integrate1d(img-dark, npt_radial, mask= mask, safe = safe,\ | ||||||
|                  unit="q_A^-1", method = method, error_model = "poisson", |                  unit="q_A^-1", method = method, error_model = "poisson", | ||||||
|                  polarization_factor = polCorr) |                  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): |       storageFile=None,save=True,**removeBkg): | ||||||
|   """ similar function to the zray.utils one, this works on dataset created by |   """ similar function to the zray.utils one, this works on dataset created by | ||||||
|       doFolder """ |       doFolder """ | ||||||
|   idx = utils.findSlice(data.q_orig,qlims) |   idx = utils.findSlice(data.orig.q,qlims) | ||||||
|   # see if there are some to do ... |   # see if there are some to do ... | ||||||
|   if force: |   if force: | ||||||
|     idx_start = 0 |     idx_start = 0 | ||||||
|   else: |   else: | ||||||
|     idx_start = len(data.data) |     idx_start = len(data.data) | ||||||
|   if idx_start < len(data.data_orig): |   if idx_start < len(data.orig.data): | ||||||
|     _q,_data = utils.removeBackground(data.q_orig[idx],data.data_orig[:,idx], |     _q,_data = utils.removeBackground(data.orig.q[idx],data.orig.data[:,idx], | ||||||
|                max_iter=max_iter,background_regions=background_regions,**removeBkg) |                max_iter=max_iter,background_regions=background_regions,**removeBkg) | ||||||
|     data.q = _q |     data.q = _q | ||||||
|     data.data  = np.concatenate( (data.data,_data  ) ) |     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 |   return data | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def doFolder(folder,files='*.edf*',nQ = 1500,force=False,mask=None,dark=10,norm='auto',save_pyfai=False, | def doFolder(folder,files='*.edf*',nQ = 1500,force=False,mask=None,dark=10, | ||||||
|              saveChi=True,poni='pyfai.poni',storageFile='auto',save=True,diagnostic=None,skip_first=0,last=None): |     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 |   """ calc 1D curves from files in folder, returning a dictionary of stuff | ||||||
|       nQ    : number of Q-points (equispaced) |       nQ    : number of Q-points (equispaced) | ||||||
|       force : if True, redo from beginning even if previous data are found |       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] |       mask  : can be a list of [filenames|array of booleans|mask string] | ||||||
|               pixels that are True are dis-regarded |               pixels that are True are dis-regarded | ||||||
|       saveChi: self-explanatory |       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: |       poni  : could be: | ||||||
|               → an AzimuthalIntegrator instance |               → an AzimuthalIntegrator instance | ||||||
|               → a filename that will be look for in |               → 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: |   else: | ||||||
|     saved = None |     saved = None | ||||||
| 
 | 
 | ||||||
|   files = utils.getFiles(folder,files)[skip_first:last] |   files = utils.getFiles(folder,files) | ||||||
|   if saved is not None: |   if logDict is not None: | ||||||
|     files = [f for f in files if utils.getBasename(f) not in saved["files"]] |     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] |   if saved is not None: | ||||||
|     files_diagnostic = list(diagnostic[key].keys()) |     files = [f for f in files if f not in saved["files"]] | ||||||
|     files = [ f for f in files if utils.getBasename(f) in files_diagnostic ] |  | ||||||
|   log.info("Will do azimuthal integration for %d files"%(len(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: |   if len(files) > 0: | ||||||
|     # which poni file to use: |     # which poni file to use: | ||||||
|     ai = getAI(poni,folder) |     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" |         chi_fname = utils.removeExt(fname) + ".chi" | ||||||
|         utils.saveTxt(chi_fname,q,np.vstack((i,e)),info=ai_as_str(ai),overwrite=True) |         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: |     if saved is not None: | ||||||
|       files = np.concatenate( (saved["files"] ,files ) ) |       files = np.concatenate( (saved["files"] ,basenames ) ) | ||||||
|       data  = np.concatenate( (saved["data"]  ,data  ) ) |       data  = np.concatenate( (saved["data"]  ,data  ) ) | ||||||
|       err   = np.concatenate( (saved["err"]   ,err   ) ) |       err   = np.concatenate( (saved["err"]   ,err   ) ) | ||||||
|     ret = dict(q=q,folder=folder,files=files,data=data,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) |           pyfai=ai_as_dict(ai),pyfai_info=ai_as_str(ai),mask=mask) | ||||||
|     if not save_pyfai: del ret['pyfai'] |     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) |     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 |     # sometime saving is not necessary (if one has to do it after subtracting background | ||||||
|     if storageFile is not None and save: ret.save(storageFile) |     if storageFile is not None and save: ret.save(storageFile) | ||||||
|   else: |   else: | ||||||
|  |  | ||||||
							
								
								
									
										44
									
								
								xray/id9.py
								
								
								
								
							
							
						
						
									
										44
									
								
								xray/id9.py
								
								
								
								
							|  | @ -33,7 +33,7 @@ def _readDiagnostic(fname,retry=3): | ||||||
|   # it should not arrive here |   # it should not arrive here | ||||||
|   raise ValueError("Could not read diagnostic file after %d attempts"%retry) |   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 |   """ return an ordered dict dictionary of filename; for each key a rounded | ||||||
|       value of delay is associated """ |       value of delay is associated """ | ||||||
|   if os.path.isdir(fname): fname += "/diagnostics.log" |   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) |   # skip lines that cannot be interpreted as float (like done, etc) | ||||||
|   idx_ok = np.isfinite( delays ) |   idx_ok = np.isfinite( delays ) | ||||||
|   files = files[idx_ok] |   files = files[idx_ok] | ||||||
|  |   files = np.asarray( [utils.getBasename(f) for f in files])  | ||||||
|   delays = delays[idx_ok] |   delays = delays[idx_ok] | ||||||
|   delays = np.round(delays.astype(float),12) |   delays = np.round(delays.astype(float),12) | ||||||
|   return collections.OrderedDict( zip(files,delays) ) |   return dict( file = files, scan = delays)  | ||||||
| 
 | 
 | ||||||
| def _findDark(line): | def _findDark(line): | ||||||
|   _,value = line.split(":") |   _,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, | 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), |   saveChi=True,poni='pyfai.poni',storageFile='auto',dark=9.9,dezinger=None, | ||||||
|   removeBack=False,removeBack_kw=dict()): |   qlims=(0,10),removeBack=False,removeBack_kw=dict(),skip_first=0, | ||||||
|  |   last=None): | ||||||
|   """ very small wrapper around azav.doFolder, essentially just reading |   """ 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 |   if storageFile == 'auto' : storageFile = folder +  "/" + "pyfai_1d" + default_extension | ||||||
| 
 | 
 | ||||||
|   data = azav.doFolder(folder,files=files,nQ=nQ,force=force,mask=mask, |   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: |   #try: | ||||||
|   #  if removeBack is not None: |   #  if removeBack is not None: | ||||||
|   #    _,data.data = azav.removeBackground(data,qlims=qlims,**removeBack_kw) |   #    _,data.data = azav.removeBackground(data,qlims=qlims,**removeBack_kw) | ||||||
|   #except Exception as e: |   #except Exception as e: | ||||||
|   #  log.error("Could not remove background, error was %s"%(str(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) | #  idx = utils.findSlice(data.q,qlims) | ||||||
| #  n   = np.nanmean(data.data[:,idx],axis=1) | #  n   = np.nanmean(data.data[:,idx],axis=1) | ||||||
| #  data.norm_range = qlims | #  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, | def doFolder_dataRed(azavStorage,monitor=None,funcForAveraging=np.nanmean, | ||||||
|                      qlims=None,outStorageFile='auto',reference='min'): |                      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): |   if isinstance(azavStorage,storage.DataStorage): | ||||||
|     data = azavStorage |     data = azavStorage | ||||||
|  | @ -156,11 +165,11 @@ def doFolder_dataRed(azavStorage,monitor=None,funcForAveraging=np.nanmean, | ||||||
|     data.err  = data.err[:,idx] |     data.err  = data.err[:,idx] | ||||||
|     data.q    = data.q[idx] |     data.q    = data.q[idx] | ||||||
| 
 | 
 | ||||||
| 
 |   if isinstance(monitor,str): monitor = data['log'][monitor] | ||||||
| 
 | 
 | ||||||
|   # calculate differences |   # calculate differences | ||||||
|   diffs = dataReduction.calcTimeResolvedSignal(data.delays,data.data,err=data.err, |   diffs = dataReduction.calcTimeResolvedSignal(data.log.delay,data.data, | ||||||
|           q=data.q,reference=reference,monitor=monitor, |           err=data.err,q=data.q,reference=reference,monitor=monitor, | ||||||
|           funcForAveraging=funcForAveraging) |           funcForAveraging=funcForAveraging) | ||||||
| 
 | 
 | ||||||
|   # save txt and npz file |   # save txt and npz file | ||||||
|  | @ -171,7 +180,7 @@ def doFolder_dataRed(azavStorage,monitor=None,funcForAveraging=np.nanmean, | ||||||
| 
 | 
 | ||||||
|   return data,diffs |   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 |   import matplotlib.pyplot as plt | ||||||
|   if folder == "./": folder = os.path.abspath(folder) |   if folder == "./": folder = os.path.abspath(folder) | ||||||
|   fig = plt.figure() |   fig = plt.figure() | ||||||
|  | @ -196,6 +205,7 @@ def doFolder(folder,azav_kw = dict(), datared_kw = dict(),online=True, retryMax= | ||||||
|       else: |       else: | ||||||
|         retryNum += 1 |         retryNum += 1 | ||||||
|       plt.pause(30) |       plt.pause(30) | ||||||
|  |       if force: force=False; # does not make sense to have always True ... | ||||||
|     except KeyboardInterrupt: |     except KeyboardInterrupt: | ||||||
|       keepGoing = False |       keepGoing = False | ||||||
|     if not online: keepGoing = False |     if not online: keepGoing = False | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue