cansas1d binding IgorPro: Difference between revisions

From canSAS
(v1.07 of cansasXML.ipf)
Line 24: Line 24:
|-
|-
! {{Headcellstyle}} | date
! {{Headcellstyle}} | date
|| 2008-03-31
|| 2008-05-19
|-
! {{Headcellstyle}} | version
|| 1.07  ('''requires''' latest XMLutils XOP -- see below)
|-
|-
! {{Headcellstyle}} | purpose
! {{Headcellstyle}} | purpose
Line 33: Line 36:
|-
|-
! {{Headcellstyle}} | requires
! {{Headcellstyle}} | requires
|| IgorPro: http://www.wavemetrics.com <br /> XMLutils - XOP: http://www.igorexchange.com/project/XMLutils
|| IgorPro: http://www.wavemetrics.com <br /> XMLutils - XOP: http://www.igorexchange.com/project/XMLutils (IGOR.5.04.x-1.x-dev, 2008-May-19)
|-
|-
|}
|}
Line 115: Line 118:
**0 successful
**0 successful
**-1: XML file not found
**-1: XML file not found
**-2: root element is not <SASroot>
**-2: root element is not <SASroot> with valid canSAS namespace
**-3: <SASroot> version  is not 1.0
**-3: <SASroot> version  is not 1.0
**-4: no <SASentry> elements
**-4: no <SASentry> elements (NOT USED NOW)
;CS_1i_parseXml(fileID): given a file ID returned from '''XMLOpenFile()''', parses that file for SAS data and metadata
**-5: XOPutils needs upgrade
;CS_1i_collectMetadata(fileID, sasEntryPath): gathers metadata from the named SASentry (XPathStr)
;CS_1i_parseXml(fileID): '''This is what guides the work''', given a file ID returned from '''XMLOpenFile()''', parses that file for SAS data and metadata <br /> (1i in the function name signifies this is a function that supports INPUT from version 1.0 XML files)
;CS_appendMetaData(key, xpath, value): queries XML file for '''xpath'''.  If '''value''' is not empty, appends it to '''metadata''' where ''last'' is the new last row: <nowiki>metadata[last][0]=key; metadata[last][1]=value</nowiki>
;CS_1i_getOneSASdata(fileID, Title, SASdataPath): harvest the data and metadata in the specific SASdata element
;CS_1i_getOneVector(file,prefix,XML_name,Igor_name): harvest just one column (vector) of data
;CS_1i_GetReducedSASdata(fileID, SASdataPath): grab the data and put it in the working data folder
;CS_1i_locateTitle(fileID, SASentryPath): determine the title for this experiment
;CS_appendMetaData(fileID, key, xpath, value): queries XML file for '''xpath'''.  If '''value''' is not empty, appends it to '''metadata''' where ''last'' is the new last row: <nowiki>metadata[last][0]=key; metadata[last][1]=value</nowiki>
;CS_buildXpathStr(prefix, value): this function can be used only with very simple XPath constructions
;CS_cleanFolderName(proposal): given a proposal string, returns a candidate folder name for immediate use
;CS_findElementIndex(matchStr): looks for element index in structure ''W_ElementList'' returned from call to '''XmlElemList(fileID)'''
;CS_findElementIndex(matchStr): looks for element index in structure ''W_ElementList'' returned from call to '''XmlElemList(fileID)'''
;CS_getDefaultNamespace(fileID): returns the string containing the default namespace for the XML file
;CS_registerNameSpaces(): Builds a table of all namespaces used in the XML file and appends '''W_ElementList''' with full namespace-xpath string for each element.
;CS_registerNameSpaces(): Builds a table of all namespaces used in the XML file and appends '''W_ElementList''' with full namespace-xpath string for each element.
;CS_simpleXmlListXpath(fileID, prefix, value): Calls '''XMLlistXpath()''' with proper namespace prefix attached.
;CS_simpleXmlWaveFmXpath(fileID, prefix, value): Calls '''XMLwaveFmXpath()''' with proper namespace prefix attached.
;CS_updateWaveNote(wavName, key, value): adds (or replaces) definition of ''key''=''value'' in the wave note of ''wavName''
;CS_XmlStrFmXpath(fileID, prefix, value): Calls '''XmlStrFmXpath()''' with proper namespace prefix attached.  Trims the result string.
;CS_XPath_NS(simpleStr): this function adds namespace info as necessary to simpleStr (an XPath)
;CS_XPath_NS(simpleStr): this function adds namespace info as necessary to simpleStr (an XPath)
;CS_buildXpathStr(prefix, value): this function can be used only with very simple XPath constructions
;CS_XmlStrFmXpath(fileID, prefix, value): Calls '''XmlStrFmXpath()''' with proper namespace prefix attached.  Trims the result string.
;CS_simpleXmlWaveFmXpath(fileID, prefix, value): Calls '''XMLwaveFmXpath()''' with proper namespace prefix attached.
;CS_simpleXmlListXpath(fileID, prefix, value): Calls '''XMLlistXpath()''' with proper namespace prefix attached.
;TrimWS(str): Calls '''TrimWSL(TrimWSR(str))'''
;TrimWS(str): Calls '''TrimWSL(TrimWSR(str))'''
;TrimWSL(str): Trims white space from left (leading) end of '''str'''
;TrimWSL(str): Trims white space from left (leading) end of '''str'''
;TrimWSR(str): Trims white space from right (trailing) end of '''str'''
;TrimWSR(str): Trims white space from right (trailing) end of '''str'''
;CS_updateWaveNote(wavName, key, value): adds (or replaces) definition of ''key''=''value'' in the wave note of ''wavName''
;prjTest_cansas1d(): Demonstration function that calls '''CS_XmlReader(fileName)''' for many of the test data sets.
;CS_1i_extractIdataColumn2Wave(fileID, basePath, colName, wavName): This function pulls one column of data from each <nowiki><Idata></nowiki> element. It is easier to write this as a single function than debug it all the times it is needed. <br /> Avoid the use of the semicolon in anything that might make it into the IgorPro wavenote since the semicolon is a list delimiter.  The import macro defends against this by converting all semicolons into the string " :semicolon: "
;CS_1i_extractSasData(fileID, SASdataPath, SASdata_folder): (1i in the function name signifies this is a function that supports INPUT from version 1.0 XML files)
;prj_grabMyXmlData(): Demonstration function that moves loaded data from <nowiki>root:Packages:CS_XMLreader</nowiki> to a user's data folder.  (In this ''example'', that folder is <nowiki>root:PRJ_canSAS</nowiki>.)
;prj_grabMyXmlData(): Demonstration function that moves loaded data from <nowiki>root:Packages:CS_XMLreader</nowiki> to a user's data folder.  (In this ''example'', that folder is <nowiki>root:PRJ_canSAS</nowiki>.)
;prjTest_cansas1d(): Demonstration function that calls '''CS_XmlReader(fileName)''' for many of the test data sets.
;testCollette(): Demonstration function that reads an ISIS/LOQ file and copies the data to the root folder a la COLLETE

