Ignore:
Timestamp:
Jul 21, 2016 11:53:53 AM (8 years ago)
Author:
lewis
Branches:
master, ESS_GUI, ESS_GUI_Docs, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_iss879, ESS_GUI_iss959, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc, costrafo411, magnetic_scatt, release-4.1.1, release-4.1.2, release-4.2.2, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
Children:
a3c538e1
Parents:
eb8da5f
Message:

Add option to export multiple frames as one file or multiple files

Location:
src/sas/sasgui/perspectives/file_converter
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • src/sas/sasgui/perspectives/file_converter/cansas_writer.py

    reb8da5f r94f4518  
    5555        self._write_run_names(datainfo, entry_node) 
    5656        # Add Data info to SASEntry 
    57         self._write_data(frame_data, entry_node) 
     57        for data_info in frame_data: 
     58            self._write_data(data_info, entry_node) 
    5859        # Transmission Spectrum Info 
    5960        self._write_trans_spectrum(datainfo, entry_node) 
     
    7778        return doc, entry_node 
    7879 
    79     def _write_data(self, frame_data, entry_node): 
     80    def _write_data(self, datainfo, entry_node): 
    8081        """ 
    8182        Writes the I and Q data to the XML file 
     
    8485        :param entry_node: lxml node ElementTree object to be appended to 
    8586        """ 
    86         for datainfo in frame_data: 
    87             node = self.create_element("SASdata") 
    88             self.append(node, entry_node) 
     87        node = self.create_element("SASdata") 
     88        self.append(node, entry_node) 
    8989 
    90             for i in range(len(datainfo.x)): 
    91                 point = self.create_element("Idata") 
    92                 node.append(point) 
    93                 self.write_node(point, "Q", datainfo.x[i], 
     90        for i in range(len(datainfo.x)): 
     91            point = self.create_element("Idata") 
     92            node.append(point) 
     93            self.write_node(point, "Q", datainfo.x[i], 
     94                            {'unit': datainfo.x_unit}) 
     95            if len(datainfo.y) >= i: 
     96                self.write_node(point, "I", datainfo.y[i], 
     97                                {'unit': datainfo.y_unit}) 
     98            if datainfo.dy != None and len(datainfo.dy) > i: 
     99                self.write_node(point, "Idev", datainfo.dy[i], 
     100                                {'unit': datainfo.y_unit}) 
     101            if datainfo.dx != None and len(datainfo.dx) > i: 
     102                self.write_node(point, "Qdev", datainfo.dx[i], 
    94103                                {'unit': datainfo.x_unit}) 
    95                 if len(datainfo.y) >= i: 
    96                     self.write_node(point, "I", datainfo.y[i], 
    97                                     {'unit': datainfo.y_unit}) 
    98                 if datainfo.dy != None and len(datainfo.dy) > i: 
    99                     self.write_node(point, "Idev", datainfo.dy[i], 
    100                                     {'unit': datainfo.y_unit}) 
    101                 if datainfo.dx != None and len(datainfo.dx) > i: 
    102                     self.write_node(point, "Qdev", datainfo.dx[i], 
    103                                     {'unit': datainfo.x_unit}) 
    104                 if datainfo.dxw != None and len(datainfo.dxw) > i: 
    105                     self.write_node(point, "dQw", datainfo.dxw[i], 
    106                                     {'unit': datainfo.x_unit}) 
    107                 if datainfo.dxl != None and len(datainfo.dxl) > i: 
    108                     self.write_node(point, "dQl", datainfo.dxl[i], 
    109                                     {'unit': datainfo.x_unit}) 
     104            if datainfo.dxw != None and len(datainfo.dxw) > i: 
     105                self.write_node(point, "dQw", datainfo.dxw[i], 
     106                                {'unit': datainfo.x_unit}) 
     107            if datainfo.dxl != None and len(datainfo.dxl) > i: 
     108                self.write_node(point, "dQl", datainfo.dxl[i], 
     109                                {'unit': datainfo.x_unit}) 
  • src/sas/sasgui/perspectives/file_converter/converter_panel.py

    reb8da5f r94f4518  
    7373        self.Layout() 
    7474 
    75     def convert_to_cansas(self, frame_data, filename): 
     75    def convert_to_cansas(self, frame_data, filename, single_file): 
    7676        reader = CansasWriter() 
    7777        entry_attrs = None 
    7878        if self.run_name is not None: 
    7979            entry_attrs = { 'name': self.run_name } 
    80         reader.write(filename, frame_data, 
    81             sasentry_attrs=entry_attrs) 
     80        if single_file: 
     81            reader.write(filename, frame_data, 
     82                sasentry_attrs=entry_attrs) 
     83        else: 
     84            # strip extension from filename 
     85            ext = "." + filename.split('.')[-1] 
     86            name = filename.replace(ext, '') 
     87            for i in range(len(frame_data)): 
     88                f_name = "{}{}{}".format(name, i+1, ext) 
     89                reader.write(f_name, [frame_data[i]], 
     90                    sasentry_attrs=entry_attrs) 
    8291 
    8392    def extract_data(self, filename): 
     
    111120        frames = None 
    112121        increment = None 
     122        single_file = True 
    113123        while not valid_input: 
    114124            if dlg.ShowModal() == wx.ID_OK: 
     
    118128                    last_frame = int(dlg.last_input.GetValue()) 
    119129                    increment = int(dlg.increment_input.GetValue()) 
     130                    single_file = dlg.single_btn.GetValue() 
    120131                    if last_frame < 0 or first_frame < 0: 
    121132                        msg = "Frame values must be positive" 
     
    136147                        StatusEvent(status=msg)) 
    137148            else: 
    138                 return [], 0 
     149                return { 'frames': [], 'inc': None, 'file': single_file } 
    139150        frames = range(first_frame, last_frame + increment, 
    140151            increment) 
    141         return frames, increment 
     152        return { 'frames': frames, 'inc': increment, 'file': single_file } 
    142153 
    143154    def on_convert(self, event): 
     
    159170                frames = [iqdata.shape[0]] 
    160171                increment = 1 
     172                single_file = True 
    161173                if frames[0] > 3: 
    162                     frames, increment = self.ask_frame_range(frames[0]) 
     174                    params = self.ask_frame_range(frames[0]) 
     175                    frames = params['frames'] 
     176                    increment = params['inc'] 
     177                    single_file = params['file'] 
    163178                    if frames == []: return 
    164179        except Exception as ex: 
     
    191206            data = Data1D(x=qdata, y=iqdata[i]) 
    192207            frame_data.append(data) 
    193         # Only need to set metadata on first Data1D object 
    194         frame_data[0].filename = output_path.split('\\')[-1] 
    195         for key, value in metadata.iteritems(): 
    196             setattr(frame_data[0], key, value) 
    197  
    198         self.convert_to_cansas(frame_data, output_path) 
     208        if single_file: 
     209            # Only need to set metadata on first Data1D object 
     210            frame_data[0].filename = output_path.split('\\')[-1] 
     211            for key, value in metadata.iteritems(): 
     212                setattr(frame_data[0], key, value) 
     213        else: 
     214            # Need to set metadata for all Data1D objects 
     215            for datainfo in frame_data: 
     216                datainfo.filename = output_path.split('\\')[-1] 
     217                for key, value in metadata.iteritems(): 
     218                    setattr(datainfo, key, value) 
     219 
     220 
     221        self.convert_to_cansas(frame_data, output_path, single_file) 
    199222        wx.PostEvent(self.parent.manager.parent, 
    200223            StatusEvent(status="Conversion completed.")) 
  • src/sas/sasgui/perspectives/file_converter/frame_select_dialog.py

    reb8da5f r94f4518  
    1313            "format").format(n_frames) 
    1414        instructions_label = wx.StaticText(self, -1, instructions) 
    15         instructions_label.Wrap(self.GetSize().width - 20) 
     15        instructions_label.Wrap(self.GetSize().width - 10) 
    1616        sizer.Add(instructions_label, (y,0), (1,2), wx.ALL, 5) 
    1717        y += 1 
    1818 
    19         first_label = wx.StaticText(self, -1, "First Frame (0-{}): ".format(n_frames-1)) 
     19        first_label = wx.StaticText(self, -1, 
     20            "First Frame (0-{}): ".format(n_frames-1)) 
    2021        sizer.Add(first_label, (y,0), (1,1), wx.ALL, 5) 
    2122 
     
    2425        y += 1 
    2526 
    26         last_label = wx.StaticText(self, -1, "Last Frame (0-{}): ".format(n_frames-1)) 
     27        last_label = wx.StaticText(self, -1, 
     28            "Last Frame (0-{}): ".format(n_frames-1)) 
    2729        sizer.Add(last_label, (y,0), (1,1), wx.ALL, 5) 
    2830 
     
    3840        y += 1 
    3941 
     42        export_label = wx.StaticText(self, -1, "Export each frame to:") 
     43        sizer.Add(export_label, (y,0), (1,1), wx.LEFT | wx.RIGHT | wx.TOP, 5) 
     44        y += 1 
     45 
     46        self.single_btn = wx.RadioButton(self, -1, label="The same file", 
     47            style=wx.RB_GROUP) 
     48        sizer.Add(self.single_btn, (y,0), (1,1), 
     49            wx.LEFT | wx.RIGHT | wx.BOTTOM, 5) 
     50 
     51        multiple_btn = wx.RadioButton(self, -1, label="Multiple files") 
     52        sizer.Add(multiple_btn, (y,1), (1,1), 
     53            wx.LEFT | wx.RIGHT | wx.BOTTOM, 5) 
     54        y += 1 
     55 
    4056        done_btn = wx.Button(self, wx.ID_OK) 
    41         sizer.Add(done_btn, (y,0), (1,1), wx.LEFT | wx.TOP | wx.BOTTOM, 15) 
     57        sizer.Add(done_btn, (y,0), (1,1), wx.LEFT | wx.BOTTOM, 15) 
    4258 
    4359        cancel_btn = wx.Button(self, wx.ID_CANCEL) 
    44         sizer.Add(cancel_btn, (y,1), (1,1), wx.ALL, 15) 
     60        sizer.Add(cancel_btn, (y,1), (1,1), wx.LEFT | wx.RIGHT | wx.BOTTOM, 15) 
    4561 
    4662        self.SetSizer(sizer) 
     63 
     64        size = self.GetSize() 
     65        size.height += 35 
     66        self.SetSize(size) 
  • src/sas/sasgui/perspectives/file_converter/media/file_converter_help.rst

    reb8da5f r94f4518  
    1212The input files can be: 
    1313 
    14 *   Single column ASCII data, with lines that end with a digit, comma or 
    15     semi-colon. 
     14*   Single column ASCII data, with lines that end with a digit (no delimiter), 
     15    comma or semi-colon. 
    1616*   `BSL/OTOKO formatted 
    1717    <http://www.diamond.ac.uk/Beamlines/Soft-Condensed-Matter/small-angle/ 
     
    29295) Click *Convert* to save the converted file to disk 
    3030 
    31 **Note**: If a BSL/OTOKO file with multiple frames is selected for the 
    32 intensity-axis file, a dialog will appear asking which frames you would like 
    33 converted. You may enter a start frame, end frame & increment, and all frames 
    34 in that subset will be converted. For example: entering 0, 50 and 10 for the 
    35 first frame, last frame, and increment respectively will convert frames 0, 10, 
    36 20, 30, 40 & 50. To convert a single frame, enter the same value for first 
    37 frame & last frame, and 1 as the increment. 
     31Files With Multiple Frames 
     32^^^^^^^^^^^^^^^^^^^^^^^^^^ 
     33 
     34If a BSL/OTOKO file with multiple frames is selected for the intensity-axis 
     35file, a dialog will appear asking which frames you would like converted. You 
     36may enter a start frame, end frame & increment, and all frames in that subset 
     37will be converted. For example: entering 0, 50 and 10 for the first frame, last 
     38frame, and increment respectively will convert frames 0, 10, 20, 30, 40 & 50. 
     39To convert a single frame, enter the same value for first frame & last frame, 
     40and 1 as the increment. 
     41 
     42There is also the option to output the data as multiple frames in a single 
     43CanSAS file, or multiple files with one frame each. The single file option will 
     44produce one file with multiple `<SASdata>` elements. The multiple file option 
     45will output a file for each frame; each file will have one `<SASdata>` element, 
     46and the frame number will appended to the file name. 
Note: See TracChangeset for help on using the changeset viewer.