source: sans/Dev/branches/nxcansas_writer/NCNR_User_Procedures/Common/NIST_NXcanSAS_v709.ipf @ 1195

Last change on this file since 1195 was 1195, checked in by krzywon, 3 years ago

Write SASprocess for NSORTed files, but not other meta data.

File size: 18.5 KB
Line 
1#pragma rtGlobals=3             // Use modern global access method.
2#pragma version=5.0
3#pragma IgorVersion=6.1
4
5#include <HDF5 Browser>
6
7//************************
8// Vers 1.15 20171003
9//
10//************************
11
12
13///////////////////////////////////////////////////////////////////////////
14//
15// Basic file open/create and file initialization routines
16
17// Generic open or create file
18Function NXcanSAS_OpenOrCreate(dialog,fullpath,base)
19        Variable dialog
20        String fullpath,base
21        Variable fileID
22        if(dialog || stringmatch(fullpath, ""))
23                fileID = NxCansas_DoSaveFileDialog(base)
24        else
25                fileID = NxCansas_CreateFile(fullpath,base)
26        Endif
27        if(!fileID)
28                abort "Unable to create file at " + fullpath + "."
29        EndIf
30        return fileID
31End
32
33// Select/create file through prompt
34Function NxCansas_DoSaveFileDialog(base)
35        String base
36        Variable refNum, fileID
37        String message = "Save a file"
38        String outputPath
39        String fileFilters = "Data Files (*.h5):.h5;"
40        fileFilters += "All Files:.*;"
41        Open /D /F=fileFilters /M=message refNum
42        outputPath = S_fileName
43        fileID = NxCansas_CreateFile(outputPath,base)
44        return fileID
45End
46
47// Create file with a known path
48Function NxCansas_CreateFile(fullpath, base)
49        String fullpath,base
50        Variable fileID
51        Make/T/O/N=1 $("root:NXfile_name") = fullpath
52        fullpath = ReplaceString(":\\", fullpath, ":")
53        fullpath = ReplaceString("\\", fullpath, ":")
54        HDF5CreateFile /O/Z fileID as fullpath
55        NXCansas_InitializeFile(fileID, base)
56        return fileID
57End
58
59// Open\ file with a known path
60Function NxCansas_OpenFile(fullpath)
61        String fullpath
62        String fileName
63        Variable fileID
64        fileName = ParseFilePath(3,fullpath,":",0,0)
65        Make/T/O/N=1 $("root:NXfile_name") = fileName
66        fullpath = ReplaceString(":\\", fullpath, ":")
67        fullpath = ReplaceString("\\", fullpath, ":")
68        HDF5OpenFile /Z fileID as fullpath
69        return fileID
70End
71
72// Select/create file through prompt
73Function NxCansas_DoOpenFileDialog()
74        Variable refNum,fileID
75        String message = "Select a file"
76        String inputPath,fileName
77        String fileFilters = "Data Files (*.h5):.h5;"
78        STRUCT HDF5BrowserData bd
79        fileFilters += "All Files:.*;"
80        Open /D /F=fileFilters /M=message refNum as fileName
81        inputPath = S_fileName
82        fileID = NxCansas_OpenFile(inputPath)
83        return fileID
84End
85
86// Initialize the file to a base state
87Function NxCansas_InitializeFile(fileID, base)
88        Variable fileID
89        String base
90        String location,nxParent
91        Variable sasentry = NumVarOrDefault("root:Packages:NIST:gSASEntryNumber", 1)
92        sPrintf location,"%s:sasentry%d",base,sasentry // Igor memory base path for all
93        sPrintf nxParent,"/sasentry%d/",sasentry // HDF5 base path for all
94        NewDataFolder/O/S $(location)
95        Make/O/T/N=1 $(location + ":vals") = {""}
96        Make/O/T/N=3 $(location + ":attr") = {"NX_class", "canSAS_class", "version"}
97        Make/O/T/N=3 $(location + ":attrVals") = {"NXentry", "SASentry", "1.0"}
98        CreateStrNxCansas(fileID,nxParent,"","",$(location + ":vals"),$(location + ":attr"),$(location + ":attrVals"))
99        Make/O/T/N=1 $(location + ":entryAttr") = {""}
100        Make/O/T/N=1 $(location + ":entryAttrVals") = {""}
101        CreateStrNxCansas(fileID,nxParent,"","definition",{"NXcanSAS"},$(location + ":entryAttr"),$(location + ":entryAttrVals"))
102End
103
104//
105///////////////////////////////////////////////////////////////////////////
106
107///////////////////////////////////////////////////////////////////////////
108// Functions used to save data to file
109
110// Intermediate error handler for saving variable waves - this function should be called instead of saveNxCansas
111Function CreateVarNxCansas(fileID,parent,group,var,valueWave,attr,attrValues)
112        Variable fileID
113        String parent,group,var
114        Wave valueWave
115        Wave /T attr,attrValues
116        Variable err
117        err = saveNxCansasVars(fileID,parent,group,var,valueWave,attr,attrValues)
118        if(err)
119                Print "NxCansas write err = ",err
120        endif
121End
122// Intermediate error handler for saving string waves - this function should be called instead of saveNxCansas
123Function CreateStrNxCansas(fileID,parent,group,var,valueWave,attr,attrValues)
124        Variable fileID
125        String parent,group,var
126        Wave /T valueWave,attr,attrValues
127        Variable err
128        err = saveNxCansasStrs(fileID,parent,group,var,valueWave,attr,attrValues)
129        if(err)
130                Print "NxCansas write err = ",err
131        endif
132End
133
134Function NxCansas_writeAttributes(fileID,path,attrNames,attrVals)
135        Variable fileID
136        String path
137        Wave/T attrNames, attrVals
138        int numAttrs,i
139        numAttrs = numpnts(attrNames)
140        Duplicate/O/T attrNames, names
141        Duplicate/O/T attrVals, vals
142       
143        for(i=0; i < numAttrs; i += 1)
144                String name_i = names[i]
145                String vals_i = vals[i]
146                Make/O/T/N=1 vals_i_wave
147                vals_i_wave[0] = vals_i
148                if(!CmpStr(name_i,"") == 0)
149                        HDF5SaveData /A=name_i vals_i_wave, fileID, path
150                endif
151        endfor
152       
153End
154
155Function NxCansas_CreateGroup(fileID,parent)
156        Variable fileID
157        String parent
158        Variable groupID
159        try     
160                if(!fileID)
161                        abort "HDF5 file does not exist"
162                endif
163               
164                // Create the group if it doesn't already exist
165                HDF5CreateGroup /Z fileID, parent, groupID
166                       
167        catch
168                // DO something if error is thrown
169                Print "NxCansas write err in saveNxCansas = ",V_AbortCode
170        endtry
171        return groupID
172End
173
174// Write in a single NxCansas element (from the STRUCTURE)
175// This method should only be called by CreateVarNxCansas
176Function saveNxCansasVars(fileID,parent,group,var,valueWave,attr,attrValues)
177
178        Variable fileID
179        String parent,group,var
180        Wave valueWave
181        Wave /T attr,attrValues
182        int i, numAttrs
183       
184        variable err=0, groupID
185        String NXentry_name
186       
187        groupID = NxCansas_CreateGroup(fileID,parent)
188
189        // Save data to disk
190        if(!stringmatch(var,""))
191                HDF5SaveData /O /Z /IGOR=0 valueWave, groupID, var
192                if (V_flag != 0)
193                        err = 1
194                        abort "Cannot save wave to HDF5 dataset " + var + " with V_flag of " + num2str(V_flag)
195                endif
196        endif
197               
198        NxCansas_writeAttributes(fileID,parent+var,attr,attrValues)
199       
200        // Close group and file to release resources
201        if(groupID)
202                HDF5CloseGroup /Z groupID
203        endif
204
205        return err
206end
207
208// Write in a single NxCansas element
209// This method should only be called by CreateStrNxCansas
210Function saveNxCansasStrs(fileID,parent,group,var,valueWave,attr,attrValues)
211        Variable fileID
212        String parent,group,var
213        Wave /T attr,attrValues, valueWave
214        int i, numAttrs
215       
216        variable err=0, groupID
217        String NXentry_name
218       
219        groupID = NxCansas_CreateGroup(fileID,parent)
220       
221        // Save data to disk
222        if(!stringmatch(var,""))
223                HDF5SaveData /O /Z /IGOR=0 valueWave, groupID, var
224                if (V_flag != 0)
225                        err = 1
226                        abort "Cannot save wave to HDF5 dataset " + var + " with V_flag of " + num2str(V_flag)
227                endif
228        endif
229       
230        NxCansas_writeAttributes(fileID,parent+var,attr,attrValues)
231       
232        // Close group and file to release resources
233        if(groupID)
234                HDF5CloseGroup /Z groupID
235        endif
236
237        return err
238end
239
240//
241///////////////////////////////////////////////////////////////////////////
242
243///////////////////////////////////////////////////////////////////////////
244//
245// NXcanSAS Reader and Utilities
246
247Function LoadNXcanSASData(fileStr,outstr,doPlot,forceOverwrite)
248        String fileStr, outstr
249        Variable doPlot,forceOverwrite
250       
251        Variable refnum,fileID
252        Variable rr,gg,bb,xdim,ydim
253        SetDataFolder root:             //build sub-folders for each data set under root
254       
255        String filename
256        String I_dataS,Q_dataS,dQ_dataS,dQl_dataS,dQw_dataS,dI_dataS
257        String angst = StrVarOrDefault("root:Packages:NIST:gAngstStr", "A")
258        String/G loadDir = "root:"
259       
260        // Check fullpath and dialog
261        if(stringmatch(fileStr, ""))
262                fileID = NxCansas_DoOpenFileDialog()
263        else
264                fileID = NxCansas_OpenFile(fileStr)
265        Endif
266       
267        filename = ParseFilePath(3,fileStr,":",0,0)
268        String basestr
269        if (!cmpstr(outstr, ""))                //Outstr = "", cmpstr returns 0
270                baseStr = ShortFileNameString(CleanupName(filename,0))
271                baseStr = CleanupName(baseStr,0)                //in case the user added odd characters
272        else
273                baseStr = outstr                        //for output, hopefully correct length as passed in
274        endif
275        String baseFormat = baseStr + "_%d"
276       
277        if(fileID)
278                HDF5ListGroup /F/R/Type=1/Z fileID,"/"
279                String groupList = S_HDF5ListGroup
280                Variable groupID
281                Variable inc=1,ii=0,isMultiData=0
282                String entryUnformatted = "/sasentry%d/"
283                String dataUnformatted = "sasdata%d/"
284                String addDigit = "%d"
285                String entryBase
286                String dataBase = "sasdata/"
287                sPrintf entryBase,entryUnformatted,inc
288                // Open first group
289                HDF5OpenGroup /Z fileID, entryBase + dataBase, groupID
290                If (groupID == 0)
291                        sPrintF dataBase,dataUnformatted,0
292                        HDF5OpenGroup /z fileID, entryBase + dataBase, groupID
293                        isMultiData = 1
294                        sPrintF baseStr,baseformat,0
295                EndIf
296               
297                // Multiple SASentry groups
298                do
299                        //go back to the root folder and clean up before leaving
300                        // Multiple SASdata groups
301                        do
302                                if (isMultiData == 1)
303                                        sPrintF baseStr,baseformat,ii
304                                EndIf
305                                loadDir = "root:" + baseStr
306                                NewDataFolder/O/S $(loadDir)
307                                // Load in data
308                                HDF5LoadData /O/Z/N=$(baseStr + "_i") fileID, entryBase + dataBase + "I"
309                                HDF5LoadData /O/Z/N=$(baseStr + "_q") fileID, entryBase + dataBase + "Q"
310                                HDF5LoadData /O/Z/N=$(baseStr + "_dq") fileID, entryBase + dataBase + "dQ"
311                                HDF5LoadData /O/Z/N=$(baseStr + "_dql") fileID, entryBase + dataBase + "dQl"
312                                HDF5LoadData /O/Z/N=$(baseStr + "_dqw") fileID, entryBase + dataBase + "dQw"
313                                HDF5LoadData /O/Z/N=$(baseStr + "_s") fileID, entryBase + dataBase + "Idev"
314                                if (DimSize($(baseStr + "_i"), 1) > 1)
315                                        // Do not auto-plot 2D data
316                                        doPlot = 0
317                                        xdim = DimSize($(baseStr + "_i"), 0)
318                                        ydim = DimSize($(baseStr + "_i"), 1)
319                                        Wave q = $(baseStr + "_q")
320                                        Wave dq = $(baseStr + "_dq")
321                                       
322                                        //
323                                        // FIXME: All points set to the same value - need to loop
324                                        //
325                                       
326                                        Make/O/N=(xdim,ydim) $(baseStr + "_qx") = q[0]
327                                        Make/O/N=(xdim,ydim) $(baseStr + "_qy") = q[1]
328                                        if (numpnts(dq)>0)
329                                                Make/O/N=(xdim,ydim) $(baseStr + "_dqx") = dq[0]
330                                                Make/O/N=(xdim,ydim) $(baseStr + "_dqy") = dq[1]
331                                        EndIf
332                                        KillWaves $(baseStr + "_q")
333                                EndIf
334                                if (isMultiData)
335                                        sprintf dataBase,dataUnformatted,ii
336                                        // Open next group to see if it exists
337                                        HDF5OpenGroup /Z fileID, entryBase + dataBase, groupID
338                                else
339                                        groupID = 0
340                                endIf
341                                ii += 1
342                                // Load in Meta Data
343                                LoadMetaData(fileID,loadDir,entryBase)
344                        while (groupID != 0)
345                        inc += 1
346                        If (isMultiData)
347                                sprintf dataBase,dataUnformatted,ii
348                        endIf
349                        // Open next group to see if it exists
350                sPrintf entryBase,entryUnformatted,inc
351                        HDF5OpenGroup /Z fileID, entryBase + dataBase, groupID
352                while(groupID != 0)
353               
354                //plot if desired
355                if(doPlot)
356                        Print GetDataFolder(1)
357                       
358                        String w0 = (baseStr + "_q")
359                        String w1 = (baseStr + "_i")
360                        String w2 = (baseStr + "_s")
361                       
362                        // assign colors randomly
363                        rr = abs(trunc(enoise(65535)))
364                        gg = abs(trunc(enoise(65535)))
365                        bb = abs(trunc(enoise(65535)))
366                       
367                        // if target window is a graph, and user wants to append, do so
368                   DoWindow/B Plot_Manager
369                        if(WinType("") == 1)
370                                DoAlert 1,"Do you want to append this data to the current graph?"
371                               
372                                if(V_Flag == 1)
373                                        AppendToGraph $w1 vs $w0
374                                        ModifyGraph mode($w1)=3,marker($w1)=19,msize($w1)=2,rgb($w1)=(rr,gg,bb),tickUnit=1
375                                        ErrorBars/T=0 $w1 Y,wave=($w2,$w2)
376                                        ModifyGraph tickUnit(left)=1
377                                else
378                                //new graph
379                                        Display $w1 vs $w0
380                                        ModifyGraph log=1,mode($w1)=3,marker($w1)=19,msize($w1)=2,rgb($w1)=(rr,gg,bb),tickUnit=1
381                                        ModifyGraph grid=1,mirror=2,standoff=0
382                                        ErrorBars/T=0 $w1 Y,wave=($w2,$w2)
383                                        ModifyGraph tickUnit(left)=1
384                                        Label left "I(q)"
385                                        Label bottom "q ("+angst+"\\S-1\\M)"
386                                        Legend
387                                endif
388                        else
389                        // graph window was not target, make new one
390                                Display $w1 vs $w0
391                                ModifyGraph log=1,mode($w1)=3,marker($w1)=19,msize($w1)=2,rgb($w1)=(rr,gg,bb),tickUnit=1
392                                ModifyGraph grid=1,mirror=2,standoff=0
393                                ErrorBars/T=0 $w1 Y,wave=($w2,$w2)
394                                ModifyGraph tickUnit(left)=1
395                                Label left "I(q)"
396                                Label bottom "q ("+angst+"\\S-1\\M)"
397                                Legend
398                        endif
399                endif
400        endif
401       
402        // Close the file
403        if(fileID)
404                HDF5CloseFile /Z fileID
405        endif
406
407end
408
409Function LoadMetaData(fileID,loadDir,parentBase)
410        String parentBase,loadDir
411        Variable fileID
412        Variable groupID
413        SetDataFolder $(loadDir)
414        Make/O/N=52 $(loadDir + ":realsRead")
415        Make/O/T/N=11 $(loadDir + ":textRead")
416        Wave rw = $(loadDir + ":realsRead")
417        Wave/T textw = $(loadDir + ":textRead")
418        int isMultiDetector = 0, ii = 0
419       
420        // Title
421        HDF5OpenGroup /Z fileID, parentBase, groupID
422        HDF5LoadData /O/Z/N=title fileID, parentBase + "title"
423        Wave/T title = $(loadDir + ":title")
424       
425        // SASinstrument
426        String instrParent = parentBase + "sasinstrument/"
427       
428        // SASaperture
429        String apertureParent = instrParent + "sasaperture/"
430        HDF5OpenGroup /Z fileID, apertureParent, groupID
431        HDF5LoadData /O/Z/N=xg fileID, apertureParent + "x_gap"
432        Wave xg = $(loadDir + ":xg")
433       
434        // SAScollimation
435        String collimationParent = instrParent + "sascollimation/"
436        HDF5OpenGroup /Z fileID, collimationParent, groupID
437        HDF5LoadData /O/Z/N=cdis fileID, collimationParent + "distance"
438        Wave cdis = $(loadDir + ":cdis")
439       
440        // SASdetector
441        String detectorParent = instrParent + "sasdetector/"
442        HDF5OpenGroup /Z fileID, detectorParent, groupID
443        If (groupID == 0)
444                isMultiDetector = 1
445                ii = 1
446                String detectorUnformatted = "sasdetector%d/"
447                sprintf detectorParent,instrParent + detectorUnformatted,ii
448                HDF5OpenGroup /Z fileID, detectorParent, groupID
449        EndIf
450        do
451                HDF5LoadData /O/Z/N=detname fileID, detectorParent + "name"
452                HDF5LoadData /O/Z/N=sdd fileID, detectorParent + "SDD"
453                HDF5LoadData /O/Z/N=bcx fileID, detectorParent + "beam_center_x"
454                HDF5LoadData /O/Z/N=bcy fileID, detectorParent + "beam_center_y"
455                HDF5LoadData /O/Z/N=xps fileID, detectorParent + "x_pixel_size"
456                HDF5LoadData /O/Z/N=xpy fileID, detectorParent + "y_pixel_size"
457                Wave/T detname = $(loadDir + ":detname")
458                Wave sdd = $(loadDir + ":sdd")
459                Wave bcx = $(loadDir + ":bcx")
460                Wave bcy = $(loadDir + ":bcy")
461                Wave xps = $(loadDir + ":xps")
462                Wave xpy = $(loadDir + ":xpy")
463                If (isMultiDetector)
464                        ii += 1
465                        sprintf detectorParent,instrParent + detectorUnformatted,ii
466                        HDF5OpenGroup /Z fileID, detectorParent, groupID
467                Else
468                        groupID = 0
469                EndIf
470        while (groupID != 0)
471       
472        // SASsource
473        String sourceParent = instrParent + "sassource/"
474        HDF5OpenGroup /Z fileID, sourceParent, groupID
475        HDF5LoadData /O/Z/N=wvel fileID, sourceParent + "incident_wavelength"
476        HDF5LoadData /O/Z/N=wvels fileID, sourceParent + "incident_wavelength_spread"
477        Wave wvel = $(loadDir + ":wvel")
478        Wave wvels = $(loadDir + ":wvels")
479       
480        // SASsample
481        String sampleParent = parentBase + "sassample/"
482        HDF5OpenGroup /Z fileID, sampleParent, groupID
483        HDF5LoadData /O/Z/N=smplname fileID, sampleParent + "name"
484        HDF5LoadData /O/Z/N=smplthick fileID, sampleParent + "thickness"
485        HDF5LoadData /O/Z/N=smpltrans fileID, sampleParent + "transmission"
486        Wave/T smplname = $(loadDir + ":smplname")
487        Wave smplthick = $(loadDir + ":smplthick")
488        Wave smpltrans = $(loadDir + ":smpltrans")
489       
490        textw[0] = title[0]
491        textw[6] = smplname[0]
492        textw[9] = detname[0]
493        rw[4] = smplthick[0]
494        rw[5] = smpltrans[0]
495        rw[10] = xps[0]
496        rw[13] = xpy[0]
497        rw[16] = bcx[0]
498        rw[17] = bcy[0]
499        rw[18] = sdd[0]
500        rw[24] = xg[0]
501        rw[25] = cdis[0]
502        rw[26] = wvel[0]
503        rw[27] = wvels[0]
504       
505        KillWaves title,smplname,detname,smplthick,smpltrans,xps,xpy,bcx,bcy,sdd,xg,cdis,wvel,wvels
506       
507End
508
509//
510///////////////////////////////////////////////////////////////////////////
511
512
513///////////////////////////////////////////////////////////////////////////
514//
515// Generic Read/Write operations.
516
517//Needed to test whether file is NXcanSAS. The load routine will then either give an error if HDF5 XOP is not present or load the file if it is.
518Function isNXcanSAS(filestr)
519        String filestr
520       
521        Variable fileID=0,groupID=0
522        Int isHDF5File = 0
523       
524        fileID = NxCansas_OpenFile(filestr)
525        HDF5ListGroup /F/R/Type=1/Z fileID,"/"
526        Variable length = strlen(S_HDF5ListGroup)
527       
528        if (numtype(length) != 2)
529                isHDF5File = 1
530        endif
531       
532        if (fileID != 0)
533                // Close the file
534                HDF5CloseFile /Z fileID
535        endif
536       
537        return isHDF5File
538
539end
540
541//
542///////////////////////////////////////////////////////////////////////////
543
544///////////////////////////////////////////////////////////////////////////
545//
546// Methods related to NSORT
547
548Function WriteNSORTedNXcanSASFile(qw,iw,sw,firstFileName,secondFileName,thirdFileName,fourthFileName,normTo,norm12,norm23,norm34,[res])
549        Wave qw,iw,sw,res
550        String firstFileName,secondFileName,thirdFileName,fourthFileName,normTo
551        Variable norm12,norm23,norm34
552       
553        Variable err=0,refNum,numCols,dialog=1,useRes=0
554        String fullPath="",formatStr="",process
555       
556        //check each wave - else REALLY FATAL error when writing file
557        If(!(WaveExists(qw)))
558                err = 1
559                return err
560        Endif
561        If(!(WaveExists(iw)))
562                err = 1
563                return err
564        Endif
565        If(!(WaveExists(sw)))
566                err = 1
567                return err
568        Endif
569        if(WaveExists(res))
570                useRes = 1
571        endif
572       
573        NVAR/Z useTable = root:myGlobals:CombineTable:useTable
574        if(NVAR_Exists(useTable) && useTable==1)
575                SVAR str=root:myGlobals:CombineTable:SaveNameStr        //messy, but pass in as a global
576                fullPath = str
577                dialog=0
578        endif
579       
580        NewDataFolder/O/S root:Packages:NIST:NSORT
581        SetDataFolder root:Packages:NIST:NSORT
582       
583        process = CreateNSORTProcess(firstFileName,secondFileName,thirdFileName,fourthFileName,normTo,norm12,norm23,norm34)
584        Make/O/T/N=1 processNote = process
585       
586        Variable pts = numpnts(qw)
587        Make/O/N=(pts) qval = qw
588        Make/O/N=(pts) aveint = iw
589        Make/O/N=(pts) sigave = sw
590        if (useRes)
591                Make/O/N=(dimsize(res,0)) SigmaQ = res[p][0]
592                Make/O/N=(dimsize(res,0)) QBar = res[p][1]
593                Make/O/N=(dimsize(res,0)) fSubS = res[p][2]
594        Else
595                Make/O/N=(pts) SigmaQ = 0
596                Make/O/N=(pts) QBar = 0
597                Make/O/N=(pts) fSubS = 0
598        EndIf
599       
600        Make/O/T/N=11 textRead
601        textRead[6] = firstfileName
602        textRead[0] = "Combined data"
603       
604        Make/O/N=52 realsRead = 0
605       
606        WriteNxCanSAS1D("NSORT",fullpath,dialog)
607       
608End
609
610Function/T CreateNSORTProcess(firstFileName,secondFileName,thirdFileName,fourthFileName,normTo,norm12,norm23,norm34)
611        String firstFileName,secondFileName,thirdFileName,fourthFileName,normTo
612        Variable norm12,norm23,norm34
613        String process
614        String processFormat = "COMBINED FILE CREATED: %s - NSORT-ed %s\t+ %s\t+ %s\t+%s, normalized to %s, multiplicative factor 1-2 = %12.8g\t multiplicative factor 2-3 = %12.8g\t multiplicative factor 3-4 = %12.8g"
615       
616        sprintf process,processFormat,date(),firstFileName,secondFileName,thirdFileName,fourthFileName,normTo,norm12,norm23,norm34
617        return process
618End
619
620//
621///////////////////////////////////////////////////////////////////////////
Note: See TracBrowser for help on using the repository browser.