source: trunk/addcmds.tcl @ 99

Last change on this file since 99 was 99, checked in by toby, 14 years ago

# on 1999/07/22 20:08:20, toby did:
revise for exptool that adds multiple atoms

  • Property rcs:author set to toby
  • Property rcs:date set to 1999/07/22 20:08:20
  • Property rcs:lines set to +3 -1
  • Property rcs:rev set to 1.2
  • Property rcs:state set to Exp
  • Property svn:keywords set to Author Date Revision Id
File size: 19.5 KB
Line 
1# $Id: addcmds.tcl 99 2009-12-04 23:00:23Z toby $
2
3proc MakeAddPhaseBox {} {
4    global expmap
5
6    set nextphase ""
7    foreach p {1 2 3 4 5 6 7 8 9} {
8        if {[lsearch $expmap(phaselist) $p] == -1} {
9            set nextphase $p
10            break
11        }
12    }
13
14    # no more room
15    if {$nextphase == ""} {
16        tk_dialog .phaseerr "Add Phase Error" \
17                "There are already 9 phases. You cannot add more." \
18                error 0 "OK" 
19        return
20    }
21
22    set np .newphase
23    catch {destroy $np}
24    toplevel $np
25
26    grid [label $np.l1 -text "Adding phase #$nextphase"] \
27            -column 0 -row 0 -sticky w
28    grid [label $np.l2 -text "Phase title:"] -column 0 -row 1 
29    grid [entry $np.t1 -width 68] -column 1 -row 1 -columnspan 8
30    grid [label $np.l3 -text "Space Group:"] -column 0 -row 2 
31    grid [entry $np.t2 -width 12] -column 1 -row 2 
32    grid [frame $np.f -bd 4 -relief groove] -column 3 -row 2 -columnspan 8
33    set col -1
34    foreach i {a b c} {
35        grid [label $np.f.l1$i -text $i] -column [incr col] -row 1
36        grid [entry $np.f.e1$i -width 12] -column [incr col]  -row 1
37    }
38    set col -1
39    foreach i {a b g} {
40        grid [label $np.f.l2$i -text $i -font symbol] -column [incr col] -row 2
41        grid [entry $np.f.e2$i -width 12] -column [incr col]  -row 2
42        $np.f.e2$i insert 0 90.
43    }   
44   
45    grid [button $np.b1 -text Add \
46            -command "addphase $np"] -column 2 -row 3
47    bind $np <Return> "addphase $np"
48    grid [button $np.b2 -text Cancel \
49            -command "destroy $np"] -column 3 -row 3
50   
51    wm title $np "add new phase"
52
53    # grab focus, etc.
54    putontop $np
55
56    tkwait window $np
57
58    # fix focus...
59    afterputontop
60}
61
62proc addphase {np} {
63    global expgui
64    # validate the input
65    set err {}
66    set title [$np.t1 get]
67    if {[string trim $title] == ""} {
68        append err "  Title cannot be blank\n"
69    }
70    set spg [$np.t2 get]
71    if {[string trim $spg] == ""} {
72        append err "  Space group cannot be blank\n"
73    }
74    foreach i {a b c} {
75        set cell($i) [$np.f.e1$i get]
76        if {[string trim $cell($i)] == ""} {
77            append err "  $i cannot be blank\n"
78        } elseif {[catch {expr $cell($i)}]} {
79            append err "  $i is not valid\n"
80        }
81    }
82
83    foreach i {a b g} lbl {alpha beta gamma} {
84        set cell($lbl) [$np.f.e2$i get]
85        if {[string trim $cell($lbl)] == ""} {
86            append err "  $lbl cannot be blank\n"
87        } elseif {[catch {expr $cell($lbl)}]} {
88            append err "  $lbl is not valid\n"
89        }
90    }
91
92    if {$err != ""} {
93        tk_dialog .phaseerr "Add Phase Error" \
94                "The following error(s) were found in your input:\n$err" \
95                error 0 "OK" 
96        return
97    }
98
99    # check the space group
100    set fp [open spg.in w]
101    puts $fp "N"
102    puts $fp "N"
103    puts $fp $spg
104    puts $fp "Q"
105    close $fp
106    global tcl_platform
107    catch {
108        if {$tcl_platform(platform) == "windows"} {
109            exec [file join $expgui(gsasexe) spcgroup.exe] < spg.in >& spg.out
110        } else {
111            exec [file join $expgui(gsasexe) spcgroup] < spg.in >& spg.out
112        }
113    }
114    set fp [open spg.out r]
115    set out [read $fp]
116    close $fp
117    # attempt to parse out the output (fix up if parse did not work)
118    if {[regexp "space group symbol.*>(.*)Enter a new space group symbol" \
119            $out a b ] != 1} {set b $out}
120    if {[string first Error $b] != -1} {
121        # got an error, show it
122        ShowBigMessage \
123                 $np.error \
124                 "Error processing space group\nReview error message below" \
125                 $b
126        return
127    } else {
128        # show the result and confirm
129        set opt [ShowBigMessage \
130                $np.check \
131                "Check the symmetry operators in the output below" \
132                $b \
133                {Continue Redo} ]
134        if {$opt > 1} return
135    }
136    file delete spg.in spg.out
137   
138    # ok do it!
139    set fp [open exptool.in w]
140    puts $fp "P"
141    puts $fp $title
142    puts $fp $spg
143    puts $fp "$cell(a) $cell(b) $cell(c) $cell(alpha) $cell(beta) $cell(gamma)"
144    puts $fp "/"
145    close $fp
146    global tcl_platform
147    # Save the current exp file
148    savearchiveexp
149    # disable the file changed monitor
150    set expgui(expModifiedLast) 0
151    set expnam [file root [file tail $expgui(expfile)]]
152    catch {
153        if {$tcl_platform(platform) == "windows"} {
154            exec [file join $expgui(gsasexe) exptool.exe] $expnam \
155                    < exptool.in >& exptool.out
156        } else {
157            exec [file join $expgui(gsasexe) exptool] $expnam \
158                    < exptool.in >& exptool.out
159        }
160    }
161    # load the revised exp file
162    loadexp $expgui(expfile)
163    set fp [open exptool.out r]
164    set out [read $fp]
165    close $fp
166    destroy $np
167    ShowBigMessage \
168                 $np \
169                 "Please review the result from adding the phase" \
170                 $out
171    file delete exptool.in exptool.out
172}
173
174proc MakeAddHistBox {} {
175    global expmap newhist
176
177    # --> should check here if room for another histogram, but only texture
178    # folks will ever need that
179
180    set np .newhist
181    catch {destroy $np}
182    toplevel $np
183
184    grid [label $np.l0 -text "Adding new histogram"] \
185            -column 0 -row 0 -sticky ew -columnspan 7
186    grid [label $np.l1 -text "Data file:"] -column 0 -row 1 
187    grid [label $np.t1 -textvariable newhist(rawfile)] \
188            -column 1 -row 1 -columnspan 3
189    grid [button $np.b1 -text "Select File" \
190            -command "getrawfile $np" \
191            ] -column 4 -row 1
192
193    grid [label $np.lbank -text "Select bank" -anchor w] -column 1 -row 2 -sticky w
194    grid [frame $np.bank]  -column 2 -row 2 -columnspan 7 -sticky ew
195
196    grid [label $np.l2 -text "Instrument\nParameter file:"] -column 0 -row 3
197    grid [label $np.t2 -textvariable newhist(instfile)] \
198            -column 1 -row 3 -columnspan 3
199    grid [button $np.b2 -text "Select File" \
200            -command "getinstfile $np" \
201            ] -column 4 -row 3
202
203    grid [label $np.lset -text "Select set" -anchor w] -column 1 -row 4 -sticky w
204    grid [frame $np.set]  -column 2 -row 4 -columnspan 7 -sticky ew
205
206    grid [label $np.l3 -text "Usable data limit:"] -column 0 -row 5 -rowspan 2 
207    grid [entry $np.e3 -width 12 -textvariable newhist(2tLimit) \
208            ] -column 1 -row 5 -rowspan 2 
209    grid [radiobutton $np.cb3 -text "D-min" -variable newhist(LimitMode) \
210            -value 0] -column 2 -row 5 -sticky w
211    grid [radiobutton $np.cb4 -text "2-Theta Max" -variable newhist(LimitMode)\
212            -value 1] -column 2 -row 6 -sticky w
213   
214    grid [frame $np.f6] -column 1 -row 7 -columnspan 3
215    grid [button $np.f6.b6a -text Add \
216            -command "addhist $np"] -column 0 -row 0
217    bind $np <Return> "addhist $np"
218    grid [button $np.f6.b6b -text Cancel \
219            -command "destroy $np"] -column 1 -row 0
220   
221    grid columnconfigure $np 3 -weight 1
222
223    wm title $np "add new histogram"
224
225    if {[string trim $newhist(rawfile)] != {}} {
226        validaterawfile $np $newhist(rawfile)
227    }
228    if {[string trim $newhist(instfile)] != {}} {
229        validateinstfile $np $newhist(instfile)
230    }
231    set newhist(banknum) {}
232    set newhist(setnum) {}
233    #    for {set i 0} {$i<100} {incr i} {set newhist(bank$i) 0}
234    #    for {set i 0} {$i<100} {incr i} {set newhist(set$i) 0}
235
236    # grab focus, etc.
237    putontop $np
238
239    tkwait window $np
240
241    # fix focus...
242    afterputontop
243}
244
245# convert a file to Win-95 direct access
246proc WinCvt {file} {
247    global expgui
248    if ![file exists $file] {
249        tk_dialog .warn "Convert Error" \
250                "File $file does not exist" question 0 "OK"
251        return
252    }
253
254    set tmpname "[file join [file dirname $file] tempfile.xxx]"
255    set oldname "[file rootname $file].org"
256    if [file exists $oldname] {
257        set ans [tk_dialog .warn "OK to overwrite?" \
258                "File [file tail $oldname] exists in [file dirname $oldname]. OK to overwrite?" question 0 \
259                "Yes" "No"]
260        if $ans return
261        catch {file delete $oldname}
262    }
263
264    if [catch {
265        set in [open $file r]
266        # needed to test under UNIX
267        set out [open $tmpname w]
268        fconfigure $out -translation crlf
269        set len [gets $in line]
270        if {$len > 160} {
271            # this is a UNIX file. Hope there are no control characters
272            set i 0
273            set j 79
274            while {$j < $len} {
275                puts $out [string range $line $i $j]
276                incr i 80
277                incr j 80
278            }
279        } else {
280            while {$len >= 0} {
281                append line "                                        "
282                append line "                                        "
283                set line [string range $line 0 79]
284                puts $out $line
285                set len [gets $in line]
286            }
287        }
288        close $in
289        close $out
290        file rename $file $oldname
291        file rename $tmpname $file
292    } errmsg] {
293        tk_dialog .warn Notify "Error in conversion:\n$errmsg" warning 0 OK
294    }
295    return $file
296}
297
298proc getrawfile {np} {
299    global newhist tcl_platform
300    if {$tcl_platform(platform) == "windows"} {
301        set inp [
302        tk_getOpenFile -parent $np -initialfile $newhist(rawfile) -filetypes {
303            {"Data files" .GSAS} {"Data files" .GSA} 
304            {"Data files" .RAW}  {"All files" *}
305        }
306        ]
307    } else {
308        set inp [
309        tk_getOpenFile -parent $np -initialfile $newhist(rawfile) -filetypes {
310            {"Data files" .GSA*} {"Data files" .RAW} 
311            {"Data files" .gsa*} {"Data files" .raw} 
312            {"All files" *}
313        } 
314        ]
315    }
316    validaterawfile $np $inp
317}
318
319proc validaterawfile {np inp} {
320    global tcl_platform expgui newhist
321    if {$inp == ""} return
322    if [catch {set in [open $inp r]}] {
323        tk_dialog .err "Open error" "Unable to open file $inp" \
324                error 0 OK
325        return 
326    }
327    set newhist(banklist) {}
328    foreach child [pack slaves $np.bank] {destroy $child}
329    # is this a properly formatted file?
330    if {$tcl_platform(platform) == "windows"} {
331        # are lines the correct length?
332
333        #--> can we check that lines are terminated CR-LF?
334
335        set i 0
336        while {[set len [gets $in line]] > 0} {
337            incr i
338            if {$len != 80} {
339                set ans [tk_dialog .err "Read error" \
340                        "File $inp is not direct access. OK to convert?" \
341                        error 0 OK QUIT]
342                if {$ans == 0} {
343                    close $in
344                    WinCvt $inp
345                    set i 0
346                    set in [open $inp r]
347                    set line {}
348                } else {
349                    return
350                }
351            }
352            # scan for BANK lines
353            if {[string first BANK $line] == 0} {
354                scan $line "BANK%d" num
355                lappend newhist(banklist) $num
356            }
357            # check for "Instrument parameter file" line
358            if {$i == 2 && [string first "Instrument parameter" $line] == 0} {
359                validateinstfile $np \
360                        [file join [file dirname $inp] \
361                        [string trim [string range $line 26 end]]]
362            }
363        }
364    } else {
365        # is the file one big record?
366        set len [gets $in line]
367        if {$len <= 80} {
368            set ans [tk_dialog .err "Read error" \
369                    "File $inp is not direct access. OK to convert?" \
370                    error 0 OK QUIT]
371            if {$ans == 0} {
372                close $in
373                set oldname ${inp}.original
374                file rename $inp $oldname
375                if [catch {
376                    exec [file join $expgui(gsasexe) convstod] < \
377                            $oldname > $inp
378                } errmsg] {
379                    tk_dialog .warn Notify \
380                            "Error in conversion:\n$errmsg" warning 0 OK
381                }
382                set in [open $inp r]
383                set line {}
384            } else {
385                return
386            }
387        }
388        seek $in 0
389        set i 0
390        while {[string length [set line [read $in 80]]] == 80} {
391            incr i
392            # scan for BANK lines
393            if {[string first BANK $line] == 0} {
394                scan $line "BANK%d" num
395                lappend newhist(banklist) $num
396            }
397            # check for "Instrument parameter file" line
398            if {$i == 2 && [string first "Instrument parameter" $line] == 0} {
399                validateinstfile $np \
400                        [file join [file dirname $inp] \
401                        [string trim [string range $line 26 end]]]
402            }
403        }
404    }
405    # were banks found?
406    if {$newhist(banklist) == ""} {
407        tk_dialog .err "Read error" \
408                "File $inp has no BANK lines. This is not a valid GSAS data file." \
409                error 0 OK
410        return
411    }
412    set newhist(rawfile) $inp
413    foreach i $newhist(banklist) {
414#       pack [checkbutton $np.bank.$i -text $i \
415#               -variable newhist(bank$i)] -side left
416        pack [radiobutton $np.bank.$i -text $i \
417                -variable newhist(banknum) -value $i] -side left
418    }
419}
420
421proc getinstfile {np} {
422    global newhist tcl_platform
423    if {$tcl_platform(platform) == "windows"} {
424        set inp [
425        tk_getOpenFile -parent $np -initialfile $newhist(instfile) -filetypes {
426            {"Inst files" .INST} {"Inst files" .INS} 
427            {"Inst files" .PRM} {"All files" *}
428        }
429        ]
430    } else {
431        set inp [
432        tk_getOpenFile -parent $np -initialfile $newhist(instfile) -filetypes {
433            {"Inst files" .INS*} {"Inst files" .ins*} 
434            {"Inst files" .PRM}  {"Inst files" .prm} 
435            {"All files" *}
436        }
437        ]
438    }
439    validateinstfile $np $inp
440}
441
442proc validateinstfile {np inp} {
443    global tcl_platform expgui newhist
444    if {$inp == ""} return
445    if [catch {set in [open $inp r]}] {
446        tk_dialog .err "Open error" "Unable to open file $inp" \
447                error 0 OK
448        return 
449    }
450    set newhist(instbanks) {}
451    foreach child [pack slaves $np.set] {destroy $child}
452    # is this a properly formatted file?
453    if {$tcl_platform(platform) == "windows"} {
454        # are lines the correct length?
455
456        #--> can we check that lines are terminated CR-LF?
457
458        while {[set len [gets $in line]] > 0} {
459            if {$len != 80} {
460                set ans [tk_dialog .err "Read error" \
461                        "File $inp is not direct access. OK to convert?" \
462                        error 0 OK QUIT]
463                if {$ans == 0} {
464                    close $in
465                    WinCvt $inp
466                    set in [open $inp r]
467                    set line {}
468                } else {
469                    return
470                }
471            }
472            # scan for the INS   BANK line
473            if {[string first "INS   BANK" $line] == 0} {
474                set newhist(instbanks) \
475                        [string trim [string range $line 12 end]]
476            }
477        }
478    } else {
479        # is the file one big record?
480        set len [gets $in line]
481        if {$len <= 80} {
482            set ans [tk_dialog .err "Read error" \
483                    "File $inp is not direct access. OK to convert?" \
484                    error 0 OK QUIT]
485            if {$ans == 0} {
486                close $in
487                set oldname ${inp}.original
488                file rename $inp $oldname
489                if [catch {
490                    exec [file join $expgui(gsasexe) convstod] < \
491                            $oldname > $inp
492                } errmsg] {
493                    tk_dialog .warn Notify \
494                            "Error in conversion:\n$errmsg" warning 0 OK
495                }
496                set in [open $inp r]
497                set line {}
498            } else {
499                return
500            }
501        }
502        seek $in 0
503        while {[string length [set line [read $in 80]]] == 80} {
504            # scan for the INS   BANK line
505            if {[string first "INS   BANK" $line] == 0} {
506                set newhist(instbanks) \
507                        [string trim [string range $line 12 end]]
508            }
509        }
510    }
511    # were banks found?
512    if {$newhist(instbanks) == ""} {
513        tk_dialog .err "Read error" \
514                "File $inp has no INS   BANK line. This is not a valid GSAS Instrument Parameter file." \
515                error 0 OK
516        return
517    }
518    set newhist(instfile) $inp
519    for {set i 1} {$i <= $newhist(instbanks)} {incr i} {
520#       pack [checkbutton $np.set.$i -text $i \
521#               -variable newhist(set$i)] -side left
522        pack [radiobutton $np.set.$i -text $i \
523                -variable newhist(setnum) -value $i] -side left
524    }
525}
526
527proc addhist {np} {
528    global expgui newhist
529    # validate the input
530    set err {}
531    if {[string trim $newhist(rawfile)] == ""} {
532        append err "  No data file specified\n"
533    }
534    if {[string trim $newhist(instfile)] == ""} {
535        append err "  No instrument parameter file specified\n"
536    }
537    if {[string trim $newhist(banknum)] == ""} {
538            append err "  Bank number must be specified\n"
539    } elseif {[catch {expr $newhist(banknum)}]} {
540            append err "  Bank number is not valid\n"
541    }
542    if {[string trim $newhist(setnum)] == ""} {
543        append err "  Parameter set number must be specified\n"
544    } elseif {[catch {expr $newhist(setnum)}]} {
545        append err "  Parameter set number is not valid\n"
546    }
547    if {[string trim $newhist(2tLimit)] == ""} {
548        append err "  2Theta/d-space limit must be specified\n"
549    } elseif {[catch {expr $newhist(2tLimit)}]} {
550        append err "  The 2Theta/d-space limit is not valid\n"
551    }
552    if {[string trim $newhist(LimitMode)] == ""} {
553        append err "  Please choose between either a 2Theta or d-space limit\n"
554    }
555
556    if {$err != ""} {
557        tk_dialog .phaseerr "Add Histogram Error" \
558                "The following error(s) were found in your input:\n$err" \
559                error 0 "OK" 
560        return
561    }
562
563    # ok do it!
564    set fp [open exptool.in w]
565    puts $fp "H"
566    puts $fp $newhist(rawfile)
567    puts $fp $newhist(instfile)
568    puts $fp $newhist(banknum)
569    puts $fp $newhist(setnum)
570    if {$newhist(LimitMode)} {
571        puts $fp "T"
572    } else {
573        puts $fp "D"
574    }
575    puts $fp "$newhist(2tLimit)"
576    puts $fp "/"
577    puts $fp "X"
578    puts $fp "X"
579    close $fp
580    global tcl_platform
581    # Save the current exp file
582    savearchiveexp
583    # disable the file changed monitor
584    set expgui(expModifiedLast) 0
585    set expnam [file root [file tail $expgui(expfile)]]
586    catch {
587        if {$tcl_platform(platform) == "windows"} {
588            exec [file join $expgui(gsasexe) exptool.exe] $expnam \
589                    < exptool.in >& exptool.out
590        } else {
591            exec [file join $expgui(gsasexe) exptool] $expnam \
592                    < exptool.in >& exptool.out
593        }
594    }
595    # load the revised exp file
596    loadexp $expgui(expfile)
597    set fp [open exptool.out r]
598    set out [read $fp]
599    close $fp
600    destroy $np
601    ShowBigMessage \
602                 $np \
603                 "Please review the result from adding the phase" \
604                 $out
605    file delete exptool.in exptool.out
606}
607
608proc MakeAddAtomsBox {phase} {
609    global expmap
610
611    # is there room for more atoms? Well, we will check this later
612    if {$phase == ""} return
613    if {[llength $phase] != 1} return
614
615    set np .newatoms
616    catch {destroy $np}
617    toplevel $np
618
619    grid [label $np.l1 -text "Adding atoms to phase #$phase"] \
620            -column 0 -row 0 -sticky w -columnspan 10
621#    grid [label $np.l2 -text "Phase title:"] -column 0 -row 1
622    set row 1
623    set col -1
624    foreach i {Atom\ntype Name x y z Occ Uiso} {
625        grid [label $np.l_${row}$i -text $i] -column [incr col] -row $row
626    }
627
628    set row 2
629    set col -1
630    grid [entry $np.e${row}t -width 5] -column [incr col]  -row $row
631    grid [entry $np.e${row}n -width 8] -column [incr col]  -row $row
632    foreach i {x y z o u} {
633        grid [entry $np.e${row}$i -width 12] -column [incr col] -row $row
634    }
635    # default occupancy
636    $np.e${row}o delete 0 end
637    $np.e${row}o insert end 1.0
638    # default Uiso
639    $np.e${row}u delete 0 end
640    $np.e${row}u insert end 0.025
641    # default occupancy
642    $np.e${row}n delete 0 end
643    $np.e${row}n insert end (default)
644
645    grid [button $np.b1 -text Add \
646            -command "addatom $phase $np"] -column 2 -row 3
647    bind $np <Return> "addatom $phase $np"
648    grid [button $np.b2 -text Cancel \
649            -command "destroy $np"] -column 3 -row 3
650   
651    wm title $np "add new atom"
652
653    # grab focus, etc.
654    putontop $np
655
656    tkwait window $np
657
658    # fix focus...
659    afterputontop
660}
661
662proc addatom {phase np} {
663    global expgui env
664    # validate the input
665    set err {}
666    set row 2
667    if {[set type [string trim [$np.e${row}t get]]] == ""} {
668        append err "  No atom type specified\n"
669    }
670
671    set name [string trim [$np.e${row}n get]]
672    if {$name == "(default)"} {set name "/"}
673    if {$name == ""} {set name "/"}
674
675    foreach i {x y z o u} n {x y z Occ Uiso} {
676        if {[set $i [string trim [$np.e${row}$i get]]] == ""} {
677            append err "  No value specified for $n\n"
678        } elseif {[catch {expr [set $i]}]} {
679            append err "  The value for $n is invalid\n"
680        }
681    }
682
683    if {$err != ""} {
684        tk_dialog .phaseerr "Add Atom Error" \
685                "The following error(s) were found in your input:\n$err" \
686                error 0 "OK" 
687        return
688    }
689
690    # ok do it!
691    set fp [open exptool.in w]
692    puts $fp "A"
693    puts $fp $phase
694    # for now, only one atom at a time
695    puts $fp 1
696    puts $fp "$type $x $y $z $o $name I $u"
697    close $fp
698    # needed in UNIX
699    set env(ATOMDATA) [file join $expgui(gsasdir) data atmdata.dat]
700    # needed in Windows
701    set env(GSAS) [file nativename $expgui(gsasdir)]
702    global tcl_platform
703    # Save the current exp file
704    savearchiveexp
705    # disable the file changed monitor
706    set expgui(expModifiedLast) 0
707    set expnam [file root [file tail $expgui(expfile)]]
708    catch {
709        if {$tcl_platform(platform) == "windows"} {
710            exec [file join $expgui(gsasexe) exptool.exe] $expnam \
711                    < exptool.in >& exptool.out
712        } else {
713            exec [file join $expgui(gsasexe) exptool] $expnam \
714                    < exptool.in >& exptool.out
715        }
716    }
717    # load the revised exp file
718    loadexp $expgui(expfile)
719    set fp [open exptool.out r]
720    set out [read $fp]
721    close $fp
722    destroy $np
723    ShowBigMessage \
724                 $np \
725                 "Please review the result from adding the atom" \
726                 $out
727    file delete exptool.in exptool.out
728}
Note: See TracBrowser for help on using the repository browser.