Changeset 579ba85 in sasview for DataLoader/readers/cansas_reader.py


Ignore:
Timestamp:
Aug 29, 2008 3:56:50 PM (16 years ago)
Author:
Mathieu Doucet <doucetm@…>
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, release_4.0.1, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
Children:
442f42f
Parents:
4c00964
Message:

CanSAS format reader/writer completed/tested.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • DataLoader/readers/cansas_reader.py

    r4c00964 r579ba85  
    88copyright 2008, University of Tennessee 
    99""" 
    10  
    11 #TODO: Unit conversion 
    12 #TODO: missing aperture type: go through all entries and check for additional attributes 
     10# Known issue: reader not compatible with multiple SASdata entries 
     11# within a single SASentry. Will raise a runtime error. 
     12 
    1313#TODO: check that all vectors are written only if they have at least one non-empty value 
    14 #TODO: multiple SASEntrys 
     14#TODO: Writing only allows one SASentry per file. Would be best to allow multiple entries. 
    1515#TODO: Store error list 
    16 #TODO: convert from pixel to mm for beam center... 
    1716#TODO: Allow for additional meta data for each section 
    1817#TODO: Notes need to be implemented. They can be any XML structure in version 1.0 
     
    258257        # Look up title 
    259258        _store_content('Title', dom, 'title', data_info) 
    260         # Look up run number                     
    261         _store_content('Run', dom, 'run', data_info)                     
     259        # Look up run number    
     260        nodes = xpath.Evaluate('Run', dom) 
     261        for item in nodes:     
     262            value, attr = get_node_text(item) 
     263            if value is not None: 
     264                data_info.run.append(value) 
     265                if attr.has_key('name'): 
     266                    data_info.run_name[value] = attr['name']          
     267                            
    262268        # Look up instrument name               
    263         value, attr = get_content('SASinstrument', dom) 
    264         if attr.has_key('name'): 
    265             data_info.instrument = attr['name'] 
     269        _store_content('SASinstrument/name', dom, 'instrument', data_info) 
     270        #value, attr = get_content('SASinstrument', dom) 
     271        #if attr.has_key('name'): 
     272        #    data_info.instrument = attr['name'] 
    266273 
    267274        note_list = xpath.Evaluate('SASnote', dom) 
     
    276283         
    277284        # Sample info ################### 
     285        value, attr = get_content('SASsample', dom) 
     286        if attr.has_key('name'): 
     287            data_info.sample.name = attr['name'] 
     288             
    278289        _store_content('SASsample/ID',  
    279290                     dom, 'ID', data_info.sample)                     
     
    327338                     dom, 'wavelength_spread', data_info.source)     
    328339         
    329         # Beam size (as a vector)       
     340        # Beam size (as a vector)    
     341        value, attr = get_content('SASinstrument/SASsource/beam_size', dom) 
     342        if attr.has_key('name'): 
     343            data_info.source.beam_size_name = attr['name'] 
     344             
    330345        _store_float('SASinstrument/SASsource/beam_size/x',  
    331346                     dom, 'beam_size.x', data_info.source)     
     
    350365                 
    351366                # Get the name and type of the aperture 
    352                 ap_value, ap_attr = get_node_text(item) 
     367                ap_value, ap_attr = get_node_text(apert) 
    353368                if ap_attr.has_key('name'): 
    354369                    aperture.name = ap_attr['name'] 
     
    357372                     
    358373                _store_float('distance', apert, 'distance', aperture)     
     374                 
     375                value, attr = get_content('size', apert) 
     376                if attr.has_key('name'): 
     377                    aperture.size_name = attr['name'] 
     378                 
    359379                _store_float('size/x', apert, 'size.x', aperture)     
    360380                _store_float('size/y', apert, 'size.y', aperture)     
     
    380400             
    381401            # Detector orientation (as a vector) 
    382             _store_float('orientation/pitch', item, 'orientation.x', detector)     
    383             _store_float('orientation/yaw',  item, 'orientation.y', detector)     
    384             _store_float('orientation/roll',  item, 'orientation.z', detector)     
     402            _store_float('orientation/roll', item, 'orientation.x', detector)     
     403            _store_float('orientation/pitch', item, 'orientation.y', detector)     
     404            _store_float('orientation/yaw',   item, 'orientation.z', detector)     
    385405             
    386406            # Beam center (as a vector) 
     
    430450             
    431451        # Data info ###################### 
     452        nodes = xpath.Evaluate('SASdata', dom) 
     453        if len(nodes)>1: 
     454            raise RuntimeError, "CanSAS reader is not compatible with multiple SASdata entries" 
     455         
    432456        nodes = xpath.Evaluate('SASdata/Idata', dom) 
    433457        x  = numpy.zeros(0) 
     
    455479            if _x is not None and _y is not None: 
    456480                x  = numpy.append(x, _x) 
    457                 y  = numpy.append(x, _y) 
    458                 dx = numpy.append(x, _dx) 
    459                 dy = numpy.append(x, _dy) 
     481                y  = numpy.append(y, _y) 
     482                dx = numpy.append(dx, _dx) 
     483                dy = numpy.append(dy, _dy) 
    460484             
    461485        data_info.x = x 
     
    508532        main_node.appendChild(entry_node) 
    509533         
    510         write_node(doc, entry_node, "title", datainfo.title) 
    511         write_node(doc, entry_node, "run", datainfo.run) 
     534        write_node(doc, entry_node, "Title", datainfo.title) 
     535         
     536        for item in datainfo.run: 
     537            runname = {} 
     538            if datainfo.run_name.has_key(item) and len(str(datainfo.run_name[item]))>1: 
     539                runname = {'name': datainfo.run_name[item] } 
     540            write_node(doc, entry_node, "Run", item, runname) 
    512541         
    513542        # Data info 
     
    515544        entry_node.appendChild(node) 
    516545         
     546        for i in range(len(datainfo.x)): 
     547            pt = doc.createElement("Idata") 
     548            node.appendChild(pt) 
     549            write_node(doc, pt, "Q", datainfo.x[i], {'unit':datainfo.x_unit}) 
     550            if len(datainfo.y)>=i: 
     551                write_node(doc, pt, "I", datainfo.y[i], {'unit':datainfo.y_unit}) 
     552            if len(datainfo.dx)>=i: 
     553                write_node(doc, pt, "Qdev", datainfo.dx[i], {'unit':datainfo.x_unit}) 
     554            if len(datainfo.dy)>=i: 
     555                write_node(doc, pt, "Idev", datainfo.dy[i], {'unit':datainfo.y_unit}) 
     556 
     557         
    517558        # Sample info 
    518559        sample = doc.createElement("SASsample") 
     560        if datainfo.sample.name is not None: 
     561            sample.setAttribute("name", str(datainfo.sample.name)) 
    519562        entry_node.appendChild(sample) 
    520         write_node(doc, sample, "ID", datainfo.sample.ID) 
     563        write_node(doc, sample, "ID", str(datainfo.sample.ID)) 
    521564        write_node(doc, sample, "thickness", datainfo.sample.thickness, {"unit":datainfo.sample.thickness_unit}) 
    522565        write_node(doc, sample, "transmission", datainfo.sample.transmission) 
     
    527570         
    528571        pos = doc.createElement("position") 
    529         written = False 
    530         written = written or write_node(doc, pos, "x", datainfo.sample.position.x, {"unit":datainfo.sample.position_unit}) 
    531         written = written or write_node(doc, pos, "y", datainfo.sample.position.y, {"unit":datainfo.sample.position_unit}) 
    532         written = written or write_node(doc, pos, "z", datainfo.sample.position.z, {"unit":datainfo.sample.position_unit}) 
     572        written = write_node(doc, pos, "x", datainfo.sample.position.x, {"unit":datainfo.sample.position_unit}) 
     573        written = written | write_node(doc, pos, "y", datainfo.sample.position.y, {"unit":datainfo.sample.position_unit}) 
     574        written = written | write_node(doc, pos, "z", datainfo.sample.position.z, {"unit":datainfo.sample.position_unit}) 
    533575        if written == True: 
    534576            sample.appendChild(pos) 
    535577         
    536578        ori = doc.createElement("orientation") 
    537         written = False 
    538         written = written or write_node(doc, ori, "roll",  datainfo.sample.orientation.x, {"unit":datainfo.sample.orientation_unit}) 
    539         written = written or write_node(doc, ori, "pitch", datainfo.sample.orientation.y, {"unit":datainfo.sample.orientation_unit}) 
    540         written = written or write_node(doc, ori, "yaw",   datainfo.sample.orientation.z, {"unit":datainfo.sample.orientation_unit}) 
     579        written = write_node(doc, ori, "roll",  datainfo.sample.orientation.x, {"unit":datainfo.sample.orientation_unit}) 
     580        written = written | write_node(doc, ori, "pitch", datainfo.sample.orientation.y, {"unit":datainfo.sample.orientation_unit}) 
     581        written = written | write_node(doc, ori, "yaw",   datainfo.sample.orientation.z, {"unit":datainfo.sample.orientation_unit}) 
    541582        if written == True: 
    542583            sample.appendChild(ori) 
     
    550591        #   Source 
    551592        source = doc.createElement("SASsource") 
    552         source.setAttribute("name", str(datainfo.source.name)) 
     593        if datainfo.source.name is not None: 
     594            source.setAttribute("name", str(datainfo.source.name)) 
    553595        instr.appendChild(source) 
    554596         
    555597        write_node(doc, source, "radiation", datainfo.source.radiation) 
    556598        write_node(doc, source, "beam_shape", datainfo.source.beam_shape) 
     599        size = doc.createElement("beam_size") 
     600        if datainfo.source.beam_size_name is not None: 
     601            size.setAttribute("name", str(datainfo.source.beam_size_name)) 
     602        written = write_node(doc, size, "x", datainfo.source.beam_size.x, {"unit":datainfo.source.beam_size_unit}) 
     603        written = written | write_node(doc, size, "y", datainfo.source.beam_size.y, {"unit":datainfo.source.beam_size_unit}) 
     604        written = written | write_node(doc, size, "z", datainfo.source.beam_size.z, {"unit":datainfo.source.beam_size_unit}) 
     605        if written == True: 
     606            source.appendChild(size) 
     607             
    557608        write_node(doc, source, "wavelength", datainfo.source.wavelength, {"unit":datainfo.source.wavelength_unit}) 
    558609        write_node(doc, source, "wavelength_min", datainfo.source.wavelength_min, {"unit":datainfo.source.wavelength_min_unit}) 
     
    563614        for item in datainfo.collimation: 
    564615            coll = doc.createElement("SAScollimation") 
    565             coll.setAttribute("name", item.name) 
     616            if item.name is not None: 
     617                coll.setAttribute("name", str(item.name)) 
    566618            instr.appendChild(coll) 
    567619             
     
    569621             
    570622            for apert in item.aperture: 
    571                 ap = doc.createElement("SAScollimation") 
    572                 ap.setAttribute("name", apert.name) 
    573                 ap.setAttribute("type", apert.type) 
    574                 instr.appendChild(ap) 
     623                ap = doc.createElement("aperture") 
     624                if apert.name is not None: 
     625                    ap.setAttribute("name", str(apert.name)) 
     626                if apert.type is not None: 
     627                    ap.setAttribute("type", str(apert.type)) 
     628                coll.appendChild(ap) 
    575629                 
    576630                write_node(doc, ap, "distance", apert.distance, {"unit":apert.distance_unit}) 
    577631                 
    578632                size = doc.createElement("size") 
    579                 ap.appendChild(size) 
    580                 write_node(doc, size, "x", apert.size.x, {"unit":apert.size_unit}) 
    581                 write_node(doc, size, "y", apert.size.y, {"unit":apert.size_unit}) 
    582                 write_node(doc, size, "z", apert.size.z, {"unit":apert.size_unit}) 
    583                  
     633                if apert.size_name is not None: 
     634                    size.setAttribute("name", str(apert.size_name)) 
     635                written = write_node(doc, size, "x", apert.size.x, {"unit":apert.size_unit}) 
     636                written = written | write_node(doc, size, "y", apert.size.y, {"unit":apert.size_unit}) 
     637                written = written | write_node(doc, size, "z", apert.size.z, {"unit":apert.size_unit}) 
     638                if written == True: 
     639                    ap.appendChild(size) 
    584640 
    585641        #   Detectors 
    586642        for item in datainfo.detector: 
    587643            det = doc.createElement("SASdetector") 
    588             instr.appendChild(det) 
    589              
    590             write_node(doc, det, "name", item.name) 
    591             write_node(doc, det, "SDD", item.distance, {"unit":item.distance_unit}) 
    592             write_node(doc, det, "slit_length", item.slit_length, {"unit":item.slit_length_unit}) 
     644            written = write_node(doc, det, "name", item.name) 
     645            written = written | write_node(doc, det, "SDD", item.distance, {"unit":item.distance_unit}) 
     646            written = written | write_node(doc, det, "slit_length", item.slit_length, {"unit":item.slit_length_unit}) 
     647            if written == True: 
     648                instr.appendChild(det) 
    593649             
    594650            off = doc.createElement("offset") 
    595             det.appendChild(off) 
    596             write_node(doc, off, "x", item.offset.x, {"unit":item.offset_unit}) 
    597             write_node(doc, off, "y", item.offset.y, {"unit":item.offset_unit}) 
    598             write_node(doc, off, "z", item.offset.z, {"unit":item.offset_unit}) 
    599              
     651            written = write_node(doc, off, "x", item.offset.x, {"unit":item.offset_unit}) 
     652            written = written | write_node(doc, off, "y", item.offset.y, {"unit":item.offset_unit}) 
     653            written = written | write_node(doc, off, "z", item.offset.z, {"unit":item.offset_unit}) 
     654            if written == True: 
     655                det.appendChild(off) 
    600656             
    601657            center = doc.createElement("beam_center") 
    602             det.appendChild(center) 
    603             write_node(doc, center, "x", item.beam_center.x, {"unit":item.beam_center_unit}) 
    604             write_node(doc, center, "y", item.beam_center.y, {"unit":item.beam_center_unit}) 
    605             write_node(doc, center, "z", item.beam_center.z, {"unit":item.beam_center_unit}) 
    606              
     658            written = write_node(doc, center, "x", item.beam_center.x, {"unit":item.beam_center_unit}) 
     659            written = written | write_node(doc, center, "y", item.beam_center.y, {"unit":item.beam_center_unit}) 
     660            written = written | write_node(doc, center, "z", item.beam_center.z, {"unit":item.beam_center_unit}) 
     661            if written == True: 
     662                det.appendChild(center) 
     663                 
    607664            pix = doc.createElement("pixel_size") 
    608             det.appendChild(pix) 
    609             write_node(doc, pix, "x", item.pixel_size.x, {"unit":item.pixel_size_unit}) 
    610             write_node(doc, pix, "y", item.pixel_size.y, {"unit":item.pixel_size_unit}) 
    611             write_node(doc, pix, "z", item.pixel_size.z, {"unit":item.pixel_size_unit}) 
    612              
    613          
    614         # Sample info 
     665            written = write_node(doc, pix, "x", item.pixel_size.x, {"unit":item.pixel_size_unit}) 
     666            written = written | write_node(doc, pix, "y", item.pixel_size.y, {"unit":item.pixel_size_unit}) 
     667            written = written | write_node(doc, pix, "z", item.pixel_size.z, {"unit":item.pixel_size_unit}) 
     668            if written == True: 
     669                det.appendChild(pix) 
     670                 
     671            ori = doc.createElement("orientation") 
     672            written = write_node(doc, ori, "roll",  item.orientation.x, {"unit":item.orientation_unit}) 
     673            written = written | write_node(doc, ori, "pitch", item.orientation.y, {"unit":item.orientation_unit}) 
     674            written = written | write_node(doc, ori, "yaw",   item.orientation.z, {"unit":item.orientation_unit}) 
     675            if written == True: 
     676                det.appendChild(ori) 
     677                 
     678         
     679        # Processes info 
    615680        for item in datainfo.process: 
    616681            node = doc.createElement("SASprocess") 
    617682            entry_node.appendChild(node) 
    618683 
    619             write_node(doc, entry_node, "run", item.name) 
     684            write_node(doc, node, "name", item.name) 
     685            write_node(doc, node, "date", item.date) 
     686            write_node(doc, node, "description", item.description) 
     687            for term in item.term: 
     688                value = term['value'] 
     689                del term['value'] 
     690                write_node(doc, node, "term", value, term) 
     691            for note in item.notes: 
     692                write_node(doc, node, "SASprocessnote", note) 
    620693             
    621694         
Note: See TracChangeset for help on using the changeset viewer.