Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/sas/sascalc/dataloader/readers/cansas_reader_HDF5.py

    r61f329f0 rfeec1cb  
    1212    Data1D, Data2D, DataInfo, Process, Aperture, Collimation, \ 
    1313    TransmissionSpectrum, Detector 
    14 from ..data_info import combine_data_info_with_plottable 
    1514from ..loader_exceptions import FileContentsException, DefaultReaderException 
    1615from ..file_reader_base_class import FileReader, decode 
    1716 
     17 
    1818def h5attr(node, key, default=None): 
    1919    return decode(node.attrs.get(key, default)) 
     20 
    2021 
    2122class Reader(FileReader): 
     
    3839    # CanSAS version 
    3940    cansas_version = 2.0 
    40     # Logged warnings or messages 
    41     logging = None 
    42     # List of errors for the current data set 
    43     errors = None 
    44     # Raw file contents to be processed 
    45     raw_data = None 
    46     # List of plottable1D objects that should be linked to the current_datainfo 
    47     data1d = None 
    48     # List of plottable2D objects that should be linked to the current_datainfo 
    49     data2d = None 
    5041    # Data type name 
    51     type_name = "CanSAS 2.0" 
     42    type_name = "NXcanSAS" 
    5243    # Wildcards 
    53     type = ["CanSAS 2.0 HDF5 Files (*.h5)|*.h5"] 
     44    type = ["NXcanSAS HDF5 Files (*.h5)|*.h5|"] 
    5445    # List of allowed extensions 
    5546    ext = ['.h5', '.H5'] 
     
    8172                except Exception as e: 
    8273                    if extension not in self.ext: 
    83                         msg = "CanSAS2.0 HDF5 Reader could not load file {}".format(basename + extension) 
     74                        msg = "NXcanSAS Reader could not load file {}".format( 
     75                            basename + extension) 
    8476                        raise DefaultReaderException(msg) 
    8577                    raise FileContentsException(e.message) 
     
    9587                    self.raw_data.close() 
    9688 
    97                 for dataset in self.output: 
    98                     if isinstance(dataset, Data1D): 
    99                         if dataset.x.size < 5: 
    100                             self.output = [] 
    101                             raise FileContentsException("Fewer than 5 data points found.") 
     89                for data_set in self.output: 
     90                    if isinstance(data_set, Data1D): 
     91                        if data_set.x.size < 5: 
     92                            exception = FileContentsException( 
     93                                "Fewer than 5 data points found.") 
     94                            data_set.errors.append(exception) 
    10295 
    10396    def reset_state(self): 
     
    111104        self.errors = set() 
    112105        self.logging = [] 
     106        self.q_name = [] 
     107        self.mask_name = u'' 
     108        self.i_name = u'' 
     109        self.i_node = u'' 
     110        self.q_uncertainties = None 
     111        self.q_resolutions = None 
     112        self.i_uncertainties = u'' 
    113113        self.parent_class = u'' 
    114114        self.detector = Detector() 
     
    131131            value = data.get(key) 
    132132            class_name = h5attr(value, u'canSAS_class') 
     133            if isinstance(class_name, (list, tuple, np.ndarray)): 
     134                class_name = class_name[0] 
    133135            if class_name is None: 
    134136                class_name = h5attr(value, u'NX_class') 
     
    140142            if isinstance(value, h5py.Group): 
    141143                # Set parent class before recursion 
     144                last_parent_class = self.parent_class 
    142145                self.parent_class = class_name 
    143146                parent_list.append(key) 
     
    147150                    self.add_data_set(key) 
    148151                elif class_prog.match(u'SASdata'): 
    149                     self._initialize_new_data_set(parent_list) 
     152                    self._initialize_new_data_set(value) 
     153                    self._find_data_attributes(value) 
    150154                # Recursion step to access data within the group 
    151155                self.read_children(value, parent_list) 
     156                self.add_intermediate() 
    152157                # Reset parent class when returning from recursive method 
    153                 self.parent_class = class_name 
    154                 self.add_intermediate() 
     158                self.parent_class = last_parent_class 
    155159                parent_list.remove(key) 
    156160 
    157161            elif isinstance(value, h5py.Dataset): 
    158162                # If this is a dataset, store the data appropriately 
    159                 data_set = data[key][:] 
     163                data_set = value.value 
    160164                unit = self._get_unit(value) 
    161  
    162                 # I and Q Data 
    163                 if key == u'I': 
    164                     if isinstance(self.current_dataset, plottable_2D): 
    165                         self.current_dataset.data = data_set 
    166                         self.current_dataset.zaxis("Intensity", unit) 
    167                     else: 
    168                         self.current_dataset.y = data_set.flatten() 
    169                         self.current_dataset.yaxis("Intensity", unit) 
    170                     continue 
    171                 elif key == u'Idev': 
    172                     if isinstance(self.current_dataset, plottable_2D): 
    173                         self.current_dataset.err_data = data_set.flatten() 
    174                     else: 
    175                         self.current_dataset.dy = data_set.flatten() 
    176                     continue 
    177                 elif key == u'Q': 
    178                     self.current_dataset.xaxis("Q", unit) 
    179                     if isinstance(self.current_dataset, plottable_2D): 
    180                         self.current_dataset.q = data_set.flatten() 
    181                     else: 
    182                         self.current_dataset.x = data_set.flatten() 
    183                     continue 
    184                 elif key == u'Qdev': 
    185                     self.current_dataset.dx = data_set.flatten() 
    186                     continue 
    187                 elif key == u'dQw': 
    188                     self.current_dataset.dxw = data_set.flatten() 
    189                     continue 
    190                 elif key == u'dQl': 
    191                     self.current_dataset.dxl = data_set.flatten() 
    192                     continue 
    193                 elif key == u'Qy': 
    194                     self.current_dataset.yaxis("Q_y", unit) 
    195                     self.current_dataset.qy_data = data_set.flatten() 
    196                     continue 
    197                 elif key == u'Qydev': 
    198                     self.current_dataset.dqy_data = data_set.flatten() 
    199                     continue 
    200                 elif key == u'Qx': 
    201                     self.current_dataset.xaxis("Q_x", unit) 
    202                     self.current_dataset.qx_data = data_set.flatten() 
    203                     continue 
    204                 elif key == u'Qxdev': 
    205                     self.current_dataset.dqx_data = data_set.flatten() 
    206                     continue 
    207                 elif key == u'Mask': 
    208                     self.current_dataset.mask = data_set.flatten() 
    209                     continue 
    210                 # Transmission Spectrum 
    211                 elif (key == u'T' 
    212                       and self.parent_class == u'SAStransmission_spectrum'): 
    213                     self.trans_spectrum.transmission = data_set.flatten() 
    214                     continue 
    215                 elif (key == u'Tdev' 
    216                       and self.parent_class == u'SAStransmission_spectrum'): 
    217                     self.trans_spectrum.transmission_deviation = \ 
    218                         data_set.flatten() 
    219                     continue 
    220                 elif (key == u'lambda' 
    221                       and self.parent_class == u'SAStransmission_spectrum'): 
    222                     self.trans_spectrum.wavelength = data_set.flatten() 
    223                     continue 
    224165 
    225166                for data_point in data_set: 
     
    232173                    if key == u'definition': 
    233174                        self.current_datainfo.meta_data['reader'] = data_point 
     175                    # Run 
    234176                    elif key == u'run': 
    235177                        self.current_datainfo.run.append(data_point) 
     
    240182                        except Exception: 
    241183                            pass 
     184                    # Title 
    242185                    elif key == u'title': 
    243186                        self.current_datainfo.title = data_point 
     187                    # Note 
    244188                    elif key == u'SASnote': 
    245189                        self.current_datainfo.notes.append(data_point) 
    246  
    247190                    # Sample Information 
    248                     # CanSAS 2.0 format 
    249                     elif key == u'Title' and self.parent_class == u'SASsample': 
    250                         self.current_datainfo.sample.name = data_point 
    251                     # NXcanSAS format 
    252                     elif key == u'name' and self.parent_class == u'SASsample': 
    253                         self.current_datainfo.sample.name = data_point 
    254                     # NXcanSAS format 
    255                     elif key == u'ID' and self.parent_class == u'SASsample': 
    256                         self.current_datainfo.sample.name = data_point 
    257                     elif (key == u'thickness' 
    258                           and self.parent_class == u'SASsample'): 
    259                         self.current_datainfo.sample.thickness = data_point 
    260                     elif (key == u'temperature' 
    261                           and self.parent_class == u'SASsample'): 
    262                         self.current_datainfo.sample.temperature = data_point 
    263                     elif (key == u'transmission' 
    264                           and self.parent_class == u'SASsample'): 
    265                         self.current_datainfo.sample.transmission = data_point 
    266                     elif (key == u'x_position' 
    267                           and self.parent_class == u'SASsample'): 
    268                         self.current_datainfo.sample.position.x = data_point 
    269                     elif (key == u'y_position' 
    270                           and self.parent_class == u'SASsample'): 
    271                         self.current_datainfo.sample.position.y = data_point 
    272                     elif key == u'pitch' and self.parent_class == u'SASsample': 
    273                         self.current_datainfo.sample.orientation.x = data_point 
    274                     elif key == u'yaw' and self.parent_class == u'SASsample': 
    275                         self.current_datainfo.sample.orientation.y = data_point 
    276                     elif key == u'roll' and self.parent_class == u'SASsample': 
    277                         self.current_datainfo.sample.orientation.z = data_point 
    278                     elif (key == u'details' 
    279                           and self.parent_class == u'SASsample'): 
    280                         self.current_datainfo.sample.details.append(data_point) 
    281  
     191                    elif self.parent_class == u'SASsample': 
     192                        self.process_sample(data_point, key) 
    282193                    # Instrumental Information 
    283194                    elif (key == u'name' 
    284195                          and self.parent_class == u'SASinstrument'): 
    285196                        self.current_datainfo.instrument = data_point 
    286                     elif key == u'name' and self.parent_class == u'SASdetector': 
    287                         self.detector.name = data_point 
    288                     elif key == u'SDD' and self.parent_class == u'SASdetector': 
    289                         self.detector.distance = float(data_point) 
    290                         self.detector.distance_unit = unit 
    291                     elif (key == u'slit_length' 
    292                           and self.parent_class == u'SASdetector'): 
    293                         self.detector.slit_length = float(data_point) 
    294                         self.detector.slit_length_unit = unit 
    295                     elif (key == u'x_position' 
    296                           and self.parent_class == u'SASdetector'): 
    297                         self.detector.offset.x = float(data_point) 
    298                         self.detector.offset_unit = unit 
    299                     elif (key == u'y_position' 
    300                           and self.parent_class == u'SASdetector'): 
    301                         self.detector.offset.y = float(data_point) 
    302                         self.detector.offset_unit = unit 
    303                     elif (key == u'pitch' 
    304                           and self.parent_class == u'SASdetector'): 
    305                         self.detector.orientation.x = float(data_point) 
    306                         self.detector.orientation_unit = unit 
    307                     elif key == u'roll' and self.parent_class == u'SASdetector': 
    308                         self.detector.orientation.z = float(data_point) 
    309                         self.detector.orientation_unit = unit 
    310                     elif key == u'yaw' and self.parent_class == u'SASdetector': 
    311                         self.detector.orientation.y = float(data_point) 
    312                         self.detector.orientation_unit = unit 
    313                     elif (key == u'beam_center_x' 
    314                           and self.parent_class == u'SASdetector'): 
    315                         self.detector.beam_center.x = float(data_point) 
    316                         self.detector.beam_center_unit = unit 
    317                     elif (key == u'beam_center_y' 
    318                           and self.parent_class == u'SASdetector'): 
    319                         self.detector.beam_center.y = float(data_point) 
    320                         self.detector.beam_center_unit = unit 
    321                     elif (key == u'x_pixel_size' 
    322                           and self.parent_class == u'SASdetector'): 
    323                         self.detector.pixel_size.x = float(data_point) 
    324                         self.detector.pixel_size_unit = unit 
    325                     elif (key == u'y_pixel_size' 
    326                           and self.parent_class == u'SASdetector'): 
    327                         self.detector.pixel_size.y = float(data_point) 
    328                         self.detector.pixel_size_unit = unit 
    329                     elif (key == u'distance' 
    330                           and self.parent_class == u'SAScollimation'): 
    331                         self.collimation.length = data_point 
    332                         self.collimation.length_unit = unit 
    333                     elif (key == u'name' 
    334                           and self.parent_class == u'SAScollimation'): 
    335                         self.collimation.name = data_point 
    336                     elif (key == u'shape' 
    337                           and self.parent_class == u'SASaperture'): 
    338                         self.aperture.shape = data_point 
    339                     elif (key == u'x_gap' 
    340                           and self.parent_class == u'SASaperture'): 
    341                         self.aperture.size.x = data_point 
    342                     elif (key == u'y_gap' 
    343                           and self.parent_class == u'SASaperture'): 
    344                         self.aperture.size.y = data_point 
    345  
     197                    # Detector 
     198                    elif self.parent_class == u'SASdetector': 
     199                        self.process_detector(data_point, key, unit) 
     200                    # Collimation 
     201                    elif self.parent_class == u'SAScollimation': 
     202                        self.process_collimation(data_point, key, unit) 
     203                    # Aperture 
     204                    elif self.parent_class == u'SASaperture': 
     205                        self.process_aperture(data_point, key) 
    346206                    # Process Information 
    347                     elif (key == u'Title' 
    348                           and self.parent_class == u'SASprocess'): # CanSAS 2.0 
    349                         self.process.name = data_point 
    350                     elif (key == u'name' 
    351                           and self.parent_class == u'SASprocess'): # NXcanSAS 
    352                         self.process.name = data_point 
    353                     elif (key == u'description' 
    354                           and self.parent_class == u'SASprocess'): 
    355                         self.process.description = data_point 
    356                     elif key == u'date' and self.parent_class == u'SASprocess': 
    357                         self.process.date = data_point 
    358                     elif key == u'term' and self.parent_class == u'SASprocess': 
    359                         self.process.term = data_point 
    360                     elif self.parent_class == u'SASprocess': 
    361                         self.process.notes.append(data_point) 
    362  
     207                    elif self.parent_class == u'SASprocess': # CanSAS 2.0 
     208                        self.process_process(data_point, key) 
    363209                    # Source 
    364                     elif (key == u'wavelength' 
    365                           and self.parent_class == u'SASdata'): 
    366                         self.current_datainfo.source.wavelength = data_point 
    367                         self.current_datainfo.source.wavelength_unit = unit 
    368                     elif (key == u'incident_wavelength' 
    369                           and self.parent_class == 'SASsource'): 
    370                         self.current_datainfo.source.wavelength = data_point 
    371                         self.current_datainfo.source.wavelength_unit = unit 
    372                     elif (key == u'wavelength_max' 
    373                           and self.parent_class == u'SASsource'): 
    374                         self.current_datainfo.source.wavelength_max = data_point 
    375                         self.current_datainfo.source.wavelength_max_unit = unit 
    376                     elif (key == u'wavelength_min' 
    377                           and self.parent_class == u'SASsource'): 
    378                         self.current_datainfo.source.wavelength_min = data_point 
    379                         self.current_datainfo.source.wavelength_min_unit = unit 
    380                     elif (key == u'incident_wavelength_spread' 
    381                           and self.parent_class == u'SASsource'): 
    382                         self.current_datainfo.source.wavelength_spread = \ 
    383                             data_point 
    384                         self.current_datainfo.source.wavelength_spread_unit = \ 
    385                             unit 
    386                     elif (key == u'beam_size_x' 
    387                           and self.parent_class == u'SASsource'): 
    388                         self.current_datainfo.source.beam_size.x = data_point 
    389                         self.current_datainfo.source.beam_size_unit = unit 
    390                     elif (key == u'beam_size_y' 
    391                           and self.parent_class == u'SASsource'): 
    392                         self.current_datainfo.source.beam_size.y = data_point 
    393                         self.current_datainfo.source.beam_size_unit = unit 
    394                     elif (key == u'beam_shape' 
    395                           and self.parent_class == u'SASsource'): 
    396                         self.current_datainfo.source.beam_shape = data_point 
    397                     elif (key == u'radiation' 
    398                           and self.parent_class == u'SASsource'): 
    399                         self.current_datainfo.source.radiation = data_point 
    400                     elif (key == u'transmission' 
    401                           and self.parent_class == u'SASdata'): 
    402                         self.current_datainfo.sample.transmission = data_point 
    403  
     210                    elif self.parent_class == u'SASsource': 
     211                        self.process_source(data_point, key, unit) 
    404212                    # Everything else goes in meta_data 
     213                    elif self.parent_class == u'SASdata': 
     214                        if isinstance(self.current_dataset, plottable_2D): 
     215                            self.process_2d_data_object(data_set, key, unit) 
     216                        else: 
     217                            self.process_1d_data_object(data_set, key, unit) 
     218 
     219                        break 
     220                    elif self.parent_class == u'SAStransmission_spectrum': 
     221                        self.process_trans_spectrum(data_set, key) 
     222                        break 
    405223                    else: 
    406224                        new_key = self._create_unique_key( 
     
    411229                # I don't know if this reachable code 
    412230                self.errors.add("ShouldNeverHappenException") 
     231 
     232    def process_1d_data_object(self, data_set, key, unit): 
     233        """ 
     234        SASdata processor method for 1d data items 
     235        :param data_set: data from HDF5 file 
     236        :param key: canSAS_class attribute 
     237        :param unit: unit attribute 
     238        """ 
     239        if key == self.i_name: 
     240            self.current_dataset.y = data_set.flatten() 
     241            self.current_dataset.yaxis("Intensity", unit) 
     242        elif key == self.i_uncertainties: 
     243            self.current_dataset.dy = data_set.flatten() 
     244        elif key in self.q_name: 
     245            self.current_dataset.xaxis("Q", unit) 
     246            self.current_dataset.x = data_set.flatten() 
     247        elif key in self.q_uncertainties or key in self.q_resolutions: 
     248            if (len(self.q_resolutions) > 1 
     249                    and np.where(self.q_resolutions == key)[0] == 0): 
     250                self.current_dataset.dxw = data_set.flatten() 
     251            elif (len(self.q_resolutions) > 1 
     252                  and np.where(self.q_resolutions == key)[0] == 1): 
     253                self.current_dataset.dxl = data_set.flatten() 
     254            else: 
     255                self.current_dataset.dx = data_set.flatten() 
     256        elif key == self.mask_name: 
     257            self.current_dataset.mask = data_set.flatten() 
     258        elif key == u'wavelength': 
     259            self.current_datainfo.source.wavelength = data_set[0] 
     260            self.current_datainfo.source.wavelength_unit = unit 
     261 
     262    def process_2d_data_object(self, data_set, key, unit): 
     263        if key == self.i_name: 
     264            self.current_dataset.data = data_set 
     265            self.current_dataset.zaxis("Intensity", unit) 
     266        elif key == self.i_uncertainties: 
     267            self.current_dataset.err_data = data_set.flatten() 
     268        elif key in self.q_name: 
     269            self.current_dataset.xaxis("Q_x", unit) 
     270            self.current_dataset.yaxis("Q_y", unit) 
     271            if self.q_name[0] == self.q_name[1]: 
     272                # All q data in a single array 
     273                self.current_dataset.qx_data = data_set[0] 
     274                self.current_dataset.qy_data = data_set[1] 
     275            elif self.q_name.index(key) == 0: 
     276                self.current_dataset.qx_data = data_set 
     277            elif self.q_name.index(key) == 1: 
     278                self.current_dataset.qy_data = data_set 
     279        elif key in self.q_uncertainties or key in self.q_resolutions: 
     280            if ((self.q_uncertainties[0] == self.q_uncertainties[1]) or 
     281                    (self.q_resolutions[0] == self.q_resolutions[1])): 
     282                # All q data in a single array 
     283                self.current_dataset.dqx_data = data_set[0].flatten() 
     284                self.current_dataset.dqy_data = data_set[1].flatten() 
     285            elif (self.q_uncertainties.index(key) == 0 or 
     286                  self.q_resolutions.index(key) == 0): 
     287                self.current_dataset.dqx_data = data_set.flatten() 
     288            elif (self.q_uncertainties.index(key) == 1 or 
     289                  self.q_resolutions.index(key) == 1): 
     290                self.current_dataset.dqy_data = data_set.flatten() 
     291                self.current_dataset.yaxis("Q_y", unit) 
     292        elif key == self.mask_name: 
     293            self.current_dataset.mask = data_set.flatten() 
     294        elif key == u'Qy': 
     295            self.current_dataset.yaxis("Q_y", unit) 
     296            self.current_dataset.qy_data = data_set.flatten() 
     297        elif key == u'Qydev': 
     298            self.current_dataset.dqy_data = data_set.flatten() 
     299        elif key == u'Qx': 
     300            self.current_dataset.xaxis("Q_x", unit) 
     301            self.current_dataset.qx_data = data_set.flatten() 
     302        elif key == u'Qxdev': 
     303            self.current_dataset.dqx_data = data_set.flatten() 
     304 
     305    def process_trans_spectrum(self, data_set, key): 
     306        """ 
     307        SAStransmission_spectrum processor 
     308        :param data_set: data from HDF5 file 
     309        :param key: canSAS_class attribute 
     310        """ 
     311        if key == u'T': 
     312            self.trans_spectrum.transmission = data_set.flatten() 
     313        elif key == u'Tdev': 
     314            self.trans_spectrum.transmission_deviation = data_set.flatten() 
     315        elif key == u'lambda': 
     316            self.trans_spectrum.wavelength = data_set.flatten() 
     317 
     318    def process_sample(self, data_point, key): 
     319        """ 
     320        SASsample processor 
     321        :param data_point: Single point from an HDF5 data file 
     322        :param key: class name data_point was taken from 
     323        """ 
     324        if key == u'Title': 
     325            self.current_datainfo.sample.name = data_point 
     326        elif key == u'name': 
     327            self.current_datainfo.sample.name = data_point 
     328        elif key == u'ID': 
     329            self.current_datainfo.sample.name = data_point 
     330        elif key == u'thickness': 
     331            self.current_datainfo.sample.thickness = data_point 
     332        elif key == u'temperature': 
     333            self.current_datainfo.sample.temperature = data_point 
     334        elif key == u'transmission': 
     335            self.current_datainfo.sample.transmission = data_point 
     336        elif key == u'x_position': 
     337            self.current_datainfo.sample.position.x = data_point 
     338        elif key == u'y_position': 
     339            self.current_datainfo.sample.position.y = data_point 
     340        elif key == u'pitch': 
     341            self.current_datainfo.sample.orientation.x = data_point 
     342        elif key == u'yaw': 
     343            self.current_datainfo.sample.orientation.y = data_point 
     344        elif key == u'roll': 
     345            self.current_datainfo.sample.orientation.z = data_point 
     346        elif key == u'details': 
     347            self.current_datainfo.sample.details.append(data_point) 
     348 
     349    def process_detector(self, data_point, key, unit): 
     350        """ 
     351        SASdetector processor 
     352        :param data_point: Single point from an HDF5 data file 
     353        :param key: class name data_point was taken from 
     354        :param unit: unit attribute from data set 
     355        """ 
     356        if key == u'name': 
     357            self.detector.name = data_point 
     358        elif key == u'SDD': 
     359            self.detector.distance = float(data_point) 
     360            self.detector.distance_unit = unit 
     361        elif key == u'slit_length': 
     362            self.detector.slit_length = float(data_point) 
     363            self.detector.slit_length_unit = unit 
     364        elif key == u'x_position': 
     365            self.detector.offset.x = float(data_point) 
     366            self.detector.offset_unit = unit 
     367        elif key == u'y_position': 
     368            self.detector.offset.y = float(data_point) 
     369            self.detector.offset_unit = unit 
     370        elif key == u'pitch': 
     371            self.detector.orientation.x = float(data_point) 
     372            self.detector.orientation_unit = unit 
     373        elif key == u'roll': 
     374            self.detector.orientation.z = float(data_point) 
     375            self.detector.orientation_unit = unit 
     376        elif key == u'yaw': 
     377            self.detector.orientation.y = float(data_point) 
     378            self.detector.orientation_unit = unit 
     379        elif key == u'beam_center_x': 
     380            self.detector.beam_center.x = float(data_point) 
     381            self.detector.beam_center_unit = unit 
     382        elif key == u'beam_center_y': 
     383            self.detector.beam_center.y = float(data_point) 
     384            self.detector.beam_center_unit = unit 
     385        elif key == u'x_pixel_size': 
     386            self.detector.pixel_size.x = float(data_point) 
     387            self.detector.pixel_size_unit = unit 
     388        elif key == u'y_pixel_size': 
     389            self.detector.pixel_size.y = float(data_point) 
     390            self.detector.pixel_size_unit = unit 
     391 
     392    def process_collimation(self, data_point, key, unit): 
     393        """ 
     394        SAScollimation processor 
     395        :param data_point: Single point from an HDF5 data file 
     396        :param key: class name data_point was taken from 
     397        :param unit: unit attribute from data set 
     398        """ 
     399        if key == u'distance': 
     400            self.collimation.length = data_point 
     401            self.collimation.length_unit = unit 
     402        elif key == u'name': 
     403            self.collimation.name = data_point 
     404 
     405    def process_aperture(self, data_point, key): 
     406        """ 
     407        SASaperture processor 
     408        :param data_point: Single point from an HDF5 data file 
     409        :param key: class name data_point was taken from 
     410        """ 
     411        if key == u'shape': 
     412            self.aperture.shape = data_point 
     413        elif key == u'x_gap': 
     414            self.aperture.size.x = data_point 
     415        elif key == u'y_gap': 
     416            self.aperture.size.y = data_point 
     417 
     418    def process_source(self, data_point, key, unit): 
     419        """ 
     420        SASsource processor 
     421        :param data_point: Single point from an HDF5 data file 
     422        :param key: class name data_point was taken from 
     423        :param unit: unit attribute from data set 
     424        """ 
     425        if key == u'incident_wavelength': 
     426            self.current_datainfo.source.wavelength = data_point 
     427            self.current_datainfo.source.wavelength_unit = unit 
     428        elif key == u'wavelength_max': 
     429            self.current_datainfo.source.wavelength_max = data_point 
     430            self.current_datainfo.source.wavelength_max_unit = unit 
     431        elif key == u'wavelength_min': 
     432            self.current_datainfo.source.wavelength_min = data_point 
     433            self.current_datainfo.source.wavelength_min_unit = unit 
     434        elif key == u'incident_wavelength_spread': 
     435            self.current_datainfo.source.wavelength_spread = data_point 
     436            self.current_datainfo.source.wavelength_spread_unit = unit 
     437        elif key == u'beam_size_x': 
     438            self.current_datainfo.source.beam_size.x = data_point 
     439            self.current_datainfo.source.beam_size_unit = unit 
     440        elif key == u'beam_size_y': 
     441            self.current_datainfo.source.beam_size.y = data_point 
     442            self.current_datainfo.source.beam_size_unit = unit 
     443        elif key == u'beam_shape': 
     444            self.current_datainfo.source.beam_shape = data_point 
     445        elif key == u'radiation': 
     446            self.current_datainfo.source.radiation = data_point 
     447 
     448    def process_process(self, data_point, key): 
     449        """ 
     450        SASprocess processor 
     451        :param data_point: Single point from an HDF5 data file 
     452        :param key: class name data_point was taken from 
     453        """ 
     454        term_match = re.compile(u'^term[0-9]+$') 
     455        if key == u'Title':  # CanSAS 2.0 
     456            self.process.name = data_point 
     457        elif key == u'name':  # NXcanSAS 
     458            self.process.name = data_point 
     459        elif key == u'description': 
     460            self.process.description = data_point 
     461        elif key == u'date': 
     462            self.process.date = data_point 
     463        elif term_match.match(key): 
     464            self.process.term.append(data_point) 
     465        else: 
     466            self.process.notes.append(data_point) 
    413467 
    414468    def add_intermediate(self): 
     
    452506            spectrum_list = [] 
    453507            for spectrum in self.current_datainfo.trans_spectrum: 
    454                 spectrum.transmission = np.delete(spectrum.transmission, [0]) 
    455508                spectrum.transmission = spectrum.transmission.astype(np.float64) 
    456                 spectrum.transmission_deviation = np.delete( 
    457                     spectrum.transmission_deviation, [0]) 
    458509                spectrum.transmission_deviation = \ 
    459510                    spectrum.transmission_deviation.astype(np.float64) 
    460                 spectrum.wavelength = np.delete(spectrum.wavelength, [0]) 
    461511                spectrum.wavelength = spectrum.wavelength.astype(np.float64) 
    462512                if len(spectrum.transmission) > 0: 
     
    490540            if dataset.data.ndim == 2: 
    491541                (n_rows, n_cols) = dataset.data.shape 
    492                 dataset.y_bins = dataset.qy_data[0::n_cols] 
    493                 dataset.x_bins = dataset.qx_data[:n_cols] 
     542                flat_qy = dataset.qy_data[0::n_cols].flatten() 
     543                if flat_qy[0] == flat_qy[1]: 
     544                    flat_qy = np.transpose(dataset.qy_data)[0::n_cols].flatten() 
     545                dataset.y_bins = np.unique(flat_qy) 
     546                flat_qx = dataset.qx_data[0::n_rows].flatten() 
     547                if flat_qx[0] == flat_qx[1]: 
     548                    flat_qx = np.transpose(dataset.qx_data)[0::n_rows].flatten() 
     549                dataset.x_bins = np.unique(flat_qx) 
    494550                dataset.data = dataset.data.flatten() 
     551                dataset.qx_data = dataset.qx_data.flatten() 
     552                dataset.qy_data = dataset.qy_data.flatten() 
    495553            self.current_dataset = dataset 
    496554            self.send_to_output() 
     
    515573        self.current_datainfo = DataInfo() 
    516574 
    517  
    518     def _initialize_new_data_set(self, parent_list=None): 
     575    def _initialize_new_data_set(self, value=None): 
    519576        """ 
    520577        A private class method to generate a new 1D or 2D data object based on 
     
    524581        :param parent_list: List of names of parent elements 
    525582        """ 
    526  
    527         if parent_list is None: 
    528             parent_list = [] 
    529         if self._find_intermediate(parent_list, "Qx"): 
     583        if self._is2d(value): 
    530584            self.current_dataset = plottable_2D() 
    531585        else: 
     
    534588            self.current_dataset = plottable_1D(x, y) 
    535589        self.current_datainfo.filename = self.raw_data.filename 
    536  
    537     def _find_intermediate(self, parent_list, basename=""): 
    538         """ 
    539         A private class used to find an entry by either using a direct key or 
    540         knowing the approximate basename. 
     590        self.mask_name = "" 
     591        self.i_name = "" 
     592        self.i_node = "" 
     593        self.q_name = [] 
     594        self.q_uncertainties = [] 
     595        self.q_resolutions = [] 
     596        self.i_uncertainties = "" 
     597 
     598    @staticmethod 
     599    def check_is_list_or_array(iterable): 
     600        try: 
     601            iter(iterable) 
     602            if (not isinstance(iterable, np.ndarray) and not isinstance( 
     603                    iterable, list)) or (isinstance(iterable, str) or 
     604                                         isinstance(iterable, unicode)): 
     605                raise TypeError 
     606        except TypeError: 
     607            iterable = iterable.split(",") 
     608        return iterable 
     609 
     610    def _find_data_attributes(self, value): 
     611        """ 
     612        A class to find the indices for Q, the name of the Qdev and Idev, and 
     613        the name of the mask. 
     614        :param value: SASdata/NXdata HDF5 Group 
     615        """ 
     616        attrs = value.attrs 
     617        signal = attrs.get("signal", "I") 
     618        i_axes = attrs.get("I_axes", ["Q"]) 
     619        q_indices = attrs.get("Q_indices", [0]) 
     620        q_indices = map(int, self.check_is_list_or_array(q_indices)) 
     621        i_axes = self.check_is_list_or_array(i_axes) 
     622        keys = value.keys() 
     623        self.mask_name = attrs.get("mask") 
     624        for val in q_indices: 
     625            self.q_name.append(i_axes[val]) 
     626        self.i_name = signal 
     627        self.i_node = value.get(self.i_name) 
     628        for item in self.q_name: 
     629            if item in keys: 
     630                q_vals = value.get(item) 
     631                if q_vals.attrs.get("uncertainties") is not None: 
     632                    self.q_uncertainties = q_vals.attrs.get("uncertainties") 
     633                elif q_vals.attrs.get("uncertainty") is not None: 
     634                    self.q_uncertainties = q_vals.attrs.get("uncertainty") 
     635                if isinstance(self.q_uncertainties, str): 
     636                    self.q_uncertainties = self.q_uncertainties.split(",") 
     637                if q_vals.attrs.get("resolutions") is not None: 
     638                    self.q_resolutions = q_vals.attrs.get("resolutions") 
     639                if isinstance(self.q_resolutions, (str, unicode)): 
     640                    self.q_resolutions = self.q_resolutions.split(",") 
     641        if self.i_name in keys: 
     642            i_vals = value.get(self.i_name) 
     643            self.i_uncertainties = i_vals.attrs.get("uncertainties") 
     644            if self.i_uncertainties is None: 
     645                self.i_uncertainties = i_vals.attrs.get("uncertainty") 
     646 
     647    def _is2d(self, value, basename="I"): 
     648        """ 
     649        A private class to determine if the data set is 1d or 2d. 
    541650 
    542651        :param parent_list: List of parents nodes in the HDF5 file 
    543652        :param basename: Approximate name of an entry to search for 
    544         :return: 
    545         """ 
    546  
    547         entry = False 
    548         key_prog = re.compile(basename) 
    549         top = self.raw_data 
    550         for parent in parent_list: 
    551             top = top.get(parent) 
    552         for key in top.keys(): 
    553             if key_prog.match(key): 
    554                 entry = True 
    555                 break 
    556         return entry 
     653        :return: True if 2D, otherwise false 
     654        """ 
     655 
     656        vals = value.get(basename) 
     657        return (vals is not None and vals.shape is not None 
     658                and len(vals.shape) != 1) 
    557659 
    558660    def _create_unique_key(self, dictionary, name, numb=0): 
     
    583685        if unit is None: 
    584686            unit = h5attr(value, u'unit') 
    585         # Convert the unit formats 
    586         if unit == "1/A": 
    587             unit = "A^{-1}" 
    588         elif unit == "1/cm": 
    589             unit = "cm^{-1}" 
    590687        return unit 
Note: See TracChangeset for help on using the changeset viewer.