44 #include "gravi_image.h" 45 #include "gravi_utils.h" 47 const int GRAVI_ERROR_TIMEOUT = 0 + CPL_ERROR_EOL;
68 cpl_image * gravi_image(
const cpl_frame * input_frame,
69 const cpl_parameterlist * input_param,
70 const char* target_name)
73 cpl_image * reconstruct_image;
74 const char *input_filename;
78 double * image_buffer=NULL;
81 char* pixelsize_option, *dim_option, *regul_option, *regul_mu_option,
83 const cpl_parameter * param;
86 char *yorick_argv[21];
92 input_filename=cpl_frame_get_filename(input_frame);
93 cpl_msg_info(cpl_func,
"Input filename ok %s", input_filename);
94 if (input_filename==NULL) {
95 cpl_error_set_message(cpl_func, cpl_error_get_code(),
96 "Could not retrieve the input " 103 yorick_argv[argv_i++] = cpl_sprintf(
"%s",YORICK_BIN);
104 yorick_argv[argv_i++] = cpl_sprintf(
"-batch");
106 file=fopen(YORICK_MIRA,
"r");
109 yorick_argv[argv_i++] = cpl_sprintf(
"%s",YORICK_MIRA);
110 cpl_msg_info(cpl_func,
"Mira is there: %s", yorick_argv[argv_i-1]);
114 yorick_argv[argv_i++] = cpl_sprintf(
"%s/mira-script.i",MIRADIR);
115 cpl_msg_info(cpl_func,
"Mira is there: %s", yorick_argv[argv_i-1]);
121 cpl_errorstate prestate = cpl_errorstate_get();
124 param = cpl_parameterlist_find_const(input_param,
125 "gravi.gravity_image.pixelsize");
126 pixelsize_option=cpl_sprintf(
"-pixelsize=%g",
127 cpl_parameter_get_double(param));
128 yorick_argv[argv_i++]=pixelsize_option;
131 param = cpl_parameterlist_find_const(input_param,
132 "gravi.gravity_image.dim");
133 dim=cpl_parameter_get_int(param);
134 dim_option=cpl_sprintf(
"-dim=%d", dim);
135 yorick_argv[argv_i++]=dim_option;
138 param = cpl_parameterlist_find_const(input_param,
139 "gravi.gravity_image.regul");
140 regul_option=cpl_sprintf(
"--regul=%s", cpl_parameter_get_string(param));
141 yorick_argv[argv_i++]=regul_option;
144 param = cpl_parameterlist_find_const(input_param,
145 "gravi.gravity_image.regul_mu");
146 regul_mu_option=cpl_sprintf(
"--regul_mu=%g",
147 cpl_parameter_get_double(param));
148 yorick_argv[argv_i++]=regul_mu_option;
151 param = cpl_parameterlist_find_const(input_param,
152 "gravi.gravity_image.maxeval");
153 maxeval_option=cpl_sprintf(
"-maxeval=%d", cpl_parameter_get_int(param));
154 yorick_argv[argv_i++]=maxeval_option;
156 if (!cpl_errorstate_is_equal(prestate)) {
157 cpl_error_set_message(cpl_func, cpl_error_get_code(),
158 "Could not retrieve the input " 160 for (i=0; i<argv_i-1; i++) cpl_free(yorick_argv[i]);
165 yorick_argv[argv_i++] = cpl_sprintf(
"-regul_isotropic");
166 yorick_argv[argv_i++] = cpl_sprintf(
"-ftol=0");
167 yorick_argv[argv_i++] = cpl_sprintf(
"-gtol=0");
168 yorick_argv[argv_i++] = cpl_sprintf(
"-overwrite");
169 yorick_argv[argv_i++] = cpl_sprintf(
"-normalization=1.0");
170 yorick_argv[argv_i++] = cpl_sprintf(
"-xmin=0.0");
171 yorick_argv[argv_i++] = cpl_sprintf(
"-target=%s", target_name);
172 yorick_argv[argv_i++] = cpl_sprintf(
"%s",input_filename);
173 yorick_argv[argv_i++] = cpl_sprintf(
"./output_temp.fits");
174 yorick_argv[argv_i++] = NULL;
177 param = cpl_parameterlist_find_const(input_param,
178 "gravi.gravity_image.timeout");
179 timeout=cpl_parameter_get_double(param);
182 if (pipe(cf_pipe) != 0)
184 cpl_error_set_message(cpl_func, CPL_ERROR_ASSIGNING_STREAM,
185 "Could not create pipe for Yorick process.");
186 for (i=0; i<argv_i-1; i++) cpl_free(yorick_argv[i]);
195 cpl_error_set_message(cpl_func, CPL_ERROR_UNSPECIFIED,
196 "Could not create the fork Yorick process.");
197 for (i=0; i<argv_i-1; i++) cpl_free(yorick_argv[i]);
202 cpl_msg_info(cpl_func,
"Start Yorick process (pid: %u)", getpid());
208 dup2(cf_pipe[1], STDOUT_FILENO);
211 if (execv(yorick_argv[0], yorick_argv) == -1 ){
212 cpl_msg_error(
"MIRA/Yorick",
"Error in Yorick call (%s)",
217 printf(
"Child process (%d) - Stop\n", getpid());
228 dup2(cf_pipe[0], STDIN_FILENO);
231 time_t ticks1, ticks2;
235 while (fgets(path,
sizeof(path)-1, stdin) != NULL) {
239 if ( (s=strrchr(path,
'\n') )) s[0]=
'\0';
241 if (strncmp(path,
"START_IMAGE", strlen(path)-1) == 0){
242 cpl_msg_info(cpl_func,
"Receive image");
243 image_buffer=cpl_malloc(
sizeof(
double)*dim*dim);
246 while (fgets(path,
sizeof(path)-1, stdin) != NULL &&
247 strncmp(path,
"END_IMAGE", strlen(path)-1) != 0){
248 sscanf(path,
"%lg", &val);
249 image_buffer[i++]=val;
254 else if (strncmp(path,
"WARNING", 7) == 0){
255 cpl_msg_warning(
"MIRA/Yorick",
"%s", path);
258 else if (strncmp(path,
"# warning", 9) == 0){
259 cpl_msg_warning(
"MIRA/Yorick",
"%s", path);
262 else if (strncmp(path,
"ERROR", 5) == 0){
263 cpl_msg_error(
"MIRA/Yorick",
"%s", path);
267 cpl_msg_info(
"MIRA/Yorick",
"%s", path);
271 if (difftime(ticks2,ticks1) > timeout)
273 cpl_error_set_message(cpl_func, GRAVI_ERROR_TIMEOUT,
274 "Timeout (%g s) MIRA/Yorick process " 275 "killed. Use --timeout option to change it.", timeout);
276 cpl_msg_error(cpl_func,
"Timeout MIRA/Yorick process Killed");
277 kill((pid_t) pid, SIGKILL);
282 cpl_msg_info(cpl_func,
"End of Yorick process (pid: %u with satus %d)",
285 if (image_buffer==NULL){
286 cpl_error_set_message(cpl_func, CPL_ERROR_NULL_INPUT,
287 "Could not get image from Yorick process.");
288 for (i=0; i<argv_i-1; i++) cpl_free(yorick_argv[i]);
291 reconstruct_image = cpl_image_wrap_double(dim, dim, image_buffer);
294 for (i=0; i<argv_i-1; i++) cpl_free(yorick_argv[i]);
295 return reconstruct_image;