1#!/bin/tcsh -f
2
3set stat = 0
4set RNS = `3dnewid -fun`
5set log = /tmp/${RNS}.RL.log
6
7if ("$1" == "" || "$1" == '-h' || "$1" == '-help') then
8   goto HELP
9endif
10
11goto PARSE
12RETURN_PARSE:
13
14GETLABELS:
15   #Get the labels and values of the grouped labels
16   if (1) then
17      set llist = (`@MakeLabelTable -labeltable $grpd_labeltable -all_labels`)
18      set vlist = (`@MakeLabelTable -labeltable $grpd_labeltable -all_keys`)
19   endif
20   if ($#llist == 0) then
21      echo "Error: Have no labels"
22      goto BEND
23   endif
24
25   #Get labeltable of label_dset
26   @MakeLabelTable -labeltable_of_dset $label_dset > /tmp/${RNS}.__lt.niml.lt
27   if ($status) then
28      echo "Failed to get labeltable of $label_dset"
29      goto BEND
30   endif
31
32   set noglob
33   set com = 0
34   set c = 1
35   foreach ll ($llist)
36      #use range, easier than getting each value
37      set rng = `@MakeLabelTable -word_label_match \
38                                 -labeltable /tmp/${RNS}.__lt.niml.lt -rkeys $ll`
39      if ( $status == 0) then
40         set com = ("$com" + "$vlist[$c]*within(a,$rng[1],$rng[2])" )
41      else
42         echo "Key $ll not found in labeltable of $label_dset, ignoring it"
43      endif
44      @ c ++
45   end
46
47   if ($mask_dset != '') then
48      3dcalc -a $label_dset -b $mask_dset \
49             -expr "step(b)*($com)" -prefix $grpd_labprefix >>& $log
50      if ($status) then
51         echo "3dcalc command failed"
52         cat $log
53         goto BEND
54      endif
55   else
56      3dcalc -a $label_dset -expr "($com)" -prefix $grpd_labprefix >>& $log
57      if ($status) then
58         echo "3dcalc command failed"
59         cat $log
60         goto BEND
61      endif
62   endif
63
64
65   3drefit -labeltable $grpd_labeltable $grpd_labprefix >>& $log
66
67   #Now combine the probabilities
68   if ($p_dset != '') then
69      set v = `@GetAfniView $p_dset`
70      if (`@CheckForAfniDset /tmp/${RNS}.__gg$v` > 0) \rm -f /tmp/${RNS}.__gg*
71      foreach ll ($llist)
72         #Get all labels from /tmp/${RNS}.__lt.niml.lt
73         set llset = `@MakeLabelTable -labeltable /tmp/${RNS}.__lt.niml.lt \
74                              -word_label_match -match_label $ll`
75         echo "Notice: labels $llset map to grouped label $ll"
76         set subsel = ""
77         set psets = ''
78         set c = 1
79         while ($c <= $#llset)
80            set att = `3dAttribute -quote -ssep ';' \
81                         BRICK_LABS $p_dset           | \
82                       tr ';' '\n'                    | \
83                       sed "s/^'//g" | sed "s/'"'$//g'   `
84            echo $att | \grep -w $llset[$c] >>& $log
85            if ($status) then
86               echo "Ignoring label $llset[$c], not in $p_dset ..."
87            else
88               foreach attr ($att)
89                  echo $attr | \grep -w $llset[$c] >>& $log
90                  if ($status) then
91                  else
92                     set subsel = ($subsel $attr)
93                     set psets = ("$psets" $p_dset'['$attr']')
94                  endif
95               end
96            endif
97
98            @ c ++
99         end
100         if ($#subsel > 1) then
101            #a little slow a selection process, but safe
102            3dbucket -overwrite -prefix /tmp/${RNS}.__tt $psets >>& $log
103            if ($status) goto BEND
104            3dTstat -max \
105                  -overwrite -prefix /tmp/${RNS}.__ttm \
106                  /tmp/${RNS}.__tt$v >>& $log
107            if ($status) goto BEND
108            3drefit  -sublabel 0 "p.$ll" /tmp/${RNS}.__ttm$v  >>& $log
109            3dbucket -aglueto /tmp/${RNS}.__gg$v  \
110                     /tmp/${RNS}.__ttm$v >>& $log
111            if ($status) goto BEND
112         endif
113         unset noglob
114         if ( `@CheckForAfniDset /tmp/${RNS}.__tt$v+orig` >= 2) \
115                        \rm -f /tmp/${RNS}.__tt*
116         set noglob
117      end
118      if (`@CheckForAfniDset /tmp/${RNS}.__gg$v` >= 2) then
119         #calc sum
120         3dTstat -sum -prefix /tmp/${RNS}.__ss /tmp/${RNS}.__gg$v >>& $log
121         if ($status) then
122            echo "Something went wrong"
123            goto BEND
124         endif
125         set mbs = `3dBrickStat -min -max /tmp/${RNS}.__ss$v`
126         set mbs[1] = `ccalc -i "isnegative($mbs[1])"`
127         set mbs[2] = `ccalc -i "step(isnegative($mbs[2])+iszero($mbs[2]))"`
128         if ($mbs[1] == 1 && $mbs[2] == 1) then
129            echo "WARNING: Log p being grouped the STUPID way"
130            echo "YOU SHOULD BE DOING THE grouping in 3dGenPriors"
131            goto BEND
132            #scale
133            3dcalc -overwrite -a /tmp/${RNS}.__gg$v \
134                           -b /tmp/${RNS}.__ss$v -expr "bool(b)*(1-a/b)"   \
135                  -prefix $grpd_pprefix >>& $log
136         else
137            #scale
138            3dcalc -overwrite -a /tmp/${RNS}.__gg$v \
139                           -b /tmp/${RNS}.__ss$v -expr "step(b)*a/b"   \
140                  -prefix $grpd_pprefix >>& $log
141         endif
142         unset noglob
143         \rm -f /tmp/${RNS}.__gg* /tmp/${RNS}.__ss* /tmp/${RNS}.__tt*
144         set noglob
145      endif
146   endif
147
148   unset noglob
149
150goto END
151
152PARSE:
153   set grpd_labeltable = ''
154   set llist = ''
155	set Narg = $#
156   set label_dset = ''
157   set p_dset = ''
158   set mask_dset = ''
159   set grpd_labprefix = ''
160   set grpd_pprefix = ''
161   set verb = 0
162	set cnt = 1
163   while ($cnt <= $Narg)
164      if ("$argv[$cnt]" == "-d" || "$argv[$cnt]" == "-echo") then
165         set NxtInd = $cnt
166         set verb = 1
167         set echo
168      endif
169
170      if ("$argv[$cnt]" == "-verb") then
171         set NxtInd = $cnt
172         set verb = 1
173      endif
174
175      if ("$argv[$cnt]" == "-grouped_labeltable") then
176         set SubLoc = $cnt
177		   if ($SubLoc == $Narg) then
178				echo "Need file after -grouped_labeltable"
179            goto BEND
180			else
181				@ cnt ++
182				set grpd_labeltable = `@NoExt "$argv[$cnt]" .niml .niml.lt`
183            set grpd_labeltable = $grpd_labeltable.niml.lt
184            if (! -f $grpd_labeltable) then
185               echo "Error $grpd_labeltable not found"
186               goto BEND
187            endif
188            set NxtInd = $cnt
189			endif
190      endif
191
192      #Do not allow for labels to be given separately
193		if (0 && "$argv[$cnt]" == "-labels") then
194         set nneed = `ccalc -i $cnt + 1`
195         if ($nneed > $Narg) then
196				echo "Need at least 1 values after -labels"
197            goto BEND
198			else
199				@ cnt ++
200            set llist = ''
201            while ($argv[$cnt] !~ -* && $cnt <= $Narg)
202               set llist = ($llist $argv[$cnt])
203               @ cnt ++
204            end
205            if ($argv[$cnt] =~ -*) @ cnt --
206            set NxtInd = $cnt
207			endif
208      endif
209
210      if ("$argv[$cnt]" == "-labdset") then
211         if ($cnt > $Narg) then
212            echo "Need a dset after -labdset"
213            goto BEND
214         endif
215         @ cnt ++
216         set label_dset = $argv[$cnt]
217         if (`@CheckForAfniDset $label_dset` < 2) then
218            echo "-labdset $label_dset not found"
219            goto BEND
220         endif
221         set NxtInd = $cnt
222      endif
223
224      if ("$argv[$cnt]" == "-pdset") then
225         if ($cnt > $Narg) then
226            echo "Need a dset after -pdset"
227            goto BEND
228         endif
229         @ cnt ++
230         set p_dset = $argv[$cnt]
231         if (`@CheckForAfniDset $p_dset` < 2) then
232            echo "-pdset $p_dset not found"
233            goto BEND
234         endif
235         set NxtInd = $cnt
236      endif
237
238      if ("$argv[$cnt]" == "-mask") then
239         if ($cnt > $Narg) then
240            echo "Need a dset after -mask"
241            goto BEND
242         endif
243         @ cnt ++
244         set mask_dset = $argv[$cnt]
245         if (`@CheckForAfniDset $mask_dset` < 2) then
246            echo "-mask $mask_dset not found"
247            goto BEND
248         endif
249         set NxtInd = $cnt
250      endif
251
252      if ("$argv[$cnt]" == "-grpd_labprefix") then
253         if ($cnt > $Narg) then
254            echo "Need a prefix after -grpd_labprefix"
255            goto BEND
256         endif
257         @ cnt ++
258         set grpd_labprefix = $argv[$cnt]
259         if (`@CheckForAfniDset $grpd_labprefix` > 0) then
260            echo "-grpd_labprefix $grpd_labprefix exists already"
261            goto BEND
262         endif
263         set NxtInd = $cnt
264      endif
265      if ("$argv[$cnt]" == "-grpd_pprefix") then
266         if ($cnt > $Narg) then
267            echo "Need a prefix after -grpd_pprefix"
268            goto BEND
269         endif
270         @ cnt ++
271         set grpd_pprefix = $argv[$cnt]
272         if (`@CheckForAfniDset $grpd_pprefix` > 0) then
273            echo "-grpd_pprefix $grpd_pprefix exists already"
274            goto BEND
275         endif
276         set NxtInd = $cnt
277      endif
278      @ cnt ++
279	end
280
281   @ NxtInd ++
282   if ( $NxtInd > $#argv ) then
283      set others_list = ( )
284   else
285      set others_list = ( $argv[$NxtInd-$#argv] )
286   endif
287
288   if ($#others_list > 0) then
289      echo "Options $others_list not understood"
290      goto BEND
291   endif
292   if ($grpd_labeltable == '') then
293      echo "Have not grouped_labeltable"
294      goto BEND
295   endif
296
297   if (0) then
298      echo "Have:"
299      echo $llist
300      echo $llistmin
301      echo $llistmax
302   endif
303
304   goto RETURN_PARSE
305
306HELP:
307   echo ""
308   echo "Script used to create a label table "
309   echo ""
310   echo "Usage: `basename $0` <-grouped_labeltable LABELTABLE> "
311   echo "                     <-labdset DSET> <-grpd_grpd_labprefix PREFIX>"
312   echo "   -grouped_labeltable LABELTABLE: Name of label table providing"
313   echo "                                grouped categories"
314   echo ""
315   echo "Example 1:"
316   echo "      @RegroupLabels -grouped_labeltable Classes.niml.lt \"
317   echo "                     -labdset s01.test.cls+orig.HEAD \"
318   echo "                     -grpd_labprefix s01.test.cls3+orig \"
319   echo "                     -pdset s01.test.clsp+orig \"
320   echo "                     -grpd_pprefix s01.test.clsp3+orig"
321   echo ""
322
323   goto END
324
325BEND:
326   if ( -f $log) cat $log
327   set stat = 1
328   goto END
329
330END:
331if ($stat == 0 && -f /tmp/${RNS}.__lt.niml.lt) \rm -f /tmp/${RNS}.__lt.niml.lt
332if ($stat == 0 && -f $log) \rm /tmp/${RNS}.RL.log
333exit $stat
334