source: trunk/odf.tcl @ 478

Last change on this file since 478 was 422, checked in by toby, 13 years ago

# on 2001/09/04 22:11:44, toby did:
adjustable fonts

  • Property rcs:author set to toby
  • Property rcs:date set to 2001/09/04 22:11:44
  • Property rcs:lines set to +5 -3
  • Property rcs:rev set to 1.5
  • Property rcs:state set to Exp
  • Property svn:keywords set to Author Date Revision Id
File size: 12.7 KB
Line 
1# $Id: odf.tcl 422 2009-12-04 23:05:54Z toby $
2proc LaueCode2number {laueaxis} {
3    switch -exact $laueaxis {
4        1bar {return 1}
5        2/ma -
6        2/mb -
7        2/mc {return 2}
8        mmm  {return 3}
9        4/{return 4}
10        4/mmm {return 5}
11        3barR     {return 6}
12        "3bar mR" {return 7}
13        3bar    {return 8} 
14        3barm1 {return 9}
15        3bar1m  {return 10}
16        6/m    {return 11}
17        6/mmm  {return 12}
18        "m 3"  {return 13}
19        m3m    {return 14}
20        default {return ""}
21    }
22}
23
24# computes a list of ODF (l,m,n) terms for a given spherical harmonic order,
25#   sample symmetry and Laue symmetry
26proc ComputeODFterms {order ISAMSYM laueaxis} {
27
28    set laue [LaueCode2number $laueaxis]
29
30    set odflist {}
31    set ITOT 0
32    for {set I 2} {$I <= $order} {incr I 2} {
33        for {set M -$I} {$M <= $I} {incr M 1} {
34            if {[odfchk $ISAMSYM $I $M]} {
35                for {set N -$I} {$N <= $I} {incr N 1} {
36                    if {[odfchk $laue $I $N]} {
37                        incr ITOT
38                        lappend odflist [list $I $M $N]
39                    }
40                }
41            }
42        }
43    }
44    return $odflist
45}
46
47#PURPOSE: To determine if spherical harmonic term C(l,m) is allowed
48#   in LAUE group
49# based on GSAS FUNCTION ODFCHK(LAUE,L,M)
50proc odfchk {laue l m} {
51
52    set ODFCHK 0
53    if { $l % 2 == 0 && abs($m) <= $l } {
54        if { $laue == 0 } {
55            #Cylindricaly symmetric
56            if { $m == 0 } {set ODFCHK 1}
57        } elseif { $laue == 1 } {
58            #1-bar
59            set ODFCHK 1
60        } elseif { $laue == 2 } {
61            #2/m
62            if { abs($m) % 2 == 0 } {set ODFCHK 1}
63        } elseif { $laue == 3 } {
64            #mmm
65            if { abs($m) % 2 == 0 && $m >= 0 } {set ODFCHK 1}
66        } elseif { $laue == 4 } {
67            #4/m
68            if { abs($m) % 4 == 0 } {set ODFCHK 1}
69        } elseif { $laue == 5 } {
70            #4/mmm
71            if { abs($m) % 4 == 0 && $m >= 0 } {set ODFCHK 1}
72        } elseif { $laue == 6 } {
73            #R-3 R
74            if { abs($m) % 3 == 0 } {set ODFCHK 1}
75        } elseif { $laue == 7 } {
76            #R-3m R
77            if { abs($m) % 3 == 0 && $m >= 0 } {set ODFCHK 1}
78        } elseif { $laue == 8 } {
79            #-3
80            if { abs($m) % 3 == 0 } {set ODFCHK 1}
81        } elseif { $laue == 9 } {
82            #-3m1
83            if { abs($m) % 3 == 0 && $m >= 0 } {set ODFCHK 1}
84        } elseif { $laue == 10 } {
85            #-31m
86            if { abs($m) % 3 == 0 && $m >= 0 } {set ODFCHK 1}
87        } elseif { $laue == 11 } {
88            #6/m
89            if { abs($m) % 6 == 0 } {set ODFCHK 1}
90        } elseif { $laue == 12 } {
91            #6/mmm
92            if { abs($m) % 6 == 0 && $m >= 0 } {set ODFCHK 1}
93        } elseif { $laue == 13 } {
94            #m3
95            if { $m > 0 } {
96                if { $l % 12 == 2 } {
97                    if {$m <= ($l/12) } {set ODFCHK 1}
98                } else {
99                    if {$m <= ($l/12+1) } {set ODFCHK 1}
100                }
101            }
102        } elseif { $laue == 14 } {
103            #m3m
104            if { $m > 0 } {
105                if { $l % 12 == 2 } {
106                    if {$m <= ($l/12) } {set ODFCHK 1}
107                } else {
108                    if {$m <= ($l/12+1) } {set ODFCHK 1}
109                }
110            }
111        }
112    }
113    return $ODFCHK
114}
115
116proc MakeODFPane {} {
117    global expgui entryvar entrycmd entrybox
118    if $expgui(haveBW) {
119        pack [TitleFrame $expgui(odfFrame).f1 -bd 4 \
120                -text "Spherical Harmonic (ODF) Preferential Orientation" \
121                -relief groove] -side top -expand yes -fill x -anchor n
122        set expgui(odfFrameTop) [$expgui(odfFrame).f1 getframe]
123    } else {
124        pack [label $expgui(odfFrame).f0 \
125                -text "Spherical Harmonic (ODF) Preferential Orientation"] \
126                -side top -expand yes -fill x -anchor n
127        set expgui(odfFrameTop) [frame $expgui(odfFrame).top]
128        grid $expgui(odfFrameTop) -side top -expand yes -fill x -anchor n
129    }
130
131    grid [frame  $expgui(odfFrameTop).ps] -column 0 -row 0 -sticky w
132    # this is where the buttons will go
133    pack [label $expgui(odfFrameTop).ps.0 -text "No Phases"] -side left
134   
135    grid [label $expgui(odfFrameTop).lA -text " title:" \
136            -fg blue ] -column 1 -row 0 -sticky e
137    grid columnconfig $expgui(odfFrameTop) 1 -weight 1
138    grid [entry $expgui(odfFrameTop).lB -textvariable entryvar(phasename) \
139            -fg blue -width 45] -column 2 -columnspan 10 -row 0 -sticky e
140    grid columnconfigure $expgui(odfFrameTop) 1 -weight 1
141
142    set row 1
143    set angframe [frame $expgui(odfFrameTop).ang]
144    grid $angframe -row 2 -column 0 -columnspan 10
145    grid [label $angframe.l -text "Setting\nangles: "] \
146            -column 0 -row $row
147    foreach col {1 4 7} var {omega chi phi} lbl {w c f} {
148        grid [label $angframe.l$var -text $lbl] \
149                -column $col -row $row -padx 5 -sticky e
150        set font [$angframe.l$var cget -font]
151        $angframe.l$var config -font "Symbol [lrange $font 1 end]"
152        incr col
153        grid [checkbutton $angframe.r$var \
154                -variable entryvar(ODF${var}Ref)] \
155                -column $col -row $row 
156        incr col
157        grid [entry $angframe.e$var \
158                -textvariable entryvar(ODF$var) -width 10] \
159                -column $col -row $row -padx 5
160        set entrybox(ODF$var) $angframe.e$var
161    }
162    grid [label $angframe.lDamp -text "Damping  "] \
163            -column [incr col] -row $row
164    tk_optionMenu $angframe.om entryvar(ODFdampA) 0 1 2 3 4 5 6 7 8 9
165    grid $angframe.om -column [incr col] -row $row
166
167    #
168    set ordframe [frame $expgui(odfFrameTop).ord]
169    grid $ordframe -row 1 -column 0 -columnspan 10
170    set col -1
171    grid [label $ordframe.lo -text "Spherical\nHarmonic Order: "] \
172            -column [incr col] -row $row
173    set ordmenu [tk_optionMenu $ordframe.ord expgui(ODForder) 0]
174    $ordmenu delete 0 end
175    for {set i 0} {$i <= 34} {incr i 2} {
176        $ordmenu insert end radiobutton -variable expgui(ODForder) \
177                -label $i -value $i -command SetODFTerms
178    }
179    $ordframe.ord config -width 3
180    grid $ordframe.ord -column [incr col] -row $row
181
182    grid [label $ordframe.ls -text "Sample\nsymmetry: "] \
183            -column [incr col] -row $row
184    set expgui(ODFsym) {}
185    set expgui(symmenu) [tk_optionMenu $ordframe.sym expgui(ODFsymLbl) \
186            Cylindrical None "Shear (2/m)" "Rolling (mmm)"]
187    grid $ordframe.sym -column [incr col] -row $row
188    for {set i 0} {$i <= [$expgui(symmenu) index end]} {incr i} {
189        $expgui(symmenu) entryconfigure $i -command "SetODFSym $i"
190    }
191    $ordframe.sym config -width 12
192    grid [label $ordframe.lr -text "Refine ODF\ncoefficients"] \
193                -column [incr col] -row $row -padx 5 -sticky e
194    grid [checkbutton $ordframe.r \
195                -variable entryvar(ODFRefcoef)] \
196                -column [incr col] -row $row 
197    grid [label $ordframe.lDamp -text "Damping  "] \
198            -column [incr col] -row $row
199    tk_optionMenu $ordframe.om entryvar(ODFdampC) 0 1 2 3 4 5 6 7 8 9
200    grid $ordframe.om -column [incr col] -row $row
201    if $expgui(haveBW) {
202        pack [TitleFrame $expgui(odfFrame).f2 -bd 4 \
203                -text "Spherical Harmonic Terms: (l,m,n) & coeff's" \
204                -relief groove] -side top -fill both -expand yes -anchor n
205        set canvasfr [$expgui(odfFrame).f2 getframe]
206    } else {
207        set canvasfr [frame $expgui(odfFrame).f3 -bd 4 -relief groove]
208        pack $canvasfr -side top -expand yes -fill both -anchor n
209        grid [label $canvasfr.l \
210                -text "Spherical Harmonic Terms: (l,m,n) & coeff's"] \
211                -sticky news -row 0 -column 0 
212    }
213
214    set expgui(odfFrameCanvas) $canvasfr.canvas
215    set expgui(odfFrameScroll) $canvasfr.scroll
216    grid [canvas $expgui(odfFrameCanvas) \
217            -scrollregion {0 0 5000 500} -width 0 -height 250 \
218            -yscrollcommand "$expgui(odfFrameScroll) set"] \
219            -row 3 -column 0 -sticky ns
220    grid rowconfigure $expgui(odfFrameTop) 3 -weight 1
221    scrollbar $expgui(odfFrameScroll) \
222            -command "$expgui(odfFrameCanvas) yview"
223    frame $expgui(odfFrameCanvas).fr
224    $expgui(odfFrameCanvas) create window 0 0 -anchor nw -window $expgui(odfFrameCanvas).fr
225}
226
227proc SetODFSym {i} {
228    global expgui
229    if {$expgui(ODFsym) == $i} return
230    set expgui(ODFsym) $i
231    set expgui(ODForder) 0
232    SetODFTerms
233}
234
235proc SetODFTerms {} {
236    global expgui
237    if {$expgui(curPhase) == ""} return
238    set curterms [phaseinfo $expgui(curPhase) ODFterms]
239    set laueaxis [GetLaue [phaseinfo $expgui(curPhase) spacegroup]]
240    set newterms [ComputeODFterms $expgui(ODForder) $expgui(ODFsym) $laueaxis]
241    phaseinfo $expgui(curPhase) ODFterms set $newterms
242    phaseinfo $expgui(curPhase) ODForder set $expgui(ODForder)
243    phaseinfo $expgui(curPhase) ODFsym set $expgui(ODFsym)
244    # zero out the new terms
245    for {set i [expr [llength $curterms]+1]} \
246            {$i <= [llength $newterms]} {incr i} {
247        phaseinfo $expgui(curPhase) ODFcoef$i set 0.
248   }
249    incr expgui(changed)
250    SelectODFPhase $expgui(curPhase)
251}
252
253proc DisplayODFPane {} {
254    global expgui expmap
255    eval destroy [winfo children $expgui(odfFrameTop).ps]
256    pack [label $expgui(odfFrameTop).ps.0 -text Phase:] -side left
257    foreach num $expmap(phaselist) type $expmap(phasetype) {
258        pack [button $expgui(odfFrameTop).ps.$num -text $num \
259                -command "SelectODFPhase $num" -padx 1.5m] -side left
260        if {$type > 3} {
261            $expgui(odfFrameTop).ps.$num config -state disabled
262        }
263    }
264    # select the current phase
265    SelectODFPhase $expgui(curPhase)
266}
267
268proc SelectODFPhase {num} {
269    global entryvar entrycmd entrybox expmap expgui
270    set crsPhase {}
271    foreach n $expmap(phaselist) type $expmap(phasetype) {
272        if {$n == $num && $type <= 3} {
273            set crsPhase $num
274            catch {$expgui(odfFrameTop).ps.$num config -relief sunken}
275        } else { 
276            catch {$expgui(odfFrameTop).ps.$n config -relief raised}
277        }
278    }
279
280    # disable traces on entryvar until we are ready
281    set entrycmd(trace) 0
282
283    eval destroy [winfo children $expgui(odfFrameCanvas).fr]
284
285    if {$crsPhase == "" || [llength $expmap(phaselist)] == 0} {
286        # blank out the page
287        set expgui(ODFsymLbl) {}
288        set expgui(ODForder) {}
289        foreach var {omega chi phi omegaRef chiRef phiRef \
290                dampC dampA Refcoef} {
291            set entrycmd(ODF$var) {}
292            set entryvar(ODF$var) {}
293        }
294        set entryvar(phasename) {}
295        set entryvar(phasename) {}
296        grid forget $expgui(odfFrameScroll) 
297        set entrycmd(trace) 1
298        return
299    }
300    # phase name
301    set entrycmd(phasename) "phaseinfo $crsPhase name"
302    set entryvar(phasename) [phaseinfo $crsPhase name]
303    # ODFsym   -- sample symmetry (0-3) (*)
304    # prevent SetODFTerms from being run
305    set expgui(curPhase) {}
306    catch {$expgui(symmenu) invoke 0}
307    catch {$expgui(symmenu) invoke [phaseinfo $crsPhase ODFsym]}
308    set expgui(curPhase) $crsPhase
309    # ODForder -- spherical harmonic order (*)
310    set expgui(ODForder) [phaseinfo $expgui(curPhase) ODForder]
311    # ODFomega -- omega oriention angle (*)
312    # ODFchi -- chi oriention angle (*)
313    # ODFphi -- phi oriention angle (*)
314    # ODFomegaRef -- refinement flag for omega (*)
315    # ODFchiRef -- refinement flag for chi (*)
316    # ODFphiRef -- refinement flag for phi (*)
317    # ODFdampA -- damping for angles (*)
318    # ODFdampC -- damping for coefficients (*)
319    # ODFRefcoef -- refinement flag for ODF terms (*)
320    foreach var {omega chi phi omegaRef chiRef phiRef dampC dampA Refcoef} {
321        set entrycmd(ODF$var) "phaseinfo $expgui(curPhase) ODF$var"
322        set entryvar(ODF$var) [eval $entrycmd(ODF$var)]
323        # reset to black
324        catch {$entrybox(ODF$var) config -fg black}
325    }
326    #
327    set row 0
328    set term 0
329    set col 99
330    #     ODFterms -- a list of the {l m n} values for each ODF term (*)
331    #     ODFcoefXXX -- the ODF coefficient for for ODF term XXX (*)
332    set textureindex 1.0
333    foreach lmn [phaseinfo $expgui(curPhase) ODFterms] {
334        # make sure that numbers are separated by spaces
335        regsub -all -- "-" $lmn " -" lmn
336        incr term
337        if {$col > 5} {
338            incr row 2
339            grid rowconfig $expgui(odfFrameCanvas).fr $row \
340                    -minsize 2 -pad 10
341            set col 0
342        }
343        set lbl [eval format (%d,%d,%d) $lmn]
344        grid [label $expgui(odfFrameCanvas).fr.l$term -text $lbl] \
345                -column [incr col] -row $row -sticky s
346#       grid columnconfig $expgui(odfFrameCanvas).fr $col -pad 4
347        grid [entry $expgui(odfFrameCanvas).fr.e$term \
348                -width 10 -textvariable entryvar(ODFcoef$term)] \
349                -column $col -row [expr $row+1]
350        set entrycmd(ODFcoef$term) "phaseinfo $expgui(curPhase) ODFcoef$term"
351        set entryvar(ODFcoef$term) [eval $entrycmd(ODFcoef$term)]
352        set entrybox(ODFcoef$term) $expgui(odfFrameCanvas).fr.e$term
353        grid columnconfig $expgui(odfFrameCanvas).fr $col -pad 12
354        set textureindex [expr {$textureindex + \
355                ($entryvar(ODFcoef$term) * $entryvar(ODFcoef$term)) \
356                / ((2. * [lindex $lmn 0]) + 1.)}]
357    }
358
359    if {$term == 0} {
360        grid [label $expgui(odfFrameCanvas).fr.no -text "no terms" \
361                -anchor center] \
362                -column 0 -row 0 -sticky nsew
363    } else {
364        incr row 2
365        grid [label $expgui(odfFrameCanvas).fr.last \
366                -bd 2 -relief sunken -anchor center \
367                -text "Texture index = [format %.4f $textureindex]" ] \
368                -column 1 -columnspan 6 -row $row -sticky ew
369        grid rowconfig $expgui(odfFrameCanvas).fr $row -pad 12
370    }
371    # resize
372    update 
373    set sizes [grid bbox $expgui(odfFrameCanvas).fr]
374    set maxhgt 220
375    # use the scroll for BIG atom lists
376    if {[lindex $sizes 3] > $maxhgt} {
377        grid $expgui(odfFrameScroll) -sticky ns -column 1 -row 3
378        set height $maxhgt
379    } else {
380        grid forget $expgui(odfFrameScroll) 
381        set height [lindex $sizes 3]
382    }
383    $expgui(odfFrameCanvas) config -scrollregion $sizes \
384            -width [lindex $sizes 2] -height $height
385    set entrycmd(trace) 1
386}
387
388#debug code
389#set expgui(odfFrame) .test
390#catch {destroy $expgui(odfFrame)}
391#toplevel $expgui(odfFrame)
392#MakeODFPane
393#DisplayODFPane
Note: See TracBrowser for help on using the repository browser.