def LoadMAGIKPSD(filename, path="", friendly_name="", collapse_y=True, auto_PolState=False, PolState='', flip=True, transpose=True, **kw): """ loads a data file into a MetaArray and returns that. Checks to see if data being loaded is 2D; if not, quits Need to rebin and regrid if the detector is moving... """ lookup = {"DOWN_DOWN":"_down_down", "UP_DOWN":"_up_down", "DOWN_UP":"_down_up", "UP_UP":"_up_up", "entry": ""} if '.nxz' in filename: file_obj = hzf.File(filename) else: # nexus file_obj = h5py.File(os.path.join(path, filename)) #if not (len(file_obj.detector.counts.shape) == 2): # not a 2D object! # return for entryname, entry in file_obj.items(): active_slice = slice(None, DETECTOR_ACTIVE[0], DETECTOR_ACTIVE[1]) counts_value = entry['DAS_logs']['areaDetector']['counts'].value[:, 1:DETECTOR_ACTIVE[0]+1, :DETECTOR_ACTIVE[1]] dims = counts_value.shape print dims ndims = len(dims) if auto_PolState: PolState = lookup.get(entryname, "") # force PolState to a regularized version: if not PolState in lookup.values(): PolState = '' #datalen = file_obj.detector.counts.shape[0] if ndims == 2: if DEBUG: print "2d" ypixels = dims[0] xpixels = dims[1] elif ndims >= 3: if DEBUG: print "3d" frames = dims[0] xpixels = dims[1] ypixels = dims[2] creation_story = "LoadMAGIKPSD('{fn}', path='{p}')".format(fn=filename, p=path, aPS=auto_PolState, PS=PolState) # doesn't really matter; changing so that each keyword (whether it took the default value # provided or not) will be defined # if not PolState == '': # creation_story += ", PolState='{0}'".format(PolState) # creation_story += ")" if ndims == 2: # one of the dimensions has been collapsed. info = [] info.append({"name": "xpixel", "units": "pixels", "values": arange(xpixels) }) # reverse order info.append({"name": "theta", "units": "degrees", "values": entry['DAS_logs']['sampleAngle']['softPosition'].value }) info.extend([ {"name": "Measurements", "cols": [ {"name": "counts"}, {"name": "pixels"}, {"name": "monitor"}, {"name": "count_time"}]}, {"PolState": PolState, "filename": filename, "start_datetime": dateutil.parser.parse(file_obj.attrs.get('file_time')), "friendly_name": friendly_name, "CreationStory":creation_story, "path":path, "det_angle":entry['DAS_logs']['detectorAngle']['softPosition'].value}] ) data_array = zeros((xpixels, ypixels, 4)) mon = entry['DAS_logs']['counter']['liveMonitor'].value count_time = entry['DAS_logs']['counter']['liveTime'].value if ndims == 2: mon.shape = (1,) + mon.shape # broadcast the monitor over the other dimension count_time.shape = (1,) + count_time.shape counts = counts_value if transpose == True: counts = counts.swapaxes(0,1) if flip == True: counts = flipud(counts) data_array[..., 0] = counts #data_array[..., 0] = file_obj.detector.counts data_array[..., 1] = 1 data_array[..., 2] = mon data_array[..., 3] = count_time # data_array[:,:,4]... I wish!!! Have to do by hand. data = MetaArray(data_array, dtype='float', info=info) data.friendly_name = friendly_name # goes away on dumps/loads... just for initial object. elif ndims == 3: # then it's an unsummed collection of detector shots. Should be one sample and detector angle per frame if collapse_y == True: info = [] info.append({"name": "xpixel", "units": "pixels", "values": arange(xpixels) }) # reverse order info.append({"name": "theta", "units": "degrees", "values": entry['DAS_logs']['sampleAngle']['softPosition'].value }) info.extend([ {"name": "Measurements", "cols": [ {"name": "counts"}, {"name": "pixels"}, {"name": "monitor"}, {"name": "count_time"}]}, {"PolState": PolState, "filename": filename, "start_datetime": dateutil.parser.parse(file_obj.attrs.get('file_time')), "friendly_name": friendly_name, "CreationStory":creation_story, "path":path, "det_angle":entry['DAS_logs']['detectorAngle']['softPosition'].value}] ) data_array = zeros((xpixels, frames, 4)) mon = entry['DAS_logs']['counter']['liveMonitor'].value count_time = entry['DAS_logs']['counter']['liveTime'].value if ndims == 3: mon.shape = (1,) + mon.shape # broadcast the monitor over the other dimension count_time.shape = (1,) + count_time.shape counts = numpy.sum(counts_value, axis=2) if transpose == True: counts = counts.swapaxes(0,1) if flip == True: counts = flipud(counts) data_array[..., 0] = counts #data_array[..., 0] = file_obj.detector.counts data_array[..., 1] = 1 data_array[..., 2] = mon data_array[..., 3] = count_time # data_array[:,:,4]... I wish!!! Have to do by hand. data = MetaArray(data_array, dtype='float', info=info) data.friendly_name = friendly_name # goes away on dumps/loads... just for initial object. else: # make separate frames infos = [] data = [] samp_angle = entry['DAS_logs']['sampleAngle']['softPosition'].value if samp_angle.shape[0] == 1: samp_angle = numpy.ones((frames,)) * samp_angle det_angle = entry['DAS_logs']['detectorAngle']['softPosition'].value if det_angle.shape[0] == 1: det_angle = numpy.ones((frames,)) * det_angle for i in range(frames): samp_angle = entry['DAS_logs']['sampleAngle']['softPosition'].value[i] det_angle = entry['DAS_logs']['detectorAngle']['softPosition'].value[i] info = [] info.append({"name": "xpixel", "units": "pixels", "values": range(xpixels) }) info.append({"name": "ypixel", "units": "pixels", "values": range(ypixels) }) info.extend([ {"name": "Measurements", "cols": [ {"name": "counts"}, {"name": "pixels"}, {"name": "monitor"}, {"name": "count_time"}]}, {"PolState": PolState, "filename": filename, "start_datetime": entry['start_time'].value, "friendly_name": friendly_name, "CreationStory":creation_story, "path":path, "samp_angle": samp_angle, "det_angle": det_angle}] ) data_array = zeros((xpixels, ypixels, 4)) mon = entry['DAS_logs']['counter']['liveMonitor'].value[i] count_time = entry['DAS_logs']['counter']['liveTime'].value[i] counts = counts_value[i] if flip == True: counts = flipud(counts) data_array[..., 0] = counts data_array[..., 1] = 1 data_array[..., 2] = mon data_array[..., 3] = count_time # data_array[:,:,4]... I wish!!! Have to do by hand. subdata = MetaArray(data_array, dtype='float', info=info) subdata.friendly_name = friendly_name + ("_%d" % i) # goes away on dumps/loads... just for initial object. data.append(subdata) return data
def loadMAGIKPSD_helper(file_obj, name, path, collapse=True, collapse_axis='y', auto_PolState=False, PolState='', flip=True, transpose=True): lookup = {"DOWN_DOWN":"_down_down", "UP_DOWN":"_up_down", "DOWN_UP":"_down_up", "UP_UP":"_up_up", "entry": ""} #nx_entries = LoadMAGIKPSD.load_entries(name, fid, entries=entries) #fid.close() #if not (len(file_obj.detector.counts.shape) == 2): # not a 2D object! # return for entryname, entry in file_obj.items(): active_slice = slice(None, DETECTOR_ACTIVE[0], DETECTOR_ACTIVE[1]) counts_value = entry['DAS_logs/areaDetector/counts'].value[:, 1:DETECTOR_ACTIVE[0]+1, :DETECTOR_ACTIVE[1]] dims = counts_value.shape ndims = len(dims) if auto_PolState: PolState = lookup.get(entryname, "") # force PolState to a regularized version: if not PolState in lookup.values(): PolState = '' #datalen = file_obj.detector.counts.shape[0] if ndims == 2: if DEBUG: print "2d" ypixels = dims[0] xpixels = dims[1] elif ndims >= 3: if DEBUG: print "3d" frames = dims[0] xpixels = dims[1] ypixels = dims[2] # doesn't really matter; changing so that each keyword (whether it took the default value # provided or not) will be defined # if not PolState == '': # creation_story += ", PolState='{0}'".format(PolState) # creation_story += ")" if ndims == 2: # one of the dimensions has been collapsed. info = [] info.append({"name": "xpixel", "units": "pixels", "values": arange(xpixels) }) # reverse order samp_angle = entry['DAS_logs/sampleAngle/softPosition'].value det_angle = entry['DAS_logs/detectorAngle/softPosition'].value if samp_angle.size > 1: yaxis = entry['DAS_logs/sampleAngle/softPosition'] yaxisname = "theta" elif det_angle.size > 1: yaxis = entry['DAS_logs/detectorAngle/softPosition'] yaxisname = "det_angle" else: # need to find the one that's moving... yaxis = entry['data/x'] yaxisname = yaxis.path yaxisunits = yaxis.attrs['units'] yaxisvalues = yaxis.value info.append({"name": yaxisname, "units": yaxisunits, "values": yaxisvalues}) info.extend([ {"name": "Measurements", "cols": [ {"name": "counts"}, {"name": "pixels"}, {"name": "monitor"}, {"name": "count_time"}]}, {"PolState": PolState, "filename": filename, "start_datetime": entry['start_time'].value[0], "friendly_name": entry['DAS_logs/sample/name'].value[0], "entry": entryname, "path":path, "det_angle":entry['DAS_logs/detectorAngle/softPosition'].value, "theta": entry['DAS_logs/sampleAngle/softPosition'].value}] ) data_array = zeros((xpixels, ypixels, 4)) mon = entry['DAS_logs']['counter']['liveMonitor'].value count_time = entry['DAS_logs']['counter']['liveTime'].value if ndims == 2: mon.shape = (1,) + mon.shape # broadcast the monitor over the other dimension count_time.shape = (1,) + count_time.shape counts = counts_value if transpose == True: counts = counts.swapaxes(0,1) if flip == True: counts = flipud(counts) data_array[..., 0] = counts #data_array[..., 0] = file_obj.detector.counts data_array[..., 1] = 1 data_array[..., 2] = mon data_array[..., 3] = count_time # data_array[:,:,4]... I wish!!! Have to do by hand. data = MetaArray(data_array, dtype='float', info=info) data.friendly_name = name # goes away on dumps/loads... just for initial object. ouput = [data] elif ndims == 3: # then it's an unsummed collection of detector shots. Should be one sample and detector angle per frame if collapse == True: info = [] xaxis = "xpixel" if collapse_axis == 'y' else "ypixel" xdim = xpixels if collapse_axis == 'y' else ypixels xaxisvalues = arange(xdim) info.append({"name": xaxis, "units": "pixels", "values": xaxisvalues }) # reverse order samp_angle = entry['DAS_logs/sampleAngle/softPosition'].value det_angle = entry['DAS_logs/detectorAngle/softPosition'].value if samp_angle.size > 1: yaxis = entry['DAS_logs/sampleAngle/softPosition'] yaxisname = "theta" elif det_angle.size > 1: yaxis = entry['DAS_logs/detectorAngle/softPosition'] yaxisname = "det_angle" else: # need to find the one that's moving... yaxis = entry['data/x'] yaxisname = yaxis.path yaxisunits = yaxis.attrs['units'] yaxisvalues = yaxis.value info.append({"name": yaxisname, "units": yaxisunits, "values": yaxisvalues}) info.extend([ {"name": "Measurements", "cols": [ {"name": "counts"}, {"name": "pixels"}, {"name": "monitor"}, {"name": "count_time"}]}, {"PolState": PolState, "start_datetime": entry['start_time'].value[0], "path":path, "det_angle": det_angle.tolist(), "theta": samp_angle.tolist(), "friendly_name": entry['DAS_logs/sample/name'].value[0], "entry": entryname}] ) data_array = zeros((xdim, frames, 4)) mon = entry['DAS_logs']['counter']['liveMonitor'].value count_time = entry['DAS_logs']['counter']['liveTime'].value if ndims == 3: mon.shape = (1,) + mon.shape # broadcast the monitor over the other dimension count_time.shape = (1,) + count_time.shape axis_to_sum = 2 if collapse_axis == 'y' else 1 counts = numpy.sum(counts_value, axis=axis_to_sum) if transpose == True: counts = counts.swapaxes(0,1) if flip == True: counts = flipud(counts) data_array[..., 0] = counts #data_array[..., 0] = file_obj.detector.counts data_array[..., 1] = 1 data_array[..., 2] = mon data_array[..., 3] = count_time # data_array[:,:,4]... I wish!!! Have to do by hand. data = MetaArray(data_array, dtype='float', info=info) data.friendly_name = name # goes away on dumps/loads... just for initial object. output = [data] else: # make separate frames infos = [] data = [] samp_angle = entry['DAS_logs/sampleAngle/softPosition'].value.astype('float') if samp_angle.shape[0] == 1: samp_angle = numpy.ones((frames,)) * samp_angle det_angle = entry['DAS_logs/detectorAngle/softPosition'].value.astype('float') if det_angle.shape[0] == 1: det_angle = numpy.ones((frames,)) * det_angle count_time = entry['DAS_logs/counter/liveTime'].value if count_time.shape[0] == 1: count_time = numpy.ones((frames,)) * count_time mon = entry['DAS_logs/counter/liveMonitor'].value if mon.shape[0] == 1: mon = numpy.ones((frames,)) * mon for i in range(frames): info = [] info.append({"name": "xpixel", "units": "pixels", "values": range(xpixels) }) info.append({"name": "ypixel", "units": "pixels", "values": range(ypixels) }) info.extend([ {"name": "Measurements", "cols": [ {"name": "counts"}, {"name": "pixels"}, {"name": "monitor"}, {"name": "count_time"}]}, {"PolState": PolState, "start_datetime": entry['start_time'].value[0], "friendly_name": entry['DAS_logs/sample/name'].value[0], "entry": entryname, "path":path, "samp_angle": samp_angle[i], "det_angle": det_angle[i]}] ) data_array = zeros((xpixels, ypixels, 4)) counts = counts_value[i] if flip == True: counts = flipud(counts) data_array[..., 0] = counts data_array[..., 1] = 1 data_array[..., 2] = mon[i] data_array[..., 3] = count_time[i] # data_array[:,:,4]... I wish!!! Have to do by hand. subdata = MetaArray(data_array, dtype='float', info=info) subdata.friendly_name = name + ("_%d" % i) # goes away on dumps/loads... just for initial object. data.append(subdata) output = data return output
def LoadICPData(filename, path="", friendly_name="", auto_PolState=False, PolState='', flip=True, transpose=True, **kw): """ loads a data file into a MetaArray and returns that. Checks to see if data being loaded is 2D; if not, quits Need to rebin and regrid if the detector is moving... """ lookup = {"a":"_down_down", "b":"_up_down", "c":"_down_up", "d":"_up_up", "g": ""} file_obj = load(os.path.join(path, filename), format='NCNR NG-1') dims = file_obj.detector.counts.shape ndims = len(dims) #if not (len(file_obj.detector.counts.shape) == 2): # not a 2D object! # return if auto_PolState: key = friendly_name[-2:-1] # na1, ca1 etc. are --, nc1, cc1 are -+... PolState = lookup.get(key, "") # force PolState to a regularized version: if not PolState in lookup.values(): PolState = '' #datalen = file_obj.detector.counts.shape[0] if ndims == 2: if DEBUG: print "2d" ypixels = file_obj.detector.counts.shape[0] xpixels = file_obj.detector.counts.shape[1] elif ndims >= 3: if DEBUG: print "3d" frames = file_obj.detector.counts.shape[0] ypixels = file_obj.detector.counts.shape[1] xpixels = file_obj.detector.counts.shape[2] creation_story = "LoadICPData('{fn}', path='{p}', auto_PolState={aPS}, PolState='{PS}')".format(fn=filename, p=path, aPS=auto_PolState, PS=PolState) # doesn't really matter; changing so that each keyword (whether it took the default value # provided or not) will be defined # if not PolState == '': # creation_story += ", PolState='{0}'".format(PolState) # creation_story += ")" if ndims == 2: # one of the dimensions has been collapsed. info = [] info.append({"name": "xpixel", "units": "pixels", "values": arange(xpixels) }) # reverse order info.append({"name": "theta", "units": "degrees", "values": file_obj.sample.angle_x }) info.extend([ {"name": "Measurements", "cols": [ {"name": "counts"}, {"name": "pixels"}, {"name": "monitor"}, {"name": "count_time"}]}, {"PolState": PolState, "filename": filename, "start_datetime": file_obj.date, "friendly_name": friendly_name, "CreationStory":creation_story, "path":path, "det_angle":file_obj.detector.angle_x}] ) data_array = zeros((xpixels, ypixels, 4)) mon = file_obj.monitor.counts count_time = file_obj.monitor.count_time if ndims == 2: mon.shape = (1,) + mon.shape # broadcast the monitor over the other dimension count_time.shape = (1,) + count_time.shape counts = file_obj.detector.counts if transpose == True: counts = counts.swapaxes(0,1) if flip == True: counts = flipud(counts) data_array[..., 0] = counts #data_array[..., 0] = file_obj.detector.counts data_array[..., 1] = 1 data_array[..., 2] = mon data_array[..., 3] = count_time # data_array[:,:,4]... I wish!!! Have to do by hand. data = MetaArray(data_array, dtype='float', info=info) data.friendly_name = friendly_name # goes away on dumps/loads... just for initial object. elif ndims == 3: # then it's an unsummed collection of detector shots. Should be one sample and detector angle per frame infos = [] data = [] for i in range(frames): samp_angle = file_obj.sample.angle_x[i] det_angle = file_obj.detector.angle_x[i] info = [] info.append({"name": "xpixel", "units": "pixels", "values": range(xpixels) }) info.append({"name": "ypixel", "units": "pixels", "values": range(ypixels) }) info.extend([ {"name": "Measurements", "cols": [ {"name": "counts"}, {"name": "pixels"}, {"name": "monitor"}, {"name": "count_time"}]}, {"PolState": PolState, "filename": filename, "start_datetime": file_obj.date, "friendly_name": friendly_name, "CreationStory":creation_story, "path":path, "samp_angle": samp_angle, "det_angle": det_angle}] ) data_array = zeros((xpixels, ypixels, 4)) mon = file_obj.monitor.counts[i] count_time = file_obj.monitor.count_time[i] counts = file_obj.detector.counts[i] if flip == True: counts = flipud(counts) data_array[..., 0] = counts data_array[..., 1] = 1 data_array[..., 2] = mon data_array[..., 3] = count_time # data_array[:,:,4]... I wish!!! Have to do by hand. subdata = MetaArray(data_array, dtype='float', info=info) subdata.friendly_name = friendly_name + ("_%d" % i) # goes away on dumps/loads... just for initial object. data.append(subdata) return data