source: trunk/addcmds.tcl @ 865

Last change on this file since 865 was 865, checked in by toby, 11 years ago

# on 2006/02/22 00:18:37, toby did:
fix bug in 2theta max for multiple hist addition
implement re-evaluation of multiplicities (ResetMultiplicities?)
add button to Reset Multiplicities to edit menu
update Multiplicities after an origin change
better explain origin shifts

  • Property rcs:author set to toby
  • Property rcs:date set to 2006/02/22 00:18:37
  • Property rcs:lines set to +68 -12
  • Property rcs:rev set to 1.39
  • Property rcs:state set to Exp
  • Property svn:keywords set to Author Date Revision Id
File size: 74.2 KB
Line 
1# $Id: addcmds.tcl 865 2009-12-04 23:13:22Z toby $
2
3#----------- Add Phase routines ----------------------------------------
4
5proc MakeAddPhaseBox {} {
6    global expmap expgui
7
8    set expgui(coordList) {}
9    set nextphase ""
10    foreach p {1 2 3 4 5 6 7 8 9} {
11        if {[lsearch $expmap(phaselist) $p] == -1} {
12            set nextphase $p
13            break
14        }
15    }
16
17    # no more room
18    if {$nextphase == ""} {
19        MyMessageBox -parent . -title "Add Phase Error" \
20                -message "There are already 9 phases. You cannot add more." \
21                -icon error
22        return
23    }
24
25    set np .newphase
26    catch {destroy $np}
27    toplevel $np
28    bind $np <Key-F1> "MakeWWWHelp expgui2.html addphase"
29
30    grid [label $np.l1 -text "Adding phase #$nextphase"] \
31            -column 0 -row 0 -sticky w
32    grid [label $np.l2 -text "Phase title:"] -column 0 -row 1 
33    grid [entry $np.t1 -width 68] -column 1 -row 1 -columnspan 8
34    grid [label $np.l3 -text "Space Group:"] -column 0 -row 2 
35    grid [entry $np.t2 -width 12] -column 1 -row 2 
36    grid [frame $np.f -bd 4 -relief groove] -column 3 -row 2 -columnspan 8
37    set col -1
38    foreach i {a b c} {
39        grid [label $np.f.l1$i -text " $i "] -column [incr col] -row 1
40        grid [entry $np.f.e1$i -width 12] -column [incr col]  -row 1
41    }
42    set col -1
43    foreach i {a b g} {
44        grid [label $np.f.l2$i -text $i] -column [incr col] -row 2
45        set font [$np.f.l2$i cget -font]
46        $np.f.l2$i config -font "Symbol [lrange $font 1 end]"
47        grid [entry $np.f.e2$i -width 12] -column [incr col]  -row 2
48        $np.f.e2$i insert 0 90.
49    }   
50   
51    grid [frame $np.bf] -row 3 -column 0 -columnspan 10 -sticky ew
52    grid [button $np.bf.b1 -text Add \
53            -command "addphase $np"] -column 2 -row 3
54    bind $np <Return> "addphase $np"
55    grid [button $np.bf.b2 -text Cancel \
56            -command "destroy $np"] -column 3 -row 3
57    grid columnconfig $np.bf 4 -weight 1
58    grid [button $np.bf.help -text Help -bg yellow \
59            -command "MakeWWWHelp expgui2.html addphase"] \
60            -column 4 -row 3
61
62    # get the input formats if not already defined
63    GetImportFormats
64    if {[llength $expgui(importFormatList)] > 0} {
65        grid [frame $np.bf.fr -bd 4 -relief groove] -column 5 -row 3
66        grid [button $np.bf.fr.b3 -text "Import phase from: " \
67                -command "ImportPhase \$expgui(importFormat) $np"] \
68                -column 0 -row 0 -sticky e
69        set menu [eval tk_optionMenu $np.bf.fr.b4 expgui(importFormat) \
70                $expgui(importFormatList)]
71        for {set i 0} {$i <= [$menu index end]} {incr i} {
72            $menu entryconfig $i -command "ImportPhase \$expgui(importFormat) $np"
73        }
74        grid $np.bf.fr.b4 -column 1 -row 0 -sticky w
75        grid rowconfig $np.bf.fr 0 -pad 10
76        grid columnconfig $np.bf.fr 0 -pad 10
77        grid columnconfig $np.bf.fr 1 -pad 10
78    }
79    wm title $np "add new phase"
80
81    # set grab, etc.
82    putontop $np
83   
84    tkwait window $np
85   
86    # fix grab...
87    afterputontop
88}
89
90proc addphase {np} {
91    global expgui expmap
92    # validate the input
93    set err {}
94    set title [$np.t1 get]
95    if {[string trim $title] == ""} {
96        append err "  Title cannot be blank\n"
97    }
98    set spg [$np.t2 get]
99    if {[string trim $spg] == ""} {
100        append err "  Space group cannot be blank\n"
101    }
102    foreach i {a b c} {
103        set cell($i) [$np.f.e1$i get]
104        if {[string trim $cell($i)] == ""} {
105            append err "  $i cannot be blank\n"
106        } elseif {[catch {expr $cell($i)}]} {
107            append err "  $i is not valid\n"
108        }
109    }
110
111    foreach i {a b g} lbl {alpha beta gamma} {
112        set cell($lbl) [$np.f.e2$i get]
113        if {[string trim $cell($lbl)] == ""} {
114            append err "  $lbl cannot be blank\n"
115        } elseif {[catch {expr $cell($lbl)}]} {
116            append err "  $lbl is not valid\n"
117        }
118    }
119
120    if {$err != ""} {
121        MyMessageBox -parent . -title "Add Phase Error" \
122                -message "The following error(s) were found in your input:\n$err" \
123                -icon error
124        set expgui(oldphaselist) -1
125        return
126    }
127
128    # check the space group
129    set fp [open spg.in w]
130    puts $fp "N"
131    puts $fp "N"
132    puts $fp $spg
133    puts $fp "Q"
134    close $fp
135    global tcl_platform
136    catch {
137        if {$tcl_platform(platform) == "windows"} {
138            exec [file join $expgui(gsasexe) spcgroup.exe] < spg.in >& spg.out
139        } else {
140            exec [file join $expgui(gsasexe) spcgroup] < spg.in >& spg.out
141        }
142    }
143    set fp [open spg.out r]
144    set out [read $fp]
145    close $fp
146    # attempt to parse out the output (fix up if parse did not work)
147    if {[regexp "space group symbol.*>(.*)Enter a new space group symbol" \
148            $out a b ] != 1} {set b $out}
149    if {[string first Error $b] != -1} {
150        # got an error, show it
151        ShowBigMessage \
152                 $np.error \
153                 "Error processing space group\nReview error message below" \
154                 $b OK "" 1
155        set expgui(oldphaselist) -1
156        return
157    } else {
158        # show the result and confirm
159        set opt [ShowBigMessage \
160                $np.check \
161                "Check the symmetry operators in the output below" \
162                $b \
163                {Continue Redo} ]
164        if {$opt > 1} {
165            set expgui(oldphaselist) -1
166            return
167        }
168    }
169    file delete spg.in spg.out
170   
171    # ok do it!
172    set fp [open exptool.in w]
173    puts $fp "P"
174    puts $fp $title
175    puts $fp $spg
176    puts $fp "$cell(a) $cell(b) $cell(c) $cell(alpha) $cell(beta) $cell(gamma)"
177    puts $fp "/"
178    close $fp
179    global tcl_platform
180    # Save the current exp file
181    savearchiveexp
182    # disable the file changed monitor
183    set expgui(expModifiedLast) 0
184    set expnam [file root [file tail $expgui(expfile)]]
185    # save the previous phase list
186    set expgui(oldphaselist) $expmap(phaselist)
187    catch {
188        if {$tcl_platform(platform) == "windows"} {
189            exec [file join $expgui(gsasexe) exptool.exe] $expnam \
190                    < exptool.in >& exptool.out
191        } else {
192            exec [file join $expgui(gsasexe) exptool] $expnam \
193                    < exptool.in >& exptool.out
194        }
195    } errmsg
196    # load the revised exp file
197    set oldphaselist $expmap(phaselist)
198    loadexp $expgui(expfile)
199    set fp [open exptool.out r]
200    set out [read $fp]
201    close $fp
202    destroy $np
203    set err 0
204    if {[llength $oldphaselist] == [llength $expmap(phaselist)]} {set err 1}
205    if {$errmsg != ""} {
206        set err 1
207        append errmsg "\n" $out
208    } else {
209        set errmsg $out
210    }
211    if {$expgui(showexptool) || $err} {
212        set msg "Please review the result from adding the phase" 
213        if {$err} {append msg "\nIt appears an error occurred!"}
214        ShowBigMessage $np $msg $errmsg OK "" $err
215    }
216    file delete exptool.in exptool.out
217    # set the powpref warning (2 = required)
218    set expgui(needpowpref) 2
219    set msg "A phase was added" 
220    if {[string first $msg $expgui(needpowpref_why)] == -1} {
221        append expgui(needpowpref_why) "\t$msg\n"
222    }
223    # now select the new phase
224    SelectOnePhase [lindex $expmap(phaselist) end]   
225}
226
227#----------- Add Histogram routines --------------------------------------
228proc LabelInstParm {args} {
229    global newhist
230    switch $newhist(insttype) {
231        TOF {
232            set newhist(instfiletext) "Neutron Time of Flight"
233            catch {
234                set b $newhist(setnum)
235                append newhist(instfiletext) ", 2theta = $newhist(inst${b}Angle)"
236            }
237        }
238        ED {set newhist(instfiletext) "X-ray Energy Dispersive"}
239        "CW X" {set newhist(instfiletext) "CW X-ray"}
240        "CW N" {set newhist(instfiletext) "CW Neutron"}
241    }
242}
243trace variable newhist(setnum) w LabelInstParm
244proc MakeAddHistBox {} {
245    global expmap newhist
246
247    # --> should check here if room for another histogram, but only texture
248    # folks will ever need that
249
250    set np .newhist
251    catch {destroy $np}
252    toplevel $np
253    bind $np <Key-F1> "MakeWWWHelp expgui3.html AddHist"
254
255    grid [label $np.l0 -text "Adding a new histogram"] \
256            -column 0 -row 0 -sticky ew -columnspan 7
257    grid [checkbutton $np.d0 -text "Dummy Histogram" -variable newhist(dummy) \
258            -command "PostDummyOpts $np" \
259            ] -column 2 -row 0 -columnspan 99 -sticky e
260    grid [label $np.l1 -text "Data file:"] -column 0 -row 2
261    grid [label $np.t1 -textvariable newhist(rawfile) -bd 2 -relief ridge] \
262            -column 1 -row 2 -columnspan 3 -sticky ew
263    grid [button $np.b1 -text "Select File" \
264            -command "getrawfile $np" \
265            ] -column 4 -row 2
266
267    grid [label $np.lbank -text "Select bank" -anchor w] -column 1 -row 3 -sticky w
268    grid [frame $np.bank]  -column 2 -row 3 -columnspan 7 -sticky ew
269
270    grid [label $np.l2 -text "Instrument\nParameter file:"] -column 0 -row 5
271    grid [label $np.t2 -textvariable newhist(instfile) -bd 2 -relief ridge] \
272            -column 1 -row 5 -columnspan 3 -sticky ew
273    grid [button $np.b2 -text "Select File" \
274            -command "getinstfile $np" \
275            ] -column 4 -row 5
276    grid [button $np.edit -text "Edit file" \
277            -command {EditInstFile $newhist(instfile)}] \
278            -column 5 -row 5
279
280    grid [label $np.lset -text "Select set" -anchor w] -column 1 -row 6 -sticky w
281    grid [frame $np.set]  -column 2 -row 6 -columnspan 7 -sticky ew
282    grid [label $np.t2a -textvariable newhist(instfiletext) \
283            -justify center -anchor center -fg blue] \
284            -column 0 -row 8 -columnspan 99 -sticky ew
285
286    grid [button $np.f6a -text "Run\nRAWPLOT" -command "RunRawplot $np"] \
287            -column 4 -row 18 -rowspan 2
288    grid [label $np.l3 -text "Usable data limit:"] -column 0 -row 18 -rowspan 3 
289    grid [entry $np.e3 -width 12 -textvariable newhist(2tLimit) \
290            ] -column 1 -row 18 -rowspan 3
291    grid [radiobutton $np.cb3 -text "D-min" -variable newhist(LimitMode) \
292            -value 0] -column 2 -row 18 -sticky w
293    grid [radiobutton $np.cb4 -textvariable newhist(limitLbl)  \
294            -variable newhist(LimitMode) -anchor w -justify l \
295            -value 1] -column 2 -row 20 -sticky w
296    grid [radiobutton $np.cb5 -text "Q-max" -variable newhist(LimitMode) \
297            -value 2] -column 2 -row 19 -sticky w
298    set newhist(limitLbl) "TOF-min\n2-Theta Max"
299    # spacers
300    grid [frame $np.sp0 -bg white] \
301            -columnspan 20 -column 0 -row 1 -sticky nsew -ipady 2
302    grid [frame $np.sp1 -bg white] \
303            -columnspan 20 -column 0 -row 4 -sticky nsew -ipady 2
304    grid [frame $np.sp2 -bg white] \
305            -columnspan 20 -column 0 -row 17 -sticky nsew -ipady 2
306    grid [frame $np.sp3 -bg white] \
307            -columnspan 20 -column 0 -row 98 -sticky nsew -ipady 2
308    grid [frame $np.f6] -column 0 -row 99 -columnspan 5 -sticky ew
309    grid [button $np.f6.b6a -text Add \
310            -command "addhist $np"] -column 0 -row 0
311    bind $np <Return> "addhist $np"
312    grid [button $np.f6.b6b -text Cancel \
313            -command "destroy $np"] -column 1 -row 0
314    grid [button $np.f6.b6c -text "Add multiple banks" \
315            -command "addMultiplehist $np" -state disabled] -column 2 -row 0
316    grid [button $np.f6.help -text Help -bg yellow \
317            -command "MakeWWWHelp expgui3.html AddHist"] \
318            -column 2 -row 0 -sticky e
319    grid columnconfigure $np.f6 2 -weight 1
320    grid columnconfigure $np 3 -weight 1
321
322    # dummy histogram stuff
323    frame $np.d1
324    grid [label $np.d1.l1 -text min] -column 1 -row 1
325    grid [label $np.d1.l2 -text max] -column 2 -row 1
326    grid [label $np.d1.l3 -text step] -column 3 -row 1
327    grid [label $np.d1.lu -text ""] -column 4 -row 1 -rowspan 2
328    grid [entry $np.d1.e1 -width 10 -textvariable newhist(tmin)] -column 1 -row 2
329    grid [entry $np.d1.e2 -width 10 -textvariable newhist(tmax)] -column 2 -row 2
330    grid [entry $np.d1.e3 -width 10 -textvariable newhist(tstep)] -column 3 -row 2
331    grid [label $np.d1.m1 -anchor w] -column 1 -row 3 -sticky ew
332    grid [label $np.d1.m2 -anchor w] -column 2 -row 3 -sticky ew
333    label $np.dl1 -text "Data range:"
334    label $np.dl2 -text "Allowed"
335    label $np.dl3 -text "\n" -justify left -fg blue
336    wm title $np "add new histogram"
337
338    set newhist(banknum) {}
339    set newhist(setnum) {}
340    if {[string trim $newhist(rawfile)] != {}} {
341        validaterawfile $np $newhist(rawfile)
342    }
343    if {[string trim $newhist(instfile)] != {}} {
344        validateinstfile $np $newhist(instfile)
345    }
346
347    PostDummyOpts $np
348    # set grab, etc.
349    putontop $np
350
351    tkwait window $np
352
353    # fix grab...
354    afterputontop
355}
356
357# convert a file to Win-95 direct access
358proc WinCvt {file win} {
359    global expgui
360    if ![file exists $file] {
361        MyMessageBox -parent $win -title "Convert Error" \
362                -message "File $file does not exist" -icon error
363        return
364    }
365
366    set tmpname "[file join [file dirname $file] tempfile.xxx]"
367    set oldname "[file rootname $file].org"
368    if [file exists $oldname] {
369        set ans [MyMessageBox -parent $win -title "OK to overwrite?" \
370                -message "File [file tail $oldname] exists in [file dirname $oldname]. OK to overwrite?" \
371                -icon question -type yesno -default yes]
372        if {$ans == "no"} return
373        catch {file delete $oldname}
374    }
375
376    if [catch {
377        set in [open $file r]
378        # needed to test under UNIX
379        set out [open $tmpname w]
380        fconfigure $out -translation crlf
381        set len [gets $in line]
382        if {$len > 160} {
383            # this is an old-style UNIX file. Hope there are no control characters
384            set i 0
385            set j 79
386            while {$j < $len} {
387                puts $out [string range $line $i $j]
388                incr i 80
389                incr j 80
390            }
391        } else {
392            while {$len >= 0} {
393                append line "                                        "
394                append line "                                        "
395                set line [string range $line 0 79]
396                puts $out $line
397                set len [gets $in line]
398            }
399        }
400        close $in
401        close $out
402        file rename $file $oldname
403        file rename $tmpname $file
404    } errmsg] {
405        MyMessageBox -parent $win -title Notify \
406                -message "Error in conversion:\n$errmsg" -icon warning
407    }
408    return $file
409}
410
411proc getrawfile {np} {
412    global newhist tcl_platform
413    if {$tcl_platform(platform) == "windows"} {
414        set inp [
415        tk_getOpenFile -parent $np -initialfile $newhist(rawfile) -filetypes {
416            {"Data files" .GSAS} {"Data files" .GSA} 
417            {"Data files" .RAW}  {"All files" *}
418        }
419        ]
420    } else {
421        set inp [
422        tk_getOpenFile -parent $np -initialfile $newhist(rawfile) -filetypes {
423            {"Data files" .GSA*} {"Data files" .RAW} 
424            {"Data files" .gsa*} {"Data files" .raw} 
425            {"All files" *}
426        } 
427        ]
428    }
429    validaterawfile $np $inp
430}
431
432proc validaterawfile {np inp} {
433    global expgui newhist
434    if {$inp == ""} return
435    if [catch {set in [open $inp r]}] {
436        MyMessageBox -parent $np -title "Open error" \
437                -message "Unable to open file $inp" -icon error
438        return 
439    }
440    set newhist(banklist) {}
441    foreach child [winfo children $np.bank] {destroy $child}
442    # is this a properly formatted file?
443    # -- are lines the correct length & terminated with a CR-LF?   
444    fconfigure $in -translation lf
445    set i 0
446    while {[set len [gets $in line]] > 0} {
447        incr i
448        if {$len != 81 || [string range $line end end] != "\r"} {
449            set ans [MyMessageBox -parent $np -title "Convert?" \
450                    -message "File $inp is not in the correct format for GSAS.\nOK to convert?" \
451                    -icon warning -type {OK Quit} -default OK]
452            if {$ans == "ok"} {
453                # convert and reopen the file
454                close $in
455                WinCvt $inp $np
456                set i 0
457                set in [open $inp r]
458                fconfigure $in -translation lf
459                set line {}
460            } else {
461                return
462            }
463        }
464        # scan for BANK lines
465        if {[string first BANK $line] == 0} {
466            scan $line "BANK%d" num
467            lappend newhist(banklist) $num
468            # compute last point
469            set tmin 0
470            set tmax 0
471            catch {
472                scan $line "BANK%d%d%d%s%f%f" num nchan nrec rest start step
473                set tmin [expr $start/100.]
474                set tmax [expr ($start + $step*($nchan-1))/100.]
475            }
476            set newhist(tmin$num) $tmin
477            set newhist(tmax$num) $tmax
478        }
479        # check for "Instrument parameter file" line
480        if {$i == 2 && [string first "Instrument parameter" $line] == 0} {
481            validateinstfile $np \
482                    [file join [file dirname $inp] \
483                    [string trim [string range $line 26 end]]]
484        }
485    }
486    # were banks found?
487    if {$newhist(banklist) == ""} {
488        MyMessageBox -parent $np -title "Read error" \
489                -message "File $inp has no BANK lines.\nThis is not a valid GSAS data file." \
490                -icon warning
491        return
492    }
493    # don't use a full path unless needed
494    if {[pwd] == [file dirname $inp]} {
495        set newhist(rawfile) [file tail $inp]
496    } else {
497        set newhist(rawfile) $inp
498    }
499    set row 0
500    set col -1
501    foreach i $newhist(banklist) {
502        if {$col > 8} {
503            set col -1
504            incr row
505        }
506        grid [radiobutton $np.bank.$i -text $i -command SetTmax \
507                -variable newhist(banknum) -value $i] \
508                -column [incr col] -row $row -sticky w
509        # only 1 choice, so set it
510        if {[llength $newhist(banklist)] == 1} {
511            set newhist(banknum) $i
512            SetTmax
513        } else {
514            set newhist(2tLimit) {}
515            set newhist(LimitMode) {}
516        }
517    }
518    SetMultipleAdd $np
519}
520
521proc SetTmax {} {
522    global newhist
523    set num $newhist(banknum)
524    if {$newhist(insttype) == "TOF"} {
525        set newhist(2tLimit) [expr {$newhist(tmin$num) / 10.}]
526        if {[llength $newhist(banklist)] == $newhist(instbanks)} {
527            set newhist(setnum) $newhist(banknum)
528        }
529    } else {
530        set newhist(2tLimit) $newhist(tmax$num)
531    }
532    set newhist(LimitMode) 1
533
534}
535
536proc getinstfile {np} {
537    global newhist tcl_platform
538    if {$tcl_platform(platform) == "windows"} {
539        set inp [
540        tk_getOpenFile -parent $np -initialfile $newhist(instfile) -filetypes {
541            {"Inst files" .INST} {"Inst files" .INS} 
542            {"Inst files" .PRM} {"All files" *}
543        }
544        ]
545    } else {
546        set inp [
547        tk_getOpenFile -parent $np -initialfile $newhist(instfile) -filetypes {
548            {"Inst files" .INS*} {"Inst files" .ins*} 
549            {"Inst files" .PRM}  {"Inst files" .prm} 
550            {"All files" *}
551        }
552        ]
553    }
554    set newhist(setnum) {}
555    validateinstfile $np $inp
556}
557
558proc validateinstfile {np inp} {
559    global expgui newhist
560    if {$inp == ""} return
561    if [catch {set in [open $inp r]}] {
562        MyMessageBox -parent $np -title "Open error" \
563                -message "Unable to open file $inp" -icon error
564        return 
565    }
566    set newhist(instbanks) {}
567    foreach child [winfo children $np.set] {destroy $child}
568    # is this a properly formatted file?
569    # -- are lines the correct length & terminated with a CR-LF?   
570    fconfigure $in -translation lf
571    while {[set len [gets $in line]] > 0} {
572        if {$len != 81 || [string range $line end end] != "\r"} {
573            set ans [MyMessageBox -parent $np -title "Convert?" \
574                    -message "File $inp is not in the correct format for GSAS.\nOK to convert?" \
575                    -icon warning -type {OK Quit} -default OK]
576            if {$ans == "ok"} {
577                # convert and reopen the file
578                close $in
579                WinCvt $inp $np
580                set in [open $inp r]
581                fconfigure $in -translation lf
582                set line {}
583            } else {
584                return
585            }
586        }
587        # scan for the INS   BANK line
588        if {[string first "INS   BANK" $line] == 0} {
589            set newhist(instbanks) \
590                    [string trim [string range $line 12 end]]
591        }
592        # scan for the INS   HTYPE line
593        if {[string first "INS   HTYPE" $line] == 0} {
594            if {[string index [lindex $line 2] 2] == "T"} {
595                set newhist(insttype) TOF
596            } elseif {[string index [lindex $line 2] 2] == "E"} {
597                set newhist(insttype) ED
598            } elseif {[string index [lindex $line 2] 1] == "X"} {
599                set newhist(insttype) "CW X"
600            } else {
601                set newhist(insttype) "CW N"
602            }
603        }
604        # scan for the instrument constants
605        if {[regexp {INS ([ 1-9][0-9]) ICONS(.*)} $line a b c]} {
606            set b [string trim $b]
607            set newhist(inst${b}ICONS) [string trim $c]
608        }
609        if {[regexp {INS ([ 1-9][0-9])I ITYP(.*)} $line a b c]} {
610            set b [string trim $b]
611            set newhist(inst${b}ITYP) [string trim $c]
612        }
613        if {[regexp {INS ([ 1-9][0-9])BNKPAR(.*)} $line a b c]} {
614            set b [string trim $b]
615            set newhist(inst${b}Angle) [string trim [lindex $c 1]]
616        }
617    }
618    # were banks found?
619    if {$newhist(instbanks) == ""} {
620        MyMessageBox -parent $np -title "Read error" -message \
621                "File $inp has no \"INS   BANK\" line.\nThis is not a valid GSAS Instrument Parameter file." \
622                -icon warning
623        return
624    }
625    # don't use a full path unless needed
626    if {[pwd] == [file dirname $inp]} {
627        set newhist(instfile) [file tail $inp]
628    } else {
629        set newhist(instfile) $inp
630    }
631    set col -1
632    set row 0
633    for {set i 1} {$i <= $newhist(instbanks)} {incr i} {
634        if {$col > 8} {
635            set col -1
636            incr row
637        }
638        grid [radiobutton $np.set.$i -text $i \
639                -command "PostDummyOpts $np; ValidateDummyHist $np" \
640                -variable newhist(setnum) -value $i] \
641                -column [incr col] -row $row -sticky w
642        if {$newhist(instbanks) == 1} {set newhist(setnum) $i}
643    }
644    if {$newhist(dummy)} {PostDummyOpts $np; ValidateDummyHist $np}
645    LabelInstParm
646    SetMultipleAdd $np
647}
648
649proc addhist {np} {
650    global expgui newhist tcl_platform expmap
651    if {$newhist(dummy)} {
652        AddDummyHist $np
653        return
654    }
655    # validate the input
656    set err {}
657    if {[string trim $newhist(rawfile)] == ""} {
658        append err "  No data file specified\n"
659    }
660    if {[string trim $newhist(instfile)] == ""} {
661        append err "  No instrument parameter file specified\n"
662    }
663    if {[string trim $newhist(banknum)] == ""} {
664            append err "  Bank number must be specified\n"
665    } elseif {[catch {expr $newhist(banknum)}]} {
666            append err "  Bank number is not valid\n"
667    }
668    if {[string trim $newhist(setnum)] == ""} {
669        append err "  Parameter set number must be specified\n"
670    } elseif {[catch {expr $newhist(setnum)}]} {
671        append err "  Parameter set number is not valid\n"
672    }
673    if {[string trim $newhist(2tLimit)] == ""} {
674        append err "  2Theta/d-space limit must be specified\n"
675    } elseif {[catch {expr $newhist(2tLimit)}]} {
676        append err "  The 2Theta/d-space limit is not valid\n"
677    } elseif {$newhist(2tLimit) <= 0} {
678        append err "  The 2Theta/d-space limit is not valid\n"
679    }
680    if {[string trim $newhist(LimitMode)] == ""} {
681        append err "  Please choose between either a 2Theta, Q or d-space limit\n"
682    }
683
684    if {$err != ""} {
685        MyMessageBox -parent $np -title  "Add Histogram Error" \
686                -message "The following error(s) were found in your input:\n$err" \
687                -icon error -type ok -default ok \
688                -helplink "expgui3.html AddHistErr"
689        return
690    }
691
692    # ok do it!
693    set fp [open exptool.in w]
694    puts $fp "H"
695    if {$tcl_platform(platform) == "windows"} {
696        puts $fp [file attributes $newhist(rawfile) -shortname]
697        puts $fp [file attributes $newhist(instfile) -shortname]
698    } else {
699        puts $fp $newhist(rawfile)
700        puts $fp $newhist(instfile)
701    }
702    puts $fp $newhist(banknum)
703    puts $fp $newhist(setnum)
704    if {$newhist(LimitMode) == 1} {
705        puts $fp "T"
706        puts $fp "$newhist(2tLimit)"
707    } elseif {$newhist(LimitMode) == 2} {
708        puts $fp "D"
709        set Q 100
710        catch {set Q [expr {4*acos(0)/$newhist(2tLimit)}]}
711        puts $fp "$Q"
712    } else {
713        puts $fp "D"
714        puts $fp "$newhist(2tLimit)"
715    }
716    puts $fp "/"
717    puts $fp "X"
718    puts $fp "X"
719    close $fp
720    global tcl_platform
721    # Save the current exp file
722    savearchiveexp
723    # disable the file changed monitor
724    set expgui(expModifiedLast) 0
725    set expnam [file root [file tail $expgui(expfile)]]
726    catch {
727        if {$tcl_platform(platform) == "windows"} {
728            exec [file join $expgui(gsasexe) exptool.exe] $expnam \
729                    < exptool.in >& exptool.out
730        } else {
731            exec [file join $expgui(gsasexe) exptool] $expnam \
732                    < exptool.in >& exptool.out
733        }
734    } errmsg
735    # load the revised exp file
736    set oldpowderlist $expmap(powderlist)
737    loadexp $expgui(expfile)
738    set fp [open exptool.out r]
739    set out [read $fp]
740    close $fp
741    destroy $np
742    set err 0
743    if {[llength $oldpowderlist] == [llength $expmap(powderlist)]} {set err 1}
744    if {$errmsg != ""} {
745        append errmsg "\n" $out
746        set err 1
747    } else {
748        set errmsg $out
749    }
750    if {$expgui(showexptool) || $err} {
751        set msg "Please review the result from adding the histogram" 
752        if {$err} {append msg "\nIt appears an error occurred!"}
753        ShowBigMessage $np $msg $errmsg OK "" $err
754    }
755    file delete exptool.in exptool.out
756    # set the powpref warning (2 = required)
757    set expgui(needpowpref) 2
758    set msg "A histogram was added" 
759    if {[string first $msg $expgui(needpowpref_why)] == -1} {
760        append expgui(needpowpref_why) "\t$msg\n"
761    }
762    # select the most recently added histogram
763    if {!$err} {
764        set i [llength $expmap(histlistboxcontents)]
765        if {$i > 0} {
766            incr i -1
767            set expgui(curhist) $i
768            sethistlist
769        }
770    }
771}
772
773proc RunRawplot {parent} {
774    global newhist tcl_platform
775    set f1 $newhist(rawfile)
776    set f2 $newhist(instfile)
777    # for Windows put a message on top, in case file names must be shortened
778    if {$tcl_platform(platform) == "windows"} {
779        catch {set f1 [file nativename \
780                    [file attributes $newhist(rawfile) -shortname]]}
781        catch {set f2 [file nativename \
782                [file attributes $newhist(instfile) -shortname]]}
783    }
784    if {$f1 != "" || $f2 != ""} {
785        #set msg "Note: input to RAWPLOT\n"
786        #if {$f1 != ""} {append msg "data file: $f1\n"}
787        #if {$f2 != ""} {append msg "instrument file: $f2"}
788        catch {toplevel $parent.msg}
789        catch {eval destroy [winfo children $parent.msg]}
790        wm title $parent.msg "File names"
791        grid [label $parent.msg.1 \
792                -text "File names to be input to RAWPLOT" \
793                -justify center -anchor center] \
794                -column 0 -row 0 -columnspan 2
795        if {$f1 != ""} {
796            grid [label $parent.msg.2a \
797                    -text "Raw histogram: $f1" \
798                    -justify center -anchor e] \
799                    -column 0 -row 1
800            grid [button $parent.msg.2b \
801                    -command "clipboard clear; clipboard append $f1" \
802                    -text "put name\nin clipboard"] \
803                    -column 1 -row 1
804        }           
805        if {$f2 != ""} {
806            grid [label $parent.msg.3a \
807                    -text "Raw histogram: $f2" \
808                    -justify center -anchor e] \
809                    -column 0 -row 2
810            grid [button $parent.msg.3b \
811                    -command "clipboard clear; clipboard append $f2" \
812                    -text "put name\nin clipboard"] \
813                    -column 1 -row 2
814        }           
815        grid [button $parent.msg.4 \
816                -command "destroy $parent.msg" \
817                -text "Close"] \
818                -column 0 -columnspan 2 -row 9
819    }
820    # start RAWPLOT
821    runGSASprog rawplot 1
822    if {[winfo exists $parent.msg]} {raise $parent.msg}
823    update
824}
825#--- Dummy histogram stuff
826proc PostDummyOpts {np} {
827    global newhist
828    if {$newhist(dummy)} {
829        trace variable newhist(tmin) w "ValidateDummyHist $np"
830        trace variable newhist(tmax) w "ValidateDummyHist $np"
831        trace variable newhist(tstep) w "ValidateDummyHist $np"
832        foreach w {l1 t1 lbank} {
833            $np.$w config -fg grey
834        }
835        $np.d1.m1 config -text {}
836        $np.d1.m2 config -text {}
837        $np.b1 config -state disabled
838        grid forget $np.l3 $np.e3 $np.cb3 $np.cb4 $np.cb5 $np.bank $np.f6a
839        grid $np.dl1 -column 0 -row 18
840        grid $np.d1 -column 1 -row 18 -rowspan 2 -columnspan 4 -sticky e
841        grid $np.dl3 -column 0 -columnspan 99 -row 20 -sticky ew
842        if {$newhist(insttype) == "TOF"} {
843            $np.dl1 config -text "Data range:\n(TOF)"
844            $np.d1.lu config -text millisec
845            grid $np.dl2 -column 0 -row 19
846            catch {
847                set s $newhist(setnum)
848                foreach {x tmin tmax x} $newhist(inst${s}ITYP) {}
849                $np.d1.m1 config -text $tmin
850                $np.d1.m2 config -text $tmax
851            }
852        } elseif {[lindex $newhist(insttype) 0] == "CW"} {
853            $np.dl1 config -text "Data range:\n(2Theta)"
854            $np.d1.lu config -text degrees
855            #grid forget $np.dl2
856            $np.d1.m1 config -text >0.
857            $np.d1.m2 config -text <180.
858        } elseif {$newhist(insttype) == "ED"} {
859            $np.dl1 config -text "Data range:\n(Energy)"
860            $np.d1.lu config -text KeV
861            $np.d1.m1 config -text 1.
862            $np.d1.m2 config -text 200.
863            grid $np.dl2 -column 0 -row 19
864        } else {
865            $np.dl1 config -text "No file\nselected"
866            $np.d1.lu config -text {}
867        }
868    } else {
869        foreach var {tmin tmax tstep} {
870            foreach v [ trace vinfo newhist($var)] {
871                eval trace vdelete newhist($var) $v
872            }
873        }
874        grid forget $np.dl1 $np.d1 $np.dl2 $np.dl3
875        foreach w {l1 t1 lbank} {
876            $np.$w config -fg black
877        }
878        $np.b1 config -state normal
879        grid $np.bank -column 2 -row 3 -columnspan 7 -sticky ew
880        grid $np.f6a -column 4 -row 18 -rowspan 3
881        grid $np.l3 -column 0 -row 18 -rowspan 3
882        grid $np.e3 -column 1 -row 18 -rowspan 3 
883        grid $np.cb3 -column 2 -row 18 -sticky w
884        grid $np.cb4 -column 2 -row 20 -sticky w
885        grid $np.cb5 -column 2 -row 19 -sticky w
886     }
887}
888
889proc ValidateDummyHist {np args} {
890    # validate input
891    global newhist
892    set msg {}
893    $np.dl3 config -text "\n"
894    foreach e {e1 e2 e3} v {tmin tmax tstep} {
895        if [catch {expr $newhist($v)}] {
896            $np.d1.$e config -fg red
897            append msg "Value of $newhist($v) is invalid for $v\n"
898        } else {
899            $np.d1.$e config -fg black
900        }
901    }
902    if {[catch {expr $newhist(setnum)}]} {
903        append msg "An instrument file bank number must be selected\n"
904    } elseif {$newhist(setnum) <= 0 || \
905            $newhist(setnum) > $newhist(instbanks)} {
906        append msg "An invalid instrument file bank has been selected\n"
907    }
908
909    if {$msg != ""} {return $msg}
910
911    if {$newhist(tmax) <= $newhist(tmin)} {
912        $np.d1.e1 config -fg red
913        $np.d1.e2 config -fg red
914        return "Tmax <= Tmin\n"
915    }
916
917
918    set dmin -1
919    set dmax -1
920    if {$newhist(insttype) == "TOF"} {
921        catch {
922            set s $newhist(setnum)
923            foreach {x tmin tmax x} $newhist(inst${s}ITYP) {}
924            if {$newhist(tmin) <$tmin } {
925                $np.d1.e1 config -fg red
926                append msg "Min value of $newhist(tmin) msec is invalid.\n"
927            }
928            if {$newhist(tmax) >$tmax } {
929                $np.d1.e2 config -fg red
930                append msg "Max value of $newhist(tmax) msec is invalid.\n"
931            }
932            set s $newhist(setnum)
933            set dmin [expr {1000. * $newhist(tmin) / \
934                    [lindex $newhist(inst${s}ICONS) 0]}]
935            set dmax [expr {1000. * $newhist(tmax) / \
936                    [lindex $newhist(inst${s}ICONS) 0]}]
937        }
938    } elseif {[lindex $newhist(insttype) 0] == "CW"} {
939        if {$newhist(tmin) <= 0 } {
940            $np.d1.e1 config -fg red
941            append msg "Min value of $newhist(tmin) degrees is invalid.\n"
942        }
943        if {$newhist(tmax) >=180 } {
944            $np.d1.e2 config -fg red
945            append msg "Max value of $newhist(tmax) degrees is invalid.\n"
946        }
947        catch {
948            set s $newhist(setnum)
949            set dmin [expr {[lindex $newhist(inst${s}ICONS) 0]\
950                    * 0.5 / sin(acos(0.)*$newhist(tmax)/180.)}]
951            set dmax [expr {[lindex $newhist(inst${s}ICONS) 0]\
952                    * 0.5 / sin(acos(0.)*$newhist(tmin)/180.)}]
953        }
954    } else {
955        if {$newhist(tmin) <1 } {
956            $np.d1.e1 config -fg red
957            append msg "Min value of $newhist(tmin) KeV is invalid.\n"
958        }
959        if {$newhist(tmax) >200 } {
960            $np.d1.e2 config -fg red
961            append msg "Max value of $newhist(tmax) KeV is invalid.\n"
962        }
963        catch {
964            set s $newhist(setnum)
965            set ang [lindex $newhist(inst${s}ICONS) 0]
966            set dmin [expr {12.398/ (2.0*sin($ang*acos(0.)/180) * \
967                    $newhist(tmax))}]
968            set dmax [expr {12.398/ (2.0*sin($ang*acos(0.)/180) * \
969                    $newhist(tmin))}]
970        }
971    }
972    if {$msg != ""} {return $msg}
973    set pnts -1
974    catch {
975        set pnts [expr {1+int(($newhist(tmax) - $newhist(tmin))/$newhist(tstep))}]
976        set qmin [expr {4.*acos(0)/$dmax}]
977        set qmax [expr {4.*acos(0)/$dmin}]
978    }
979    if {$pnts <= 0} {
980        $np.d1.e3 config -fg red
981        append msg "Step value of $newhist(tstep) is invalid.\n"
982    }
983    if {$pnts >20000} {
984        $np.d1.e3 config -fg red
985        append msg "Step value of $newhist(tstep) is too small (>20000 points).\n"
986    }
987    if {$msg != ""} {return $msg}
988    if {$dmin > 0 && $dmax > 0} {
989        catch {
990            set msg [format \
991                    {  %d points.%s  D-space range: %.2f-%.2f A,  Q: %.2f-%.2f/A} \
992                    $pnts "\n" $dmin $dmax $qmin $qmax]
993            $np.dl3 config -text $msg
994        }
995    }
996    if {$msg != ""} {return ""}
997    $np.dl3 config -text [format {  %d points.%s  Range: ?} $pnts "\n"]
998    return "Invalid data range -- something is wrong!"
999}
1000
1001proc AddDummyHist {np} {
1002    global newhist expgui expmap
1003    global tcl_platform
1004    set msg [ValidateDummyHist $np]
1005    if {$msg != ""} {
1006        MyMessageBox -parent $np -title  "Add Histogram Error" \
1007                -message "The following error(s) were found in your input:\n$msg" \
1008                -icon error -type ok -default ok \
1009                -helplink "expgui3.html AddHistErr"
1010        return
1011    }
1012    set fp [open exptool.in w]
1013    puts $fp "D"
1014    puts $fp $newhist(instfile)
1015    puts $fp $newhist(setnum)
1016    if {$newhist(insttype) == "TOF"} {
1017        puts $fp "C"
1018    }
1019    puts $fp $newhist(tmin)
1020    puts $fp $newhist(tmax)
1021    puts $fp $newhist(tstep)
1022    puts $fp "X"
1023    puts $fp "0"
1024    close $fp
1025    # Save the current exp file
1026    savearchiveexp
1027    # disable the file changed monitor
1028    set expgui(expModifiedLast) 0
1029    set expnam [file root [file tail $expgui(expfile)]]
1030    set err [catch {
1031        if {$tcl_platform(platform) == "windows"} {
1032            exec [file join $expgui(gsasexe) exptool.exe] $expnam \
1033                    < exptool.in >& exptool.out
1034        } else {
1035            exec [file join $expgui(gsasexe) exptool] $expnam \
1036                    < exptool.in >& exptool.out
1037        }
1038    } errmsg ]
1039    # load the revised exp file
1040    set oldpowderlist $expmap(powderlist)
1041    loadexp $expgui(expfile)
1042    set fp [open exptool.out r]
1043    set out [read $fp]
1044    close $fp
1045    if {[llength $oldpowderlist] == [llength $expmap(powderlist)]} {set err 1}
1046    if {$errmsg != ""} {
1047        append errmsg "\n" $out
1048    } else {
1049        set errmsg $out
1050    }
1051    if {[regexp {\(P,H,A\)} $out]} {
1052        set msg {You must upgrade the EXPTOOL program.}
1053        append msg { This version cannot add dummy histograms.}
1054        MyMessageBox -icon error -title "Old EXPTOOL program" \
1055                -message $msg -parent $np \
1056                -helplink "expguierr.html OldEXPTOOL"
1057        # update the documentation & link
1058        destroy $np
1059    } elseif {$expgui(showexptool) || $err} {
1060        set msg "Please review the result from adding the dummy histogram" 
1061        if {$err} {append msg "\nIt appears an error occurred!"}
1062        ShowBigMessage $np $msg $errmsg OK "" $err
1063    } else {
1064        destroy $np
1065    }
1066    file delete exptool.in exptool.out
1067    # set the powpref warning (2 = required)
1068    set expgui(needpowpref) 2
1069    set msg "A histogram was added" 
1070    if {[string first $msg $expgui(needpowpref_why)] == -1} {
1071        append expgui(needpowpref_why) "\t$msg\n"
1072    }
1073}
1074
1075#--- multiple histogram stuff
1076proc SetMultipleAdd {np} {
1077    global newhist
1078    $np.f6.b6c configure -state disabled
1079    catch {
1080        if {$newhist(instbanks) == [llength $newhist(banklist)] \
1081                && $newhist(instbanks) > 1} {
1082            $np.f6.b6c configure -state normal
1083        }
1084    }
1085}
1086
1087proc addMultiplehist {np} {
1088    global newhist
1089    # should not happen, but just in case
1090    if {$newhist(instbanks) != [llength $newhist(banklist)]} {
1091        $np.f6.b6c configure -state disable
1092        return
1093    }
1094    catch {destroy [set top $np.addMult]}
1095    toplevel $top
1096    grid [canvas $top.canvas \
1097            -scrollregion {0 0 5000 500} -width 0 -height 250 \
1098            -yscrollcommand "$top.scroll set"] \
1099            -column 0 -columnspan 2 -row 1 -sticky nsew
1100    grid columnconfigure $top 0 -weight 1
1101    grid rowconfigure $top 1 -weight 1
1102    scrollbar $top.scroll \
1103            -command "$top.canvas yview"
1104    frame [set cfr $top.canvas.fr]
1105    $top.canvas create window 0 0 -anchor nw -window $cfr
1106    grid [label $top.top -text "Select banks to add" -bg beige] \
1107            -column 0 -columnspan 3 -row 0 -sticky ew
1108    grid [button $top.add -text Add -command "destroy $np"] -column 0 -row 2
1109    grid [button $top.cancel -text Cancel -command "destroy $top"] \
1110            -column 1 -row 2 -columnspan 2
1111
1112    set row 1
1113    grid [label $cfr.t1 -text "Bank\n#"] -column 0 -row 0
1114    switch $newhist(insttype) {
1115        TOF {set txt "T-min\n(ms)"}
1116        ED  {set txt "E-max\n(KeV)"}
1117        default {set txt "2theta\nmax"}
1118    }
1119    grid [label $cfr.t2 -text $txt] -column 1 -row 0
1120    foreach i $newhist(banklist) {
1121        grid [checkbutton $cfr.c$i -text $i \
1122                -variable newhist(usebank$i)] \
1123                -column 0 -row [incr row] -sticky w
1124        set newhist(usebank$i) 1
1125        grid [entry $cfr.e$i -width 8] -column 1 -row $row -sticky w
1126        if {$newhist(insttype) == "TOF"} {
1127            $cfr.e$i config -textvariable newhist(tmin$i)
1128        } else {
1129            $cfr.e$i config -textvariable newhist(tmax$i)
1130        }
1131    }
1132    # resize the list
1133    update
1134    set sizes [grid bbox $top.canvas.fr]
1135    $top.canvas config -scrollregion $sizes -width [lindex $sizes 2]
1136    # use the scroll for BIG lists
1137    if {[lindex $sizes 3] > [winfo height $top.canvas]} {
1138        grid $top.scroll -sticky ns -column 3 -row 1
1139    } else {
1140        grid forget $top.scroll 
1141    }
1142    update
1143    putontop $top
1144    tkwait window $top
1145    afterputontop
1146
1147    if {[winfo exists $np]} return
1148
1149    # validate the input
1150    set err {}
1151    if {[string trim $newhist(rawfile)] == ""} {
1152        append err "  No data file specified\n"
1153    }
1154    if {[string trim $newhist(instfile)] == ""} {
1155        append err "  No instrument parameter file specified\n"
1156    }
1157    foreach i $newhist(banklist) {
1158        if {$newhist(usebank$i)} {
1159            if {[catch {expr $newhist(tmin$i)}]} {
1160                append err "  The Max/Min limit is not valid for bank $i\n"
1161            } elseif {$newhist(tmin$i) <= 0} {
1162                append err "  The Max/Min limit is not valid for bank $i\n"
1163            }
1164        }
1165    }
1166    if {$err != ""} {
1167        MyMessageBox -parent $np -title  "Add Histogram Error" \
1168                -message "The following error(s) were found in your input:\n$err" \
1169                -icon error -type ok -default ok \
1170                -helplink "expgui3.html AddHistErr"
1171        return
1172    }
1173
1174    # ok do it!
1175    global tcl_platform expmap expgui
1176    # Save the current exp file
1177    savearchiveexp
1178    set oldpowderlist $expmap(powderlist)
1179    # disable the file changed monitor
1180    set expgui(expModifiedLast) 0
1181    set expnam [file root [file tail $expgui(expfile)]]
1182    if {$tcl_platform(platform) == "windows"} {
1183        set rfile [file attributes $newhist(rawfile) -shortname]
1184        set ifile [file attributes $newhist(instfile) -shortname]
1185        set exe [file join $expgui(gsasexe) exptool.exe]
1186    } else {
1187        set rfile $newhist(rawfile)
1188        set ifile $newhist(instfile)
1189        set exe [file join $expgui(gsasexe) exptool]
1190    }
1191    set k 0
1192    set added 0
1193    set outlog {}
1194    set err 0
1195    pleasewait "adding histograms" expgui(temp)
1196    foreach i $newhist(banklist) {
1197        incr k
1198        if {$newhist(usebank$i)} {
1199            incr added
1200            set expgui(temp) "adding bank $i"
1201            update
1202            set fp [open exptool.in w]
1203            puts $fp "H"
1204            puts $fp $rfile
1205            puts $fp $ifile
1206            puts $fp $i
1207            puts $fp $k
1208            puts $fp "T"
1209            puts $fp "$newhist(tmin$i)"
1210            puts $fp "/"
1211            puts $fp "X"
1212            puts $fp "X"
1213            close $fp
1214            catch {
1215                exec $exe $expnam < exptool.in >& exptool.out
1216            } errmsg
1217            set fp [open exptool.out r]
1218            set out [read $fp]
1219            close $fp
1220            if {$errmsg != ""} {
1221                append outlog "\n\n\nNOTE ERROR:\n" $errmsg $out
1222                set err 1
1223            } else {
1224                append outlog $out
1225            }
1226        }
1227    }
1228    # load the revised exp file
1229    loadexp $expgui(expfile)
1230    if {[llength $oldpowderlist]+$added != [llength $expmap(powderlist)]} {
1231        set err 1
1232    }
1233    # set the powpref warning (2 = required)
1234    set expgui(needpowpref) 2
1235    set msg "A histogram was added" 
1236    if {[string first $msg $expgui(needpowpref_why)] == -1} {
1237        append expgui(needpowpref_why) "\t$msg\n"
1238    }
1239    file delete exptool.in exptool.out
1240    donewait 
1241    if {$expgui(showexptool) || $err} {
1242        set msg "Please review the result from adding the histogram" 
1243        if {$err} {append msg "\nIt appears an error occurred!"}
1244        ShowBigMessage $np $msg $outlog OK "" $err
1245    }
1246    # select the most recently added histogram
1247    if {!$err} {
1248        set i [llength $expmap(histlistboxcontents)]
1249        if {$i > 0} {
1250            incr i -1
1251            set expgui(curhist) $i
1252            sethistlist
1253        }
1254    }
1255}
1256
1257#----------- Add Atoms routines ----------------------------------------
1258proc MakeAddAtomsBox {phase "atomlist {}"} {
1259    global expmap expgui
1260
1261    # is there room for more atoms? Well, we will check this someday
1262    if {$phase == ""} return
1263    if {[llength $phase] != 1} return
1264
1265    set top .newatoms
1266    catch {destroy $top}
1267    toplevel $top
1268    bind $top <Key-F1> "MakeWWWHelp expgui2.html addatoms"
1269
1270    grid [label $top.l1 -relief groove -bd 4 -anchor center\
1271            -text "Adding atoms to phase #$phase"] \
1272            -column 0 -row 0 \
1273            -sticky we -columnspan 10
1274   
1275    grid [canvas $top.canvas \
1276            -scrollregion {0 0 5000 500} -width 0 -height 250 \
1277            -yscrollcommand "$top.scroll set"] \
1278            -column 0 -row 2 -columnspan 4 -sticky nsew
1279    grid columnconfigure $top 3 -weight 1
1280    grid rowconfigure $top 2 -weight 1
1281    grid rowconfigure $top 1 -pad 5
1282    scrollbar $top.scroll \
1283            -command "$top.canvas yview"
1284    frame $top.canvas.fr
1285    $top.canvas create window 0 0 -anchor nw -window $top.canvas.fr
1286
1287    set np $top.canvas.fr
1288    set row 0
1289    set col 0
1290    grid [label $np.l_${row}0 -text "  #  "] -column $col -row $row
1291    foreach i {Atom\ntype Name x y z Occ Uiso} \
1292            var {type name x y z occ uiso} {
1293        grid [button $np.l_${row}$i -text $i -padx 0 -pady 0 \
1294                -command "sortAddAtoms $phase $top $var"] \
1295                -column [incr col] -row $row -sticky nsew
1296    }
1297    grid [label $np.l_${row}Use -text Use\nFlag] -column [incr col] -row $row
1298
1299    set expgui(SetAddAtomsScroll) 0
1300    set i [llength $atomlist]
1301    if {$i == 0} {incr i}
1302    for {set j 0} {$j < $i} {incr j} {
1303        MakeAddAtomsRow $top
1304    }
1305    set row 0
1306    foreach item $atomlist {
1307        incr row
1308        foreach val $item w {n x y z t o u} {
1309            if {$val != ""} {
1310                $np.e${row}$w delete 0 end
1311                $np.e${row}$w insert end $val
1312            }
1313        }
1314    }
1315    bind $top <Configure> "SetAddAtomsScroll $top"
1316    grid rowconfigure $top 3 -min 10
1317    grid [button $top.b1 -text "Add Atoms"\
1318            -command "addatom $phase $top"] -column 0 -row 5 -sticky w
1319    bind $top <Return> "addatom $phase $top"
1320    grid [button $top.b2 -text Cancel \
1321            -command "destroy $top"] -column 1 -row 5 -sticky w
1322    grid [button $top.help -text Help -bg yellow \
1323            -command "MakeWWWHelp expgui2.html addatoms"] \
1324            -column 0 -columnspan 2 -row 4
1325
1326    # get the input formats if not already defined
1327    GetImportFormats
1328    if {[llength $expgui(importFormatList)] > 0} {
1329        grid [frame $top.fr -bd 4 -relief groove] \
1330                -column 3 -row 5 -columnspan 2 -sticky e
1331        grid [button $top.fr.b3 -text "Import atoms from: " \
1332                -command "ImportAtoms \$expgui(importFormat) $top $phase"] \
1333                -column 0 -row 0 -sticky e
1334        set menu [eval tk_optionMenu $top.fr.b4 expgui(importFormat) \
1335                $expgui(importFormatList)]
1336        for {set i 0} {$i <= [$menu index end]} {incr i} {
1337            $menu entryconfig $i -command "ImportAtoms \$expgui(importFormat) $top $phase"
1338        }
1339        grid $top.fr.b4 -column 1 -row 0 -sticky w
1340        grid rowconfig $top.fr 0 -pad 10
1341        grid columnconfig $top.fr 0 -pad 10
1342        grid columnconfig $top.fr 1 -pad 10
1343    }
1344
1345    grid [button $top.b3 -text  "More atom boxes" \
1346            -command "MakeAddAtomsRow $top"] -column 3 \
1347            -columnspan 2 -row 4 -sticky e
1348   
1349    wm title $top "add new atom"
1350
1351    # set grab, etc.
1352    putontop $top
1353
1354    tkwait window $top
1355
1356    # fix grab...
1357    afterputontop
1358}
1359
1360proc MakeAddAtomsRow {top} {
1361    set np $top.canvas.fr
1362    set col -1
1363    set row 1
1364    # find an empty row
1365    while {![catch {grid info $np.e${row}t}]} {incr row}
1366    grid [label $np.e${row}num -text $row] -column [incr col]  -row $row
1367    grid [entry $np.e${row}t -width 5] -column [incr col]  -row $row
1368    grid [entry $np.e${row}n -width 8] -column [incr col]  -row $row
1369    foreach i {x y z o u} {
1370        grid [entry $np.e${row}$i -width 9] -column [incr col] -row $row
1371    }
1372    grid [checkbutton $np.e${row}use -variable expgui(UseAtom$row)] \
1373            -column [incr col] -row $row
1374    # default occupancy
1375    $np.e${row}o delete 0 end
1376    $np.e${row}o insert end 1.0
1377    # default Uiso
1378    $np.e${row}u delete 0 end
1379    $np.e${row}u insert end 0.025
1380    # default label
1381    $np.e${row}n delete 0 end
1382    $np.e${row}n insert end (default)
1383    # use by default
1384    $np.e${row}use select
1385
1386    SetAddAtomsScroll $top
1387    return $row
1388}
1389
1390proc SetAddAtomsScroll {top} {
1391    global expgui
1392    if $expgui(SetAddAtomsScroll) return
1393    # prevent reentrance
1394    set expgui(SetAddAtomsScroll) 1
1395    update
1396    set sizes [grid bbox $top.canvas.fr]
1397    $top.canvas config -scrollregion $sizes -width [lindex $sizes 2]
1398    # use the scroll for BIG atom lists
1399    if {[lindex $sizes 3] > [winfo height $top.canvas]} {
1400        grid $top.scroll -sticky ns -column 4 -row 2
1401    } else {
1402        grid forget $top.scroll 
1403    }
1404    update
1405    set expgui(SetAddAtomsScroll) 0
1406}
1407
1408# Validate the atoms in the atoms add/phase replace box
1409# returns a null string on error or a list of atoms
1410proc ValidateAtomsBox {top np} {
1411    global expgui
1412    set row 0
1413    # loop over the defined rows
1414    set err {}
1415    set atomlist {}
1416    set validatmtypes {
1417        H H-1 H_1 H_2 D H_3 HE HE_3 HE_4 LI LI+1 LI_6 LI_7 BE BE+2 B B_10
1418        B_11 C CV C_12 C_13 N N_14 N_15 O O-1 O-2 O_16 O_17 O_18 F F-1 F_19 NE
1419        NE_20 NE_21 NE_22 NA NA+1 NA_23 MG MG+2 MG_24 MG_25 MG_26 AL AL+3
1420        AL_27 SI SI+4 SIV SI_28 SI_29 SI_30 P P_31 S S_32 S_33 S_34 CL CL-1
1421        CL_35 CL_37 AR AR_36 AR_40 K K+1 K_39 K_41 CA CA+2 CA_40 CA_44 SC SC+3
1422        SC_45 TI TI+2 TI+3 TI+4 TI_46 TI_47 TI_48 TI_49 TI_50 V V+2 V+3 V+5
1423        V_51 CR CR+2 CR+3 CR_50 CR_52 CR_53 CR_54 MN MN+2 MN+3 MN+4 MN_55 FE
1424        FE+2 FE+3 FE_54 FE_56 FE_57 FE_58 CO CO+2 CO+3 CO_59 NI NI+2 NI+3
1425        NI_58 NI_60 NI_61 NI_62 NI_64 CU CU+1 CU+2 CU_63 CU_65 ZN ZN+2 ZN_64
1426        ZN_66 ZN_67 ZN_68 GA GA+3 GE GE+4 AS AS_75 SE BR BR-1 BR_79 BR_81 KR
1427        RB RB+1 SR SR+2 Y Y+3 Y_89 ZR ZR+4 NB NB+3 NB+5 NB_93 MO MO+3 MO+5
1428        MO+6 TC TC_98 RU RU+3 RU+4 RH RH+3 RH+4 RH_103 PD PD+2 PD+4 AG AG+1
1429        AG+2 CD CD+2 CD_112 CD_113 CD_114 CD_116 IN IN+3 IN_113 IN_115 SN SN+2
1430        SN+4 SB SB+3 SB+5 TE I I-1 I_127 XE CS CS+1 CS_133 BA BA+2 LA LA+3 CE
1431        CE+3 CE+4 PR PR+3 PR+4 PR_141 ND ND+3 PM PM+3 PM_147 SM SM+3 SM_152
1432        SM_154 EU EU+2 EU+3 EU_153 GD GD+3 GD_160 TB TB+3 TB_159 DY DY+3 HO
1433        HO+3 HO_165 ER ER+3 TM TM+3 TM_169 YB YB+2 YB+3 LU LU+3 HF HF+4 TA
1434        TA+5 TA_181 W W+6 RE OS OS+4 IR IR+3 IR+4 PT PT+2 PT+4 AU AU+1 AU+3
1435        AU_197 HG HG+1 HG+2 TL TL+1 TL+3 PB PB+2 PB+4 BI BI+3 BI+5 BI_209 PO
1436        PO_210 AT AT_210 RN RN_222 FR FR_223 RA RA+2 RA_226 AC AC+3 AC_227 TH
1437        TH+4 TH_232 PA PA_231 U U+3 U+4 U+6 U_235 U_238 NP NP+3 NP+4 NP+6
1438        NP_237 PU PU+3 PU+4 PU+6 PU_239 PU_240 PU_242 AM AM_243 CM CM_244 BK
1439        BK_247 CF CF_249
1440    }
1441    # loop over the defined rows
1442    while {![catch {grid info $np.e[incr row]t}]} {
1443        if !{$expgui(UseAtom$row)} continue
1444        # ignore blank entries
1445        set line {}
1446        foreach i {t x y z} {
1447            append line [string trim [$np.e${row}$i get]]
1448        }
1449        if {$line == ""} continue
1450
1451        # validate the input
1452        if {[set type [string trim [$np.e${row}t get]]] == ""} {
1453            append err "  line $row: No atom type specified\n"
1454        }
1455        if {[lsearch $validatmtypes [string toupper $type]] == -1} {
1456            append err "  line $row: Atom type $type is invalid for GSAS\n"
1457        }
1458        set name [string trim [$np.e${row}n get]]
1459        if {$name == "(default)"} {set name "/"}
1460        if {$name == ""} {set name "/"}
1461        foreach i {x y z o u} n {x y z Occ Uiso} {
1462            if {[set $i [string trim [$np.e${row}$i get]]] == ""} {
1463                append err "  line $row: No value specified for $n\n"
1464            } elseif {[catch {expr [set $i]}]} {
1465                append err "  line $row: The value for $n is invalid\n"
1466            }
1467        }
1468        lappend atomlist "$type $x $y $z $o $name I $u"
1469    }
1470    if {$err != ""} {
1471        MyMessageBox -icon warning -message "Note Errors:\n$err" -parent $top
1472        return {}
1473    }
1474    if {[llength $atomlist] == 0} {
1475        MyMessageBox -icon warning -message "No atoms to load!" -parent $top
1476        return {}
1477    }
1478    return $atomlist
1479}
1480
1481proc addatom {phase top} {
1482    global expgui env expmap
1483    set np $top.canvas.fr
1484    # validate the atoms info
1485    set atomlist [ValidateAtomsBox $top $np]
1486    if {$atomlist == ""} return
1487
1488    # ok add the atoms!
1489    set fp [open exptool.in w]
1490    puts $fp "A"
1491    puts $fp $phase
1492    # number of atoms
1493    puts $fp [llength $atomlist]
1494    foreach atomline $atomlist {
1495        puts $fp $atomline
1496    }
1497    close $fp
1498    # needed in UNIX
1499    set env(ATOMDATA) [file join $expgui(gsasdir) data atmdata.dat]
1500    set env(gsas) [file nativename $expgui(gsasdir)]
1501    # needed in Windows
1502    set env(GSAS) [file nativename $expgui(gsasdir)]
1503
1504    global tcl_platform
1505    # Save the current exp file
1506    savearchiveexp
1507    # disable the file changed monitor
1508    set expgui(expModifiedLast) 0
1509    set expnam [file root [file tail $expgui(expfile)]]
1510    catch {
1511        if {$tcl_platform(platform) == "windows"} {
1512            exec [file join $expgui(gsasexe) exptool.exe] $expnam \
1513                    < exptool.in >& exptool.out
1514        } else {
1515            exec [file join $expgui(gsasexe) exptool] $expnam \
1516                    < exptool.in >& exptool.out
1517        }
1518    } errmsg
1519    # load the revised exp file
1520    set oldatomlist $expmap(atomlist_$phase)
1521    loadexp $expgui(expfile)
1522    set fp [open exptool.out r]
1523    set out [read $fp]
1524    close $fp
1525    destroy $top
1526    set err 0
1527    if {[llength $oldatomlist] == [llength $expmap(atomlist_$phase))]} {
1528        set err 1
1529    }
1530    if {$errmsg != ""} {
1531        append errmsg "\n" $out
1532        set err 1
1533    } else {
1534        set errmsg $out
1535    }
1536    if {$expgui(showexptool) || $err} {
1537        set msg "Please review the result from adding the atom(s)" 
1538        if {$err} {append msg "\nIt appears an error occurred!"}
1539        ShowBigMessage $top $msg $errmsg OK "" $err
1540    }
1541    file delete exptool.in exptool.out
1542}
1543
1544#---------------------------------------------------------------------------
1545# commands to modify a group of selected atoms
1546#---------------------------------------------------------------------------
1547
1548# make the dialog to choose an action
1549proc MakeXformAtomsBox {phase} {
1550    global expgui expmap
1551    set numberList {}
1552    set p $expgui(curPhase)
1553    foreach AtomIndex $expgui(selectedatomlist) {
1554        # get atom number & phase
1555        set tuple [lindex $expmap(atomlistboxcontents) $AtomIndex]
1556        lappend numberList [lindex $tuple 0]
1557    }
1558    if {$numberList == ""} return
1559    if {[llength $numberList] > 1} {
1560        set suffix s
1561        set suffixy "ies"
1562    } else {
1563        set suffix ""
1564        set suffixy "y"
1565    }
1566    set w .global
1567    catch {destroy $w}
1568    toplevel $w
1569    wm title $w "Edit Atomic Parameter -- phase #$phase"
1570    bind $w <Key-F1> "MakeWWWHelp expgui2.html xform"
1571    # this needs to track by phase
1572    grid [label $w.0 \
1573            -text "Modifying atom${suffix} [CompressList $numberList] Phase $phase" \
1574            -bg yellow -anchor center] -row 0 -column 0 -columnspan 10 \
1575            -sticky nsew
1576    grid rowconfigure $w 0 -pad 5
1577    grid rowconfigure $w 1 -minsize 2
1578
1579    grid [TitleFrame $w.1 -bd 6 -relief groove -text "Modify coordinates"] \
1580            -row 2 -column 0 -columnspan 10 -sticky news
1581    set w1 [$w.1 getframe]
1582    set row 0
1583    foreach v {x y z} {
1584        incr row
1585        set col -1
1586        grid [label $w1.l$v -text "new $v   =   "] -column [incr col] -row $row
1587        foreach o {x y z} {
1588            grid [entry $w1.e${v}${o} -width 6] -column [incr col] -row $row
1589            $w1.e${v}${o} delete 0 end
1590            if {$v == $o} {
1591                $w1.e${v}${o} insert end "1.0"
1592            } else {
1593                $w1.e${v}${o} insert end "0."
1594            }
1595            grid [label $w1.p${v}${o} -text " $o  +  "] \
1596                    -column [incr col] -row $row
1597        }
1598        grid [entry $w1.e${v} -width 6] -column [incr col] -row $row
1599        $w1.e${v} delete 0 end
1600        $w1.e${v} insert end "0."
1601    }
1602    grid [button $w1.do -text "Transform Coordinates" \
1603            -command "XformAtomsCoord $phase [list $numberList] $w1" \
1604            ] -row [incr row] -column 0 -columnspan 10
1605
1606    set shift [GetOrigin1Shift $phase]
1607    grid [button $w1.d1 -text "Xform Origin 1 to Origin 2" \
1608              -command "XformAtoms2Origin2 $phase [list $numberList] $w1 [list $shift]" \
1609             ] -row [incr row] -column 3 -columnspan 10 -sticky e
1610    if {$shift == ""} {$w1.d1 config -state disabled}
1611
1612    grid [button $w1.d4 -text "Reset Multiplicities" \
1613                -command "ResetMultiplicities $phase $w" \
1614                ] -row $row -column 0 -columnspan 3 -sticky w
1615
1616
1617    grid rowconfigure $w 3 -minsize 5
1618    grid [TitleFrame $w.4 -bd 6 -relief groove -text "Modify occupanc${suffixy}"] \
1619            -row 4 -column 0 -columnspan 10 -sticky news
1620    set w2 [$w.4 getframe]
1621    grid [label $w2.1 -text "Occupancy: "] -row 1 -column 0
1622    grid [entry $w2.e -width 10] -column 1 -row 1
1623    $w2.e delete 0 end
1624    $w2.e insert end 1.0
1625    grid columnconfigure $w2 2 -weight 1
1626    grid [button $w2.do -text "Set Occupanc${suffixy}" \
1627            -command "XformAtomsOcc $phase [list $numberList] $w2" \
1628            ] -row 2 -column 0 -columnspan 10
1629
1630    grid rowconfigure $w 5 -minsize 5
1631    grid [TitleFrame $w.6 -bd 6 -relief groove \
1632            -text "Modify Displacement Parameter$suffix"] \
1633            -row 6 -column 0 -columnspan 10 -sticky news
1634    set w2 [$w.6 getframe]
1635    grid [entry $w2.e -width 10] -column 1 -row 1
1636    $w2.e delete 0 end
1637    $w2.e insert end 0.025
1638    grid columnconfigure $w2 2 -weight 1
1639    grid [button $w2.do -text "Set U" \
1640            -command "XformAtomsU $phase [list $numberList] $w2" \
1641            ] -row 2 -column 0 -columnspan 10
1642    grid [frame $w2.f] -row 3 -column 0 -columnspan 10
1643
1644    if {[lindex $expmap(phasetype) [expr {$p - 1}]] != 4} {
1645        grid [label $w2.1 -text "Uiso or Uequiv: "] -row 1 -column 0
1646        grid [button $w2.f.iso -text "Set Isotropic" \
1647                -command "XformAtomsU $phase [list $numberList] iso" \
1648                ] -row 0 -column 0
1649        grid [button $w2.f.aniso -text "Set Anisotropic" \
1650                -command "XformAtomsU $phase [list $numberList] aniso" \
1651                ] -row 0 -column 1
1652    } else {
1653        grid [label $w2.1 -text "Uiso: "] -row 1 -column 0
1654    }
1655
1656    grid rowconfigure $w 7 -minsize 5
1657    if {[lindex $expmap(phasetype) [expr {$p - 1}]] != 4} {
1658        grid [TitleFrame $w.8 -bd 6 -relief groove \
1659                -text "Erase Atom$suffix"] \
1660                -row 8 -column 0 -columnspan 10 -sticky news
1661        set w2 [$w.8 getframe]
1662        grid [button $w2.do -text "Erase Atom${suffix}" \
1663                -command "EraseAtoms $phase [list $numberList] $w" \
1664                ] -row 2 -column 0 -columnspan 10
1665    }
1666
1667    grid rowconfigure $w 11 -minsize 5
1668    grid [frame $w.b] -row 12 -column 0 -columnspan 10 -sticky ew
1669    pack [button $w.b.3 -text Close -command "destroy $w"] -side left \
1670            -padx 5 -pady 5
1671    pack [button $w.b.help -text Help -bg yellow \
1672            -command "MakeWWWHelp expgui2.html xform"] -side right \
1673            -padx 5 -pady 5
1674    bind $w <Return> "destroy $w"
1675
1676    # force the window to stay on top
1677    putontop $w
1678    focus $w.b.3
1679    tkwait window $w
1680    afterputontop
1681    # if there are selected atoms, reset their display
1682    if {[llength $expgui(selectedatomlist)] != 0} editRecord
1683}
1684
1685# transform the coordinates
1686proc XformAtomsCoord {phase numberList w1} {
1687    global expgui expmap
1688    if {[lindex $expmap(phasetype) [expr {$phase - 1}]] == 4} {
1689        set cmd mmatominfo
1690    } else {
1691        set cmd atominfo
1692    }
1693    # get the matrix
1694    foreach v {x y z} {
1695        foreach o {x y z} {
1696            set matrix(${v}${o}) [$w1.e${v}${o} get]
1697        }
1698        set matrix(${v}) [$w1.e${v} get]
1699    }
1700    foreach atom $numberList {
1701        foreach v {x y z} {
1702            set $v [$cmd $phase $atom $v]
1703        }
1704        foreach v {x y z} {
1705            set new$v $matrix(${v})
1706            foreach o {x y z} {
1707                set new$v [expr [set new$v] + $matrix(${v}${o})*[set $o]]
1708            }
1709            $cmd $phase $atom $v set [set new$v]
1710        }
1711        incr expgui(changed)
1712    }
1713    # update multiplicities for the phase
1714    set parent [winfo toplevel $w1]
1715    ResetMultiplicities $phase $parent
1716    SelectOnePhase $phase
1717    MyMessageBox -parent $parent -type OK -default ok -title "Transform applied" \
1718        -message "The coordinates of atoms [CompressList $numberList] have been transformed"
1719#    UpdateAtomLine $numberList $phase
1720    destroy $parent
1721}
1722
1723# set the occupancies to a single value
1724proc XformAtomsOcc {phase numberList w2} {
1725    global expgui expmap
1726    if {[lindex $expmap(phasetype) [expr {$phase - 1}]] == 4} {
1727        set cmd mmatominfo
1728    } else {
1729        set cmd atominfo
1730    }
1731    # get the value
1732    set val [$w2.e get]
1733    foreach atom $numberList {
1734        $cmd $phase $atom frac set $val
1735        incr expgui(changed)
1736    }
1737    UpdateAtomLine $numberList $phase
1738}
1739
1740# transform Uiso or Uij; if anisotropic set Uequiv to Uij
1741proc XformAtomsU {phase numberList w2} {
1742    global expgui
1743    if {$w2 == "iso"} {
1744        foreach atom $numberList {
1745            if {[atominfo $phase $atom temptype] != "I"} {
1746                atominfo $phase $atom temptype set I
1747                incr expgui(changed)
1748            }
1749        }
1750    } elseif {$w2 == "aniso"} {
1751        foreach atom $numberList {
1752            if {[atominfo $phase $atom temptype] == "I"} {
1753                atominfo $phase $atom temptype set A
1754                incr expgui(changed)
1755            }
1756        }
1757    } else {
1758        # get the value
1759        set val [$w2.e get]
1760        foreach atom $numberList {
1761            global expmap
1762            if {[lindex $expmap(phasetype) [expr {$phase - 1}]] == 4} {
1763                mmatominfo $phase $atom Uiso set $val
1764            } elseif {[atominfo $phase $atom temptype] == "I"} {
1765                atominfo $phase $atom Uiso set $val
1766            } else {
1767                atominfo $phase $atom U11 set $val
1768                atominfo $phase $atom U22 set $val
1769                atominfo $phase $atom U33 set $val
1770                atominfo $phase $atom U12 set 0.0
1771                atominfo $phase $atom U13 set 0.0
1772                atominfo $phase $atom U23 set 0.0
1773            }
1774            incr expgui(changed)
1775        }
1776    }
1777    UpdateAtomLine $numberList $phase
1778}
1779
1780# confirm and erase atoms
1781proc EraseAtoms {phase numberList w2} {
1782    global expgui
1783    if {[llength $numberList] <= 0} return
1784    # make a list of atoms
1785    foreach atom $numberList {
1786        append atomlist "\n\t$atom  [atominfo $phase $atom label]"
1787    }
1788    set msg "OK to remove the following [llength $numberList] atoms from phase $phase:$atomlist"
1789    set val [MyMessageBox -parent $w2 -type okcancel -icon warning \
1790            -default cancel -title "Confirm Erase" -message $msg]
1791    if {$val == "ok"} {
1792        foreach atom $numberList {
1793            EraseAtom $atom $phase
1794            incr expgui(changed)
1795        }
1796        mapexp
1797        DisplayAllAtoms $phase
1798        destroy $w2
1799    }
1800}
1801
1802#----------- more Add Phase routines (import) -------------------------------
1803proc ImportPhase {format np} {
1804    global expgui
1805    foreach item $expgui(extensions_$format) {
1806        lappend typelist [list $format $item]
1807    }
1808    lappend typelist [list "All files" *]
1809    set file [tk_getOpenFile -parent $np -filetypes $typelist]
1810    if {![file exists $file]} return
1811    # read in the file
1812    set input [$expgui(proc_$format) $file]
1813    catch {
1814        $np.bf.b1 config -text "Continue" -command "addphase $np; AddAtomsList"
1815        bind $np <Return> "addphase $np; AddAtomsList"
1816    }
1817    catch {
1818        $np.t1 delete 0 end
1819        $np.t1 insert end "from $file"
1820    }
1821    $np.t2 delete 0 end
1822    $np.t2 insert end [lindex $input 0]
1823    foreach i {.e1a .e1b .e1c .e2a .e2b .e2g} val [lindex $input 1] {
1824        $np.f$i delete 0 end
1825        $np.f$i insert end $val
1826    }
1827    set expgui(coordList) [lindex $input 2]
1828    set msg [lindex $input 3]
1829    if {$msg != ""} {
1830        catch {destroy $np.msg}
1831        grid [label $np.msg -text $msg -fg red -anchor center -bd 4 -relief raised] \
1832                -column 0 -columnspan 99 -row 20 -sticky ew
1833    }
1834}
1835
1836proc ImportAtoms {format top phase} {
1837    global expgui
1838    foreach item $expgui(extensions_$format) {
1839        lappend typelist [list $format $item]
1840    }
1841    lappend typelist [list "All files" *]
1842    set file [tk_getOpenFile -parent $top -filetypes $typelist]
1843    if {![file exists $file]} return
1844    # disable during read
1845    catch {
1846        foreach b "$top.b1 $top.b2 $top.fr.b3" {
1847            $b config -state disabled
1848        }
1849    }
1850    # read in the file
1851    set input [$expgui(proc_$format) $file]
1852    # add atoms to table
1853    foreach item [lindex $input 2] {
1854        set row [MakeAddAtomsRow $top]
1855        set np $top.canvas.fr
1856        foreach val $item w {n x y z t o u} {
1857            if {$val != ""} {
1858                $np.e${row}$w delete 0 end
1859                $np.e${row}$w insert end $val
1860            }
1861        }
1862    }
1863    # sort the atoms by number, so that empty entries are at the bottom
1864    sortAddAtoms $phase $top number
1865    # reenable
1866    catch {
1867        foreach b "$top.b1 $top.b2 $top.fr.b3" {
1868            $b config -state normal
1869        }
1870    }
1871}
1872
1873proc AddAtomsList {} {
1874    global expgui expmap
1875    # skip if we aborted out of addphase
1876    if {$expgui(oldphaselist) == -1} return
1877    # find the new phase
1878    set phase {}
1879    foreach p $expmap(phaselist) {
1880        if {[lsearch $expgui(oldphaselist) $p] == -1} {
1881            set phase $p
1882            break
1883        }
1884    }
1885    if {$phase == ""} return
1886    MakeAddAtomsBox $phase $expgui(coordList)
1887}
1888
1889# get the input formats by sourcing files named import_*.tcl
1890proc GetImportFormats {} {
1891    global expgui tcl_platform
1892    # only needs to be done once
1893    if [catch {set expgui(importFormatList)}] {
1894        set filelist [glob -nocomplain [file join $expgui(scriptdir) import_*.tcl]]
1895        foreach file $filelist {
1896            set description ""
1897            source $file
1898            if {$description != ""} {
1899                lappend expgui(importFormatList) $description
1900                if {$tcl_platform(platform) == "unix"} {
1901                    set extensions "[string tolower $extensions] [string toupper $extensions]"
1902                }
1903                set expgui(extensions_$description) $extensions
1904                set expgui(proc_$description) $procname
1905            }
1906        }
1907    }
1908}
1909
1910proc MakeReplacePhaseBox {} {
1911    global expmap expgui tcl_platform
1912
1913    set expgui(coordList) {}
1914    # ignore the command if no phase is selected
1915    foreach p {1 2 3 4 5 6 7 8 9} {
1916        if {[lsearch $expmap(phaselist) $expgui(curPhase)] == -1} {
1917            return
1918        }
1919    }
1920
1921    set top .newphase
1922    catch {destroy $top}
1923    toplevel $top
1924    bind $top <Key-F1> "MakeWWWHelp expgui2.html replacephase"
1925
1926    grid [label $top.l1 -text "Replacing phase #$expgui(curPhase)" \
1927            -bg yellow -anchor center] -column 0 -columnspan 8 -row 0 -sticky ew
1928    grid [label $top.l3a -text "Current Space Group: "] \
1929            -column 0 -row 2 -columnspan 2 -sticky e
1930    grid [label $top.l3b -text [phaseinfo $expgui(curPhase) spacegroup]\
1931            -bd 4 -relief groove] \
1932            -column 2 -row 2  -sticky ew
1933    grid [label $top.l4 -text "New Space Group: "] \
1934            -column 0 -row 3 -columnspan 2 -sticky e
1935    grid [entry $top.t2 -width 12] -column 2 -row 3 -sticky w
1936    grid [radiobutton $top.r1 -text "Reenter current atoms"\
1937            -variable expgui(DeleteAllAtoms) -value 0] \
1938            -column 1 -row 4 -columnspan 8 -sticky w
1939    grid [radiobutton $top.r2 -text "Delete current atoms" \
1940            -variable expgui(DeleteAllAtoms) -value 1] \
1941            -column 1 -row 5 -columnspan 8 -sticky w
1942   
1943    grid [frame $top.f -bd 4 -relief groove] \
1944            -column 3 -row 2 -columnspan 3 -rowspan 4
1945    set col -1
1946    foreach i {a b c} {
1947        grid [label $top.f.l1$i -text " $i "] -column [incr col] -row 1
1948        grid [entry $top.f.e1$i -width 12] -column [incr col]  -row 1
1949        $top.f.e1$i delete 0 end
1950        $top.f.e1$i insert 0 [phaseinfo $expgui(curPhase) $i]
1951    }
1952    set col -1
1953    foreach i {a b g} var {alpha beta gamma} {
1954        grid [label $top.f.l2$i -text $i] -column [incr col] -row 2
1955        set font [$top.f.l2$i cget -font]
1956        $top.f.l2$i config -font "Symbol [lrange $font 1 end]"
1957        grid [entry $top.f.e2$i -width 12] -column [incr col]  -row 2
1958        $top.f.e2$i delete 0 end
1959        $top.f.e2$i insert 0 [phaseinfo $expgui(curPhase) $var]
1960    } 
1961
1962    grid [button $top.b1 -text Continue \
1963            -command "replacephase1 $top $expgui(curPhase)"] \
1964            -column 0 -row 6 -sticky w
1965    bind $top <Return> "replacephase1 $top $expgui(curPhase)"
1966    grid [button $top.b2 -text Cancel \
1967            -command "destroy $top"] -column 1 -row 6 -sticky w
1968    grid [button $top.help -text Help -bg yellow \
1969            -command "MakeWWWHelp expgui2.html replacephase"] \
1970            -column 2 -row 6
1971
1972    # get the input formats if not already defined
1973    GetImportFormats
1974    if {[llength $expgui(importFormatList)] > 0} {
1975        grid [frame $top.fr -bd 4 -relief groove] \
1976                -column 2 -row 6 -columnspan 8 -sticky e
1977        grid [button $top.fr.b3 -text "Import phase from: " \
1978                -command "ImportPhase \$expgui(importFormat) $top"] \
1979                -column 0 -row 0 -sticky e
1980        set menu [eval tk_optionMenu $top.fr.b4 expgui(importFormat) \
1981                $expgui(importFormatList)]
1982        for {set i 0} {$i <= [$menu index end]} {incr i} {
1983            $menu entryconfig $i -command "ImportPhase \$expgui(importFormat) $top"
1984        }
1985        grid $top.fr.b4 -column 1 -row 0 -sticky w
1986        grid rowconfig $top.fr 0 -pad 10
1987        grid columnconfig $top.fr 0 -pad 10
1988        grid columnconfig $top.fr 1 -pad 10
1989#       grid columnconfig $top 4 -weight 1
1990        grid columnconfig $top 2 -weight 1
1991    }
1992   
1993    wm title $top "Replace phase $expgui(curPhase)"
1994
1995    # set grab, etc.
1996    putontop $top
1997
1998    tkwait window $top
1999
2000    # fix grab...
2001    afterputontop
2002}
2003
2004proc replacephase1 {top phase} {
2005    # validate cell & space group & save to pass
2006    global expgui expmap
2007    set expgui(SetAddAtomsScroll) 0
2008    # validate the input
2009    set err {}
2010    set spg [$top.t2 get]
2011    if {[string trim $spg] == ""} {
2012        append err "  Space group cannot be blank\n"
2013    }
2014    set cell {}
2015    foreach i {a b c a b g} lbl {a b c alpha beta gamma} n {1 1 1 2 2 2} {
2016        set $lbl [$top.f.e${n}$i get]
2017        if {[string trim [set $lbl]] == ""} {
2018            append err "  $lbl cannot be blank\n"
2019        } elseif {[catch {expr [set $lbl]}]} {
2020            append err "  [set $lbl] is not valid for $lbl\n"
2021        }
2022        lappend cell [set $lbl]
2023    }
2024
2025    if {$err != ""} {
2026        MyMessageBox -parent $top -title "Replace Phase Error" -icon warning \
2027                -message "The following error(s) were found in your input:\n$err" 
2028        return
2029    }
2030
2031    # check the space group
2032    set fp [open spg.in w]
2033    puts $fp "N"
2034    puts $fp "N"
2035    puts $fp $spg
2036    puts $fp "Q"
2037    close $fp
2038    global tcl_platform
2039    catch {
2040        if {$tcl_platform(platform) == "windows"} {
2041            exec [file join $expgui(gsasexe) spcgroup.exe] < spg.in >& spg.out
2042        } else {
2043            exec [file join $expgui(gsasexe) spcgroup] < spg.in >& spg.out
2044        }
2045    }
2046    set fp [open spg.out r]
2047    set out [read $fp]
2048    close $fp
2049    # attempt to parse out the output (fix up if parse did not work)
2050    if {[regexp "space group symbol.*>(.*)Enter a new space group symbol" \
2051            $out a b ] != 1} {set b $out}
2052    if {[string first Error $b] != -1} {
2053        # got an error, show it
2054        ShowBigMessage \
2055                 $top.error \
2056                 "Error processing space group\nReview error message below" \
2057                 $b OK "" 1
2058        return
2059    } else {
2060        # show the result and confirm
2061        set opt [ShowBigMessage \
2062                $top.check \
2063                "Check the symmetry operators in the output below" \
2064                $b \
2065                {Continue Redo} ]
2066        if {$opt > 1} return
2067    }
2068    file delete spg.in spg.out
2069    # draw coordinates box
2070    eval destroy [winfo children $top]
2071    grid [label $top.l1 -relief groove -bd 4 -anchor center\
2072            -text "Atom list for phase #$phase"] \
2073            -column 0 -row 0 \
2074            -sticky we -columnspan 10
2075    grid [canvas $top.canvas \
2076            -scrollregion {0 0 5000 500} -width 0 -height 250 \
2077            -yscrollcommand "$top.scroll set"] \
2078            -column 0 -row 2 -columnspan 4 -sticky nsew
2079    grid columnconfigure $top 3 -weight 1
2080    grid rowconfigure $top 2 -weight 1
2081    grid rowconfigure $top 1 -pad 5
2082    scrollbar $top.scroll \
2083            -command "$top.canvas yview"
2084    frame $top.canvas.fr
2085    $top.canvas create window 0 0 -anchor nw -window $top.canvas.fr
2086
2087    set np $top.canvas.fr
2088    set row 0
2089    set col 0
2090    grid [label $np.l_${row}0 -text "  #  "] -column $col -row $row
2091    foreach i {Atom\ntype Name x y z Occ Uiso} \
2092            var {type name x y z occ uiso} {
2093        grid [button $np.l_${row}$i -text $i -padx 0 -pady 0 \
2094                -command "sortAddAtoms $phase $top $var"] \
2095                -column [incr col] -row $row -sticky nsew
2096    }
2097    grid [label $np.l_${row}Use -text Use\nFlag] -column [incr col] -row $row
2098
2099    # add the old atoms, if appropriate
2100    if {!$expgui(DeleteAllAtoms)} {
2101        # loop over all atoms
2102        foreach atom $expmap(atomlist_$phase) {
2103            set row [MakeAddAtomsRow $top]
2104            # add all atoms in the current phase to the list
2105            foreach w {n x y z t o} var {label x y z type frac} {
2106                $np.e${row}$w delete 0 end
2107                $np.e${row}$w insert end [atominfo $phase $atom $var]
2108            }
2109            $np.e${row}u delete 0 end
2110            if {[atominfo $phase $atom temptype] == "I"} {
2111                $np.e${row}u insert end [atominfo $phase $atom Uiso]
2112            } else {
2113                $np.e${row}u insert end [expr ( \
2114                        [atominfo $phase $atom U11] + \
2115                        [atominfo $phase $atom U22] + \
2116                        [atominfo $phase $atom U33]) / 3.]
2117            }
2118        }
2119    }
2120
2121    # add coordinates that have been read in, if any
2122    foreach item $expgui(coordList) {
2123        set row [MakeAddAtomsRow $top]
2124        foreach val $item w {n x y z t o u} {
2125            if {$val != ""} {
2126                $np.e${row}$w delete 0 end
2127                $np.e${row}$w insert end $val
2128            }
2129        }
2130    }
2131    # a blank spot in the table
2132    MakeAddAtomsRow $top
2133
2134    bind $top <Configure> "SetAddAtomsScroll $top"
2135    grid rowconfigure $top 3 -min 10
2136    grid [button $top.b1 -text "Continue"\
2137            -command "replacephase2 $phase $top [list $spg] [list $cell]"] \
2138            -column 0 -row 5 -sticky w
2139    bind $top <Return> "replacephase2 $phase $top [list $spg] [list $cell]"
2140    grid [button $top.b2 -text Cancel \
2141            -command "destroy $top"] -column 1 -row 5 -sticky w
2142    if {[llength $expgui(importFormatList)] > 0} {
2143        grid [frame $top.fr -bd 4 -relief groove] \
2144                -column 3 -row 5 -columnspan 2 -sticky e
2145        grid [button $top.fr.b3 -text "Import atoms from: " \
2146                -command "ImportAtoms \$expgui(importFormat) $top $phase"] \
2147                -column 0 -row 0 -sticky e
2148        set menu [eval tk_optionMenu $top.fr.b4 expgui(importFormat) \
2149                $expgui(importFormatList)]
2150        for {set i 0} {$i <= [$menu index end]} {incr i} {
2151            $menu entryconfig $i -command "ImportAtoms \$expgui(importFormat) $top $phase"
2152        }
2153        grid $top.fr.b4 -column 1 -row 0 -sticky w
2154        grid rowconfig $top.fr 0 -pad 10
2155        grid columnconfig $top.fr 0 -pad 10
2156        grid columnconfig $top.fr 1 -pad 10
2157    }
2158
2159    grid [button $top.b3 -text  "More atom boxes" \
2160            -command "MakeAddAtomsRow $top"] -column 3 \
2161            -columnspan 2 -row 4 -sticky e
2162   
2163    wm title $top "Replacing phase: Enter atoms"
2164    SetAddAtomsScroll $top
2165
2166    # fix grab for old window
2167    afterputontop
2168    # set grab, etc.
2169    putontop $top
2170}
2171
2172proc replacephase2 {phase top spg cell} {
2173    global expgui expmap env
2174    # validate coordinates
2175    set np $top.canvas.fr
2176    # validate the atoms info
2177    set atomlist [ValidateAtomsBox $top $np]
2178    if {$atomlist == ""} return
2179
2180    pleasewait "updating phase"
2181    # replace spacegroup and cell
2182    phaseinfo $phase spacegroup set $spg
2183    foreach val $cell var {a b c alpha beta gamma} {
2184        phaseinfo $phase $var set $val
2185    }
2186    incr expgui(changed) 
2187    # delete all atoms
2188    foreach i $expmap(atomlist_$phase) {
2189        EraseAtom $i $phase
2190        incr expgui(changed) 
2191    }
2192    # write new atoms from table as input to exptool
2193    set fp [open exptool.in w]
2194    puts $fp "A"
2195    puts $fp $phase
2196    # number of atoms
2197    puts $fp [llength $atomlist]
2198    foreach atomline $atomlist {
2199        puts $fp $atomline
2200        incr expgui(changed) 
2201    }
2202    close $fp
2203    # needed in UNIX
2204    set env(ATOMDATA) [file join $expgui(gsasdir) data atmdata.dat]
2205    set env(gsas) [file nativename $expgui(gsasdir)]
2206    # needed in Windows
2207    set env(GSAS) [file nativename $expgui(gsasdir)]
2208
2209    global tcl_platform
2210    # Save the current exp file
2211    savearchiveexp
2212    # disable the file changed monitor
2213    set expgui(expModifiedLast) 0
2214    set expnam [file root [file tail $expgui(expfile)]]
2215    catch {
2216        if {$tcl_platform(platform) == "windows"} {
2217            exec [file join $expgui(gsasexe) exptool.exe] $expnam \
2218                    < exptool.in >& exptool.out
2219        } else {
2220            exec [file join $expgui(gsasexe) exptool] $expnam \
2221                    < exptool.in >& exptool.out
2222        }
2223    } errmsg
2224    # load the revised exp file
2225    loadexp $expgui(expfile)
2226    set fp [open exptool.out r]
2227    set out [read $fp]
2228    close $fp
2229    set err 0
2230    if {[llength $atomlist] != [llength $expmap(atomlist_$phase))]} {
2231        set err 1
2232    }
2233    if {$errmsg != ""} {
2234        append errmsg "\n" $out
2235        set err 1
2236    } else {
2237        set errmsg $out
2238    }
2239    donewait 
2240    if {$expgui(showexptool) || $err} {
2241        set msg "Please review the result from adding the atom(s)" 
2242        if {$err} {append msg "\nIt appears an error occurred!"}
2243        ShowBigMessage $top $msg $errmsg OK "" $err
2244    }
2245    file delete exptool.in exptool.out
2246    # set the powpref warning (2 = required)
2247    set expgui(needpowpref) 2
2248    set msg "A phase was replaced"
2249    if {[string first $msg $expgui(needpowpref_why)] == -1} {
2250        append expgui(needpowpref_why) "\t$msg\n"
2251    }
2252    destroy $top
2253}
2254
2255proc sortAddAtoms {phase top sortvar} {
2256    global expgui
2257    set np $top.canvas.fr
2258    set validlist {}
2259    set invalidlist {}
2260    set row 0
2261    while {![catch {grid info $np.e[incr row]t}]} {
2262        set valid 1
2263        set line $row
2264        if !{$expgui(UseAtom$row)} {set valid 0}
2265        lappend line $expgui(UseAtom$row)
2266        if {[set type [string trim [$np.e${row}t get]]] == ""} {set valid 0}
2267        lappend line [string trim [$np.e${row}t get]]
2268        lappend line [string trim [$np.e${row}n get]]
2269        foreach i {x y z o u} {
2270            set tmp [string trim [$np.e${row}$i get]]
2271            lappend line $tmp
2272            if {$tmp == "" || [catch {expr $tmp}]} {set valid 0}
2273        }
2274        if {$valid} {
2275            lappend validlist $line
2276        } else {
2277            lappend invalidlist $line
2278        }
2279    }
2280    switch $sortvar {
2281        type {set sortlist [lsort -index 2 -dictionary $validlist]}
2282        name {set sortlist [lsort -index 3 -dictionary $validlist]}
2283        x {set sortlist [lsort -index 4 -real $validlist]}
2284        y {set sortlist [lsort -index 5 -real $validlist]}
2285        z {set sortlist [lsort -index 6 -real $validlist]}
2286        occ {set sortlist [lsort -index 7 -real $validlist]}
2287        uiso  {set sortlist [lsort -index 8 -real $validlist]}
2288        default {set sortlist $validlist}
2289    }
2290
2291    if {[llength $invalidlist] > 0} {append sortlist " $invalidlist"}
2292    set row 0
2293    foreach line $sortlist {
2294        incr row
2295        set expgui(UseAtom$row) [lindex $line 1]
2296        foreach item [lrange $line 2 end] \
2297                var {t n x y z o u} {
2298            $np.e${row}$var delete 0 end
2299            $np.e${row}$var insert end $item
2300        }
2301    }
2302}
2303
2304proc EditInstFile {"filename {}"} {
2305    global expgui
2306    # on the first call, load the commands
2307    if {[catch {
2308        if {[info procs instMakeWindow] == ""} {
2309            source [file join $expgui(scriptdir) instedit.tcl]
2310        }
2311    } errmsg]} {
2312        MyMessageBox -parent . -title "Load error" \
2313                -message "Unexpected error while sourcing file instedit.tcl: $errmsg" \
2314                -icon error
2315    }
2316    instMakeWindow $filename
2317}
2318
2319# load a list of Origin 1/2 space groups
2320proc GetOrigin12List {} {
2321    # don't need to read the file twice
2322    if {[array names ::Origin1list] != ""} return
2323    set line {}
2324    set fp1 [open [file join $::expgui(scriptdir) spacegrp.ref] r]
2325    while {[lindex $line 1] != 230} {
2326        if {[gets $fp1 line] < 0} break
2327    }
2328    while {[gets $fp1 line] >= 0} {
2329        set key [string tolower [lindex $line 8]]
2330        regsub -all " " $key "" key
2331        regsub -- "-3" $key "3" key
2332        if {$key != ""} {
2333#       puts "$key -- [lindex $line 1] [lindex $line 8] [lindex $line 9]"
2334            set ::Origin1list($key) [lindex $line 9]
2335        }
2336    }
2337    close $fp1
2338}
2339
2340# get the shift to be added to origin 1 coordinates to obtain origin 2 settings
2341proc GetOrigin1Shift {phase} {
2342    GetOrigin12List
2343    set spg [string tolower [phaseinfo $phase spacegroup]]
2344    regsub -all " " $spg "" spg
2345    regsub -- "-3" $spg "3" spg
2346    if {[catch {set shift $::Origin1list($spg)}]} {
2347        return ""
2348    } else {
2349        return $shift
2350    }
2351}
2352
2353proc XformAtoms2Origin2 {phase numberList w1 shift} {
2354    global expgui expmap
2355    set parent [winfo toplevel $w1]
2356    if {[llength $numberList] != [llength $expmap(atomlist_$phase)]} {
2357        # not all atoms were selected in phase -- do a sanity check
2358        set msg {You have selected only some atoms to be shifted. Do you want to shift all atoms or only the selected atoms?}
2359        set val [MyMessageBox -parent $parent -icon warning \
2360                     -type "{Use all} {Use Selection}" -default "use all" \
2361                     -title "Shift all" -message $msg]
2362#       puts "$phase $numberList $w1 $shift"
2363        if {$val == "use all"} {set numberList $expmap(atomlist_$phase)}
2364    }
2365    if {[lindex $expmap(phasetype) [expr {$phase - 1}]] == 4} {
2366        set cmd mmatominfo
2367    } else {
2368        set cmd atominfo
2369    }
2370    foreach atom $numberList {
2371        foreach v {x y z} vs $shift {
2372            set c [$cmd $phase $atom $v]
2373            $cmd $phase $atom $v set [expr {$c + $vs}]
2374        }
2375        incr expgui(changed)
2376    }
2377
2378    ResetMultiplicities $phase $parent
2379    SelectOnePhase $phase
2380    MyMessageBox -parent $parent -type OK -default ok -title "Shift applied" \
2381        -message "A shift of \"$shift\" has been added to coordinates of atoms [CompressList $numberList]"
2382#    UpdateAtomLine $numberList $phase
2383    destroy $parent
2384}
2385
2386# reset the site multiplicities using the EXPEDT program
2387proc ResetMultiplicities {phase parent} {
2388    global expgui tcl_platform
2389    set input [open resetmult.inp w]
2390    puts $input "Y"
2391    puts $input "l a p $phase"
2392    puts $input "l"
2393    puts $input "x x x"
2394    puts $input "x"
2395    close $input
2396    # Save the current exp file
2397    savearchiveexp
2398    # disable the file changed monitor
2399    set expgui(expModifiedLast) 0
2400    set expnam [file root [file tail $expgui(expfile)]]
2401    set err [catch {
2402        if {$tcl_platform(platform) == "windows"} {
2403            exec [file join $expgui(gsasexe) expedt.exe] $expnam < resetmult.inp >& resetmult.out
2404        } else {
2405            exec [file join $expgui(gsasexe) expedt] $expnam < resetmult.inp >& resetmult.out
2406        }
2407    } errmsg]
2408    loadexp $expgui(expfile)
2409    catch {file delete resetmult.inp}
2410    if {$expgui(showexptool) || $err} {
2411        set fp [open resetmult.out r]
2412        set out [read $fp]
2413        close $fp
2414        if {$errmsg != ""} {
2415            append errmsg "\n" $out
2416        } else {
2417            set errmsg $out
2418        }
2419        set msg "Please review the result from listing the phase." 
2420        if {$err} {append msg "\nIt appears an error occurred!"}
2421        ShowBigMessage $parent.msg $msg $errmsg OK "" $err
2422    }
2423}
2424
2425# default values
2426set newhist(insttype) {}
2427set newhist(dummy) 0
2428set newhist(instfiletext) {}
Note: See TracBrowser for help on using the repository browser.