- Timestamp:
- Jun 3, 2019 3:23:40 PM (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
sans/Dev/trunk/NCNR_User_Procedures/Reduction/USANS/WriteUSANSNXcanSAS.ipf
r1087 r1157 3 3 #pragma IgorVersion=6.1 4 4 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 ////////////////////////////////////////////////////////////////////////////////// 11 8 // 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 15 16 // 16 17 Function WriteUSANSNXcanSAS(type,fullpath,lo,hi,dialog) 18 17 19 String type,fullpath 18 20 Variable lo,hi,dialog //=1 will present dialog for name 19 21 20 22 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 VAX24 String destStr="" ,formatStr = "%15.6g %15.6g %15.6g %15.6g %15.6g %15.6g"+termStr23 NVAR dQv = root:Packages:NIST:USANS:Globals:MainPanel:gDQv 24 25 Variable fileID 26 String destStr="" 25 27 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"} 26 44 27 45 Variable refNum,integer,realval … … 31 49 WAVE inten=$(destStr + ":DetCts") 32 50 WAVE sig=$(destStr + ":ErrDetCts") 51 52 if(dialog || stringmatch(fullpath, "")) 53 fileID = NxCansas_DoSaveFileDialog() 54 else 55 fileID = NxCansas_CreateFile(fullpath) 56 Endif 33 57 34 58 //check each wave … … 43 67 Endif 44 68 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 48 107 // 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 74 114 75 115 //tailor the output given the type of data written out... 76 116 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="" 79 119 NVAR TransWide = $(USANSFolder+":Globals:MainPanel:gTransWide") 80 120 NVAR TransRock = $(USANSFolder+":Globals:MainPanel:gTransRock") … … 111 151 pkStr += " ; EMP PEAK ANGLE: "+num2str(QpkFromNote("EMP")) 112 152 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 137 257 End 138 258 139 259 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 260 Function WriteNXcanSASUSANSDesmeared(fullpath,lo,hi,dialog) 261 262 String fullpath 210 263 Variable lo,hi,dialog //=1 will present dialog for name 211 264 … … 213 266 NVAR dQv = root:Packages:NIST:USANS:Globals:MainPanel:gDQv 214 267 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"} 220 287 221 288 Variable refNum,integer,realval 222 223 289 224 290 //*****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 228 300 229 301 //check each wave … … 239 311 240 312 //Use the evil extra column for the resolution "information". Should probably switch to using slit_length in collimation. 241 Duplicate/O qvals,dumWave242 dumWave = dQv //written out as a positive value, since the column is identified by its label, dQl243 ///244 245 if(dialog)246 PathInfo/S catPathName247 fullPath = DoSaveFileDialog("Save data as",fname="",suffix="."+type+"x")248 If(cmpstr(fullPath,"")==0)249 //user cancel, don't write out a file250 Close/A251 Abort "no data file was written"252 Endif253 //Print "dialog fullpath = ",fullpath254 Endif255 256 313 //write out partial set? 257 // duplicate the original data, all 3 waves258 314 Duplicate/O qvals,tq,ti,te 259 315 ti=inten 260 316 te=sig 261 317 if( (lo!=hi) && (lo<hi)) 262 redimension/N=(hi-lo+1) tq,ti,te, dumWave//lo to hi, inclusive318 redimension/N=(hi-lo+1) tq,ti,te,res1,res2,res3 //lo to hi, inclusive 263 319 tq=qvals[p+lo] 264 320 ti=inten[p+lo] … … 266 322 endif 267 323 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 281 365 282 366 //tailor the output given the type of data written out... 283 367 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="" 286 370 NVAR TransWide = $(USANSFolder+":Globals:MainPanel:gTransWide") 287 371 NVAR TransRock = $(USANSFolder+":Globals:MainPanel:gTransRock") … … 290 374 NVAR thick = $(USANSFolder+":Globals:MainPanel:gThick") 291 375 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) 353 479 354 480 //write confirmation of write operation to history area 355 481 Print "Averaged XML File written: ", GetFileNameFromPathNoSemi(fullPath) 356 482 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 416 487 endif 417 488 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 489 End
Note: See TracChangeset
for help on using the changeset viewer.