/* The function plot_cfvr.c displays cardiac function and venous return curves by writing Gnuplot commands to the gpcommands file in the /tmp directory and then invoking gnuplot on the file. Function arguments: outputfilein - MATLAB array of the prefix name of the file containing the cardiac function/venous return numerics covrformatin - MATLAB array indicating the desired plotting format Function outputs: none */ #include #include #include #include #include #include void mlfPlot_cfvr(const mxArray *outputfilein, const mxArray *covrformatin) { /* Declaring variables. */ char command[128], *outputfile; FILE *fp, *fpnew; double covrformat; /* Converting MATLAB types to C types. */ outputfile=mxArrayToString(outputfilein); covrformat=mxGetScalar(covrformatin); /* If only the curve of the current simulation is desired for display or there is currently no /tmp/gpcommands file. */ fp = fopen("/tmp/gpcommands","r"); if (covrformat == 0 | covrformat == 2 | fp == 0) { fclose(fp); /* Delete existing gpcommands file. */ system("rm -f /tmp/gpcommands"); /* Creating new gpcommands file. */ fpnew = fopen("/tmp/gpcommands","w"); sprintf(command,"set tics out"); fprintf(fpnew,"%s\n",command); sprintf(command,"set title ''"); fprintf(fpnew,"%s\n",command); /* For cardiac function or venous return curve display. */ if (covrformat == 0) { sprintf(command,"set xlabel 'mPra [mmHg]'"); } /* For cardiac output versus systemic arterial pressure curve display. */ else { sprintf(command,"set xlabel 'mPa [mmHg]'"); } fprintf(fpnew,"%s\n",command); /* For cardiac function or venous return curve display. */ if (covrformat == 0) { sprintf(command,"set ylabel 'mql,mqv [l/min]'"); } /* For cardiac output versus systemic arterial pressure curve display. */ else { sprintf(command,"set ylabel 'mql [l/min]'"); } fprintf(fpnew,"%s\n",command); sprintf(command,"set xrange [:]"); fprintf(fpnew,"%s\n",command); sprintf(command,"set yrange [:]"); fprintf(fpnew,"%s\n",command); /* For cardiac function or venous return curve display. */ if (covrformat == 0) { fprintf(fpnew,"plot '%s.txt' using 1:2 notitle with lines\n",outputfile); } /* For cardiac output versus systemic arterial pressure curve display. */ else { fprintf(fpnew,"plot '%s.txt' using 3:2 notitle with lines\n",outputfile); } fclose(fpnew); /* Copying gpcommands to a temporary file. */ system("cp /tmp/gpcommands /tmp/gpcommands.orig"); /* Adding a pause command to keep display window open until user desires to close it to the gpcommands file. */ fpnew = fopen("/tmp/gpcommands","a"); sprintf(command,"pause -1 \"Press RETURN to dismiss the plot window: \""); fprintf(fpnew,"%s\n",command); fclose(fpnew); /* Invoking gnuplot. */ system("gnuplot /tmp/gpcommands < /dev/tty"); /* Copying temporary file -- without pause command -- to gpcommands. */ system("mv -f /tmp/gpcommands.orig /tmp/gpcommands"); } /* If multiple curves per a window are desired and a /tmp/gpcommands file currently exists. */ else { fclose(fp); /* Adding new Gnuplot commands to existing gpcommands file. */ /* For cardiac function or venous return curve display. */ if (covrformat == 1) { sprintf(command,"replot \'%s.txt\' using 1:2 notitle with lines",outputfile); } /* For cardiac output versus systemic arterial pressure curve display. */ else { sprintf(command,"replot \'%s.txt\' using 3:2 notitle with lines",outputfile); } fpnew = fopen("/tmp/gpcommands","a"); fprintf(fpnew,"%s\n",command); fclose(fpnew); /* Copying gpcommands to a temporary file. */ system("cp /tmp/gpcommands /tmp/gpcommands.orig"); /* Adding a pause command to keep display window open until user desires to close it to the gpcommands file. */ fpnew = fopen("/tmp/gpcommands","a"); sprintf(command,"pause -1 \"Press RETURN to dismiss the plot window: "); fprintf(fpnew,"%s\n",command); fclose(fpnew); /* Invoking gnuplot. */ system("gnuplot /tmp/gpcommands < /dev/tty"); /* Copying temporary file -- without pause command -- to gpcommands. */ system("mv -f /tmp/gpcommands.orig /tmp/gpcommands"); } /* Freeing allocated dynamic memory and returning to rcvsim.m */ mxFree(outputfile); return; }