Revision as of 18:59, 19 May 2008

canSAS 1-D SAS XML format binding to IgorPro

An import tool (binding) for IgorPro has been created (cansasXML.ipf). You can check out the IgorPro working directory from the SVN server (see instructions below).

To use the canSASxml.ipf procedure, you must have the XMLutils XOP IGOR plugin installed. See the Usage Notes below.

Note that the code described here is not a complete user interface. (See further comments below.) It is expected that this code will be called by a graphical user interface routine and that routine will handle the work of copying the loaded SAS data in IgorPro from the root:Packages:CS_XMLreader data folder to the destination of choice (including any renaming of waves as desired).

file cansasXML.ipf
author Pete R. Jemian <jemian@anl.gov>
date 2008-05-19
version 1.07 (requires latest XMLutils XOP -- see below)
purpose implement an IgorPro file reader to read the canSAS 1-D reduced SAS data in XML files
adheres to the cansas1d/1.0 standard: http://www.smallangles.net/wgwiki/index.php/cansas1d_documentation
URL TRAC: http://svn.smallangles.net/trac/canSAS/browser/1dwg/trunk/IgorPro/cansasXML.ipf
SVN: http://svn.smallangles.net/svn/canSAS/1dwg/trunk/IgorPro/cansasXML.ipf
requires IgorPro: http://www.wavemetrics.com
XMLutils - XOP: http://www.igorexchange.com/project/XMLutils (IGOR.5.04.x-1.x-dev, 2008-May-19)

Checkout of support code in Subversion

