Ignore:
Timestamp:
Jun 3, 2019 3:23:40 PM (4 years ago)
Author:
krzywon
Message:

Create USANS NXcanSAS data writer (untested).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sans/Dev/trunk/NCNR_User_Procedures/Reduction/USANS/WriteUSANSNXcanSAS.ipf

    r1087 r1157  
    33#pragma IgorVersion=6.1 
    44 
    5 ////////////// 
    6 //for writing out data (q-i-s-dum-dum-dum) from the "type" folder 
    7 //if fullpath is a complete HD path:filename, no dialog will be presented 
    8 //if fullpath is just a filename, the save dialog will be presented (forced if dialog =1) 
    9 //lo,hi are an (optional) range of the data[lo,hi] to save (in points) 
    10 //if lo=hi=0, all of the data is written out 
     5#include <HDF5 Browser> 
     6 
     7////////////////////////////////////////////////////////////////////////////////// 
    118// 
    12 //////// 27 OCT 04 
    13 // now writes 6-column data such that the last three columns are the divergence 
    14 //  = a constant value, set in Init_MainUSANS() 
     9// Write out an NXcanSAS compliant file using all known USANS information 
     10 
     11//************************ 
     12// Vers 1.00 20190603 
     13// 
     14//************************ 
     15 
    1516// 
    1617Function WriteUSANSNXcanSAS(type,fullpath,lo,hi,dialog) 
     18         
    1719        String type,fullpath 
    1820        Variable lo,hi,dialog           //=1 will present dialog for name 
    1921         
    2022        SVAR USANSFolder = root:Packages:NIST:USANS:Globals:gUSANSFolder 
    21  
    22          
    23         String termStr="\r\n"           //VAX uses only <CR> as terminator, but only CRLF seems to FTP correctly to VAX 
    24         String destStr="",formatStr = "%15.6g %15.6g %15.6g %15.6g %15.6g %15.6g"+termStr 
     23        NVAR dQv = root:Packages:NIST:USANS:Globals:MainPanel:gDQv 
     24         
     25        Variable fileID 
     26        String destStr="" 
    2527        destStr = USANSFolder+":"+type 
     28        String dateStr=date()+" "+time() 
     29 
     30        String parentBase = "/sasentry/" // HDF5 base path for all  
     31        String/G base = "root:NXcanSAS_USANS_file" 
     32         
     33        KillDataFolder/Z $base 
     34         
     35        // Define common attribute waves 
     36        Make/T/N=1 empty = {""} 
     37        Make/T/N=1 units = {"units"} 
     38        Make/T/N=1 m = {"m"} 
     39        Make/T/N=1 mm = {"mm"} 
     40        Make/T/N=1 cm = {"cm"} 
     41        Make/T/N=1 angstrom = {"A"} 
     42        Make/T/N=1 inv_cm = {"1/cm"} 
     43        Make/T/N=1 inv_angstrom = {"1/A"} 
    2644         
    2745        Variable refNum,integer,realval 
     
    3149        WAVE inten=$(destStr + ":DetCts") 
    3250        WAVE sig=$(destStr + ":ErrDetCts") 
     51                 
     52        if(dialog || stringmatch(fullpath, "")) 
     53                fileID = NxCansas_DoSaveFileDialog() 
     54        else 
     55                fileID = NxCansas_CreateFile(fullpath) 
     56        Endif 
    3357         
    3458        //check each wave 
     
    4367        Endif 
    4468         
    45         // 27 OCT 04 SRK 
    46         // make a dummy wave to hold the divergence, and write it as the last 3 columns 
    47         // and make the value negative as a flag for the analysis software 
     69        //Use the evil extra column for the resolution "information". Should probably switch to using slit_length in collimation. 
     70        Duplicate/O qvals,dumWave 
     71        dumWave = dQv 
     72         
     73        Make/N= (numpnts(dumWave)) dQw = 0 
     74         
     75        // Run Name and title 
     76        NewDataFolder/O/S $(base + ":entry1") 
     77        Make/T/N=1 $(base + ":entry1:title") = {StringByKey("LABEL",note(inten),":",";")} 
     78        CreateStrNxCansas(fileID,parentBase,"","title",$(base + ":entry1:title"),empty,empty) 
     79        Make/T/N=1 $(base + ":entry1:run") = {""} 
     80        CreateStrNxCansas(fileID,parentBase,"","run",$(base + ":entry1:run"),empty,empty) 
     81         
     82        // SASData 
     83        String dataParent = parentBase + "sasdata/" 
     84        // Create SASdata entry 
     85        String dataBase = base + ":entry1:sasdata" 
     86        NewDataFolder/O/S $(dataBase) 
     87        Make/O/T/N=5 $(dataBase + ":attr") = {"canSAS_class","signal","I_axes","NX_class","Q_indices", "timestamp"} 
     88        Make/O/T/N=5 $(dataBase + ":attrVals") = {"SASdata","I","Q","NXdata","0",dateStr} 
     89        CreateStrNxCansas(fileID,dataParent,"","",empty,$(dataBase + ":attr"),$(dataBase + ":attrVals")) 
     90        // Create q entry 
     91        NewDataFolder/O/S $(dataBase + ":q") 
     92        Make/T/N=2 $(dataBase + ":q:attr") = {"units","resolutions"} 
     93        Make/T/N=2 $(dataBase + ":q:attrVals") = {"1/angstrom","dQl,dQw"} 
     94        CreateVarNxCansas(fileID,dataParent,"sasdata","Q",tq,$(dataBase + ":q:attr"),$(dataBase + ":q:attrVals")) 
     95        // Create i entry 
     96        NewDataFolder/O/S $(dataBase + ":i") 
     97        Make/T/N=2 $(dataBase + ":i:attr") = {"units","uncertainties"} 
     98        Make/T/N=2 $(dataBase + ":i:attrVals") = {"1/cm","Idev"} 
     99        CreateVarNxCansas(fileID,dataParent,"sasdata","I",ti,$(dataBase + ":i:attr"),$(dataBase + ":i:attrVals")) 
     100        // Create idev entry 
     101        CreateVarNxCansas(fileID,dataParent,"sasdata","Idev",te,units,inv_cm) 
     102        // Create qdev entry 
     103        CreateVarNxCansas(fileID,dataParent,"sasdata","dQl",dumWave,units,inv_angstrom) 
     104        CreateVarNxCansas(fileID,dataParent,"sasdata","dQw",dQw,units,inv_angstrom) 
     105        CreateVarNxCansas(fileID,dataParent,"sasdata","Qmean",res2,units,inv_angstrom) 
     106         
    48107        // 
    49         Duplicate/O qvals,dumWave 
    50         NVAR DQv=$(USANSFolder+":Globals:MainPanel:gDQv") 
    51         dumWave = - DQv 
    52         /// 
    53         if(dialog) 
    54                 PathInfo/S savePathName 
    55                 fullPath = DoSaveFileDialog("Save data as") 
    56                 If(cmpstr(fullPath,"")==0) 
    57                         //user cancel, don't write out a file 
    58                         Close/A 
    59                         Abort "no data file was written" 
    60                 Endif 
    61                 //Print "dialog fullpath = ",fullpath 
    62         Endif 
    63          
    64         //write out partial set? 
    65         Duplicate/O qvals,tq,ti,te 
    66         ti=inten 
    67         te=sig 
    68         if( (lo!=hi) && (lo<hi)) 
    69                 redimension/N=(hi-lo+1) tq,ti,te,dumWave                //lo to hi, inclusive 
    70                 tq=qvals[p+lo] 
    71                 ti=inten[p+lo] 
    72                 te=sig[p+lo] 
    73         endif 
     108        ////////////////////////////////////////////////////////////////////////////////////////////// 
     109         
     110        ////////////////////////////////////////////////////////////////////////////////////////////// 
     111        // 
     112        // Write USANS meta data 
     113         
    74114         
    75115        //tailor the output given the type of data written out... 
    76116        WAVE inten_EMP=$(USANSFolder+":EMP:DetCts") 
    77         String samStr="",empStr="",dateStr="",samLabelStr="",paramStr="",empLevStr="",bkgLevStr="" 
    78         String pkStr="" 
     117        String samStr="",empStr="",samLabelStr="",paramStr="",empLevStr="",bkgLevStr="" 
     118        String pkStr="", processNote="" 
    79119        NVAR TransWide = $(USANSFolder+":Globals:MainPanel:gTransWide") 
    80120        NVAR TransRock = $(USANSFolder+":Globals:MainPanel:gTransRock") 
     
    111151                        pkStr += " ; EMP PEAK ANGLE: "+num2str(QpkFromNote("EMP"))                               
    112152        endswitch 
    113          
    114         //these strings are always the same 
    115         dateStr="CREATED: "+date()+" at  "+time() 
    116         samLabelStr ="LABEL: "+StringByKey("LABEL",note(inten),":",";")  
    117          
    118         //actually open the file 
    119         Open refNum as fullpath 
    120          
    121         fprintf refnum,"%s"+termStr,samStr 
    122         fprintf refnum,"%s"+termStr,dateStr 
    123         fprintf refnum,"%s"+termStr,samLabelStr 
    124         fprintf refnum,"%s"+termStr,empStr 
    125         fprintf refnum,"%s"+termStr,paramStr 
    126         fprintf refnum,"%s"+termStr,pkStr 
    127         fprintf refnum,"%s"+termStr,empLevStr + " ; "+bkglevStr 
    128          
    129         // 
    130         wfprintf refnum, formatStr, tq,ti,te,dumWave,dumWave,dumWave 
    131          
    132         Close refnum 
    133          
    134         Killwaves/Z ti,tq,te,dumWave 
    135          
    136         Return(0) 
     153 
     154        processNote = samStr+"\n"+dateStr+"\n"+samLabelStr+"\n"+empStr+"\n"+paramStr+"\n"+pkStr+"\n" 
     155        processNote += empLevStr + " ; "+bkglevStr+"\n" 
     156         
     157        // SASinstrument 
     158        String instrParent = parentBase + "sasinstrument/" 
     159        // Create SASinstrument entry 
     160        String instrumentBase = base + ":entry1:sasinstrument" 
     161        NewDataFolder/O/S $(instrumentBase) 
     162        Make/O/T/N=5 $(instrumentBase + ":attr") = {"canSAS_class","NX_class"} 
     163        Make/O/T/N=5 $(instrumentBase + ":attrVals") = {"SASinstrument","NXinstrument"} 
     164        CreateStrNxCansas(fileID,instrParent,"","",empty,$(instrumentBase + ":attr"),$(instrumentBase + ":attrVals")) 
     165         
     166        // SASaperture 
     167        String apertureParent = instrParent + "sasaperture/" 
     168        // Create SASaperture entry 
     169        String apertureBase = instrumentBase + ":sasaperture" 
     170        NewDataFolder/O/S $(apertureBase) 
     171        Make/O/T/N=5 $(apertureBase + ":attr") = {"canSAS_class","NX_class"} 
     172        Make/O/T/N=5 $(apertureBase + ":attrVals") = {"SASaperture","NXaperture"} 
     173        CreateStrNxCansas(fileID,apertureParent,"","",empty,$(apertureBase + ":attr"),$(apertureBase + ":attrVals")) 
     174         
     175        // Create SASaperture shape entry 
     176        Make/O/T/N=1 $(apertureBase + ":shape") = {"slit"}  
     177        CreateStrNxCansas(fileID,apertureParent,"sasaperture","shape",$(apertureBase + ":shape"),empty,empty) 
     178        // Create SASaperture x_gap entry 
     179        Make/O/N=1 $(apertureBase + ":x_gap") = {0.1} 
     180        CreateVarNxCansas(fileID,apertureParent,"sasaperture","x_gap",$(apertureBase + ":x_gap"),units,cm) 
     181        // Create SASaperture y_gap entry 
     182        Make/O/N=1 $(apertureBase + ":y_gap") = {5.0} 
     183        CreateVarNxCansas(fileID,apertureParent,"sasaperture","y_gap",$(apertureBase + ":y_gap"),units,cm) 
     184 
     185        // SASdetector 
     186        String detectorParent = instrParent + "sasdetector/" 
     187        // Create SASdetector entry 
     188        String detectorBase = instrumentBase + ":sasdetector" 
     189        NewDataFolder/O/S $(detectorBase) 
     190        Make/O/T/N=5 $(detectorBase + ":attr") = {"canSAS_class","NX_class"} 
     191        Make/O/T/N=5 $(detectorBase + ":attrVals") = {"SASdetector","NXdetector"} 
     192        CreateStrNxCansas(fileID,detectorParent,"","",empty,$(detectorBase + ":attr"),$(detectorBase + ":attrVals")) 
     193        // Create SASdetector name entry 
     194        Make/O/T/N=1 $(detectorBase + ":name") = {"BT5 DETECTOR ARRAY"} 
     195        CreateStrNxCansas(fileID,detectorParent,"","name",$(detectorBase + ":name"),empty,empty) 
     196         
     197        // SASsource 
     198        String sourceParent = instrParent + "sassource/" 
     199        // Create SASdetector entry 
     200        String sourceBase = instrumentBase + ":sassource" 
     201        NewDataFolder/O/S $(sourceBase) 
     202        Make/O/T/N=5 $(sourceBase + ":attr") = {"canSAS_class","NX_class"} 
     203        Make/O/T/N=5 $(sourceBase + ":attrVals") = {"SASsource","NXsource"} 
     204        CreateStrNxCansas(fileID,sourceParent,"","",empty,$(sourceBase + ":attr"),$(sourceBase + ":attrVals")) 
     205        // Create SASsource radiation entry 
     206        Make/O/T/N=1 $(sourceBase + ":radiation") = {"Reactor Neutron Source"} 
     207        CreateStrNxCansas(fileID,sourceParent,"","radiation",$(sourceBase + ":radiation"),empty,empty) 
     208        // Create SASsource incident_wavelength entry 
     209        Make/O/N=1 $(sourceBase + ":incident_wavelength") = {2.38} 
     210        CreateVarNxCansas(fileID,sourceParent,"","incident_wavelength",$(sourceBase + ":incident_wavelength"),units,angstrom) 
     211        // Create SASsource incident_wavelength_spread entry 
     212        Make/O/N=1 $(sourceBase + ":incident_wavelength_spread") = {0.06} 
     213        CreateVarNxCansas(fileID,sourceParent,"","incident_wavelength_spread",$(sourceBase + ":incident_wavelength_spread"),units,angstrom) 
     214         
     215        // SASsample 
     216        String sampleParent = parentBase + "sassample/" 
     217        // Create SASsample entry 
     218        String sampleBase = base + ":entry1:sassample" 
     219        NewDataFolder/O/S $(sampleBase) 
     220        Make/O/T/N=5 $(sampleBase + ":attr") = {"canSAS_class","NX_class"} 
     221        Make/O/T/N=5 $(sampleBase + ":attrVals") = {"SASsample","NXsample"} 
     222        CreateStrNxCansas(fileID,sampleParent,"","",empty,$(sampleBase + ":attr"),$(sampleBase + ":attrVals")) 
     223        // Create SASsample name entry 
     224        Make/O/T/N=1 $(sampleBase + ":name") = {StringByKey("LABEL",note(inten),":",";")} 
     225        CreateStrNxCansas(fileID,sampleParent,"","name",$(sampleBase + ":name"),empty,empty) 
     226        // Create SASsample thickness entry 
     227        Make/O/N=1 $(sampleBase + ":thickness") = {thick} 
     228        CreateVarNxCansas(fileID,sampleParent,"","thickness",$(sampleBase + ":thickness"),units,cm) 
     229        // Create SASsample transmission entry 
     230        Make/O/N=1 $(sampleBase + ":transmission") = {TransWide} 
     231        CreateVarNxCansas(fileID,sampleParent,"","transmission",$(sampleBase + ":transmission"),empty,empty) 
     232         
     233        // SASProcess 
     234        String processParent = parentBase + "sasprocess/" 
     235        // Create SASsample entry 
     236        String processBase = base + ":entry1:sasprocess" 
     237        NewDataFolder/O/S $(processBase) 
     238        Make/O/T/N=5 $(processBase + ":attr") = {"canSAS_class","NX_class"} 
     239        Make/O/T/N=5 $(processBase + ":attrVals") = {"SASprocess","NXprocess"} 
     240        CreateStrNxCansas(fileID,processParent,"","",empty,$(processBase + ":attr"),$(processBase + ":attrVals")) 
     241        // Create SASsample name entry 
     242        Make/O/T/N=1 $(processBase + ":name") = {"NIST IGOR"} 
     243        CreateStrNxCansas(fileID,processParent,"","name",$(processBase + ":name"),empty,empty) 
     244        // Create SASsample thickness entry 
     245        Make/O/T/N=1 $(sampleBase + ":note") = {processNote} 
     246        CreateVarNxCansas(fileID,processParent,"","note",$(processBase + ":note"),units,cm) 
     247         
     248        //write confirmation of write operation to history area 
     249        Print "Averaged XML File written: ", GetFileNameFromPathNoSemi(fullPath) 
     250        KillWaves/Z dumWave 
     251         
     252        // Close the file 
     253        if(fileID) 
     254                HDF5CloseFile /Z fileID 
     255        endif 
     256         
    137257End 
    138258 
    139259 
    140 // convert "old" 3-column .cor files to "new" 6-column files 
    141 // Append the suffix="_6col.cor" to the new data files 
    142 // 
    143 // these "old" files will all have dQv = 0.037 (1/A) to match the  
    144 // absolute scaling constant. "New" files written Nov 2004 or later  
    145 // will have the appropriate values of dQv and scaling, as set in 
    146 // the initialization routines. 
    147 // 
    148 // files were written out in the style above, 7 header lines, then the data 
    149 // 
    150 Function Convert3ColTo6Col_R() 
    151          
    152         String termStr="\r\n"           //VAX uses only <CR> as terminator, but only CRLF seems to FTP correctly to VAX 
    153         String formatStr = "%15.6g %15.6g %15.6g %15.6g %15.6g %15.6g"+termStr 
    154         String newFName="",suffix="_6col.cor",fullpath="" 
    155          
    156         Variable refNum_old,refnum_new,integer,realval 
    157          
    158         // 08 NOV 04 SRK 
    159         Variable ii,dQv = -0.037                //hard-wired value for divergence (pre- NOV 2004 value) 
    160         /// 
    161          
    162         Open/R/D/M="Select the 3-column data file"/T="????" refnum_old          //won't actually open the file 
    163         If(cmpstr(S_filename,"")==0) 
    164                 //user cancel, don't write out a file 
    165                 Close/A 
    166                 Abort "no data file was written" 
    167         Endif 
    168         fullpath = S_filename 
    169         newFname = fullpath[0,strlen(fullpath)-5]+suffix 
    170         Print fullpath 
    171         Print newFname 
    172          
    173         String tmpStr 
    174         String extraStr="" 
    175         sprintf extraStr,"%15.6g %15.6g %15.6g",dQv,dQv,dQv 
    176         extraStr += termStr 
    177         //actually open each of the files 
    178         Open/R refNum_old as fullpath 
    179         Open refNum_new as newFname 
    180          
    181         //7 header lines 
    182         for(ii=0;ii<7;ii+=1) 
    183                 FReadLine refNum_old, tmpStr            //returns only CR 
    184                 fprintf refnum_new,tmpStr+"\n"          // add LF so file has CRLF 
    185         endfor 
    186          
    187         do 
    188                 FReadLine refNum_old, tmpStr 
    189                 if(strlen(tmpStr)==0) 
    190                         break 
    191                 endif 
    192                 fprintf refnum_new,tmpStr[0,strlen(tmpStr)-2]+extraStr 
    193         while(1) 
    194          
    195         Close refnum_old 
    196         Close refnum_new 
    197                  
    198         Return(0) 
    199 End 
    200  
    201 /////////XML Routines//////// 
    202 ///AJJ Jan 2010 
    203 ///Have to put these here, annoyingly, because we depend on USANS specific functions 
    204 ///Need to think about consolidation of functions. 
    205  
    206 #if( Exists("XmlOpenFile") ) 
    207  
    208 Function WriteXMLUSANSWaves_R(type,fullpath,lo,hi,dialog) 
    209         String type,fullpath 
     260Function WriteNXcanSASUSANSDesmeared(fullpath,lo,hi,dialog) 
     261         
     262        String fullpath 
    210263        Variable lo,hi,dialog           //=1 will present dialog for name 
    211264         
     
    213266        NVAR dQv = root:Packages:NIST:USANS:Globals:MainPanel:gDQv 
    214267         
    215         Struct NISTXMLfile nf 
    216          
    217         String termStr="\r\n"           //VAX uses only <CR> as terminator, but only CRLF seems to FTP correctly to VAX 
    218         String destStr="",formatStr = "%15.6g %15.6g %15.6g %15.6g %15.6g %15.6g"+termStr 
    219         destStr = USANSFolder+":"+type 
     268        Variable fileID 
     269        String destStr="" 
     270        destStr = USANSFolder+":Smeared" 
     271        String dateStr=date()+" "+time() 
     272 
     273        String parentBase = "/sasentry/" // HDF5 base path for all  
     274        String/G base = "root:NXcanSAS_USANS_file" 
     275         
     276        KillDataFolder/Z $base 
     277         
     278        // Define common attribute waves 
     279        Make/T/N=1 empty = {""} 
     280        Make/T/N=1 units = {"units"} 
     281        Make/T/N=1 m = {"m"} 
     282        Make/T/N=1 mm = {"mm"} 
     283        Make/T/N=1 cm = {"cm"} 
     284        Make/T/N=1 angstrom = {"A"} 
     285        Make/T/N=1 inv_cm = {"1/cm"} 
     286        Make/T/N=1 inv_angstrom = {"1/A"} 
    220287         
    221288        Variable refNum,integer,realval 
    222  
    223289         
    224290        //*****these waves MUST EXIST, or IGOR Pro will crash, with a type 2 error**** 
    225         WAVE qvals =$(destStr + ":Qvals") 
    226         WAVE inten=$(destStr + ":DetCts") 
    227         WAVE sig=$(destStr + ":ErrDetCts") 
     291        WAVE qvals =$(destStr + "Q_dsm") 
     292        WAVE inten=$(destStr + "I_dsm") 
     293        WAVE sig=$(destStr + "S_dsm") 
     294                 
     295        if(dialog || stringmatch(fullpath, "")) 
     296                fileID = NxCansas_DoSaveFileDialog() 
     297        else 
     298                fileID = NxCansas_CreateFile(fullpath) 
     299        Endif 
    228300         
    229301        //check each wave 
     
    239311         
    240312        //Use the evil extra column for the resolution "information". Should probably switch to using slit_length in collimation. 
    241         Duplicate/O qvals,dumWave 
    242         dumWave = dQv                   //written out as a positive value, since the column is identified by its label, dQl 
    243         /// 
    244          
    245         if(dialog) 
    246                 PathInfo/S catPathName 
    247                 fullPath = DoSaveFileDialog("Save data as",fname="",suffix="."+type+"x") 
    248                 If(cmpstr(fullPath,"")==0) 
    249                         //user cancel, don't write out a file 
    250                         Close/A 
    251                         Abort "no data file was written" 
    252                 Endif 
    253                 //Print "dialog fullpath = ",fullpath 
    254         Endif 
    255          
    256313        //write out partial set? 
    257         // duplicate the original data, all 3 waves 
    258314        Duplicate/O qvals,tq,ti,te 
    259315        ti=inten 
    260316        te=sig 
    261317        if( (lo!=hi) && (lo<hi)) 
    262                 redimension/N=(hi-lo+1) tq,ti,te,dumWave                //lo to hi, inclusive 
     318                redimension/N=(hi-lo+1) tq,ti,te,res1,res2,res3         //lo to hi, inclusive 
    263319                tq=qvals[p+lo] 
    264320                ti=inten[p+lo] 
     
    266322        endif 
    267323         
    268         //Data 
    269         Wave nf.Q = tq 
    270         nf.unitsQ = "1/A" 
    271         Wave nf.I = ti 
    272         nf.unitsI = "1/cm" 
    273         Wave nf.Idev = te 
    274         nf.unitsIdev = "1/cm" 
    275         // for slit-smeared USANS, set only a 4th column to  -dQv 
    276         Wave nf.dQl = dumWave 
    277         nf.unitsdQl= "1/A" 
    278  
    279         //write out the standard header information 
    280         //fprintf refnum,"FILE: %s\t\t CREATED: %s\r\n",textw[0],textw[1] 
     324        Make/N= (numpnts(dumWave)) dQw = 0 
     325         
     326        // Run Name and title 
     327        NewDataFolder/O/S $(base + ":entry1") 
     328        Make/T/N=1 $(base + ":entry1:title") = {StringByKey("LABEL",note(inten),":",";")} 
     329        CreateStrNxCansas(fileID,parentBase,"","title",$(base + ":entry1:title"),empty,empty) 
     330        Make/T/N=1 $(base + ":entry1:run") = {""} 
     331        CreateStrNxCansas(fileID,parentBase,"","run",$(base + ":entry1:run"),empty,empty) 
     332         
     333        // SASData 
     334        String dataParent = parentBase + "sasdata/" 
     335        // Create SASdata entry 
     336        String dataBase = base + ":entry1:sasdata" 
     337        NewDataFolder/O/S $(dataBase) 
     338        Make/O/T/N=5 $(dataBase + ":attr") = {"canSAS_class","signal","I_axes","NX_class","Q_indices", "timestamp"} 
     339        Make/O/T/N=5 $(dataBase + ":attrVals") = {"SASdata","I","Q","NXdata","0",dateStr} 
     340        CreateStrNxCansas(fileID,dataParent,"","",empty,$(dataBase + ":attr"),$(dataBase + ":attrVals")) 
     341        // Create q entry 
     342        NewDataFolder/O/S $(dataBase + ":q") 
     343        Make/T/N=2 $(dataBase + ":q:attr") = {"units","resolutions"} 
     344        Make/T/N=2 $(dataBase + ":q:attrVals") = {"1/angstrom","dQ"} 
     345        CreateVarNxCansas(fileID,dataParent,"sasdata","Q",tq,$(dataBase + ":q:attr"),$(dataBase + ":q:attrVals")) 
     346        // Create i entry 
     347        NewDataFolder/O/S $(dataBase + ":i") 
     348        Make/T/N=2 $(dataBase + ":i:attr") = {"units","uncertainties"} 
     349        Make/T/N=2 $(dataBase + ":i:attrVals") = {"1/cm","Idev"} 
     350        CreateVarNxCansas(fileID,dataParent,"sasdata","I",ti,$(dataBase + ":i:attr"),$(dataBase + ":i:attrVals")) 
     351        // Create idev entry 
     352        CreateVarNxCansas(fileID,dataParent,"sasdata","Idev",te,units,inv_cm) 
     353        // Create qdev entry 
     354        CreateVarNxCansas(fileID,dataParent,"sasdata","dQl",dumWave,units,inv_angstrom) 
     355        CreateVarNxCansas(fileID,dataParent,"sasdata","dQw",res1,units,inv_angstrom) 
     356        CreateVarNxCansas(fileID,dataParent,"sasdata","Qmean",res2,units,inv_angstrom) 
     357         
     358        // 
     359        ////////////////////////////////////////////////////////////////////////////////////////////// 
     360         
     361        ////////////////////////////////////////////////////////////////////////////////////////////// 
     362        // 
     363        // Write USANS meta data 
     364         
    281365         
    282366        //tailor the output given the type of data written out... 
    283367        WAVE inten_EMP=$(USANSFolder+":EMP:DetCts") 
    284         String samStr="",empStr="",dateStr="",samLabelStr="",paramStr="",empLevStr="",bkgLevStr="" 
    285         String pkStr="" 
     368        String samStr="",empStr="",samLabelStr="",paramStr="",empLevStr="",bkgLevStr="" 
     369        String pkStr="", processNote="" 
    286370        NVAR TransWide = $(USANSFolder+":Globals:MainPanel:gTransWide") 
    287371        NVAR TransRock = $(USANSFolder+":Globals:MainPanel:gTransRock") 
     
    290374        NVAR thick = $(USANSFolder+":Globals:MainPanel:gThick") 
    291375         
    292         strswitch(type) 
    293                 case "SAM":              
    294                         samStr = type +" FILES: "+StringByKey("FILE",note(inten),":",";") 
    295                         empStr = "Uncorrected SAM data" 
    296                         empLevStr = "Uncorrected SAM data" 
    297                         bkgLevStr = "Uncorrected SAM data" 
    298                         paramStr = "Uncorrected SAM data" 
    299                         pkStr += "SAM PEAK ANGLE: "+num2str(QpkFromNote("SAM")) 
    300                         break                                            
    301                 case "EMP":      
    302                         samStr = type +" FILES: "+StringByKey("FILE",note(inten),":",";") 
    303                         empStr = "Uncorrected EMP data" 
    304                         empLevStr = "Uncorrected EMP data" 
    305                         bkgLevStr = "Uncorrected EMP data" 
    306                         paramStr = "Uncorrected EMP data" 
    307                         pkStr += "EMP PEAK ANGLE: "+num2str(QpkFromNote("EMP")) 
    308                         break 
    309                 default:                //"COR" is the default   
    310                         samStr = type +" FILES: "+StringByKey("FILE",note(inten),":",";") 
    311                         empStr = "EMP FILES: "+StringByKey("FILE",note(inten_EMP),":",";")       
    312                         empLevStr = "EMP LEVEL: " + num2str(empCts) 
    313                         bkgLevStr = "BKG LEVEL: " + num2str(bkgCts) 
    314                         paramStr = "Ds = "+num2str(thick)+" cm ; " 
    315                         paramStr += "Twide = "+num2Str(TransWide)+" ; " 
    316                         paramStr += "Trock = "+num2str(TransRock)        
    317                         pkStr += "SAM PEAK ANGLE: "+num2str(QpkFromNote("SAM")) 
    318                         pkStr += " ; EMP PEAK ANGLE: "+num2str(QpkFromNote("EMP"))                               
    319         endswitch 
    320          
    321          
    322         //AJJ to fix with sensible values 
    323         nf.run = "" 
    324         nf.nameSASinstrument = "BT5 USANS" 
    325         nf.SASnote = "" 
    326         // 
    327         nf.sample_ID = "" 
    328         nf.title = StringByKey("LABEL",note(inten),":",";") 
    329         nf.radiation = "neutron" 
    330         nf.wavelength = 2.38 
    331         nf.unitswavelength = "A" 
    332         nf.sample_thickness = thick 
    333         nf.unitssample_thickness = "cm" 
    334          
    335         //Do something with beamstop (rw[21]) 
    336         nf.detector_name = "BT5 DETECTOR ARRAY" 
    337  
    338         nf.SASprocessnote = samStr+"\n" 
    339         nf.SASprocessnote += dateStr+"\n" 
    340         nf.SASprocessnote += samLabelStr+"\n" 
    341         nf.SASprocessnote += empStr+"\n" 
    342         nf.SASprocessnote += paramStr+"\n" 
    343         nf.SASprocessnote += pkStr+"\n" 
    344         nf.SASprocessnote += empLevStr + " ; "+bkglevStr+"\n" 
    345          
    346         nf.nameSASProcess = "NIST IGOR" 
    347  
    348         //Close refnum 
    349          
    350         writeNISTXML(fullpath, nf) 
    351          
    352         SetDataFolder root:             //(redundant) 
     376        samStr = "SMEARED FILES: "+StringByKey("FILE",note(inten),":",";") 
     377        empStr = "EMP FILES: "+StringByKey("FILE",note(inten_EMP),":",";")       
     378        empLevStr = "EMP LEVEL: " + num2str(empCts) 
     379        bkgLevStr = "BKG LEVEL: " + num2str(bkgCts) 
     380        paramStr = "Ds = "+num2str(thick)+" cm ; " 
     381        paramStr += "Twide = "+num2Str(TransWide)+" ; " 
     382        paramStr += "Trock = "+num2str(TransRock)        
     383        pkStr += "SAM PEAK ANGLE: "+num2str(QpkFromNote("SAM")) 
     384        pkStr += " ; EMP PEAK ANGLE: "+num2str(QpkFromNote("EMP")) 
     385 
     386        processNote = samStr+"\n"+dateStr+"\n"+samLabelStr+"\n"+empStr+"\n"+paramStr+"\n"+pkStr+"\n" 
     387        processNote += empLevStr + " ; "+bkglevStr+"\n" 
     388         
     389        // SASinstrument 
     390        String instrParent = parentBase + "sasinstrument/" 
     391        // Create SASinstrument entry 
     392        String instrumentBase = base + ":entry1:sasinstrument" 
     393        NewDataFolder/O/S $(instrumentBase) 
     394        Make/O/T/N=5 $(instrumentBase + ":attr") = {"canSAS_class","NX_class"} 
     395        Make/O/T/N=5 $(instrumentBase + ":attrVals") = {"SASinstrument","NXinstrument"} 
     396        CreateStrNxCansas(fileID,instrParent,"","",empty,$(instrumentBase + ":attr"),$(instrumentBase + ":attrVals")) 
     397         
     398        // SASaperture 
     399        String apertureParent = instrParent + "sasaperture/" 
     400        // Create SASaperture entry 
     401        String apertureBase = instrumentBase + ":sasaperture" 
     402        NewDataFolder/O/S $(apertureBase) 
     403        Make/O/T/N=5 $(apertureBase + ":attr") = {"canSAS_class","NX_class"} 
     404        Make/O/T/N=5 $(apertureBase + ":attrVals") = {"SASaperture","NXaperture"} 
     405        CreateStrNxCansas(fileID,apertureParent,"","",empty,$(apertureBase + ":attr"),$(apertureBase + ":attrVals")) 
     406         
     407        // Create SASaperture shape entry 
     408        Make/O/T/N=1 $(apertureBase + ":shape") = {"slit"}  
     409        CreateStrNxCansas(fileID,apertureParent,"sasaperture","shape",$(apertureBase + ":shape"),empty,empty) 
     410        // Create SASaperture x_gap entry 
     411        Make/O/N=1 $(apertureBase + ":x_gap") = {0.1} 
     412        CreateVarNxCansas(fileID,apertureParent,"sasaperture","x_gap",$(apertureBase + ":x_gap"),units,cm) 
     413        // Create SASaperture y_gap entry 
     414        Make/O/N=1 $(apertureBase + ":y_gap") = {5.0} 
     415        CreateVarNxCansas(fileID,apertureParent,"sasaperture","y_gap",$(apertureBase + ":y_gap"),units,cm) 
     416 
     417        // SASdetector 
     418        String detectorParent = instrParent + "sasdetector/" 
     419        // Create SASdetector entry 
     420        String detectorBase = instrumentBase + ":sasdetector" 
     421        NewDataFolder/O/S $(detectorBase) 
     422        Make/O/T/N=5 $(detectorBase + ":attr") = {"canSAS_class","NX_class"} 
     423        Make/O/T/N=5 $(detectorBase + ":attrVals") = {"SASdetector","NXdetector"} 
     424        CreateStrNxCansas(fileID,detectorParent,"","",empty,$(detectorBase + ":attr"),$(detectorBase + ":attrVals")) 
     425        // Create SASdetector name entry 
     426        Make/O/T/N=1 $(detectorBase + ":name") = {"BT5 DETECTOR ARRAY"} 
     427        CreateStrNxCansas(fileID,detectorParent,"","name",$(detectorBase + ":name"),empty,empty) 
     428         
     429        // SASsource 
     430        String sourceParent = instrParent + "sassource/" 
     431        // Create SASdetector entry 
     432        String sourceBase = instrumentBase + ":sassource" 
     433        NewDataFolder/O/S $(sourceBase) 
     434        Make/O/T/N=5 $(sourceBase + ":attr") = {"canSAS_class","NX_class"} 
     435        Make/O/T/N=5 $(sourceBase + ":attrVals") = {"SASsource","NXsource"} 
     436        CreateStrNxCansas(fileID,sourceParent,"","",empty,$(sourceBase + ":attr"),$(sourceBase + ":attrVals")) 
     437        // Create SASsource radiation entry 
     438        Make/O/T/N=1 $(sourceBase + ":radiation") = {"Reactor Neutron Source"} 
     439        CreateStrNxCansas(fileID,sourceParent,"","radiation",$(sourceBase + ":radiation"),empty,empty) 
     440        // Create SASsource incident_wavelength entry 
     441        Make/O/N=1 $(sourceBase + ":incident_wavelength") = {2.38} 
     442        CreateVarNxCansas(fileID,sourceParent,"","incident_wavelength",$(sourceBase + ":incident_wavelength"),units,angstrom) 
     443        // Create SASsource incident_wavelength_spread entry 
     444        Make/O/N=1 $(sourceBase + ":incident_wavelength_spread") = {0.06} 
     445        CreateVarNxCansas(fileID,sourceParent,"","incident_wavelength_spread",$(sourceBase + ":incident_wavelength_spread"),units,angstrom) 
     446         
     447        // SASsample 
     448        String sampleParent = parentBase + "sassample/" 
     449        // Create SASsample entry 
     450        String sampleBase = base + ":entry1:sassample" 
     451        NewDataFolder/O/S $(sampleBase) 
     452        Make/O/T/N=5 $(sampleBase + ":attr") = {"canSAS_class","NX_class"} 
     453        Make/O/T/N=5 $(sampleBase + ":attrVals") = {"SASsample","NXsample"} 
     454        CreateStrNxCansas(fileID,sampleParent,"","",empty,$(sampleBase + ":attr"),$(sampleBase + ":attrVals")) 
     455        // Create SASsample name entry 
     456        Make/O/T/N=1 $(sampleBase + ":name") = {StringByKey("LABEL",note(inten),":",";")} 
     457        CreateStrNxCansas(fileID,sampleParent,"","name",$(sampleBase + ":name"),empty,empty) 
     458        // Create SASsample thickness entry 
     459        Make/O/N=1 $(sampleBase + ":thickness") = {thick} 
     460        CreateVarNxCansas(fileID,sampleParent,"","thickness",$(sampleBase + ":thickness"),units,cm) 
     461        // Create SASsample transmission entry 
     462        Make/O/N=1 $(sampleBase + ":transmission") = {TransWide} 
     463        CreateVarNxCansas(fileID,sampleParent,"","transmission",$(sampleBase + ":transmission"),empty,empty) 
     464         
     465        // SASProcess 
     466        String processParent = parentBase + "sasprocess/" 
     467        // Create SASsample entry 
     468        String processBase = base + ":entry1:sasprocess" 
     469        NewDataFolder/O/S $(processBase) 
     470        Make/O/T/N=5 $(processBase + ":attr") = {"canSAS_class","NX_class"} 
     471        Make/O/T/N=5 $(processBase + ":attrVals") = {"SASprocess","NXprocess"} 
     472        CreateStrNxCansas(fileID,processParent,"","",empty,$(processBase + ":attr"),$(processBase + ":attrVals")) 
     473        // Create SASsample name entry 
     474        Make/O/T/N=1 $(processBase + ":name") = {"NIST IGOR"} 
     475        CreateStrNxCansas(fileID,processParent,"","name",$(processBase + ":name"),empty,empty) 
     476        // Create SASsample thickness entry 
     477        Make/O/T/N=1 $(sampleBase + ":note") = {processNote} 
     478        CreateVarNxCansas(fileID,processParent,"","note",$(processBase + ":note"),units,cm) 
    353479         
    354480        //write confirmation of write operation to history area 
    355481        Print "Averaged XML File written: ", GetFileNameFromPathNoSemi(fullPath) 
    356482        KillWaves/Z dumWave 
    357         Return(0) 
    358 End 
    359  
    360 Function WriteXMLUSANSDesmeared_R(fullpath,lo,hi,dialog) 
    361         String fullpath 
    362         Variable lo,hi,dialog           //=1 will present dialog for name 
    363          
    364         SVAR USANSFolder = root:Packages:NIST:USANS:Globals:gUSANSFolder         
    365          
    366         Struct NISTXMLfile nf 
    367          
    368         String termStr="\r\n" 
    369         String destStr = USANSFolder+":DSM:" 
    370         String formatStr = "%15.6g %15.6g %15.6g %15.6g %15.6g %15.6g"+termStr 
    371          
    372         Variable refNum,integer,realval 
    373          
    374         //*****these waves MUST EXIST, or IGOR Pro will crash, with a type 2 error**** 
    375         WAVE Q_dsm =$(destStr + "Q_dsm") 
    376         WAVE I_dsm=$(destStr + "I_dsm") 
    377         WAVE S_dsm=$(destStr + "S_dsm") 
    378          
    379         //check each wave 
    380         If(!(WaveExists(Q_dsm))) 
    381                 Abort "Q_dsm DNExist in WriteUSANSDesmeared()" 
    382         Endif 
    383         If(!(WaveExists(I_dsm))) 
    384                 Abort "I_dsm DNExist in WriteUSANSDesmeared()" 
    385         Endif 
    386         If(!(WaveExists(S_dsm))) 
    387                 Abort "S_dsm DNExist in WriteUSANSDesmeared()" 
    388         Endif 
    389          
    390         // 06 FEB 06 SRK 
    391         // make dummy waves to hold the "fake" resolution, and write it as the last 3 columns 
    392         // 
    393         Duplicate/O Q_dsm,res1,res2,res3 
    394         res3 = 1                // "fake" beamstop shadowing 
    395         res1 /= 100             //make the sigmaQ so small that there is no smearing 
    396          
    397         if(dialog) 
    398                 Open/D refnum as fullpath+".dsmx"               //won't actually open the file 
    399                 If(cmpstr(S_filename,"")==0) 
    400                         //user cancel, don't write out a file 
    401                         Close/A 
    402                         Abort "no data file was written" 
    403                 Endif 
    404                 fullpath = S_filename 
    405         Endif 
    406          
    407         //write out partial set? 
    408         Duplicate/O Q_dsm,tq,ti,te 
    409         ti=I_dsm 
    410         te=S_dsm 
    411         if( (lo!=hi) && (lo<hi)) 
    412                 redimension/N=(hi-lo+1) tq,ti,te,res1,res2,res3         //lo to hi, inclusive 
    413                 tq=Q_dsm[p+lo] 
    414                 ti=I_dsm[p+lo] 
    415                 te=S_dsm[p+lo] 
     483         
     484        // Close the file 
     485        if(fileID) 
     486                HDF5CloseFile /Z fileID 
    416487        endif 
    417488         
    418                 //Data 
    419         Wave nf.Q = tq 
    420         nf.unitsQ = "1/A" 
    421         Wave nf.I = ti 
    422         nf.unitsI = "1/cm" 
    423         Wave nf.Idev = te 
    424         nf.unitsIdev = "1/cm" 
    425         Wave nf.Qdev = res1 
    426         nf.unitsQdev = "1/A" 
    427         Wave nf.Qmean = res2 
    428         nf.unitsQmean = "1/A" 
    429         Wave nf.Shadowfactor = res3 
    430         nf.unitsShadowfactor = "none" 
    431          
    432         //tailor the output given the type of data written out... 
    433         String samStr="",dateStr="",str1,str2 
    434          
    435         NVAR m = $(USANSFolder+":DSM:gPowerM")                          // power law exponent 
    436         NVAR chiFinal = $(USANSFolder+":DSM:gChi2Final")                //chi^2 final 
    437         NVAR iter = $(USANSFolder+":DSM:gIterations")           //total number of iterations 
    438          
    439         //get the number of spline passes from the wave note 
    440         String noteStr 
    441         Variable boxPass,SplinePass 
    442         noteStr=note(I_dsm) 
    443         BoxPass = NumberByKey("BOX", noteStr, "=", ";") 
    444         splinePass = NumberByKey("SPLINE", noteStr, "=", ";") 
    445          
    446         samStr = fullpath 
    447         dateStr="CREATED: "+date()+" at  "+time() 
    448         sprintf str1,"Chi^2 = %g   PowerLaw m = %4.2f   Iterations = %d",chiFinal,m,iter 
    449         sprintf str2,"%d box smooth passes and %d smoothing spline passes",boxPass,splinePass 
    450          
    451         //AJJ to fix with sensible values 
    452         nf.run = "Test" 
    453         nf.nameSASinstrument = "BT5 USANS" 
    454         nf.SASnote = "" 
    455         // 
    456         nf.sample_ID = "" 
    457         nf.title = samstr 
    458         nf.radiation = "neutron" 
    459         nf.wavelength = 2.38 
    460         nf.unitswavelength = "A" 
    461          
    462         //Do something with beamstop (rw[21]) 
    463         nf.detector_name = "BT5 DETECTOR ARRAY" 
    464  
    465         nf.SASprocessnote = samStr+"\n" 
    466         nf.SASprocessnote += str1+"\n" 
    467         nf.SASprocessnote += str2+"\n" 
    468         nf.SASprocessnote += datestr+"\n" 
    469  
    470          
    471         nf.nameSASProcess = "NIST IGOR" 
    472  
    473         //Close refnum 
    474          
    475         writeNISTXML(fullpath, nf) 
    476          
    477         SetDataFolder root:             //(redundant) 
    478          
    479         KillWaves/Z res1,res2,res2,ti,te,tq 
    480          
    481         Return(0) 
    482 End 
    483  
    484  
    485 #else   // if( Exists("XmlOpenFile") ) 
    486         // No XMLutils XOP: provide dummy function so that IgorPro can compile dependent support code 
    487          
    488          
    489         Function WriteXMLUSANSWaves_R(type,fullpath,lo,hi,dialog) 
    490                 String type,fullpath 
    491                 Variable lo,hi,dialog           //=1 will present dialog for name 
    492          
    493             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)" 
    494                 return(-6) 
    495         end 
    496          
    497         Function WriteXMLUSANSDesmeared_R(fullpath,lo,hi,dialog) 
    498                 String fullpath 
    499                 Variable lo,hi,dialog           //=1 will present dialog for name 
    500          
    501             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)" 
    502                 return(-6) 
    503         end 
    504          
    505 #endif 
     489End      
Note: See TracChangeset for help on using the changeset viewer.