1 #ifndef SUMA_XCOLBAR_INCLUDED
2 #define SUMA_XCOLBAR_INCLUDED
3 
4 #define SUMA_CMAP_WIDTH    20
5 #define SUMA_CMAP_HEIGHT   300
6 #define SUMA_SCALE_SLIDER_WIDTH 18
7 #define SUMA_SCALE_WIDTH 70
8 #define SUMA_SCALE_HEIGHT  SUMA_CMAP_HEIGHT
9 #define SUMA_CMAP_ORIGIN   0.0,  0.0,     0.0
10 #define SUMA_CMAP_TOPLEFT  SUMA_CMAP_WIDTH, SUMA_CMAP_HEIGHT,   0.0
11 #define SUMA_CMAP_VIEW_FROM (2 * SUMA_CMAP_HEIGHT)
12 #define SUMA_CMAP_FOV_INITIAL 28.07249 /*!< 2 * atan((double)SUMA_CMAP_HEIGHT/2.0/(double)SUMA_CMAP_VIEW_FROM) * 180 * SUMA_PI , see labbook page 3 */
13 #if 0 /* the old one */
14    #define SUMA_RANGE_STRING(m_nel, m_i, m_str_min, m_str_max, m_range){  \
15       int m_loc[2];  \
16       if (SUMA_GetColRange(m_nel, m_i, m_range, m_loc)) {   \
17          sprintf(m_str_min, "%.2f %d", m_range[0], m_loc[0]);   \
18          sprintf(m_str_max, "%.2f %d", m_range[1], m_loc[1]);   \
19       } else { \
20          sprintf(m_str_min, "??? ???");   \
21          sprintf(m_str_max, "??? ???");   \
22       }  \
23    }
24 #else
25    #define SUMA_RANGE_STRING(m_dset, m_i, m_str_min, m_str_max, m_str_minloc, m_str_maxloc, m_range){  \
26       int m_loc[2];  \
27       if (SUMA_GetDsetColRange(m_dset, m_i, m_range, m_loc)) {   \
28          SUMA_SurfaceObject *m_SOp = NULL;   \
29          char *m_idcode_str = NULL; \
30          int m_N_Node=-1;  \
31          /* number of nodes of parent surface */   \
32          m_idcode_str = NI_get_attribute(m_dset->ngr, "MeshParent_idcode"); /* obsolete */\
33          if (!m_idcode_str) m_idcode_str = NI_get_attribute(m_dset->ngr, "domain_parent_idcode"); \
34          if (m_idcode_str) { \
35             m_SOp = SUMA_findSOp_inDOv(m_idcode_str, SUMAg_DOv, SUMAg_N_DOv);  \
36             if (m_SOp) {  \
37                m_N_Node = m_SOp->N_Node;   \
38             }  \
39          }  \
40          sprintf(m_str_min, "%s", MV_format_fval2(m_range[0], 7));   \
41          sprintf(m_str_max, "%s", MV_format_fval2(m_range[1], 7));   \
42          sprintf(m_str_minloc, "%d", SUMA_GetNodeIndex_FromNodeRow_s(m_dset, m_loc[0], m_N_Node));   \
43          sprintf(m_str_maxloc, "%d", SUMA_GetNodeIndex_FromNodeRow_s(m_dset, m_loc[1], m_N_Node));   \
44       } else { \
45          sprintf(m_str_min, "???");   \
46          sprintf(m_str_max, "???");   \
47          sprintf(m_str_minloc, "???");   \
48          sprintf(m_str_maxloc, "???");   \
49       }  \
50    }
51 #endif
52 
53 #define SUMA_XHAIR_STRING(v, str)   {\
54    sprintf(str,"%s, ", MV_format_fval2(v[0], 7)); \
55    strcat(str, MV_format_fval2(v[1], 7)); \
56    strcat(str, ", ");   \
57    strcat(str,MV_format_fval2(v[2], 7)); \
58 }
59 
60 #define SUMA_INSERT_CELL_STRING(TF, i, j, strng)   {  \
61    if (TF->str_value) { \
62       SUMA_STRING_REPLACE(TF->str_value[j*TF->Ni+i], strng);\
63    }  \
64    XtVaSetValues (TF->cells[j*TF->Ni+i], XmNvalue, strng, NULL);  \
65 }
66 
67 /* modifies a cell's value and marks it as modified
68 No callback is made*/
69 #define SUMA_MODIFY_CELL_VALUE(TF, i, j, val)   {  \
70    if (TF->type == SUMA_int || TF->type == SUMA_float) { \
71       TF->cell_modified = j*TF->Ni+i;  \
72       TF->num_value[TF->cell_modified] = val;  \
73       SUMA_TableF_SetString(TF);\
74    }  else {   \
75       SUMA_SL_Err("Macro for numerical tables only"); \
76    }  \
77 }
78 
79 /* Like SUMA_MODIFY_CELL_VALUE, but cell_modified is reset to -1 */
80 #define SUMA_INSERT_CELL_VALUE(TF, i, j, val)   {  \
81    if (TF->type == SUMA_int || TF->type == SUMA_float) { \
82       SUMA_MODIFY_CELL_VALUE(TF, i, j, val); \
83       TF->cell_modified = -1; \
84    }  else {   \
85       SUMA_SL_Err("Macro also for numerical tables only"); \
86    }  \
87 }
88 
89 #define SUMA_GET_CELL_VALUE(TF, i, j, val)   {  \
90    if (TF->type == SUMA_int || TF->type == SUMA_float) { \
91       val = TF->num_value[j*TF->Ni+i];  \
92    }  else {   \
93       SUMA_SL_Err("Macro for numerical tables only"); \
94       val = 0.0;  \
95    }  \
96 }
97 
98 #define SUMA_SET_CELL_VALUE(TF, i, j, val)   {  \
99    if (TF->type == SUMA_int) {\
100       TF->num_value[j*TF->Ni+i] = (int)val;  \
101    } else if (TF->type == SUMA_float) { \
102       TF->num_value[j*TF->Ni+i] = (float)val;  \
103    }  else {   \
104       SUMA_SL_Err("Macro for numerical tables only"); \
105       val = 0.0;  \
106    }  \
107 }
108 
109 /*!
110    \brief retrieves the cell index using the cell's widget
111 */
112 #define SUMA_WHICH_CELL(TF, w, Found)  {  \
113    int m_nmx, m_i=0; \
114    m_nmx = TF->Ni*TF->Nj;  \
115    Found = -1; \
116    while (m_i<m_nmx) {  \
117       if (TF->cells[m_i] == w) { Found = m_i; m_i = m_nmx; }      \
118       ++m_i;   \
119    }  \
120 }
121 
122 #define SUMA_CELL_ROW_COL_2_1D(m_TF, m_row, m_col) \
123    ( ((m_TF) && (m_row) >= 0 && (m_row) < (m_TF)->Ni && \
124                 (m_col) >= 0 && (m_col) < (m_TF)->Nj) \
125          ? (m_row)+(m_TF)->Ni*(m_col):-1 )
126 
127 #define SUMA_CELL_1D_2_ROW_COL(m_TF, m_n, m_row, m_col) {\
128    (m_row) = (m_col) = -1;   \
129    if (((m_TF)) && (m_n) >= 0) {   \
130       (m_row) = (m_n) % (m_TF)->Ni; \
131       (m_col) = (m_n) / (m_TF)->Ni; \
132       if ((m_row) >= (m_TF)->Ni || (m_col) >= (m_TF)->Nj) {\
133          (m_row) = (m_col) = -1;   \
134       }\
135    }  \
136 }
137 
138 /* scale size gets messed up, see afni_widg.c and afni.h's
139 FIX_SCALE_SIZE*/
140 #define SUMA_FORCE_SCALE_HEIGHT(SurfCont) {\
141   XtVaSetValues(  SurfCont->thr_sc, XmNheight,  SUMA_CMAP_HEIGHT-40, NULL ) ; \
142 }
143 
144 #define SUMA_FORCE_SLICE_SCALE_WIDTH(SurfCont) {\
145   /* Not needed, if you have problems make it mirror SUMA_FORCE_SCALE_HEIGHT \
146   for scales inside SurfCont->Ax_slc, Sa_slc, and Co_slc */ \
147 }
148 
149 #define SUMA_UPDATE_ALL_NODE_GUI_FIELDS(ado) {\
150       SUMA_UpdateNodeNodeField(ado); \
151       /* Now get the data values at that node */   \
152       SUMA_UpdateNodeValField(ado);  \
153       /* now find that node in the colored list */ \
154       SUMA_UpdateNodeLblField(ado);  \
155 }
156 
157 /* Don't attempt to break up this string over multiple lines */
158 #define SUMA_SHPINX_BREAK  ".. container:: clearer\n\n   .. image:: media/blank.jpg\n\n   .. Preceding block is a trick to keep upcoming text from wrapping around the figures.\n\n"
159 
160 /*! structure for holding table data for range setting */
161 typedef struct {
162    SUMA_ALL_DO *ado;
163    SUMA_OVERLAYS *colp;
164 } SUMA_SRV_DATA;
165 
166 SUMA_Boolean SUMA_isTopColPlane(SUMA_OVERLAYS *cp, SUMA_ALL_DO *ado);
167 SUMA_Boolean SUMA_isCurColPlane(SUMA_OVERLAYS *cp, SUMA_ALL_DO *ado);
168 SUMA_X_SurfCont *SUMA_ADO_Cont(SUMA_ALL_DO *ado);
169 SUMA_Boolean SUMA_ADO_ShowCurForeOnly(SUMA_ALL_DO *ado);
170 SUMA_ALL_DO *SUMA_Cont_ADO(SUMA_X_SurfCont *SurfCont);
171 SUMA_SurfaceObject *SUMA_Cont_SO(SUMA_X_SurfCont *SurfCont);
172 SUMA_OVERLAYS * SUMA_ADO_CurColPlane(SUMA_ALL_DO *ado);
173 SUMA_Boolean SUMA_isADO_Cont_Realized(SUMA_ALL_DO *ado);
174 SUMA_Boolean SUMA_isADO_Cont_Created(SUMA_ALL_DO *ado);
175 SUMA_Boolean SUMA_isTopColPlane(SUMA_OVERLAYS *cp, SUMA_ALL_DO *ado);
176 SUMA_Boolean SUMA_isCurColPlane(SUMA_OVERLAYS *cp, SUMA_ALL_DO *ado);
177 float *SUMA_ADO_DatumXYZ(SUMA_ALL_DO *ado, int isel, char *variant);
178 float *SUMA_GDSET_EdgeXYZ(SUMA_DSET *dset, int isel, char *variant, float *here);
179 SUMA_Boolean SUMA_GDSET_EdgeXYZ_eng(SUMA_DSET *dset, int isel,
180                                     char *variant, float *here);
181 SUMA_SurfaceObject *SUMA_GDSET_FrameSO(SUMA_DSET *dset);
182 SUMA_Boolean SUMA_GDSET_GMATRIX_Aff(SUMA_DSET *dset, double Aff[4][4], int I2X);
183 float *SUMA_GDSET_XYZ_Range(SUMA_DSET *dset,  char *variant, float *here);
184 float *SUMA_GDSET_XYZ_Center(SUMA_DSET *dset,  char *variant, float *here);
185 float *SUMA_GDSET_NodeXYZ(SUMA_DSET *dset, int node, char *variant, float *here);
186 SUMA_Boolean SUMA_GDSET_NodeXYZ_eng(SUMA_DSET *dset, int node,
187                                     char *variant, float *here);
188 SUMA_Boolean SUMA_TDO_PointXYZ_eng(SUMA_TractDO *tdo, int point,
189                                    int *BTP, float *here);
190 float *SUMA_TDO_PointXYZ(SUMA_TractDO *tdo, int point, int *BTP, float *here);
191 SUMA_Boolean SUMA_VO_PointXYZ_eng(SUMA_VolumeObject *vo, int point,
192                                    int *IJK, float *here);
193 float *SUMA_VO_PointXYZ(SUMA_VolumeObject *vo, int point, int *IJK, float *here);
194 SUMA_Boolean SUMA_MDO_PointXYZ_eng(SUMA_MaskDO *mo, int point,
195                                    int *IJK, float *here);
196 float *SUMA_MDO_PointXYZ(SUMA_MaskDO *mdo, int point, int *BTP, float *here);
197 char *SUMA_ADO_LDP(SUMA_ALL_DO *ado);
198 char * SUMA_ADO_Label(SUMA_ALL_DO *ado);
199 char * SUMA_ADO_CropLabel(SUMA_ALL_DO *ado, int len);
200 SUMA_Boolean SUMA_ADO_isLabel(SUMA_ALL_DO *ado, char *lbl);
201 char *SUMA_ADO_sLabel(SUMA_ALL_DO *ado);
202 char * SUMA_ADO_idcode(SUMA_ALL_DO *ado);
203 char * SUMA_ADO_Parent_idcode(SUMA_ALL_DO *ado);
204 SUMA_CIFTI_SAUX *SUMA_ADO_CSaux(SUMA_ALL_DO *ado);
205 SUMA_GRAPH_SAUX *SUMA_ADO_GSaux(SUMA_ALL_DO *ado);
206 SUMA_TRACT_SAUX *SUMA_ADO_TSaux(SUMA_ALL_DO *ado);
207 SUMA_MASK_SAUX *SUMA_ADO_MSaux(SUMA_ALL_DO *ado);
208 SUMA_SURF_SAUX *SUMA_ADO_SSaux(SUMA_ALL_DO *ado);
209 SUMA_VOL_SAUX *SUMA_ADO_VSaux(SUMA_ALL_DO *ado);
210 void *SUMA_ADO_Saux(SUMA_ALL_DO *ado);
211 void SUMA_cb_ShowCoSlice_toggled(Widget w, XtPointer data,XtPointer client_data);
212 int SUMA_SetShowSlice(SUMA_VolumeObject *vdo, char *variant, int val);
213 void SUMA_cb_ShowSaSlice_toggled(Widget w, XtPointer data,XtPointer client_data);
214 void SUMA_cb_ShowAxSlice_toggled(Widget w, XtPointer data,XtPointer client_data);
215 SUMA_DSET *SUMA_ADO_Dset(SUMA_ALL_DO *ado);
216 int SUMA_Anatomical_DOs(SUMA_DO *dov, int N_dov, int *rdov);
217 int SUMA_ADO_N_Datum(SUMA_ALL_DO *ado);
218 int SUMA_ADO_N_Datum_Lev(SUMA_ALL_DO *ado, SUMA_DATUM_LEVEL dtlvl);
219 int SUMA_ADO_Max_Datum_Index(SUMA_ALL_DO *ado);
220 int SUMA_ADO_Max_Datum_Index_Lev(SUMA_ALL_DO *ado, SUMA_DATUM_LEVEL dtlvl);
221 char * SUMA_ADO_variant(SUMA_ALL_DO *ado);
222 int SUMA_ADO_ColPlane_SelectedDatum(SUMA_ALL_DO *ado, SUMA_OVERLAYS *Sover);
223 int SUMA_ADO_SelectedDatum(SUMA_ALL_DO *ado, void *extra, void *extra2);
224 int SUMA_ADO_SelectedSecondary(SUMA_ALL_DO *ado);
225 SUMA_Boolean SUMA_is_ADO_Datum_Primitive(SUMA_ALL_DO *ado,
226                                           SUMA_COLID_OFFSET_DATUM *codf);
227 SUMA_Boolean SUMA_ADO_Set_SelectedDatum(SUMA_ALL_DO *ado, int sel,
228                                         void *extra, void *extra2);
229 int SUMA_ADO_N_Overlays(SUMA_ALL_DO *ado);
230 SUMA_OVERLAYS * SUMA_ADO_Overlay0(SUMA_ALL_DO *ado);
231 SUMA_OVERLAYS * SUMA_ADO_Overlay(SUMA_ALL_DO *ado, int i);
232 SUMA_OVERLAYS * SUMA_ADO_CurColPlane(SUMA_ALL_DO *ado);
233 SUMA_OVERLAYS **  SUMA_ADO_Overlays(SUMA_ALL_DO *ado, int *N_over);
234 SUMA_Boolean SUMA_ADO_Append_Overlay(SUMA_ALL_DO *ado, SUMA_OVERLAYS **over);
235 void SUMA_ShowMeTheChildren(Widget w);
236 void SUMA_UnmanageTheChildren(Widget w);
237 void SUMA_ManageTheChildren(Widget w);
238 void SUMA_DoForTheChildren(Widget w, int i, int lvl, int rec);
239 Widget SUMA_FindChildWidgetNamed(Widget w, char *name);
240 XImage *SUMA_cmap_to_XImage (Widget wid, SUMA_COLOR_MAP *cm);
241 void SUMA_DrawCmap(SUMA_COLOR_MAP *Cmap);
242 void SUMA_cmap_wid_display(SUMA_ALL_DO *ado);
243 void SUMA_cmap_context_Init(SUMA_ALL_DO *ado);
244 void SUMA_cmap_wid_graphicsInit (Widget w, XtPointer clientData, XtPointer call);
245 Boolean SUMA_cmap_wid_handleRedisplay(XtPointer clientData);
246 void SUMA_cmap_wid_postRedisplay(Widget w, XtPointer clientData, XtPointer call);
247 void SUMA_cmap_wid_expose(Widget w, XtPointer clientData, XtPointer call);
248 void SUMA_cmap_wid_resize(Widget w, XtPointer clientData, XtPointer call);
249 void SUMA_cmap_wid_input(Widget w, XtPointer clientData, XtPointer call);
250 unsigned char *SUMA_read_ppm(char *fname, int *width, int *height, int verb);
251 void SUMA_CreateCmapWidgets(Widget parent, SUMA_ALL_DO *ado);
252 void SUMA_cb_ColMap_Switch(Widget w, XtPointer clientData, XtPointer call);
253 int SUMA_SwitchCmap(SUMA_ALL_DO *ado, SUMA_COLOR_MAP *CM, int setmenu);
254 int SUMA_SwitchCmap_one(SUMA_ALL_DO *ado, SUMA_COLOR_MAP *CM, int setmenu);
255 int SUMA_SelectSwitchCmap_one( SUMA_ALL_DO *ado, SUMA_LIST_WIDGET *LW,
256                                int ichoice, SUMA_Boolean CloseShop, int setmen);
257 int SUMA_SelectSwitchCmap( SUMA_ALL_DO *ado, SUMA_LIST_WIDGET *LW,
258                            int ichoice, SUMA_Boolean CloseShop, int setmen);
259 int SUMA_SwitchColPlaneBrightness_one(
260          SUMA_ALL_DO *ado, SUMA_OVERLAYS *colp,
261          int ind, int setmen);
262 int SUMA_SwitchColPlaneBrightness(
263          SUMA_ALL_DO *ado, SUMA_OVERLAYS *colp,
264          int ind, int setmen);
265 void SUMA_cb_SwitchBrightness(Widget w, XtPointer clientData, XtPointer call);
266 int SUMA_SwitchColPlaneThreshold(
267          SUMA_ALL_DO *ado, SUMA_OVERLAYS *colp,
268          int ind, int setmen);
269 int SUMA_SwitchColPlaneThreshold_one(
270          SUMA_ALL_DO *ado, SUMA_OVERLAYS *colp,
271          int ind, int setmen);
272 void SUMA_cb_SwitchThreshold(Widget w, XtPointer clientData, XtPointer call);
273 int SUMA_SwitchColPlaneIntensity(SUMA_ALL_DO *ado, SUMA_OVERLAYS *colp,
274                                  int ind, int setmen);
275 int SUMA_SwitchColPlaneIntensity_one (
276          SUMA_ALL_DO *ado,
277          SUMA_OVERLAYS *colp,
278          int ind, int setmen);
279 void SUMA_cb_SwitchIntensity(Widget w, XtPointer clientData, XtPointer call);
280 SUMA_MenuItem *SUMA_FreeMenuVector(SUMA_MenuItem *menu, int Nels);
281 SUMA_MenuItem *SUMA_FormSwitchColMenuVector(SUMA_ALL_DO *ado,
282                                             int what, int *N_items);
283 void SUMA_set_cmap_options(SUMA_ALL_DO *ado,
284                            SUMA_Boolean NewDset, SUMA_Boolean NewMap);
285 void SUMA_set_cmap_options_SO(SUMA_ALL_DO *ado, SUMA_Boolean NewDset,
286                            SUMA_Boolean NewMap);
287 
288 void SUMA_cb_SwitchCmap(Widget w, XtPointer client_data, XtPointer call);
289 SUMA_MenuItem *SUMA_FormSwitchCmapMenuVector(SUMA_COLOR_MAP **CMv, int N_maps);
290 void SUMA_cb_SelectSwitchCmap (Widget w, XtPointer client_data, XtPointer call);
291 void SUMA_cb_CloseSwitchCmap (Widget w, XtPointer client_data, XtPointer call);
292 SUMA_Boolean SUMA_CmapSelectList(SUMA_ALL_DO *ado, int type, int bringup);
293 SUMA_Boolean SUMA_SwitchColPlaneCmap(SUMA_ALL_DO *ado, SUMA_COLOR_MAP *CM);
294 SUMA_Boolean SUMA_SetCmapMenuChoice(SUMA_ALL_DO *ado, char *str);
295 int SUMA_GetListIchoice(XmListCallbackStruct *cbs,
296                         SUMA_LIST_WIDGET *LW,
297                         SUMA_Boolean *CloseShop);
298 void SUMA_cb_SelectSwitchInt (
299          Widget w, XtPointer client_data,
300          XtPointer call_data);
301 void SUMA_cb_SelectSwitchThr (
302          Widget w, XtPointer client_data,
303          XtPointer call_data);
304 void SUMA_cb_SelectSwitchBrt (
305          Widget w, XtPointer client_data,
306          XtPointer call_data);
307 int SUMA_SelectSwitchDsetCol(
308          SUMA_ALL_DO *ado,
309          SUMA_LIST_WIDGET *LW,
310          int block,
311          int ichoice);
312 void SUMA_cb_CloseSwitchLst (Widget w, XtPointer client_data, XtPointer call);
313 void SUMA_SetScaleRange(SUMA_ALL_DO *ado, double range[2]);
314 int SUMA_set_threshold_one(SUMA_ALL_DO *ado, SUMA_OVERLAYS *colp,
315                            float *val);
316 int SUMA_set_threshold(SUMA_ALL_DO *ado, SUMA_OVERLAYS *colp,
317                            float *val);
318 void SUMA_cb_set_threshold(Widget w, XtPointer clientData, XtPointer call);
319 int SUMA_set_threshold_label(SUMA_ALL_DO *ado, float val, float val2);
320 void SUMA_optmenu_EV( Widget w , XtPointer cd ,
321                       XEvent *ev , Boolean *continue_to_dispatch );
322 void SUMA_cb_SetCoordBias(Widget widget, XtPointer client_data,
323                           XtPointer call_data);
324 SUMA_Boolean SUMA_RedisplayAllShowing(char *SO_idcode_str,
325                                       SUMA_SurfaceViewer *SVv, int N_SVv);
326 void SUMA_CreateSliceFields(  Widget parent,
327                         char *tit, char *hint, char *help,
328                         int Nslc, char *var, SUMA_ALL_DO *ado,
329                         void (*NewValueCallback)(void * data), void *cb_data,
330                         SUMA_SLICE_FIELD *SF);
331 void SUMA_CreateTable(  Widget parent,
332             int Ni, int Nj,
333             char *wname,
334             char **row_tit, char **col_tit,
335             char **row_hint, char **col_hint,
336             char **row_help, char **col_help,
337             int *cwidth, SUMA_Boolean editable, SUMA_VARTYPE type,
338             void (*NewValueCallback)(void * data), void *cb_data,
339             void (*TitLabelEVHandler)(Widget w , XtPointer cd ,
340                                       XEvent *ev , Boolean *ctd),
341             void *TitLabelEVHandlerData,
342             void (*CellEVHandler)(Widget w , XtPointer cd ,
343                                   XEvent *ev , Boolean *ctd),
344             void *CellEVHandlerData,
345                         SUMA_TABLE_FIELD *TF);
346 void SUMA_TableF_cb_label_Modify (Widget w, XtPointer client_data,
347                                   XtPointer call_data);
348 void SUMA_TableF_SetString (SUMA_TABLE_FIELD * AF);
349 void SUMA_TableF_cb_label_change (Widget w, XtPointer client_data,
350                                   XtPointer call_data);
351 void SUMA_leave_TableField( Widget w , XtPointer client_data ,
352                            XEvent * ev , Boolean * continue_to_dispatch );
353 void SUMA_SliceF_cb_mont_change (  Widget w, XtPointer client_data,
354                                     XtPointer call_data);
355 void SUMA_leave_SliceField( Widget w , XtPointer client_data ,
356                            XEvent * ev , Boolean * continue_to_dispatch );
357 void SUMA_leave_MontField( Widget w , XtPointer client_data ,
358                             XEvent * ev , Boolean * continue_to_dispatch );
359 int SUMA_SetRangeValueNew(SUMA_ALL_DO *ado,
360                           SUMA_OVERLAYS *colp,
361                           int row, int col,
362                           float v1, float v2,
363                           int setmen,
364                           int redisplay, float *reset,
365                           SUMA_NUMERICAL_UNITS num_units);
366 int SUMA_SetRangeValueNew_one(SUMA_ALL_DO *ado,
367                           SUMA_OVERLAYS *colp,
368                           int row, int col,
369                           float v1, float v2,
370                           int setmen,
371                           int redisplay, float *reset,
372                           SUMA_NUMERICAL_UNITS num_units);
373 void SUMA_cb_SetRangeValue (void *data);
374 int SUMA_SetClustValue(SUMA_ALL_DO *ado,
375                           SUMA_OVERLAYS *colp,
376                           int row, int col,
377                           float v1, float v2,
378                           int setmen,
379                           int redisplay, float *reset);
380 int SUMA_SetClustValue_one(SUMA_ALL_DO *ado,
381                           SUMA_OVERLAYS *colp,
382                           int row, int col,
383                           float v1, float v2,
384                           int setmen,
385                           int redisplay, float *reset);
386 void SUMA_cb_SetClustValue (void *data);
387 SUMA_Boolean SUMA_SetClustTableTit_one (SUMA_ALL_DO *ado,
388                         SUMA_OVERLAYS *colp, int i, int j, int Button);
389 SUMA_Boolean SUMA_SetClustTableTit (SUMA_ALL_DO *ado,
390                         SUMA_OVERLAYS *colp, int i, int j, int Button);
391 void SUMA_SetClustTableTit_EV ( Widget w , XtPointer cd ,
392                       XEvent *ev , Boolean *continue_to_dispatch );
393 SUMA_Boolean SUMA_SetTableTitleButton1(SUMA_TABLE_FIELD *TF, int i, int j,
394                                        byte flag);
395 SUMA_TABLE_FIELD * SUMA_AllocTableField(char *wname);
396 SUMA_TABLE_FIELD * SUMA_FreeTableField(SUMA_TABLE_FIELD *TF);
397 SUMA_SLICE_FIELD * SUMA_AllocSliceField(char *wname);
398 SUMA_SLICE_FIELD * SUMA_FreeSliceField(SUMA_SLICE_FIELD *SF);
399 SUMA_VR_FIELD * SUMA_AllocVRField(char *wname);
400 SUMA_VR_FIELD * SUMA_FreeVRField(SUMA_VR_FIELD *VrF);
401 int SUMA_set_slice_label(SUMA_ALL_DO *ado, char *variant, float val);
402 int SUMA_set_slice_scale(SUMA_ALL_DO *ado, char *variant, float val);
403 void SUMA_cb_set_Ax_slice_label(Widget w, XtPointer clientData, XtPointer call);
404 void SUMA_cb_set_Sa_slice_label(Widget w, XtPointer clientData, XtPointer call);
405 void SUMA_cb_set_Co_slice_label(Widget w, XtPointer clientData, XtPointer call);
406 void SUMA_SliceF_SetString (SUMA_SLICE_FIELD * SF);
407 void SUMA_SliceF_cb_label_change (  Widget w, XtPointer client_data,
408                                     XtPointer call_data);
409 int SUMA_set_slice(SUMA_ALL_DO *ado, char *variant, float *valp,
410                    char *caller, int redisp);
411 int SUMA_set_mont(SUMA_ALL_DO *ado, char *variant,
412                   float *val1p, float *val2p,
413                   char *caller, int redisp);
414 void SUMA_cb_set_Co_slice(Widget w, XtPointer clientData, XtPointer call);
415 void SUMA_cb_set_Sa_slice(Widget w, XtPointer clientData, XtPointer call);
416 void SUMA_cb_set_Ax_slice(Widget w, XtPointer clientData, XtPointer call);
417 SUMA_CELL_VARIETY SUMA_cellvariety (SUMA_TABLE_FIELD *TF, int n);
418 int SUMA_RowTitCell(SUMA_TABLE_FIELD *TF, int r);
419 int SUMA_ColTitCell(SUMA_TABLE_FIELD *TF, int c);
420 int SUMA_ObjectID_Row(SUMA_TABLE_FIELD *TF, char *id);
421 SUMA_Boolean SUMA_InitRangeTable(SUMA_ALL_DO *ado, int what);
422 SUMA_Boolean SUMA_InitClustTable(SUMA_ALL_DO *ado);
423 void SUMA_CreateXhairWidgets(Widget parent, SUMA_ALL_DO *ado);
424 void SUMA_CreateXhairWidgets_SO(Widget parent, SUMA_ALL_DO *ado);
425 void SUMA_CreateXhairWidgets_GLDO(Widget parent, SUMA_ALL_DO *ado);
426 void SUMA_CreateXhairWidgets_TDO(Widget parent, SUMA_ALL_DO *ado);
427 void SUMA_CreateXhairWidgets_CO(Widget parent, SUMA_ALL_DO *ado);
428 void SUMA_CreateXhairWidgets_VO(Widget parent, SUMA_ALL_DO *ado);
429 void SUMA_CreateXhairWidgets_MDO(Widget parent, SUMA_ALL_DO *ado);
430 SUMA_Boolean SUMA_UpdateXhairField(SUMA_SurfaceViewer *sv);
431 SUMA_Boolean SUMA_UpdateCrossHairNodeLabelField(SUMA_SurfaceViewer *sv);
432 void SUMA_XhairInput (void* data);
433 void SUMA_NodeInput (void* data);
434 void SUMA_GNodeInput (void *data);
435 void  SUMA_SetCellEditMode(SUMA_TABLE_FIELD *TF, int i, int j, int Mode);
436 void SUMA_TriInput (void* data);
437 void SUMA_TpointInput(void*data);
438 void SUMA_IJKInput(void*data);
439 SUMA_Boolean SUMA_UpdateTriField(SUMA_SurfaceObject *SO);
440 SUMA_Boolean SUMA_UpdateNodeLblField(SUMA_ALL_DO *ADO);
441 SUMA_Boolean SUMA_UpdateNodeLblField_ADO(SUMA_ALL_DO *ADO);
442 char **SUMA_FormNodeValFieldStrings(SUMA_ALL_DO *ado,
443                                  SUMA_DSET *dset, int Node,
444                                  int find, int tind, int bind, int dec,
445                                  double *I, double *T, double *B);
446 SUMA_Boolean SUMA_GetNodeValsAtSelection(SUMA_ALL_DO *ado,
447                SUMA_DSET *dset, int Node,
448                int find, int tind, int bind,
449                double *I, double *T, double *B) ;
450 SUMA_Boolean SUMA_UpdateNodeValField(SUMA_ALL_DO *ado);
451 SUMA_Boolean SUMA_UpdateNodeNodeField(SUMA_ALL_DO *ado);
452 SUMA_Boolean SUMA_Init_SurfCont_CrossHair(SUMA_ALL_DO *ado);
453 void SUMA_cb_AbsThresh_tb_toggled (Widget w, XtPointer data,
454                                     XtPointer client_data);
455 void SUMA_cb_SymIrange_tb_toggled (Widget w, XtPointer data,
456                                     XtPointer client_data);
457 void SUMA_cb_ShowZero_tb_toggled (Widget w, XtPointer data,
458                                     XtPointer client_data);
459 void SUMA_cb_SetCmapMode(Widget widget, XtPointer client_data,
460                                     XtPointer call_data);
461 SUMA_Boolean SUMA_SetCmapMode(SUMA_ALL_DO *ado, int imenu);
462 void SUMA_cb_SetLinkMode(Widget widget, XtPointer client_data,
463                                     XtPointer call_data);
464 void SUMA_set_cmap_options_GLDO(SUMA_ALL_DO *ado, SUMA_Boolean NewDset,
465                                 SUMA_Boolean NewMap);
466 void SUMA_set_cmap_options_VO(SUMA_ALL_DO *ado, SUMA_Boolean NewDset,
467                                 SUMA_Boolean NewMap);
468 void SUMA_set_cmap_options_CO(SUMA_ALL_DO *ado, SUMA_Boolean NewDset,
469                            SUMA_Boolean NewMap);
470 void SUMA_cb_Cmap_Load(Widget w, XtPointer data, XtPointer client_data);
471 SUMA_COLOR_MAP *SUMA_LoadCmapFile_eng(char *filename);
472 void SUMA_LoadCmapFile (char *filename, void *data);
473 SUMA_Boolean  SUMA_Insert_Cmap_of_Dset(SUMA_DSET *dset);
474 void SUMA_CreateUpdatableCmapMenu(SUMA_ALL_DO *ado);
475 int SUMA_ThreshVal2ScalePos(SUMA_ALL_DO *ado, float *val);
476 int  SUMA_SliceVal2ScalePos (SUMA_ALL_DO *ado, char *variant, float *val);
477 void SUMA_cb_SetScaleThr(void *data);
478 int SUMA_SetScaleThr_one(SUMA_ALL_DO *ado, SUMA_OVERLAYS *colp,
479                           float *val, int setmen, int redisplay);
480 int SUMA_SetScaleThr(SUMA_ALL_DO *ado, SUMA_OVERLAYS *colp,
481                           float *val, int setmen, int redisplay);
482 SUMA_Boolean SUMA_DsetColSelectList(
483          SUMA_ALL_DO *ado, int type,
484          int refresh, int bringup);
485 SUMA_ASSEMBLE_LIST_STRUCT * SUMA_AssembleDsetColList(SUMA_DSET *dset);
486 void SUMA_UpdatePvalueField (SUMA_ALL_DO *ado, float thresh);
487 double SUMA_Pval2ThreshVal (SUMA_ALL_DO *ado, double pval);
488 SUMA_Boolean SUMA_UpdatePointField(SUMA_ALL_DO*ado);
489 SUMA_Boolean SUMA_UpdateNodeField(SUMA_ALL_DO *ado);
490 char *SUMA_GetLabelsAtSelection(SUMA_ALL_DO *ado, int node, int sec);
491 char *SUMA_GetLabelsAtSelection_ADO(SUMA_ALL_DO *ado, int node, int sec);
492 SUMA_Boolean SUMA_GetValuesAtSelection(SUMA_ALL_DO *ado, int fromtable,
493                                        float *I, float *T, float *B);
494 SUMA_Boolean SUMA_SetCmodeMenuChoice(SUMA_ALL_DO *ado, char *str);
495 SUMA_NIDO *SUMA_NodeLabelToTextNIDO (char *lbls, SUMA_ALL_DO *ado,
496                                      SUMA_SurfaceViewer *sv);
497 XmFontList SUMA_AppendToFontList(XmFontList fontlisti, Widget w,
498                                  char *fontname, char *tag);
499 
500 /* the help strings */
501 
502 /* Surface Properties Block */
503 #define  SUMA_SurfContHelp_more  \
504    "Opens a dialog with detailed " \
505    "information about the object in geek speak."
506 
507    #define  SUMA_SurfContHelp_RenderMode  \
508 "Choose the rendering mode for this surface.:LR:\n" \
509 "   Viewer: Surface's rendering mode is set "  \
510 ":         :by the viewer's setting which can "   \
511 ":         :be changed with the :ref:`'p'<LC_p>` option.:LR:\n"  \
512 "   Fill:   Shaded rendering mode.:LR:\n"  \
513 "   Line:   Mesh rendering mode.:LR:\n"    \
514 "   Points: Points rendering mode.:LR:\n"
515 
516    #define  SUMA_SurfContHelp_VTransMode  \
517 "Set the transparency level for this set of slices to one of the " \
518 "following options::LR:\n" \
519 "   Viewer: Surface's transparency is set "  \
520 "           by the viewer's setting which can "   \
521 "           be changed with the :ref:`o<LC_o>`, :ref:`O<UC_O>` options.:LR:\n"\
522 "           Only Cheesecloth transparency is allowed in "\
523 "           this setting.:LR:\n"\
524 "   A :   Alpha blending. May look good, but not always "\
525 "         accurate.:LR:\n"  \
526 "   0 :   No transparency, opaque.:LR:\n"  \
527 "   ...:LR:\n"    \
528 "   16:   Maximum transparency, invisibile:LR:\n"
529 
530    #define  SUMA_SurfContHelp_TransMode  \
531 "Set the transparency for this surface to one of the following "   \
532 "options.:LR:\n" \
533 "   Viewer: Surface's transparency is set "  \
534 "           by the viewer's setting which can "   \
535 "           be changed with the :ref:`o<LC_o>`, :ref:`O<UC_O>`  options.:LR:\n" \
536 "   0 :   No transparency, opaque.:LR:\n"  \
537 "   ...:LR:\n"    \
538 "   16:   Maximum transparency, invisibile:LR:\n"
539 
540 #define  SUMA_SurfContHelp_DsetViewMode  \
541    "Choose the viewing mode for this dataset.:LR:\n" \
542    "   Col: Colours, only.:LR:\n"  \
543    "   Con: Contours (slower), only.:LR:\n"  \
544    "   C&C: Colours and Contours (slower), only.:LR:\n"    \
545    "   XXX: Unfortunately nothing, only.:LR:\n"  \
546    " There is one contour created for each color "  \
547    " in the colormap. You'd want to use colormaps with "  \
548    " few colors to get a contour of use. " \
549    " Contours are not created if colormap has panes "   \
550    " of unequal sizes.\n"
551 
552 #define  SUMA_SurfContHelp_DsetFont  \
553    "Choose the font size for labels of nodes.:LR:\n" \
554    "   8: 8x13.:LR:\n"  \
555    "   9: 9x15.:LR:\n"  \
556    "   TR10: Times New Roman 10.:LR:\n"    \
557    "   HE10: Helvetica 10.:LR:\n"    \
558    "   HE12: Helvetica 12.:LR:\n"    \
559    "   HE18: Helvetica 18.:LR:\n"    \
560    "   TR24: Times New Roman 24.:LR:\n"    \
561    "   XXX: Show no text.:LR:\n"
562 
563 #define  SUMA_SurfContHelp_DsetNodeRad  \
564    "Choose the radius sizing for nodes of this graph dataset.:LR:\n" \
565    "   Const: All nodes have a radius of 1 x Gain.:LR:\n"  \
566    "   Val: Nodes size equals its dset value x Gain. A node's dset"\
567    "value is that of the edge connecting the node to itself:LR:\n"  \
568    "   XXX: Show no balls.:LR:\n"
569 
570 #define  SUMA_SurfContHelp_DsetThrough  \
571    "When a node, rather than an edge is :ref:`selected<Selecting_Objects>`, "\
572    "choose how connections to it are displayed.:LR:\n" \
573    "   Edg: Show connections to selected node with edges, either straight "\
574    "lines or with bundles.:LR:\n"  \
575    "   Col: Show connections to selected node by changing the colors of "\
576    "the connecting nodes, based on edge value. Edges are not displayed. "\
577    "the idea here is to reduce the clutter of the display, while still "\
578    "allowing you to visualize connection strength to one node at a time.:LR:\n"\
579   "   Rad: Show connections to selected node by changing the  radius of the "\
580   "connecting nodes, based on edge value. Edges are not displayed in this "\
581   "mode also.:LR:\n"\
582    "   CaR: Both Col and Rad:LR:\n"\
583    "   XXX: Do nothing special, keep showing whole graph, even when "\
584    "selecting a graph node.:LR:\n"
585 
586 #define  SUMA_SurfContHelp_DsetEdgeThick  \
587    "Choose the thickness for edges of this graph dataset.:LR:\n" \
588    "   Const: All nodes have a radius of 1 x Gain.:LR:\n"  \
589    "   Val: Edge size equals its dset value x Gain:LR:\n"
590 
591 #define  SUMA_SurfContHelp_TractStyle  \
592    "Choose the line drawing style.:LR:\n" \
593    "   Digits specify number of pixels to mask out of each 16 pixels:LR:\n"\
594    "   1 :   One pixel/16 off, almost solid:LR:\n"  \
595    "   ...:LR:\n"    \
596    "   15:   15/16 pixels off, almost invisible:LR:\n"   \
597    "   HDE: Hide all the tracts:LR:\n"  \
598    "   SLD: No stippling, solid line.:LR:\n"
599 
600 #define  SUMA_SurfContHelp_DsetEdgeStip  \
601    "Choose the stippling for edges of this graph dataset.:LR:\n" \
602    "   1 :   One pixel/16 off, almost solid:LR:\n"  \
603    "   ...:LR:\n"    \
604    "   15:   15/16 pixels off, almost invisible:LR:\n"   \
605    "   Val: Set stippling based on the dset value:LR:\n"  \
606    "   XXX: No stippling, solid line.:LR:\n"
607 
608    #define  SUMA_SurfContHelp_DsetAlphaVal  \
609 "Choose the method for assigning an alpha value (A) to a voxel's color.:LR:\n" \
610 "   Avg :  A = average of R, G, B values:LR:\n"  \
611 "   Max :  A = maximum of R, G, B values:LR:\n"    \
612 "   Min :  A = minimum of R, G, B values:LR:\n"    \
613 "   I :  A is based on I selection. I range parameters apply :LR:\n"   \
614 "   T :  A is based on T selection. Full range is used.:LR:\n"  \
615 "   B :  A is based on B selection. B range parameters apply:LR:\n" \
616 "   XXX: A is set to 0, nothing will show.:LR:\n"
617 
618    #define  SUMA_SurfContHelp_TractMask  \
619 "That's not the name of the button, but its default value. "\
620 "This menu controls how tracts that fall outside of the masks are "\
621 "displayed::LR:\n"\
622 "   Hde:   Hide 'em masked tracts:LR:\n"  \
623 "   Gry:   Gray 'em masked tracts (gray color set by"\
624 " :ref:`Gry<TractCont->Coloring_Controls->Gry>` arrow field):LR:\n"\
625 "   One:   A coding mistake that ended up looking cool. Each tract not in "\
626 "the mask is colored by one color extracted from the set of colors for the"\
627 " whole network.:LR:\n"\
628 "   Ign:   Ignore 'em good for nothing masks, show tracts in all their"\
629 " unabashed glory:LR:\n"
630 
631 #define  SUMA_SurfContHelp_TractMaskGray  \
632    "Set the gray level for masked tracts. 0 for black, 100 for white\n" \
633    "   This arrow field only has an effect when 'Msk' menu is set to 'Gry'\n"   \
634 
635 #define  SUMA_SurfContHelp_DsetNodeCol  \
636    "Choose the colorization method for nodes of this dataset.:LR:\n" \
637    "   White: Alle weiss.:LR:\n"  \
638    "   Black: Tutti nero.:LR:\n"  \
639    "   Red: Sve crveno.:LR:\n"  \
640    "   Green: Killon akhdar.:LR:\n" \
641    "   Blue: Tous bleu.:LR:\n"   \
642    "   Yellow: Todos amarillo.:LR:\n"   \
643    "   Gray50: Not there yet.:LR:\n" \
644    "   Val: Nodes color is based its dset value and the chosen colormap:LR:\n"
645 
646 #define  SUMA_SurfContHelp_DsetTxtShad  \
647    "Choose the variants for how labels are handled.:LR:\n" \
648    "   T : Text shown unless more than 50% occluded.:LR:\n"  \
649    "   Ts: Foreground text bright, occluded text shaded:LR:\n"  \
650    "   B : Text shown with background box unless more than 50% occluded:LR:\n"  \
651    "   Bs: Foreground text with background, occluded text shaded:LR:\n"   \
652    "   Ta: All text shown, occlusions be damned.:LR:\n"\
653    "   Ba: All text shown with background, damn the torpedoes.:LR:\n"
654 
655 #define  SUMA_SurfContHelp_DsetGmatBord  \
656    "Choose the partition ratio of the matrix border. This option only applies to the matrix display of the graph.:LR:\n" \
657    "   XX: No partition.:LR:\n"  \
658    "   5: Border is 1/5 of cell width.:LR:\n"  \
659    "   10: Border is 1/10 of cell width.:LR:\n"  \
660    "   20: Border is 1/20 of cell width.:LR:\n" \
661    "   30: Border is 1/30 of cell width.:LR:\n"   \
662    "   40: Border is 1/40 of cell width.:LR:\n"
663 
664 #define SUMA_SurfContHelp_Dsets  \
665    "Show/Hide Dataset (previously Color Plane) controllers"
666 
667 #define SUMA_SurfContHelp_Xhr \
668    "Set/Get crosshair location in mm :term:`RAI` on\n"   \
669    "this controller's selected object.\n"   \
670    "Entering new coordinates \n"   \
671    "makes the crosshair jump\n"   \
672    "to that location (like :ref:`'ctrl+j' <LC_Ctrl+j>`).\n"   \
673    "Use :ref:`'alt+l'<LC_Alt+l>` to center the\n"   \
674    "cross hair in your viewer."
675 
676 #define SUMA_SurfContHelp_Node   \
677    "Index of node in focus (1) and :term:`RAI` coordinates "   \
678    "of that node (2).:LR:\n"   \
679    "1- The index is of the node in focus on this controller's "   \
680    "surface. Nodes in focus are "   \
681    "highlighted by the blue sphere "   \
682    "in the crosshair.\n"   \
683    "This cell is editable; manually entering a new node's index "   \
684    "will put that node in focus "   \
685    "and send the crosshair to its "   \
686    "location (like :ref:`'j' <LC_j>`). "   \
687    "Use :ref:`'alt+l' <LC_Alt+l>` to center the "   \
688    "cross hair in your viewer.:LR:\n" \
689    "2- The :term:`RAI` coordinates are those of the surface node after all spatial transformations have been applied to the surface. Those transformations do not include visualization transformations applied in the viewer"
690 
691 #define SUMA_SurfContHelp_GNode   \
692    "Index of the node closest to the selection location on the edge's "  \
693    "representation.:LR:\n"\
694    "*NOTE* that a node is also an edge that starts and ends at the same"\
695    "node. Think diagonal elements of a connectivity matrix."
696 
697 #define SUMA_TractContHelp_I   \
698    "Set/Get the :term:`1D index` of the selected elementary tract datum: "\
699    "the infinitesimal point.\n"
700 
701 #define SUMA_SurfContHelp_I   \
702    "Set/Get the :term:`1D index` of the selected elementary surface datum: "\
703    "the node.\n"
704 
705 #define SUMA_GraphContHelp_I   \
706    "Set/Get the :term:`1D index` of the selected elementary surface datum: "\
707    "the edge.\n"
708 
709 #define SUMA_VolContHelp_I   \
710    "Set/Get the :term:`1D index` of the selected elementary surface datum: "\
711    "the voxel.\n"
712 
713    #define SUMA_SurfContHelp_BTP   \
714 "Set/Get the triplet of indices for the selection on the displayed tracts.\n"\
715 "   The 1st index is that of the selected :term:`bundle` in the network:LR:\n"\
716 "   The second is for the selected :term:`tract` in that bundle:LR:\n"  \
717 "   The third is the index of the :term:`point` selected along that tract.:LR:\n"
718 
719 #define SUMA_SurfContHelp_IJK   \
720    "Triplet of indices (I) of selected voxel.\n"   \
721    "The mm RAI coordinate X = M I with M being the matrix transforming\n"  \
722    "voxel indices to voxel coordinates.\n"
723 
724 
725 #define SUMA_SurfContHelp_Tri   \
726    "1- Triangle (faceset) index of "   \
727    "triangle in focus on this  "   \
728    "on this controller's surface.\n"   \
729    "Triangle in focus is highlighted "   \
730    "in gray, and entering a new triangle's "   \
731    "index will set a new triangle in "   \
732    "focus (like :ref:`'J'<UC_j>`).:LR:\n"   \
733    "2- Indices of nodes forming triangle.:LR:\n"
734 
735    #define SUMA_SurfContHelp_GEdge \
736 "1- Edge/Cell Index:  Get/Set index of :term:`edge`/:term:`cell` in focus on "\
737 "this controller's graph. This number is the :term:`1D index` of the edge/cell "\
738 "in the graph/matrix. Consider it the equivalent of a voxel 1D index in "\
739 "a volume, or a node in a surface dataset. \n" \
740 "Entering a new edge's index will put that edge  in focus and send the "\
741 "crosshair to its center (like :ref:`j<LC_j>`). "\
742 "Use :ref:`alt+l<LC_Alt+l>` to center the cross hair in your viewer.:LR:\n" \
743 "Note that an edge can be formed by a pair of identical nodes - think "\
744 "matrix diagonal.:LR:\n"\
745 "2- Nodes Forming Directed Edge/Cell: For a cell, this would its pair of "\
746 "row and column indices into the matrix. For a graph, this would be the "\
747 "indices of the :term:`nodes` forming the directed edge."
748 
749 #define SUMA_SurfContHelp_NodeValTblr0 \
750    "Data values at node in focus"
751 #define SUMA_SurfContHelp_GEdgeValTblr0 \
752    "Data values at edge in focus. :term:`Intensity`, "\
753 ":term:`Threshold`, and :term:`Brightness` show the triplets of values "\
754 " at the selected edge that correspond to the graph/matrix  choices." \
755 "in :ref:`I<VolCont->Dset_Mapping->I>`, :ref:`T<VolCont->Dset_Mapping->T>`, and :ref:`B<VolCont->Dset_Mapping->B>` selectors."
756 
757    #define SUMA_SurfContHelp_NodeValTblc0 \
758 "Data values at node in focus. :term:`Intensity`, "\
759 ":term:`Threshold`, and :term:`Brightness` show the triplets of values "\
760 " at the selected node that correspond to the dataset column choices " \
761 "in :ref:`I<SurfCont->Dset_Mapping->I>`, :ref:`T<SurfCont->Dset_Mapping->T>`, and :ref:`B<SurfCont->Dset_Mapping->B>` selectors."
762 
763 
764    #define SUMA_TractContHelp_NodeValTblc0 \
765 "Data values at point in focus. At the moment, :term:`Intensity`, "\
766 ":term:`Threshold`, and :term:`Brightness` show the RGB values for the point "\
767 "selected. Eventually, they would represent the triplets of values at the point"\
768 " that correspond to the dataset column choices in :term:`I`, :term:`T`,"\
769 " :term:`B`."
770 
771    #define SUMA_VolContHelp_NodeValTblc0 \
772 "Data values at voxel in focus. :term:`Intensity`, "\
773 ":term:`Threshold`, and :term:`Brightness` show the triplets of values "\
774 " at the selected voxel that correspond to the volume column choices " \
775 "in :ref:`I<VolCont->Dset_Mapping->I>`, :ref:`T<VolCont->Dset_Mapping->T>`, and :ref:`B<VolCont->Dset_Mapping->B>` selectors."
776 
777 #define SUMA_SurfContHelp_GEdgeValTblc0 \
778    SUMA_SurfContHelp_GEdgeValTblr0
779 
780 #define SUMA_SurfContHelp_NodeValTblc1 \
781    "Intensity (I) value"
782 #define    SUMA_SurfContHelp_GEdgeValTblc1\
783    "Intensity (I) value"
784 
785 #define SUMA_SurfContHelp_NodeValTblc2 \
786    "Threshold (T) value"
787 #define SUMA_SurfContHelp_GEdgeValTblc2\
788    "Threshold (T) value"
789 
790 #define SUMA_SurfContHelp_NodeValTblc3 \
791    "Brightness modulation (B) value"
792 #define SUMA_SurfContHelp_GEdgeValTblc3 \
793    "Brightness modulation (B) value"
794 
795 #define SUMA_SurfContHelp_NodeLabelTblr0 \
796    "Labels available at the selected datum.\n" \
797    "If nothing is available, datum color\n"   \
798    "is displayed."
799 
800 #define SUMA_TractContHelp_NodeLabelTblr0 \
801    "Labels at selected point. For now, nothing more than a regurgitation " \
802    "of :ref:`BTP<TractCont->Xhair_Info->BTP.r00>`"
803 
804 #define SUMA_SurfContHelp_GEdgeLabelTblr0\
805    "Labels from the selected graph dataset\n" \
806    "at the edge in focus.\n"   \
807    "If no labels are available, edge color\n"   \
808    "is displayed."
809 
810 #define SUMA_SurfContHelp_DsetLblTblr0 \
811   "Label of dataset currently selected. Note that for some objects, "\
812   "like surfaces, what you're viewing "\
813   "at any moment maybe a blend of multiple datasets. See "\
814   ":ref:`color mixing<ColorMixing>` for details."
815 
816 #define SUMA_SurfContHelp_DsetLblTblr1 \
817    "Parent surface of Dset."
818 
819 #define SUMA_SurfContHelp_DsetOrd \
820    "Order of Dset's colorplane in the stack of all colorplanes of the parent surface.\n"  \
821    "The datset with highest order number is \n"   \
822    "on top of the stack. Separate \n"  \
823    ":ref:`stacks<Plane_Layering>` exist for foreground (fg:)\n" \
824    "and background planes (bg:).:LR:\n"   \
825    ":SPX:See :ref:`Color Mixing<ColorMixing>` for details on how colors "\
826    "are merged.:SPX:"
827 
828 #define SUMA_TractContHelp_DsetOrd \
829    "Order of this tract's dataset colorplane in the stack of all colorplanes available.\n"  \
830    "The datset with highest order number is \n"   \
831    "on top of the stack.\n"   \
832    ":SPX:See :ref:`color plane grouping <Color_Plane_Grouping>` for details "\
833    "on how colors are merged.:SPX:"
834 
835 #define SUMA_SurfContHelp_DsetAlphaThresh \
836    "Alpha threshold of Dset's rendered slices.\n"  \
837    "When datasets' voxels get colored, they get an Alpha (A) value\n"\
838    "in addition to the R, G, B values. A is computed based on\n"\
839    "the setting of the 'Avl' menu.\n"\
840    "Voxels (or more precisely, their openGL realization) \n"   \
841    "with Alpha lower than this value will not get rendered.\n"  \
842    "This is another way to 'threshold' a rendered volume, and \n" \
843    "is comparable to thresholding with the slider bar if using a\n"\
844    "monochromatic increasingly monotonic colormap with 'Avl' set to\n"\
845    "one of Max, Min, or Avg.\n"  \
846    "Note that thresholding with the slider bar sets A for thresholded \n" \
847    "voxels to 0.0 regardless of the setting for 'Avl'.\n"   \
848    "Thresholding with Ath is faster than using the slider bar because \n" \
849    "it does not require recreating the whole texture."
850 
851 #define SUMA_SurfContHelp_ArrowFieldMenu \
852    "For datasets with sub-bricks exceeding what you have\n" \
853    "set in environment variable SUMA_ArrowFieldSelectorTrigger\n"\
854    "the menu selection switches to this format."
855 
856 #define SUMA_SurfContHelp_DsetOpa \
857    "Opacity of Dset's colorplane.\n"  \
858    "Opaque planes have an opacity\n"   \
859    "of 1, transparent planes have\n"  \
860    "an opacity of 0. \n"   \
861    "Opacities are used when mixing\n" \
862    "planes within the same :ref:`group<Color_Plane_Grouping>`  \n"  \
863    "foreground (fg:) or background(bg:).\n"   \
864    "\n"  \
865    "Opacity values are not applied\n"  \
866    "to the first plane in a group.\n"   \
867    "Consequently, if you have just\n"   \
868    "one plane to work with, opacity \n"   \
869    "value is meaningless.\n"  \
870    "\n"  \
871    "Color mixing can be done in two \n"  \
872    "ways, use :ref:`F7<F7>` to toggle between \n" \
873    "mixing modes.\n"
874 
875 #define SUMA_TractContHelp_DsetOpa \
876    "Opacity of Dset's colorplane.\n"  \
877    "Opaque planes have an opacity\n"   \
878    "of 1, transparent planes have\n"  \
879    "an opacity of 0. \n"   \
880    "\n"\
881    "Opacity values are not applied\n"  \
882    "to the first plane in a group.\n"   \
883    "Consequently, if you have just\n"   \
884    "one plane to work with, or you have "\
885    ":ref:`1<TractCont->Coloring_Controls->1>` ON, \n"\
886    "the opacity  value is meaningless.\n"  \
887    "\n"  \
888    "Color mixing can be done in two \n"  \
889    "ways, use :ref:`F7<F7>` to toggle between \n" \
890    "mixing modes.\n"
891 
892 #define SUMA_SurfContHelp_DsetDim  \
893    "Dimming factor to apply to colormap\n" \
894    "before mapping the intensity (I) data.\n" \
895    "The colormap, if displayed on the right,\n"   \
896    "is not visibly affected by Dim but the\n"   \
897    "colors mapped onto the surface, voxel grid, tracts, etc. are.\n"   \
898    "For RGB Dsets (e.g. .col files, or tract colors), Dim is\n" \
899    "applied to the RGB colors directly.:LR:\n"  \
900    "Decreasing Dim is useful when the colors are too saturated\n" \
901    "for lighting to reflect the object terrain.\n" \
902    "When in doubt, just press the button and see what happens."   \
903 
904 #define SUMA_SurfContHelp_DsetNodeRadGain  \
905    "Gain to apply to node radius.\n" \
906    "This multiplier is always applied to whatever\n" \
907    "radius value the node gets, whether is it constant\n"   \
908    "or data derived.\n"
909 
910 #define SUMA_SurfContHelp_DsetEdgeThickGain  \
911    "Gain to apply to edge thickness.\n" \
912    "This multiplier is always applied to whatever\n" \
913    "thickness value the edge gets, whether is it constant\n"   \
914    "or data derived.\n"
915 
916 #define SUMA_SurfContHelp_DsetView  \
917    "View (ON)/Hide Dset node colors"
918 
919 #define SUMA_SurfContHelp_DsetViewOne  \
920    "If ON, view only the selected\n"\
921    "Dset's colors. No mixing of colors in the\n"\
922    "foreground stack is done.\n"   \
923    "\n"  \
924    "If OFF, then mix the color planes\n"  \
925    "in the foreground stack.\n"  \
926    "\n"  \
927    "This option makes it easy to view \n" \
928    "one Dset's colors at a time without\n"   \
929    "having to worry about color mixing,\n"   \
930    "opacity, and stacking order.\n" \
931    "\n"  \
932    "Needless to say, options such as\n" \
933    "'Ord:' and 'Opa:' in this panel are \n" \
934    "of little use when this button is ON."
935 
936 #define SUMA_TractContHelp_DsetViewOne  \
937    "If ON, view only the selected\n"\
938    "Dset's colors.\n"   \
939    "\n"  \
940    "If OFF, then mix the color planes\n"  \
941    "in the datasets stack.\n"  \
942    "\n"  \
943    "This option makes it easy to view \n" \
944    "one Dset's colors at a time without\n"   \
945    "having to worry about color mixing,\n"   \
946    "opacity, and stacking order.\n" \
947    "\n"  \
948    "Needless to say, options such as\n" \
949    "'Ord:' and 'Opa:' in this panel are \n" \
950    "of little use when this button is ON."
951 
952 #define SUMA_SurfContHelp_DsetSwitch   \
953    "Switch between datasets."
954 
955 #define SUMA_TractContHelp_DsetSwitch   \
956 "Select the dataset to which the Coloring Controls are being applied. For now "\
957 "you have three free RGB datasets per network that are created by SUMA. In the"\
958 " first one each node of a tract is colored based on the local orientation, "\
959 "with red, green, and blue values reflecting the X,Y, and Z components of the"\
960 " unit direction vector. In the second dataset all nodes of a tract are "\
961 "assigned the color of the middle node of that tract. In the third dataset, all"\
962 " nodes of a tract are colored based on the bundle in which that tract"\
963 " resides.The number of colors in such a dataset depend on the total number of"\
964 " bundles in the entire network."
965 
966 #define SUMA_SurfContHelp_SetThreshTblr0   \
967 "Set/Get the threshold value.\n"  \
968 "When statistical parameters are set under "\
969 ":ref:`T <VolCont->Dset_Mapping->T>`, you can \n"  \
970 "append a 'p' to set by the p value, as in 0.001p.:LR:\n" \
971 "For percentile thresholding, append a '%' to "\
972 "the value, such as 25%\n"
973 
974    #define SUMA_SurfContHelp_MasksLoad  \
975 "Load a set of masks previously saved by my neighboring button. The save "\
976 "operation also preserves the :ref:`Mask Eval<MaskCont->Masks->Mask_Eval.r00>` "\
977 "expression.:LR:\nReloading a mask file will replace current masks."
978 
979 #define SUMA_SurfContHelp_MasksSave  \
980    "Save current set of masks for future loading by my neighborly button.\n"
981 
982 #define SUMA_SurfContHelp_DsetLoad  \
983    "Load a new dataset (Dset).\n"   \
984    "Datasets can be of 3 formats::LR:\n"   \
985    "1- NIML (.niml.dset): "   \
986    ":   :This format is internal "   \
987    ":   :to AFNI/SUMA. :LR:\n"   \
988    "2- GIFTI (.gii.dset):"\
989    ":   :The format to end all formats.:LR:\n"  \
990    "3- 1D   (.1D.dset): "   \
991    ":   :Simple ASCII tabular format "   \
992    ":   :supporting numerical values "   \
993    ":   :only.\n"   \
994    "     Each row i contains Nj data "   \
995    ":   :values per node."   \
996    ":   :Since this format has no header"   \
997    ":   :associated with it, it makes"   \
998    ":   :some assumption about the data"   \
999    ":   :in the columns. :LR:\n"   \
1000    "   You can choose from 3 options: \n"   \
1001    ":   :(see below for nomenclature):LR:\n"   \
1002    "   - Each column has Ni values where\n"   \
1003    ":   :Ni = N_Node. \n"   \
1004    ":   :In this case, it is assumed that\n"   \
1005    ":   :row i has values for node i on\n"   \
1006    ":   :the surface.\n"   \
1007    "   - If Ni is not equal to N_Node then\n"   \
1008    ":   :SUMA will check to see if column 0\n"   \
1009    ":   :(Col_0) is all integers with values\n"   \
1010    ":   :v satisfying:  0 <= v < N_Node .\n"   \
1011    "     If that is the case then column 0\n"   \
1012    ":   :contains the node indices. The values\n"   \
1013    ":   :in row j of Dset are for the node\n"   \
1014    ":   :indexed Col_0[j].\n"   \
1015    "     In the sample :term:`1D` Dset shown below\n"   \
1016    ":   :assuming N_Node > 58, SUMA\n"   \
1017    ":   :will consider the 1st column to \n"   \
1018    ":   :contain node indices. In that case\n"   \
1019    ":   :the values -12.1 and 0.9 are for \n"   \
1020    ":   :node 58 on the surface.\n"   \
1021    "   - Lastly, if Col_0 fails the node index\n"   \
1022    ":   :test, then SUMA considers the data\n"   \
1023    ":   :in row i to be associated with node i.\n"   \
1024    "\n"   \
1025    "   If you're confused, try creating some\n"   \
1026    ":   :toy datasets like the one below and \n"   \
1027    ":   :load them into SUMA.\n"   \
1028    "\n"   \
1029    "   Sample 1D Dset (Call it pickle.1D.dset):\n"   \
1030    "     25    22.7     1.2   \n"   \
1031    "     58    -12.1    0.9   \n"   \
1032    "\n"   \
1033    "   Nomenclature and conventions:\n"   \
1034    "     - N_Node is the number of nodes\n"   \
1035    ":     :forming the surface.\n"   \
1036    "     - Indexing always starts at 0.\n"   \
1037    ":     :In the example, value v at \n"   \
1038    ":     :row 0, column 1 is v = 22.7 .\n"   \
1039    "     - A Dset has Ni rows and Nj columns.\n"   \
1040    ":     :In other terms, Ni is the number\n"   \
1041    ":     :of values per node and Nj is the\n"   \
1042    ":     :number of nodes for which data are\n"   \
1043    ":     :specified in Dset.\n"   \
1044    ":     :Ni = 2, Nj = 3 in the example."
1045 
1046 #define SUMA_SurfContHelp_DsetLoadCol  \
1047    "Load a new color plane.\n"   \
1048    "A color plane is a :term:`1D` text file with \n" \
1049    "each row formatted as such:LR:\n"  \
1050    "  n  r g b:LR:\n" \
1051    "where n is the node index, \n"  \
1052    "r, g, and b are the red, green and blue\n"  \
1053    "color values, respectively. \n"  \
1054    "Color values must be between 0 and 1.0. \n" \
1055    "A sample file would be: test.1D.col with content:LIT:\n"   \
1056    "   0    0.1 0.2 1   \n"   \
1057    "   1    0   1   0.8 \n"   \
1058    "   4    1   1   1   \n"   \
1059    "   7    1   0   1   \n"   \
1060    "   14   0.7 0.3 0   "
1061 
1062 
1063 #define SUMA_SurfContHelp_SelInt \
1064 "Use this menu to select which column (:term:`sub-brick`) in the "   \
1065 "dataset (Dset) should be used for an Intensity (I)"   \
1066 "measure.\n"   \
1067 "\n"   \
1068 "Values in (I) are the ones that get colored by the colormap," \
1069 "however, no coloring is done if the :ref:`'v'<SurfCont->Dset_Mapping->I->v>` button on the right is"   \
1070 "turned off.\n"   \
1071 "\n"   \
1072 "The (I) value for the selected :term:`datum` (n) is shown in the :ref:`'Val'<SurfCont->Xhair_Info->Val.c00>` table"\
1073 "of the :ref:`'Xhair Info' <SurfCont->Xhair_Info>` section on the left.\n"\
1074 "The value is also shown in the SUMA viewer\n"\
1075 "\n"   \
1076 "You can use a different type of selector to set (I). "  \
1077 "A right-click on 'I' opens a list widget, which is better " \
1078 "when you have many columns from which to choose.\n" \
1079 "\n"  \
1080 "The style of this selector can also change depending on the number"\
1081 "of sub-bricks (columns) you have in your dataset. If the number"\
1082 "exceeds a threshold specified by the environment variable "\
1083 ":ref:`SUMA_ArrowFieldSelectorTrigger<SUMA_ArrowFieldSelectorTrigger>`\n"
1084 
1085 #define SUMA_SurfContHelp_SelThr \
1086 "Use this menu to select which column (:term:`sub-brick`) in the\n"   \
1087 "dataset (Dset) should be used for a Threshold (T) "   \
1088 "measure.\n"   \
1089 "\n"   \
1090 "T values are the ones used to determine if a :term:`datum` "   \
1091 "gets colored based on its (I) value.\n"   \
1092 "\n"   \
1093 "A :term:`datum` n is not colored if::LR:\n"   \
1094 "    T(n)   < Tscale   :LR:\n"   \
1095 "or if :ref:`'\\|T\\|'<SurfCont->Dset_Mapping->abs_T>` option below "   \
1096 "is turned ON: :LR:\n"   \
1097 "  | T(n) | < Tscale .\n"  \
1098 "\n"   \
1099 "Thresholding is not applied when the :ref:`'v'<SurfCont->Dset_Mapping->T->v>` button on the right is turned off.\n" \
1100 "\n"   \
1101 "The (T) value for the selected :term:`datum` (n) is shown in the :ref:`'Val'<SurfCont->Xhair_Info->Val.c00>` table"\
1102 "of the :ref:`'Xhair Info' <SurfCont->Xhair_Info>` section on the left.\n"\
1103 "The value is also shown in the SUMA viewer\n"\
1104 "\n"   \
1105 "You can use a different type of selector to set (T). "  \
1106 "A right-click on 'T' opens a list widget, which is better " \
1107 "when you have many columns from which to choose.\n" \
1108 "\n" \
1109 "The style of this selector can also change depending on the number "\
1110 "of sub-bricks (columns) you have in your dataset. If the number "\
1111 "exceeds a threshold specified by the environment variable "\
1112 ":ref:`SUMA_ArrowFieldSelectorTrigger<SUMA_ArrowFieldSelectorTrigger>`\n"
1113 
1114    #define SUMA_SurfContHelp_SelBrt \
1115 "Use this menu to select which column (:term:`sub-brick`) in the "\
1116 "dataset (Dset) should be used for color Brightness (B) modulation.\n"   \
1117 "\n"   \
1118 "The (B) values are the ones used to control the brightness of a :term:`datum's<datum>` color.\n"  \
1119 "\n"   \
1120 "Brightness modulation is controlled by ranges in the 'B' cells of the "\
1121 "table below.\n"   \
1122 "\n"   \
1123 "Brightness modulation is not applied when the :ref:`'v'<SurfCont->Dset_Mapping->B->v>` button on \n"   \
1124 "the right is turned off.\n"  \
1125 "\n"   \
1126 "The (B) value for the selected :term:`datum` (n) is shown in the :ref:`'Val'<SurfCont->Xhair_Info->Val.c00>` table"\
1127 "of the :ref:`'Xhair Info' <SurfCont->Xhair_Info>` section on the left.\n"\
1128 "The value is also shown in the SUMA viewer\n"\
1129 "\n"   \
1130 "You can use a different type of selector to set (B). "  \
1131 "A right-click on 'B' opens a list widget, which is better " \
1132 "when you have many columns from which to choose.\n" \
1133 "\n" \
1134 "The style of this selector can also change depending on the number"\
1135 "of sub-bricks (columns) you have in your dataset. If the number"\
1136 "exceeds a threshold specified by the environment variable "\
1137 ":ref:`SUMA_ArrowFieldSelectorTrigger<SUMA_ArrowFieldSelectorTrigger>`\n"
1138 
1139 #define SUMA_SurfContHelp_SelIntTgl \
1140    "View (ON)/Hide Dset node colors"
1141 
1142 #define SUMA_VolContHelp_SelIntTgl \
1143    "View (ON)/Hide Dset voxel colors"
1144 
1145 #define SUMA_GraphContHelp_SelIntTgl \
1146    "View (ON)/Hide Dset edge colors"
1147 
1148 #define SUMA_SurfContHelp_SelThrTgl \
1149    "Apply (ON)/Ignore thresholding"
1150 
1151 #define SUMA_SurfContHelp_SelBrtTgl \
1152    "View (ON)/Ignore brightness modulation"
1153 
1154 #define SUMA_SurfContHelp_ShowSliceTgl \
1155    "View (ON)/Hide slice"
1156 #define SUMA_SurfContHelp_ShowVrFTgl \
1157    "View (ON)/Hide Volume Rendering"
1158 #define SUMA_SurfContHelp_VrSelectTgl \
1159    "When ON, allow voxel selection on volume rendering."
1160 
1161 #define SUMA_SurfContHelp_SetRngTbl_r0 \
1162    "Used for setting the clipping ranges. "   \
1163    "Clipping is only done for \n"   \
1164    "color mapping. Actual data \n"   \
1165    "values do not change."
1166 
1167 #define SUMA_SurfContHelp_SetRngTbl_r1 \
1168 "Intensity clipping range rules::LR:\n" \
1169 "   Values in the intensity data "   \
1170 "that are less than Min are colored "   \
1171 "by the first (bottom) color of the "   \
1172 "colormap. :LR:\n"   \
1173 "   Values larger than Max are mapped "   \
1174 "to the top color.:LR:\n"   \
1175 "   Intermediate values are mapped according to the :ref:`'Col'<SurfCont->Dset_Mapping->Col>` menu below.\n"\
1176 "\n"\
1177 "You can set the range as a percentile of the dataset's values by appending "\
1178 " '%' to the percentile for Min and/or Max such as 5% or 90%. Note that "\
1179 "the percentile always gets replaced by the actual value in the dataset.\n"  \
1180 "\n"   \
1181 "A left-click on 'I' locks ranges from automatic resetting, and the locked "\
1182 "range applies to the current Dset only. A locked range is indicated with the "\
1183 "reverse video mode.\n"   \
1184 "\n"   \
1185 "A right-click resets values to the default range (usually 2% to 98%) in the dataset."
1186 
1187 #define SUMA_SurfContHelp_SetRngTbl_r2 \
1188 "Values in the brightness (B) :ref:`column<SurfCont->Dset_Mapping->B>` "\
1189 "are clipped to the Min to Max range in this row before calculating "\
1190 "their modulation factor per the values in the next table row.\n"   \
1191 "\n"   \
1192 "You can set the range as a percentile of the dataset's values by appending "\
1193 " '%' to the percentile for Min and/or Max such as 8% or 75%. Note that "\
1194 "the percentile always gets replaced by the actual value in the dataset.\n"  \
1195 "\n"   \
1196 "A left-click locks ranges in this row from automatic resetting, "   \
1197 "and a locked range is applied to the current Dset only. A locked "\
1198 "range is indicated with the reverse video mode.\n" \
1199 "\n"   \
1200 "A right-click resets values to the default range (usually 2% to 98%) for the dataset."
1201 
1202 #define SUMA_SurfContHelp_SetRngTbl_r3 \
1203    "Brightness modulation factor range.\n"   \
1204    "Brightness modulation values, after\n"   \
1205    "clipping per the values in the row above,\n"   \
1206    "are scaled to fit the range specified\n"   \
1207    "here."
1208 
1209 #define SUMA_SurfContHelp_SetRngTbl_r4 \
1210    "Coordinate bias range.\n"   \
1211    "Coordinates of nodes that are mapped\n"   \
1212    "to the colormap can have a bias added\n"   \
1213    "to their coordinates. \n"   \
1214    "\n"   \
1215    "Nodes mapped to the first color of \n"   \
1216    "the map receive the minimum bias and\n"   \
1217    "nodes mapped to the last color receive\n"   \
1218    "the maximum bias. \n"   \
1219    "\n"   \
1220    "Nodes not colored, because of \n"   \
1221    "thresholding for example, will \n"   \
1222    "have no bias applied."
1223 
1224 #define SUMA_SurfContHelp_SetRngTbl_c1 \
1225    "Minimum clip value.\n" \
1226    "Clips values (v) in the Dset\n" \
1227    "less than Minimum (min):\n"  \
1228    "  if v < min then v = min \n\n"\
1229 "You can also set the range as a percentile of the dataset's values by  "\
1230 "appending '%' to the percentile such as 5% or 90%. Note that "\
1231 "the percentile always gets replaced by the actual value in the dataset."
1232 
1233 #define SUMA_SurfContHelp_SetRngTbl_c2 \
1234    "Maximum clip value.\n" \
1235    "Clips values (v) in the Dset\n" \
1236    "larger than Maximum (max):\n"  \
1237    "  if v > max then v = max \n\n" \
1238 "You can also set the range as a percentile of the dataset's values by  "\
1239 "appending '%' to the percentile such as 5% or 90%. Note that "\
1240 "the percentile always gets replaced by the actual value in the dataset."
1241 
1242 
1243 #define SUMA_SurfContHelp_SetClustTbl_r0 \
1244    "Used for setting the clustering parameters."
1245 
1246 #define SUMA_SurfContHelp_SetClustTbl_r1 \
1247    "Clusterizing.\n" \
1248    "\n"   \
1249    "Left click toggles clusterizing ON/OFF"
1250 
1251 #define SUMA_SurfContHelp_SetClustTbl_c1 \
1252    "Minimum distance between nodes.\n" \
1253    "Nodes closer than the minimum distance are in\n"\
1254    "same cluster. If you want to distance to be in\n"\
1255    "number of edges (N) separating nodes, set the minimum\n"\
1256    "distance to -N. This parameter is the same as -rmm in\n"\
1257    "the program SurfClust"
1258 
1259 #define SUMA_SurfContHelp_SetClustTbl_c2 \
1260    "Minimum cluster area\n" \
1261    "A cluster whose area is less than the specified minimum\n"\
1262    "will not be displayed. Instead of areas, you can specify\n"\
1263    "that clusters less than K nodes be masked by setting\n"\
1264    "the Minimum cluster area to -K\n"  \
1265    "This parameter covers options -amm2 and -n in\n"\
1266    "the program SurfClust"
1267 
1268 #define SUMA_SurfContHelp_Col \
1269    "Switch between modes for mapping values to the color map.:LR:\n"   \
1270    "The bottom color of the map C0 maps to the minimum value in the "\
1271    ":ref:`I range<SurfCont->Dset_Mapping->SetRangeTable.r01>` row, "\
1272    "and the top color to the maximum value. Colors for values in between "\
1273    "the minimum and maximum of "\
1274    ":ref:`I range<SurfCont->Dset_Mapping->SetRangeTable.r01>`, the following "\
1275    "methods apply:LR:\n"\
1276    "Int: Interpolate linearly between\n"   \
1277    ":   :colors in colormap to find color at:LR:\n"\
1278    ":   :   icol=((V-Vmin)/Vrange * Ncol) :LR:\n"   \
1279    "NN : Use the nearest color in the\n"   \
1280    ":   :colormap. The index into the colormap\n"\
1281    ":   :of Ncol colors is given by :LR:\n"\
1282    ":   :   icol=floor((V-Vmin)/Vrange * Ncol) :LR:\n"   \
1283    ":   :with icol clipped to the range 0 to Ncol-1:LR:\n"   \
1284    "Dir: Use intensity values as indices\n"   \
1285    ":   :into the colormap.\n"   \
1286    ":   :In Dir mode, the intensity \n"   \
1287    ":   :clipping range is of no use.:LR:\n" \
1288    ":   :   icol=floor(V) with clipping to the range 0 to Ncol-1"
1289 
1290 #define SUMA_SurfContHelp_Link \
1291 "Switch between methods for the automatic linking of I, T selectors.:LR:\n"   \
1292 "  None: Do nothing.:LR:\n"   \
1293 "  Same: Set the T selector to match the I selection.:LR:\n"  \
1294 "  Stat: Switch T selector to match an I selection with \n"\
1295 ":       :an obvious statistic. Matching is based on labels.:LR:\n"\
1296 "You can set your preference using environment variable\n"\
1297 "   SUMA_IxT_LinkMode\n"
1298 
1299 #define SUMA_SurfContHelp_Bias \
1300    "Coordinate bias direction.:LR:\n"   \
1301    ": :-: No bias thank you:LR:\n"   \
1302    ": :x: X coord bias:LR:\n"   \
1303    ": :y: Y coord bias:LR:\n"   \
1304    ": :z: Z coord bias:LR:\n"   \
1305    ": :n: bias along node's normal:LR:\n"  \
1306    "\n"   \
1307    "See more info in Bhelp for\n"   \
1308    "'C' table entry above.\n" \
1309    "\n"   \
1310    "This option will produce\n"   \
1311    "'Extremely Cool'[1] images.\n"   \
1312    "[1] Chuck E. Weiss (Slow River/" \
1313    "Rykodisc) 1999."
1314 
1315 #define SUMA_SurfContHelp_Cmp \
1316    "Switch between available color maps.\n"   \
1317    "If the number of colormaps is too large\n"   \
1318    "for the menu button, right click over\n"   \
1319    "the 'Cmp' label and a chooser with a \n"   \
1320    "slider bar will appear.\n"   \
1321    "\n"   \
1322    "More help is available via\n"   \
1323    "ctrl+h while mouse is over the\n"   \
1324    "colormap."
1325 
1326 #define SUMA_SurfContHelp_CmpNew \
1327    "Load new colormap.\n"   \
1328    "Loaded map will replace a\n"   \
1329    "pre-existing one with the\n"   \
1330    "same name.\n"   \
1331    "\n"   \
1332    "See ScaleToMap -help for \n"   \
1333    "details on the format of \n"   \
1334    "colormap file. The formats\n"   \
1335    "are described in the section\n"   \
1336    "for the option -cmapfile.\n"   \
1337    "\n"   \
1338    "A sample colormap would be:LIT:\n"   \
1339    " 0 0 1\n"   \
1340    " 1 1 1\n"   \
1341    " 1 0 0:LR:\n"   \
1342    "saved into a cmap file called\n"   \
1343    "cmap_test.1D.cmap" \
1344    "\n"  \
1345    "See also envs :ref:`SUMA_CmapsDir<SUMA_CmapsDir>`, "\
1346    ":ref:`SUMA_RetinoAngle_DsetColorMap<SUMA_RetinoAngle_DsetColorMap>` "\
1347    "and :ref:`SUMA_VFR_DsetColorMap<SUMA_VFR_DsetColorMap>`"
1348 
1349 
1350    #define  SUMA_SurfContHelp_AbsThr   \
1351 "Toggle Absolute thresholding.:LR:\n"   \
1352 "   OFF: Mask color for\n"   \
1353 ":      ::term:`datum` (nodes, edges, voxels, etc.) that have::LR:\n"   \
1354 "      T(n) < Tscale:LR:\n"   \
1355 "   ON:  Mask color for\n"   \
1356 ":      ::term:`datum` that have::LR:\n"   \
1357 "      | T(n) | < Tscale\n\n"   \
1358 "where::LR:\n"   \
1359 "     Tscale is the value set by the threshold scale.:LR:\n"   \
1360 "     T(n) is the :term:`datum` value in the selected threshold column (T).\n"  \
1361 ":         :This value is seen in the second cell of the 'Value'\n"   \
1362 ":         :table on the left side."
1363 
1364 #define  SUMA_SurfContHelp_Isym   \
1365    "Toggle Intensity range symmetry "   \
1366    "about 0.:LR:\n"   \
1367    "   ON : Intensity clipping range\n"   \
1368    ":     :is forced to go from \n"   \
1369    ":     :-val to val.\n"   \
1370    ":     :This allows you to mimic\n"   \
1371    ":     :AFNI's ranging mode.:LR:\n"   \
1372    "  OFF: Intensity clipping range\n"   \
1373    ":     :can be set to your liking."
1374 
1375 #define  SUMA_SurfContHelp_Shw0   \
1376    "Toggle color masking of nodes "   \
1377    "with intensity = 0 :LR:\n"   \
1378    "  ON : 0 intensities are mapped\n"   \
1379    ":     :to the colormap as any\n"   \
1380    ":     :other values.:LR:\n"   \
1381    "  OFF: 0 intensities are masked,\n"   \
1382    ":     :a la AFNI"
1383 
1384 #define  SUMA_SurfContHelp_RangeTbl_c0 \
1385    "Full range of values in Dset"
1386 
1387 #define SUMA_SurfContHelp_RangeTbl_c1 \
1388    "Minimum value in Dset column"
1389 
1390 #define SUMA_SurfContHelp_RangeTbl_c2 \
1391    "Node index at minimum.\n"   \
1392    "Right click in cell to\n"   \
1393    "have crosshair jump to\n"   \
1394    "node's index.\n"   \
1395    "Same as 'ctrl+j' or\n"   \
1396    "an entry in the 'Node' cell\n"   \
1397    "under Xhair Info block."
1398 
1399 #define SUMA_GraphContHelp_RangeTbl_c2 \
1400    "Edge index at minimum.\n"   \
1401    "Right click in cell to\n"   \
1402    "have crosshair jump to\n"   \
1403    "edge's index.\n"   \
1404    "Same as 'ctrl+j' or\n"   \
1405    "an entry in the 'Edge' cell\n"   \
1406    "under Xhair Info block."
1407 
1408 #define SUMA_SurfContHelp_RangeTbl_c3 \
1409    "Maximum value in Dset column"
1410 
1411 #define SUMA_SurfContHelp_RangeTbl_c4  \
1412    "Node index at maximum.\n" \
1413    "Right click in cell to\n" \
1414    "have crosshair jump to\n" \
1415    "node's index.\n"   \
1416    "Same as 'ctrl+j' or\n"   \
1417    "an entry in the 'Node' cell\n"   \
1418    "under Xhair Info block."
1419 
1420 #define SUMA_GraphContHelp_RangeTbl_c4  \
1421    "Edge index at maximum.\n" \
1422    "Right click in cell to\n" \
1423    "have crosshair jump to\n" \
1424    "edge's index.\n"   \
1425    "Same as 'ctrl+j' or\n"   \
1426    "an entry in the 'Edge' cell\n"   \
1427    "under Xhair Info block."
1428 
1429 #define SUMA_SurfContHelp_RangeTbl_r1  \
1430    "Range of values in intensity (I) column"
1431 
1432 #define SUMA_SurfContHelp_RangeTbl_r2  \
1433    "Range of values in threshold (T) column"
1434 
1435 #define SUMA_SurfContHelp_RangeTbl_r3  \
1436    "Range of values in brightness (B) column"
1437 
1438 #define  SUMA_SurfContHelp_MaskTypeTbl_c0 \
1439    "Add one more row for a mask ROI"
1440 
1441 #define SUMA_SurfContHelp_MaskTypeTbl_c1 \
1442    "String label of ROI"
1443 
1444 #define SUMA_SurfContHelp_MaskTypeTbl_c05 \
1445    "Variable symbol. Choose from 'a' to 'z'"
1446 
1447    #define SUMA_SurfContHelp_MaskTypeTbl_c2 \
1448 "Type of mask. For the moment, this string can only be one of 'box' or 'sphere'."
1449 
1450    #define SUMA_SurfContHelp_MaskTypeTbl_c3 \
1451 "Set/Get coordinates in mm :term:`RAI` of the center of the mask :LR:\n"   \
1452 "You can right click in cell to get back to the original center.:LR:\n" \
1453 "You can also reposition the mask interactively in the SUMA viewer "\
1454 "by :ref:`selecting <Button_3-Press>` something, if you are in "\
1455 ":ref:`Mask Manipulation Mode<Mask_Manipulation_Mode>`."
1456 
1457 #define SUMA_SurfContHelp_MaskTypeTbl_c4 \
1458 "Set/Get size along three dimensions of mask. You can enter a single value "\
1459 "if the all three dimensions are equal. :LR:\n" \
1460 "Right click in cell to get back to the original size.:LR:\n" \
1461 "Resizing in SUMA viewer can be done with :ref:`Ctrl+scroll<Ctrl+Scroll>` "\
1462 "if you are in :ref:`Mask Manipulation Mode<Mask_Manipulation_Mode>`.:LR:\n"\
1463 "You can also change values by scrolling with mouse pointer over the cell.\n"
1464 
1465    #define SUMA_Switch_Cont_BHelp   \
1466 "Switch to controllers of other objects. You can use the arrows, or set the "\
1467 "controller's index directly."
1468 
1469    #define SUMA_SurfContHelp_AllObjs   \
1470 "Initialize controllers for all objects that have one. "\
1471 "This is particularly useful when a particular may not be visible under "\
1472 "the default settings."
1473 
1474    #define SUMA_SurfContHelp_MaskTypeTbl_c5  \
1475 "Color of mask in RGB triplets between 0 and 1.0. You can also specify "\
1476 "colors using the shorthands of::LR:\n"\
1477 "   'b' or 'blue':LR:\n"   \
1478 "   'g' or 'green':LR:\n"  \
1479 "   'p' or 'pink':LR:\n"   \
1480 "   'r' or 'red':LR:\n" \
1481 "   'w' or 'white':LR:\n"  \
1482 "   'y' or 'yellow':LR:\n" \
1483 "The final color depends also on the dim factor 'D'"
1484 
1485    #define SUMA_SurfContHelp_MaskTypeTbl_c6  \
1486 "Alpha of mask color. The Alpha value controls the contribution of an ROI's"\
1487 "color to the tracts that pass through it. This tinting process is only "\
1488 "used when 'Mask Eval' is in use, and when A is > 0. See the help for "\
1489 "'Mask Eval' for information on how tinting works.:LR:\n"\
1490 "You can also change values by scrolling with mouse pointer over the cell.\n"
1491 
1492    #define SUMA_SurfContHelp_MaskTypeTbl_c7  \
1493 "Transparency of mask. A value of 0 renders a mask opaque. Consider using "\
1494 "lower D values to avoid color saturation of rendered masks.:LR:\n"\
1495 "You can also change values by scrolling with mouse pointer over the cell.\n"
1496 
1497 
1498 #define SUMA_SurfContHelp_MaskTypeTbl_c8  \
1499    "Dimming factor for color. Saturated colors may not look nice when rendered, so consider using the D parameter to dim a color's brightness without having to so directly in the color column. Setting D to 6 for example will scale a color by a factor of 6/9, so a saturated red of [1 0 0] becomes [0.67 0 0 ]. This makes masks render better when not in transparent mode T = 0.:LR:\n"\
1500 "You can also change values by scrolling with mouse pointer over the cell.\n"
1501 
1502    #define SUMA_SurfContHelp_MaskTypeTbl_r1  \
1503 "Delete row of mask ROI. You have to click twice to get rid of a row, so there "\
1504 "is no undo for you. After the 1st click, the 'x' turn big 'X' and a new click "\
1505 "on big 'X' deletes the row. If you fail to click on big 'X' or simply change "\
1506 "your mind, the operation is canceled and big 'X' is little 'x' again. YAY!"
1507 
1508    #define SUMA_SurfContHelp_EvalMaskExpr_r0 \
1509 "A boolean expression evaluated per tract to determine whether or not a tract "\
1510 "should be displayed. Each mask is assigned a letter from 'a' to 'z' and has "\
1511 "an entry in the table below. Symbols for the OR operator are '|' or '+' "\
1512 "while those for AND are '&' or '*'. The '|' is for the NOT operation. By "\
1513 "default, the expression is blank, as indicated by '-', and the operation is "\
1514 "an OR of all the masks.\n\n" \
1515 ":SPX:.. _Tract_Tinting:\n\n"\
1516 ":NOF:Tract Tinting:\n"\
1517 ":NOF:^^^^^^^^^^^^^^\n\n"\
1518 ":DEF:"\
1519 "Tract_Tinting:\n"\
1520 "^^^^^^^^^^^^^^\n"\
1521 ":SPX:"\
1522 "Tracts that go through any of the masks are displayed and they keep their own color:SPX:, as shown in the figure below to the left:SPX:.\n\n"\
1523 "Say we now want to show tracts that go through both masks b and c or through "\
1524 "mask a. The expression to evaluate at each tract would be: '( b & c ) | a'. "\
1525 "Note that for the expression to take effect, you need to have the "\
1526 ":ref:`v button<MaskCont->Masks->Mask_Eval->v>` selected.\n\n"\
1527 ":SPX:\n\n"\
1528 "   .. figure:: media/MaskedTracts.01.jpg\n"\
1529 "      :align: left\n"\
1530 "      :figwidth: 30%\n"\
1531 "      :name: media/MaskedTracts.01.jpg\n\n"\
1532 "      :ref:`Tracts going through any of the three masks.<media/MaskedTracts.01.jpg>`\n\n"\
1533 "   .. figure:: media/MaskedTracts.02.jpg\n"\
1534 "      :align: right\n"\
1535 "      :figwidth: 30%\n"\
1536 "      :name: media/MaskedTracts.02.jpg\n\n"\
1537 "      Tracts evaluating to true per expression: '( b & c ) | a'. :ref:`(link)<media/MaskedTracts.02.jpg>`\n\n"\
1538 "   .. figure:: media/MaskController.02.jpg\n"\
1539 "      :align: center\n"\
1540 "      :name: media/MaskController.02.jpg\n"\
1541 "      :figwidth: 30%\n\n"\
1542 "      :ref:`Mask Controller.<media/MaskController.02.jpg>`\n\n"\
1543 SUMA_SHPINX_BREAK \
1544 ":SPX:"  \
1545 "When using the the Mask Eval expression, the color of tracts that go though a set of regions is equal to the alpha weighted average of the colors of those regions.:SPX: This can be seen in the figure on the right side above.\n\n"\
1546 "The colors of a tract is given by:LIT:\n"\
1547 "   Ct = sum(AiCi)/sum(Ai)\n\n"\
1548 "for all ROIs i the tract intersects.\n\n"   \
1549 "For example, say a tract goes through a blue region of color [0 0 1] with alpha of 0.5 (A ~ 5 in column A), and a red region of color [1 0 0] (alpha is 1.0, or in the table = 9). The tracts that go through both ROIs will be colored (1.0*([1 0 0]+0.5*([0 0 1])/1.5, which is purple. Similar averaging goes on if tracts go through more than 2 regions. Tracts that go though one region will get that region's color.\n\n"\
1550 "Now, if you set alpha to 0 for a certain ROI, then that ROI does add to the "\
1551 "tint of tracts that go thourough it at all. And for a tract that goes through that region only, it retains its original colors.:SPX: See image on the right side.:SPX:\n\n"\
1552 ":SPX:\n\n"\
1553 "  .. figure:: media/Masks.02.jpg\n"\
1554 "     :align: left\n"\
1555 "     :name: media/Masks.02.jpg\n"\
1556 "     :figwidth: 30%\n\n"\
1557 "     Tracts going through any of 2 masks 'a|b', with 'Mask Eval' ON. :ref:`(link)<media/Masks.02.jpg>`\n\n"\
1558 "  .. figure:: media/Masks.03.jpg\n"\
1559 "     :align: right\n"\
1560 "     :name: media/Masks.03.jpg\n"\
1561 "     :figwidth: 30%\n\n"\
1562 "     Tracts going through 'a|b' but with alpha of ROI 'a' - the blue one - set to 0. Tracts going through the blue ROI are not tinted by it at all. :ref:`(link)<media/Masks.03.jpg>`\n\n"\
1563 "  .. figure:: media/Masks.00.jpg\n"\
1564 "     :align: center\n"\
1565 "     :name: media/Masks.00.jpg\n"\
1566 "     :figwidth: 30%\n\n"\
1567 "     Mask Controller settings for image to the left. :ref:`(link)<media/Masks.00.jpg>`\n\n"\
1568 SUMA_SHPINX_BREAK \
1569 ":SPX:"  \
1570 
1571    #define SUMA_SurfContHelp_DistMask_r0 \
1572 "Set Min Max length for tract masking. Use can scroll (mouse wheel) in Min "\
1573 "and Max cells to change the value. The 'v' button must be selected for "\
1574 "masking to take effect."
1575 
1576 #define SUMA_SurfContHelp_GDSET_ViewBundles \
1577    "Show bundles instead of edges between nodes if \n"\
1578    "the graph dataset contains such information. For\n"\
1579    "the moment, only 3dProbTrackID creates such data."\
1580 ":SPX:\n\n"\
1581 ".. figure:: media/Graph3D.jpg\n"\
1582 "   :align: left\n"\
1583 "   :name: media/Graph3D.jpg\n"\
1584 "   :figwidth: 30%\n\n"\
1585 "   :ref:`Graph shown in 3D. <media/Graph3D.jpg>` Edges represented by straight lines.\n\n"\
1586 ".. figure:: media/Graph3D_Bundles.jpg\n"\
1587 "   :align: right\n"\
1588 "   :name: media/Graph3D_Bundles.jpg\n"\
1589 "   :figwidth: 30%\n\n"\
1590 "   Graph shown in 3D. :ref:`Edges represented by bundles <media/Graph3D_Bundles.jpg>` derived from.\n"\
1591 "   tractography with 3dTrackID. See :ref:`FATCAT_DEMO` for details.\n\n"\
1592 SUMA_SHPINX_BREAK \
1593 "Figures were generated using :ref:`FATCAT_DEMO` output with::\n\n"\
1594 "   suma -vol mprage+orig. -gdset DTI/o.NETS_AND_000.niml.dset &\n\n"\
1595 ":SPX:\n\n"\
1596 "Bundle colors reflect the value of the edge connecting the two nodes\n\n"\
1597 "Selection is identical to when edges are represented by straight lines.\n\n"
1598 
1599 #define SUMA_SurfContHelp_GDSET_ViewUncon \
1600    "Show graph nodes even if unconnected to other nodes.\n"
1601 
1602 #define  SUMA_SurfContHelp_Mask  \
1603 "Opens controller for masks.\n" \
1604 "At the first click, this button creates a new interactive tract mask and activates menu items such as :ref:`Gry<TractCont->Coloring_Controls->Gry>`. A ball of a mask is added to the interface, and only tracts that go through it are displayed. \n"\
1605 ":SPX:"\
1606 "\n"\
1607 ".. figure:: media/MaskButtonInController.jpg\n"\
1608 "   :align: center\n"\
1609 "   :name: media/MaskButtonInController.jpg\n"\
1610 "\n"\
1611 "   :ref:`(link)<media/MaskButtonInController.jpg>`\n\n"\
1612 ":SPX:"\
1613 "Clicking on Masks after the initialization brings up the "\
1614 ":ref:`Mask Controller<MaskCont>`. See :ref:`mask manipulation"\
1615 " mode<Mask_Manipulation_Mode>` for details on how to move the mask around.\n"
1616 
1617 /* this one's based on AFNI's func->thr_pval_label help */
1618 #define SUMA_SurfContHelp_ThreshStats  \
1619    "Shows the estimated significance\n"   \
1620    "(p-value) of the threshold above,\n"  \
1621    "if possible.:LR:\n"  \
1622    "   * If not possible, will display as '[N/A]' instead.:LR:\n" \
1623    "   * p's that display as 1.2-7 should be interpreted as 1.2 x 10^(-7):LR:\n"\
1624    "   * p-value here is significance PER NODE/VOXEL/etc.:LR:\n" \
1625    "* If FDR curves are pre-computed in the dataset's header, then the False "\
1626    "Discovery Rate q-value will also be shown.:LR:\n"     \
1627    "* You can add FDR curves to a dataset with '3drefit -addFDR'.\n"
1628 
1629    #define SUMA_SurfContHelp_ColorBar  \
1630 "Colorbar used for colorizing values in 'I' sub-brick.\n"   \
1631 "Colorization depends on the settings under the "\
1632 ":ref:`I<SurfCont->Dset_Mapping->I>`, :ref:`Range "\
1633 "Setting<SurfCont->Dset_Mapping->SetRangeTable.r01>`, among other things. "\
1634 "Threshold settings determine whether or not a certain value will get "\
1635 "displayed at all.:LR:\n"  \
1636 "Use :SPX: *ctrl+h over the colorbar* :DEF: ctrl+h over the colorbar :SPX:"\
1637 "for help on :ref:`manipulating the displayed "\
1638 "map<Colormap_Keyboard_Controls>`.\n"
1639 
1640 #define SUMA_SurfContHelp_ThrScale  \
1641    "Set threshold value to determine which nodes/voxels/edges will get colored"\
1642    "Voxels for which the value in the 'T' sub-brick is below that of the "\
1643    "threshold will not get colored."
1644 
1645 #endif
1646