static void update_labels(MBLOCK *mblk) { POPUP_INFO *popinf = mblk->popinf + POP_INT1D; if (popinf->cont_id) { char *label; label = psnd_sprintf_temp("%d", mblk->int1dinf->left); g_popup_set_label(popinf->cont_id, INT1D_LEFT, label); label = psnd_sprintf_temp("%d", mblk->int1dinf->right); g_popup_set_label(popinf->cont_id, INT1D_RIGHT, label); } }
static void write_integrals(MBLOCK *mblk) { FILE *outfile = stdout; char *filename; if (mblk->int1dinf->next == NULL) { g_popup_messagebox(mblk->info->win_id, "Warning", "Empty list", FALSE); return; } filename = psnd_savefilename(mblk,"Write integrals to file","*"); if (!filename) return; if ((outfile = fopen(filename,"w")) == NULL) { char *label; label = psnd_sprintf_temp("Can not open file %s",filename); g_popup_messagebox(mblk->info->win_id, "Warning", label, FALSE); return; } print_integrals(mblk, outfile); fclose(outfile); }
static void show_color(MBLOCK *mblk, int col_id) { int save_win_id; char *label; int colornamecount; char **arraydata; int win_id = mblk->info->colorwin_id; int block_id = mblk->info->colorblock_id; int array_id = mblk->info->colorarray_id; g_push_gc(); save_win_id=g_get_windownr(); g_select_window(win_id); g_delete_object(mblk->spar[S_COLORMAP].obj_id+1); g_open_object(mblk->spar[S_COLORMAP].obj_id+1); g_select_viewport(mblk->spar[S_COLORMAP].vp_id); g_set_foreground(col_id); g_fillrectangle(0,MAXROW,MAXCOLUMN,MAXROW+1); g_moveto(0.2,MAXROW+0.2); if (col_id == G_WHITE ) g_set_foreground(G_BLACK); else g_set_foreground(G_WHITE); g_set_font(G_FONT_HELVETICA_BOLD,G_RELATIVE_FONTSCALING); g_set_charsize(1.0); arraydata = psnd_get_colornames(&colornamecount); label = psnd_sprintf_temp("Block%d:%s:Color=%d", block_id+1, arraydata[array_id], col_id); g_label(label); g_close_object(mblk->spar[S_COLORMAP].obj_id+1); g_call_object(mblk->spar[S_COLORMAP].obj_id+1); g_flush(); g_pop_gc(); g_select_window(save_win_id); }
/* * Integrate peaks */ void psnd_integrate1d(MBLOCK *mblk, float x1, float x2) { int i; int i1 = round(x1); int i2 = round(x2); int lim1 = min(i1, i2); int lim2 = max(i1, i2); int xmin, xmax; float sum0, sum1, sum, ymin, ymax, yrange,xx; char *label; POPUP_INFO *popinf = mblk->popinf + POP_INT1D; lim1 = max(1, lim1); lim2 = max(1, lim2); lim1 = min(DAT->isize, lim1); lim2 = min(DAT->isize, lim2); mblk->int1dinf->left = min(lim1,lim2); mblk->int1dinf->right = max(lim1,lim2); update_labels(mblk); lim1 = mblk->int1dinf->left; lim2 = mblk->int1dinf->right; /* * ... determine integral over visible area (and min and max) */ for (i=0,sum0=0;i<DAT->isize;i++) sum0 += DAT->xreal[i]; if (sum0 == 0) sum0 = 1; /* * * ... determine integral over selected area (and min and max) * ... and draw the intensity lines * */ g_append_object(mblk->spar[S_REAL].obj_id); g_set_foreground(mblk->spar[S_REAL].color); for (i=lim1,sum=0,xmin=lim1,xmax=lim1;i<=lim2;i++) { sum += DAT->xreal[i-1]; g_moveto((float) i, DAT->xreal[i-1]); g_lineto((float) i, 0.0); } /* * * ... calc integral * */ g_set_foreground(mblk->spar[S_REAL].color3); minmax(DAT->xreal,DAT->isize,&(DAT->ylimit[0]),&(DAT->ylimit[1])); sum1=0; yrange = (DAT->ylimit[1] - DAT->ylimit[0])/ sum0; for (i=lim1;i<lim2;i++) { sum1 += yrange * DAT->xreal[i-1]; DAT->work1[i-1] = sum1; } /* * Try to move integral on top of peak */ xx=DAT->ylimit[0]; for (i=lim1;i<lim2;i++) { if (xx < (DAT->xreal[i-1]-DAT->work1[i-1])) xx = DAT->xreal[i-1]-DAT->work1[i-1]; } /* * But not outside window */ if (DAT->work1[lim2-2]+xx>DAT->ylimit[1]) xx -= -DAT->ylimit[1] + (DAT->work1[lim2-2] + xx); xx += (DAT->ylimit[1] - DAT->ylimit[0])/100; for (i=lim1;i<lim2;i++) { DAT->work1[i-1] += xx; } /* * Draw integral */ g_moveto((float) lim1, DAT->work1[lim1-1]); for (i=lim1;i<lim2;i++) { g_lineto((float)i, DAT->work1[i-1]); } /* * Print label */ g_moveto((float) lim1, DAT->work1[lim1-1]+(DAT->work1[lim2-2]-DAT->work1[lim1-1])/2); label = psnd_sprintf_temp("%.2e", sum); /* g_set_motif_realtextrotation(1); g_set_textdirection(90);*/ g_label(label); /* g_set_textdirection(0);*/ g_set_foreground(mblk->spar[S_REAL].color); g_close_object(mblk->spar[S_REAL].obj_id); g_plotall(); /* g_set_motif_realtext rotation(0);*/ mblk->int1dinf->sum = sum; if (popinf->visible) add_integral(mblk); psnd_printf(mblk," Range: %6d%6d Area: %g\n", lim1, lim2, sum); }
/* * Popup menu */ void psnd_int1d_popup(MBLOCK *mblk) { int i, ok; G_POPUP_CHILDINFO ci[20]; int id; char *label; POPUP_INFO *popinf = mblk->popinf + POP_INT1D; if (popinf->visible) return; popinf->visible = TRUE; if (!popinf->cont_id) { int cont_id; if (!mblk->int1dinf->left) { mblk->int1dinf->left = 1; mblk->int1dinf->right = DAT->isize; } mblk->int1dinf->left = max(mblk->int1dinf->left, 1); mblk->int1dinf->left = min(mblk->int1dinf->left, DAT->isize); mblk->int1dinf->right = max(mblk->int1dinf->right, 1); mblk->int1dinf->right = min(mblk->int1dinf->right, DAT->isize); cont_id = g_popup_container_open(mblk->info->win_id, "Integrate 1D", G_POPUP_KEEP|G_POPUP_SINGLEBUTTON); popinf->cont_id = cont_id; label = psnd_sprintf_temp("%d", mblk->int1dinf->left); id=0; g_popup_init_info(&(ci[id])); ci[id].type = G_CHILD_TEXTBOX; ci[id].id = INT1D_LEFT; ci[id].title = "Left "; ci[id].func = integrate1d_callback; ci[id].userdata = (void*) mblk; ci[id].item_count = 20; ci[id].items_visible = 10; ci[id].label = label; ci[id].horizontal = TRUE; g_popup_add_child(cont_id, &(ci[id])); label = psnd_sprintf_temp("%d", mblk->int1dinf->right); id++; g_popup_init_info(&(ci[id])); ci[id].type = G_CHILD_TEXTBOX; ci[id].id = INT1D_RIGHT; ci[id].title = "Right "; ci[id].func = integrate1d_callback; ci[id].userdata = (void*) mblk; ci[id].item_count = 20; ci[id].items_visible = 10; ci[id].label = label; ci[id].horizontal = TRUE; g_popup_add_child(cont_id, &(ci[id])); id++; g_popup_init_info(&(ci[id])); ci[id].type = G_CHILD_PUSHBUTTON; ci[id].id = INT1D_MOUSE; ci[id].label = "Grab Mouse Button 1"; ci[id].func = integrate1d_callback; ci[id].userdata = (void*) mblk; g_popup_add_child(cont_id, &(ci[id])); id++; g_popup_init_info(&(ci[id])); ci[id].type = G_CHILD_PUSHBUTTON; ci[id].id = INT1D_INTEGRAL; ci[id].label = "Calc Integral"; ci[id].func = integrate1d_callback; ci[id].userdata = (void*) mblk; g_popup_add_child(cont_id, &(ci[id])); /* id++; g_popup_init_info(&(ci[id])); ci[id].type = G_CHILD_PUSHBUTTON; ci[id].id = INT1D_NOISE; ci[id].label = "Calc Noise"; ci[id].func = integrate1d_callback; ci[id].userdata = (void*) mblk; g_popup_add_child(cont_id, &(ci[id])); */ id++; g_popup_init_info(&(ci[id])); ci[id].type = G_CHILD_PUSHBUTTON; ci[id].id = INT1D_PRINT; ci[id].label = "Print Integrals"; ci[id].func = integrate1d_callback; ci[id].userdata = (void*) mblk; g_popup_add_child(cont_id, &(ci[id])); id++; g_popup_init_info(&(ci[id])); ci[id].type = G_CHILD_PUSHBUTTON; ci[id].id = INT1D_WRITE; ci[id].label = "Write to disk"; ci[id].func = integrate1d_callback; ci[id].userdata = (void*) mblk; g_popup_add_child(cont_id, &(ci[id])); id++; g_popup_init_info(&(ci[id])); ci[id].type = G_CHILD_PUSHBUTTON; ci[id].id = INT1D_RESET; ci[id].label = "Clear list"; ci[id].func = integrate1d_callback; ci[id].userdata = (void*) mblk; g_popup_add_child(cont_id, &(ci[id])); id++; g_popup_init_info(&(ci[id])); ci[id].type = G_CHILD_OK; ci[id].func = integrate1d_callback; ci[id].userdata = (void*) mblk; g_popup_add_child(cont_id, &(ci[id])); id++; g_popup_init_info(&(ci[id])); ci[id].type = G_CHILD_CANCEL; ci[id].func = integrate1d_callback; ci[id].userdata = (void*) mblk; g_popup_add_child(cont_id, &(ci[id])); } mblk->int1dinf->left = max(mblk->int1dinf->left, 1); mblk->int1dinf->left = min(mblk->int1dinf->left, DAT->isize); mblk->int1dinf->right = max(mblk->int1dinf->right, 1); mblk->int1dinf->right = min(mblk->int1dinf->right, DAT->isize); g_popup_container_show(popinf->cont_id) ; }