Ignore:
Timestamp:
Sep 14, 2009 11:59:44 AM (13 years ago)
Author:
ajj
Message:
  • Code for output of canSAS XML files for AVE and ABS generated via protocol panel.
  • NOT set as default output as yet.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • sans/Dev/trunk/NCNR_User_Procedures/Common/NIST_XML_v40.ipf

    r548 r555  
    361361End 
    362362 
     363//AJJ 12/5/08 
     364 
     365//Define struct for file contents 
     366Structure NISTXMLfile 
     367//      string filename 
     368        string Run 
     369        string title 
     370 
     371        //<SASdata> 
     372        Wave Q,I,Idev,Qdev,Qmean,Shadowfactor,dQl 
     373        string unitsQ,unitsI,unitsIdev,unitsQdev,unitsQmean,unitsShadowfactor,unitsdQl 
     374 
     375//      Variable flux_monitor 
     376//      string Q_resolution 
     377 
     378        //<SASsample> 
     379        string sample_ID 
     380        variable sample_thickness 
     381        string unitssample_thickness 
     382        variable sample_transmission 
     383 
     384        //SASinstrument 
     385        string nameSASinstrument 
     386        // SASinstrument/SASsource 
     387        string radiation 
     388//      string beam_shape 
     389        variable wavelength 
     390        string unitswavelength 
     391        variable wavelength_spread 
     392        string unitswavelength_spread 
     393  
     394        //<SAScollimation> 
     395//      variable collimation_length 
     396//      string unitscollimation_length 
     397        variable source_aperture 
     398        string unitssource_aperture 
     399        string typesource_aperture 
     400        variable sample_aperture 
     401        string unitssample_aperture 
     402        string typesample_aperture 
     403 
     404        //SASdetector         <SASdetector> 
     405        string detector_name 
     406        variable offset_angle 
     407        string unitsoffset_angle 
     408        variable  SDD 
     409        string unitsSDD 
     410        variable beamcenter_X 
     411        string unitsbeamcenter_X 
     412        variable beamcenter_Y 
     413        string unitsbeamcenter_Y 
     414//      variable pixel_sizeX 
     415//      string unitspixel_sizeX 
     416//      variable pixel_sizeY 
     417//      string unitspixel_sizeY 
     418//      string detectortype  
     419 
     420        // <SASprocess name="NCNR-IGOR"> 
     421        string nameSASprocess 
     422        string SASprocessnote 
     423//      string SASprocessdate 
     424//      string average_type 
     425//      string SAM_file 
     426//      string BKD_file 
     427//      string EMP_file 
     428//      string DIV_file 
     429//      string MASK_file 
     430//      string ABS_parameters 
     431//      variable TSTAND 
     432//      variable DSTAND 
     433//      string unitsDSTAND 
     434//      variable IZERO 
     435//      variable XSECT 
     436//      string unitsXSECT 
     437        string SASnote 
     438Endstructure 
     439 
     440 
     441//Function to write NIST canSAS XML files 
     442//Minimalist XML file - AJJ Dec 2008 
     443function writeNISTXML(fileName, NISTfile) 
     444        String fileName 
     445        Struct NISTXMLfile &NISTfile 
     446 
     447        variable fileID 
     448         
     449        //create the sasXML file with SASroot 
     450        //no namespace, no prefix 
     451        fileID = xmlcreatefile(fileName,"SASroot","cansas1d/1.0","") 
     452 
     453        //create a version attribute for the root element 
     454        xmlsetAttr(fileID,"/SASroot","","version","1.0") 
     455        xmlsetAttr(fileID,"/SASroot","","xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance") 
     456        xmlsetAttr(fileID,"/SASroot","","xsi:schemaLocation","cansas1d/1.0 http://svn.smallangles.net/svn/canSAS/1dwg/trunk/cansas1d.xsd") 
     457 
     458 
     459        //create the SASentry node 
     460        xmladdnode(fileID,"/SASroot","","SASentry","",1) 
     461                 
     462        //create the Title node 
     463        xmladdnode(fileID,"/SASroot/SASentry","","Title",NISTfile.Title,1) 
     464 
     465        //create the Run node 
     466        xmladdnode(fileID,"/SASroot/SASentry","","Run",NISTfile.Run,1) 
     467         
     468        //create the SASdata node 
     469        xmladdnode(fileID,"/SASroot/SASentry","","SASdata","",1) 
     470 
     471        variable ii 
     472         
     473        if (WaveExists(NISTfile.dQl) == 1) 
     474                for(ii=0 ; ii<numpnts(NISTfile.Q) ; ii+=1) 
     475                        xmladdnode(fileID,"/SASroot/SASentry/SASdata","","Idata","",1) 
     476                        xmladdnode(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]","","Q",num2str(NISTfile.Q[ii]),1) 
     477                        xmlsetAttr(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]/Q","","unit",NISTfile.unitsQ) 
     478         
     479                        xmladdnode(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]","","I",num2str(NISTfile.I[ii]),1) 
     480                        xmlsetAttr(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]/I","","unit",NISTfile.unitsI) 
     481         
     482                        xmladdnode(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]","","Idev",num2str(NISTfile.Idev[ii]),1) 
     483                        xmlsetAttr(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]/Idev","","unit",NISTfile.unitsIdev)       
     484         
     485                        xmladdnode(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]","","Idev",num2str(NISTfile.dQl[ii]),1) 
     486                        xmlsetAttr(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]/Idev","","unit",NISTfile.unitsdQl)                
     487                endfor 
     488        else 
     489                for(ii=0 ; ii<numpnts(NISTfile.Q) ; ii+=1) 
     490                        xmladdnode(fileID,"/SASroot/SASentry/SASdata","","Idata","",1) 
     491                        xmladdnode(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]","","Q",num2str(NISTfile.Q[ii]),1) 
     492                        xmlsetAttr(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]/Q","","unit",NISTfile.unitsQ) 
     493         
     494                        xmladdnode(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]","","I",num2str(NISTfile.I[ii]),1) 
     495                        xmlsetAttr(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]/I","","unit",NISTfile.unitsI) 
     496         
     497                        xmladdnode(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]","","Idev",num2str(NISTfile.Idev[ii]),1) 
     498                        xmlsetAttr(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]/Idev","","unit",NISTfile.unitsIdev) 
     499         
     500                        xmladdnode(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]","","Qdev",num2str(NISTfile.Qdev[ii]),1) 
     501                        xmlsetAttr(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]/Qdev","","unit",NISTfile.unitsQdev) 
     502         
     503                        xmladdnode(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]","","Qmean",num2str(NISTfile.Qmean[ii]),1) 
     504                        xmlsetAttr(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]/Qmean","","unit",NISTfile.unitsQmean) 
     505         
     506                        xmladdnode(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]","","Shadowfactor",num2str(NISTfile.shadowfactor[ii]),1) 
     507                endfor 
     508        endif 
     509 
     510        //SASsample node 
     511        xmladdnode(fileID,"/SASroot/SASentry","","SASsample","",1) 
     512        xmladdnode(fileID,"/SASroot/SASentry/SASsample","","ID",NISTfile.sample_ID,1) 
     513 
     514        //SASInstrument node 
     515        xmladdnode(fileID,"/SASroot/SASentry","","SASinstrument","",1) 
     516        xmladdnode(fileID,"/SASroot/SASentry/SASinstrument","","name",NISTfile.nameSASinstrument,1) 
     517         
     518        //SASsource 
     519        xmladdnode(fileID,"/SASroot/SASentry/SASinstrument","","SASsource","",1) 
     520        xmladdnode(fileID,"/SASroot/SASentry/SASinstrument/SASsource","","radiation",NISTfile.radiation,1) 
     521 
     522        //SAScollimation 
     523        xmladdnode(fileID,"/SASroot/SASentry/SASinstrument","","SAScollimation","",1) 
     524 
     525        //SASdetector 
     526        xmladdnode(fileID,"/SASroot/SASentry/SASinstrument","","SASdetector","",1) 
     527        xmladdnode(fileID,"/SASroot/SASentry/SASinstrument/SASdetector","","name",NISTfile.detector_name,1) 
     528 
     529 
     530        //SASprocess 
     531        xmladdnode(fileID,"/SASroot/SASentry","","SASprocess","",1) 
     532        xmlsetAttr(fileID,"/SASroot/SASentry/SASprocess","","name",NISTfile.nameSASprocess)      
     533        xmladdnode(fileID,"/SASroot/SASentry/SASprocess","","SASprocessnote",NISTfile.SASprocessnote,1) 
     534         
     535        //SASnote 
     536        xmladdnode(fileID,"/SASroot/SASentry","","SASnote",NISTfile.SASnote,1) 
     537         
     538        xmlsavefile(fileID) 
     539        xmlclosefile(fileID,0) 
     540         
     541end 
     542 
     543Function convertNISTtoNISTXML(fileStr) 
     544        String fileStr 
     545         
     546        Struct NISTXMLfile nf 
     547         
     548        Variable rr,gg,bb,refnum,dQv 
     549        SetDataFolder root:      
     550         
     551        if (cmpStr(fileStr,"") == 0) 
     552                //No filename given, open dialog 
     553                Open/D/R  refnum 
     554                if (cmpstr(S_filename,"") == 0) 
     555                        return 0 
     556                else 
     557                        fileStr = S_filename 
     558                endif 
     559        endif 
     560 
     561        //Load the waves, using default waveX names 
     562        //if no path or file is specified for LoadWave, the default Mac open dialog will appear 
     563        LoadWave/G/D/A/Q fileStr 
     564        String fileNamePath = S_Path+S_fileName 
     565        String basestr = CleanupName(ParseFilePath(3,ParseFilePath(5,fileNamePath,":",0,0),":",0,0),0) 
     566//      String baseStr = CleanupName(S_fileName,0) 
     567//              print "basestr :"+basestr 
     568        String fileName =  ParseFilePath(0,ParseFilePath(5,filestr,":",0,0),":",1,0) 
     569//              print "filename :"+filename 
     570        Variable numCols = V_flag 
     571        String outfileName = S_Path+basestr+".xml" 
     572 
     573         
     574        if(numCols==3)          //simple 3-column data with no resolution information 
     575                 
     576                Wave nf.Q = $(StringFromList(0, S_waveNames ,";" )) 
     577                Wave nf.I = $(StringFromList(1, S_waveNames ,";" )) 
     578                Wave nf.Idev = $(StringFromList(2, S_waveNames ,";" )) 
     579                                 
     580                //Set units 
     581                nf.unitsQ = "1/A" 
     582                nf.unitsI = "1/cm" 
     583                nf.unitsIdev = "1/cm" 
     584                                 
     585        endif           //3-col data 
     586         
     587        if(numCols == 6)                //6-column SANS or USANS data that has resolution information 
     588                 
     589                // put the names of the (default named) loaded waves into local names 
     590                Wave nf.Q = $(StringFromList(0, S_waveNames ,";" )) 
     591                Wave nf.I  = $(StringFromList(1, S_waveNames ,";" )) 
     592                Wave nf.Idev  = $(StringFromList(2, S_waveNames ,";" )) 
     593 
     594                //Set units 
     595                nf.unitsQ = "1/A" 
     596                nf.unitsI = "1/cm" 
     597                nf.unitsIdev = "1/cm" 
     598 
     599                WAVE resTest = $(StringFromList(3, S_waveNames ,";" )) 
     600 
     601                // need to switch based on SANS/USANS 
     602                if (isSANSResolution(resTest[0]))               //checks to see if the first point of the wave is <0] 
     603                        Wave nf.Qdev  = $(StringFromList(3, S_waveNames ,";" )) 
     604                        Wave nf.Qmean  = $(StringFromList(4, S_waveNames ,";" )) 
     605                        Wave nf.Shadowfactor  = $(StringFromList(5, S_waveNames ,";" )) 
     606                         
     607                        //Set units 
     608                        nf.unitsQdev = "1/A" 
     609                        nf.unitsQmean = "1/A" 
     610                else 
     611                        Wave nf.dQl = $(StringFromList(3, S_waveNames ,";" )) 
     612                         
     613                        //Set units 
     614                        nf.unitsdQl = "1/A" 
     615                         
     616                endif 
     617                 
     618                //Tidy up 
     619                Variable i = 0 
     620                do 
     621                        WAVE wv= $(StringFromList(i,S_waveNames,";")) 
     622                        if( WaveExists(wv) == 0 ) 
     623                                break 
     624                        endif 
     625                        KillWaves wv 
     626                        i += 1 
     627                while (1)       // exit is via break statement 
     628 
     629         
     630        endif   //6-col data 
     631 
     632        //Get file header 
     633        setmetadataFromASCHeader(fileStr,nf) 
     634 
     635        //Set required metadata that we can't get from these files 
     636        nf.detector_name = "Ordela 128x128" 
     637        nf.nameSASinstrument = "NIST NG3/NG7 SANS" 
     638        nf.radiation = "neutron" 
     639        nf.sample_ID = nf.title 
     640        nf.nameSASProcess = "NIST Data Converter" 
     641        nf.sasnote = "Data converted from previous NIST format. SASProcessnote contains header from original text file." 
     642 
     643        writeNISTXML(outfileName, nf) 
     644 
     645end 
     646 
     647function setmetadataFromASCHeader(fileStr,NISTfile) 
     648        String fileStr 
     649        Struct NISTXMLfile &NISTfile 
     650 
     651        String hdr="",buffer="" 
     652        Variable lineNum = 0, fileref 
     653        Variable num 
     654         
     655        Open/R fileref as fileStr 
     656        do 
     657                FReadLine fileref, buffer 
     658                if (stringmatch(buffer,"*The 6 columns are*") == 1) 
     659                        break 
     660                endif 
     661                buffer = RemoveEnding(buffer) 
     662                print buffer 
     663                //Get run value 
     664                if (stringmatch(buffer,"*file:*") == 1) 
     665                        NISTfile.run = TrimWS(StringFromList(0,StringFromList(1, buffer, ":"),"C")) 
     666                elseif (stringmatch(buffer,"combined file*") == 1) 
     667                        NISTfile.run = "Combined Data" 
     668                endif 
     669                 
     670                //Get title value 
     671                if (stringmatch(buffer,"*FIRST File LABEL:*") == 1) 
     672                        NISTfile.title = TrimWS(StringFromList(1,buffer, ":")) 
     673                elseif(stringmatch(buffer,"*LABEL:*") == 1) 
     674                        NISTfile.title = TrimWS(StringFromList(1,buffer, ":")) 
     675                endif 
     676                 
     677                hdr += buffer+"\n" 
     678        while(strlen(buffer) > 0) 
     679         
     680        if (strlen(NISTfile.title) == 0) 
     681                NISTfile.title = CleanupName(ParseFilePath(3,ParseFilePath(5,fileStr,":",0,0),":",0,0),0) 
     682        endif 
     683        if (strlen(NISTfile.run) == 0) 
     684                NISTfile.run = "Unknown" 
     685        endif 
     686         
     687        NISTfile.sasprocessnote = RemoveEnding(hdr) 
     688         
     689end 
     690 
     691 
    363692#else   // if( Exists("XmlOpenFile") ) 
    364693        // No XMLutils XOP: provide dummy function so that IgorPro can compile dependent support code 
     
    371700         
    372701 
     702        function writeNISTXML(fileName, NISTfile) 
     703            String fileName, NISTfile 
     704            Abort  "XML function provided by XMLutils XOP is not available, get the XOP from : http://www.igorexchange.com/project/XMLutils (see http://www.smallangles.net/wgwiki/index.php/cansas1d_binding_IgorPro for details)" 
     705         RETURN(-6) 
     706         
    373707         
    374708#endif  // if( Exists("XmlOpenFile")  
Note: See TracChangeset for help on using the changeset viewer.