Subversion (http://subversion.tigris.org/) is a program for managing software versions. There are command line and GUI clients for a variety of operating systems. We won't recommend any here but will show the command lines necessary.

XMLutils XOP

The XMLutils XOP, written by Andrew Nelson (ANSTO), is hosted on the IgorExchange (http://www.igorexchange.com/).

One good location to place the checked out XMLutils directory is in the Wavemetrics directory, next to the Igor Pro Folder

svn://svn.igorexchange.com/packages/XMLutils/ XMLutils

In the future, to retrieve an updated version of this support, go into the XMLutils directory (created above) and type the command

svn update

This will check the repository and update files as needed. If the installer program was updated, you;ll need to run the new installer program. It is not necessary to uninstall first.

The installer executables contained in the download will do all the installation for you. They will place the XOP in the folder /User Procedures/motofit/XMLutils, and create a shortcut/alias to the plugin in /Igor Extensions. Packages from other facilities should place the XOP there as well.

cansasXML.ipf

Check out the canSAS 1d SAS XML reader from the subversion repository:

svn checkout http://svn.smallangles.net/svn/canSAS/1dwg/trunk cansas-1dwg

This will download lots of extra files. The file of interest is in the IgorPro directory and is called cansasXML.ipf

In the future, to retrieve an updated version of this support, go into the cansas-1dwg directory (created above) and type the command

svn update

This will check the repository and update files as needed.

Installation

  1. License and Install IgorPro (should have already been done by now)
  2. Quit IgorPro if it is running
  3. Download XMLutils XOP. Either checkout from subversion (see above) or, with a web browser, go to http://svn.igorexchange.com/viewvc/packages/XMLutils/trunk/
  4. Install XMLutils XOP by double-clicking the installer for you operating system.
  5. Download cansasXML.ipf. Either checkout from subversion (see above) or, with a web browser, copy cansasXML.ipf from on-line subversion repository: http://svn.smallangles.net/svn/canSAS/1dwg/trunk/IgorPro/cansasXML.ipf
  6. Copy cansasXML.ipf file to ...\Wavemetrics\Igor Pro Folder\User Procedures (or file system equivalent)
  7. Then, you should be able to restart IgorPro and progress from there

Usage Notes

To use the canSASxml.ipf procedure, you must have the XMLutils XOP IGOR plugin installed. This may be downloaded from the IgorExchange Project site. There are installer executables contained in the download that will do all the installation for you. Each installer will place the XOP in the folder ...\Wavemetrics\Igor Pro Folder\User Procedures\motofit\XMLutils, and create a shortcut/alias to the plugin in ...\Wavemetrics\Igor Pro Folder\Igor Extensions.


List of Functions

These are (most of) the FUNCTIONS in the cansasXML.ipf code. The only functions of interest are CS_XmlReader(fileName) which reads the named XML file and and loads SAS data and the two demonstration functions prj_grabMyXmlData() and prjTest_cansas1d() that together show a usage example.

CS_XmlReader(fileName)
open a canSAS 1-D reduced SAS XML data file
  • input: fileName (string) name of canSAS XML file (can include file system path name to file)
  • returns:
    • 0 successful
    • -1: XML file not found
    • -2: root element is not <SASroot> with valid canSAS namespace
    • -3: <SASroot> version is not 1.0
    • -4: no <SASentry> elements (NOT USED NOW)
    • -5: XOPutils needs upgrade
CS_1i_parseXml(fileID)
This is what guides the work, given a file ID returned from XMLOpenFile(), parses that file for SAS data and metadata
(1i in the function name signifies this is a function that supports INPUT from version 1.0 XML files)
CS_1i_getOneSASdata(fileID, Title, SASdataPath)
harvest the data and metadata in the specific SASdata element
CS_1i_getOneVector(file,prefix,XML_name,Igor_name)
harvest just one column (vector) of data
CS_1i_GetReducedSASdata(fileID, SASdataPath)
grab the data and put it in the working data folder
CS_1i_locateTitle(fileID, SASentryPath)
determine the title for this experiment
CS_appendMetaData(fileID, key, xpath, value)
queries XML file for xpath. If value is not empty, appends it to metadata where last is the new last row: metadata[last][0]=key; metadata[last][1]=value
CS_buildXpathStr(prefix, value)
this function can be used only with very simple XPath constructions
CS_cleanFolderName(proposal)
given a proposal string, returns a candidate folder name for immediate use
CS_findElementIndex(matchStr)
looks for element index in structure W_ElementList returned from call to XmlElemList(fileID)
CS_getDefaultNamespace(fileID)
returns the string containing the default namespace for the XML file
CS_registerNameSpaces()
Builds a table of all namespaces used in the XML file and appends W_ElementList with full namespace-xpath string for each element.
CS_simpleXmlListXpath(fileID, prefix, value)
Calls XMLlistXpath() with proper namespace prefix attached.
CS_simpleXmlWaveFmXpath(fileID, prefix, value)
Calls XMLwaveFmXpath() with proper namespace prefix attached.
CS_updateWaveNote(wavName, key, value)
adds (or replaces) definition of key=value in the wave note of wavName
CS_XmlStrFmXpath(fileID, prefix, value)
Calls XmlStrFmXpath() with proper namespace prefix attached. Trims the result string.
CS_XPath_NS(simpleStr)
this function adds namespace info as necessary to simpleStr (an XPath)
TrimWS(str)
Calls TrimWSL(TrimWSR(str))
TrimWSL(str)
Trims white space from left (leading) end of str
TrimWSR(str)
Trims white space from right (trailing) end of str
prjTest_cansas1d()
Demonstration function that calls CS_XmlReader(fileName) for many of the test data sets.
prj_grabMyXmlData()
Demonstration function that moves loaded data from root:Packages:CS_XMLreader to a user's data folder. (In this example, that folder is root:PRJ_canSAS.)
testCollette()
Demonstration function that reads an ISIS/LOQ file and copies the data to the root folder a la COLLETE