Doxygen Source Code Documentation
plug_retroicor.c File Reference
#include "afni.h"#include "retroicor.h"Go to the source code of this file.
Defines | |
| #define | PRIC_C_DEF_THRESHOLD 10 |
| #define | PRIC_R_DEF_WINSIZE 20 |
| #define | PRIC_M_DEF_ORDER 2 |
| #define | PRIC_I_DEF_IGNORE 0 |
Functions | |
| char * | PRIC_main (PLUGIN_interface *) |
| PLUGIN_interface * | PLUGIN_init (int ncall) |
Variables | |
| char | helpstring [] |
Define Documentation
|
|
Definition at line 91 of file plug_retroicor.c. Referenced by PLUGIN_init(). |
|
|
Definition at line 94 of file plug_retroicor.c. Referenced by PLUGIN_init(). |
|
|
Definition at line 93 of file plug_retroicor.c. Referenced by PLUGIN_init(), and PRIC_main(). |
|
|
Definition at line 92 of file plug_retroicor.c. |
Function Documentation
|
|
Definition at line 100 of file plug_retroicor.c. References ANAT_ALL_MASK, FUNC_FIM_MASK, helpstring, PLUTO_add_hint(), PLUTO_set_sequence(), PRIC_C_DEF_THRESHOLD, PRIC_I_DEF_IGNORE, PRIC_M_DEF_ORDER, and PRIC_main().
00101 {
00102 PLUGIN_interface * plint ;
00103
00104 if( ncall > 0 ) return NULL ; /* only one interface */
00105
00106 /*-- set titles and call point --*/
00107
00108 plint = PLUTO_new_interface( "RETROICOR" ,
00109 "Physio Correction of a 3D+time Dataset" ,
00110 helpstring ,
00111 PLUGIN_CALL_VIA_MENU , PRIC_main ) ;
00112
00113 PLUTO_add_hint( plint , "Physio Correction of a 3D+time Dataset" ) ;
00114
00115 PLUTO_set_sequence( plint , "A:newdset:retroicor" ) ;
00116
00117 /*-- first line of input: Datasets --*/
00118
00119 PLUTO_add_option( plint , "Datasets" , "Datasets" , TRUE ) ;
00120
00121 PLUTO_add_dataset( plint , "Input" ,
00122 ANAT_ALL_MASK , FUNC_FIM_MASK ,
00123 DIMEN_4D_MASK | BRICK_ALLREAL_MASK ) ;
00124 PLUTO_add_hint( plint , "Choose 3D+time input" ) ;
00125
00126 PLUTO_add_string( plint , "Output" , 0, NULL , 19 ) ;
00127 PLUTO_add_hint( plint , "Prefix for corrected 3D+time output" ) ;
00128
00129 PLUTO_add_number( plint , "Ignore" , 0, 100, 0, PRIC_I_DEF_IGNORE, TRUE ) ;
00130 PLUTO_add_hint( plint , "Number of initial input timepoints to ignore" ) ;
00131
00132 /*-- second line of input: Cardiac --*/
00133
00134 PLUTO_add_option( plint , "Cardiac", "Cardiac" , FALSE ) ;
00135
00136 PLUTO_add_timeseries( plint , "Input" );
00137 PLUTO_add_hint( plint , "Choose 1D cardiac waveform input");
00138
00139 PLUTO_add_string( plint , "Output" , 0, NULL , 19 ) ;
00140 PLUTO_add_hint( plint , "Filename for 1D cardiac phase output (optional)" );
00141
00142 PLUTO_add_number( plint , "Threshold" , -1280, 1270, 1,
00143 PRIC_C_DEF_THRESHOLD, TRUE ) ;
00144 PLUTO_add_hint( plint , "Threshold for input R-wave peak detection" ) ;
00145
00146 /*-- third line of input: Resp --*/
00147
00148 PLUTO_add_option( plint , "Resp", "Resp" , FALSE ) ;
00149
00150 PLUTO_add_timeseries( plint , "Input" );
00151 PLUTO_add_hint( plint , "Choose 1D resp waveform input");
00152
00153 PLUTO_add_string( plint , "Output" , 0, NULL , 19 ) ;
00154 PLUTO_add_hint( plint , "Filename for 1D resp phase output (optional)" ) ;
00155 /*-- removed winsize ui
00156 PLUTO_add_number( plint , "Window" , 2, 100, 0, PRIC_R_DEF_WINSIZE, TRUE ) ;
00157 PLUTO_add_hint( plint , "Window size for input point estimate of slope" ) ;
00158 removed winsize ui --*/
00159 /*-- fourth line of input: Params --*/
00160
00161 PLUTO_add_option( plint , "Params", "Params" , FALSE ) ;
00162
00163 PLUTO_add_number( plint , "Order" , 1, 5, 0, PRIC_M_DEF_ORDER, FALSE ) ;
00164 PLUTO_add_hint( plint , "Order of correction" ) ;
00165
00166 return plint ;
00167 }
|
|
|
Definition at line 173 of file plug_retroicor.c. References avg, cpdata, DSET_NVALS, DSET_unload, free, MRI_FLOAT_PTR, mri_free(), MRI_IMAGE::nx, PLUTO_add_dset(), PLUTO_commandstring(), PLUTO_copy_dset(), PLUTO_find_dset(), PLUTO_popup_meter(), PLUTO_prefix_ok(), PLUTO_register_timeseries(), PLUTO_set_meter(), PRIC_M_DEF_ORDER, RIC_CalcCoeffAB(), RIC_CalcVoxelMeans(), RIC_CorrectDataset(), RIC_ToCardiacPhase(), RIC_ToRespPhase(), THD_3dim_dataset::taxis, THD_delete_3dim_dataset(), THD_filename_ok(), tross_Append_History(), tross_Copy_History(), THD_timeaxis::ttdel, UNITS_HZ_TYPE, UNITS_MSEC_TYPE, UNITS_SEC_TYPE, and THD_timeaxis::units_type. Referenced by PLUGIN_init().
00174 {
00175 char * tag , * new_prefix , * cphase1d = NULL, * rphase1d = NULL;
00176 MCW_idcode * idc ;
00177 THD_3dim_dataset * dset , * new_dset;
00178 double * avg = NULL;
00179 double * ca , * cb, * ra, * rb;
00180 MRI_IMAGE * card = NULL, * resp = NULL;
00181 MRI_IMAGE * cardphase = NULL, * respphase = NULL;
00182 float threshold, ignore_input, M_input;
00183 /*-- removed winsize ui
00184 , winsize_input;
00185 removed winsize ui --*/
00186 int ignore;
00187 int M = PRIC_M_DEF_ORDER;
00188 int winsize;
00189 float tr;
00190 int ival, nvals;
00191 FILE * fp;
00192 float * cpdata, * rpdata;
00193 char * histstring;
00194
00195 /*--------------------------------------------------------------------*/
00196 /*----- Check inputs from AFNI to see if they are reasonable-ish -----*/
00197
00198 if( plint == NULL )
00199 return "*********************\n"
00200 "PRIC_main: NULL input\n"
00201 "*********************" ;
00202
00203 /*-- first line of input: Datasets (required) --*/
00204
00205 tag = PLUTO_get_optiontag(plint) ;
00206 if( tag==NULL || strcmp(tag,"Datasets") != 0 )
00207 return "*******************************\n"
00208 "PRIC_main: bad Input option tag\n"
00209 "*******************************" ;
00210
00211 idc = PLUTO_get_idcode(plint) ;
00212 dset = PLUTO_find_dset(idc) ;
00213 if( dset == NULL )
00214 return "****************************\n"
00215 "PRIC_main: bad input dataset\n"
00216 "****************************" ;
00217
00218 new_prefix = PLUTO_get_string(plint) ;
00219 if( ! PLUTO_prefix_ok(new_prefix) )
00220 return "*********************\n"
00221 "PRIC_main: bad prefix\n"
00222 "*********************" ;
00223
00224 ignore_input = PLUTO_get_number(plint) ;
00225 ignore = rint(ignore_input);
00226 if( ignore_input == BAD_NUMBER || ignore < 0 )
00227 return "***************************\n"
00228 "PRIC_main: bad ignore input\n"
00229 "***************************" ;
00230
00231 /*-- second line of input: Cardiac --*/
00232
00233 tag = PLUTO_get_optiontag(plint) ;
00234
00235 if( tag != NULL && strcmp(tag, "Cardiac") == 0 ) {
00236
00237 card = PLUTO_get_timeseries(plint) ;
00238 if( card == NULL )
00239 return "****************************\n"
00240 "PRIC_main: bad cardiac input\n"
00241 "****************************" ;
00242
00243 /* It's okay if this is zero length--it means no output */
00244 cphase1d = PLUTO_get_string(plint) ;
00245 if( cphase1d == NULL ||
00246 (strlen(cphase1d) > 0 && ! THD_filename_ok(cphase1d)) )
00247 return "*****************************\n"
00248 "PRIC_main: bad CPhase 1D name\n"
00249 "*****************************" ;
00250
00251 threshold = PLUTO_get_number(plint) ;
00252 if( threshold == BAD_NUMBER )
00253 return "******************************\n"
00254 "PRIC_main: bad threshold input\n"
00255 "******************************" ;
00256
00257 tag = PLUTO_get_optiontag(plint) ;
00258 }
00259
00260 /*-- third line of input: Resp --*/
00261
00262 /* By this point we already got the next option tag */
00263
00264 if( tag != NULL && strcmp(tag, "Resp") == 0 ) {
00265
00266 resp = PLUTO_get_timeseries(plint) ;
00267 if( resp == NULL )
00268 return "**************************\n"
00269 "PRIC_main: bad resp input\n"
00270 "*************************" ;
00271
00272 /* It's okay if this is zero length--it means no output */
00273 rphase1d = PLUTO_get_string(plint) ;
00274 if( rphase1d == NULL ||
00275 (strlen(rphase1d) > 0 && ! THD_filename_ok(rphase1d)) )
00276 return "*****************************\n"
00277 "PRIC_main: bad RPhase 1D name\n"
00278 "*****************************" ;
00279
00280 /*-- removed winsize ui
00281 winsize_input = PLUTO_get_number(plint) ;
00282 winsize = rint(winsize_input);
00283 if( winsize_input == BAD_NUMBER || winsize < 2 )
00284 return "********************************\n"
00285 "PRIC_main: bad window size input\n"
00286 "********************************" ;
00287 removed winsize ui --*/
00288
00289 tag = PLUTO_get_optiontag(plint) ;
00290 }
00291
00292 /* Check that at least one of Cardiac and Resp were selected */
00293 if (card == NULL && resp == NULL)
00294 return "****************************************************\n"
00295 "PRIC_main: at least one of Cardiac and Resp required\n"
00296 "****************************************************" ;
00297
00298 /*-- fourth line of input: Params --*/
00299
00300 /* By this point we already got the next option tag */
00301
00302 if( tag != NULL && strcmp(tag, "Params") == 0 ) {
00303 M_input = PLUTO_get_number(plint) ;
00304 M = rint(M_input);
00305 if( M_input == BAD_NUMBER || M < 1)
00306 return "**************************\n"
00307 "PRIC_main: bad Order input\n"
00308 "**************************" ;
00309 }
00310
00311 /*------------------------------------------------------*/
00312 /*---------- At this point, the inputs are OK ----------*/
00313
00314 PLUTO_popup_meter(plint);
00315
00316 /*-- copy the image data for editing in place --*/
00317
00318 new_dset = PLUTO_copy_dset( dset , new_prefix );
00319 if( new_dset == NULL )
00320 return "********************************\n"
00321 "PRIC_main: error copying dataset\n"
00322 "********************************" ;
00323 tross_Copy_History(dset, new_dset); /* Copy and add to new_dset history */
00324 histstring = PLUTO_commandstring(plint);
00325 tross_Append_History(new_dset, histstring);
00326 free(histstring);
00327 DSET_unload( dset ) ; /* We won't need the old dataset anymore */
00328
00329 PLUTO_set_meter(plint, 10);
00330
00331 /*-- calculate cardiac correction coefficients if requested --*/
00332
00333 if (card != NULL) {
00334 /*-- convert cardiac waveform to phase --*/
00335 cardphase = RIC_ToCardiacPhase(card, threshold) ;
00336 if (cardphase == NULL) {
00337 THD_delete_3dim_dataset( new_dset , False ) ;
00338 return "******************************************\n"
00339 "PRIC_main: error transforming cardiac data\n"
00340 "******************************************" ;
00341 }
00342 PLUTO_set_meter(plint, 20);
00343
00344 /*-- calculate dataset voxel means --*/
00345 avg = RIC_CalcVoxelMeans(new_dset, ignore);
00346 if (avg == NULL) {
00347 THD_delete_3dim_dataset( new_dset , False ) ;
00348 mri_free(cardphase);
00349 return "************************************************\n"
00350 "PRIC_main: error calculating dataset voxel means\n"
00351 "************************************************" ;
00352 }
00353 PLUTO_set_meter(plint, 33);
00354
00355 /*-- calculate coefficients for each voxel --*/
00356 if (RIC_CalcCoeffAB(new_dset, cardphase, avg, &ca, &cb, M, ignore)
00357 != 0) {
00358
00359 THD_delete_3dim_dataset( new_dset , False ) ;
00360 mri_free(cardphase);
00361 return "******************************************************\n"
00362 "PRIC_main: error calculating cardiac a, b coefficients\n"
00363 "******************************************************" ;
00364 }
00365 }
00366 PLUTO_set_meter(plint, 30);
00367
00368 /*-- calculate respiratory correction coefficients if requested --*/
00369
00370 if (resp != NULL) {
00371 /*-- Set winsize to 1/2 sampling rate of resp in Hz --*/
00372 tr = new_dset->taxis->ttdel;
00373 switch (new_dset->taxis->units_type) {
00374 case UNITS_MSEC_TYPE: tr /= 1000; break;
00375 case UNITS_SEC_TYPE: break;
00376 case UNITS_HZ_TYPE: tr = 1 / tr; break;
00377 default:
00378 THD_delete_3dim_dataset( new_dset , False ) ;
00379 return "*****************************************\n"
00380 "PRIC_main: bad time units type in dataset\n"
00381 "*****************************************" ;
00382 }
00383 winsize = ceil(resp->nx / (tr * DSET_NVALS(new_dset)) / 2.0);
00384
00385 /*-- convert respiratory waveform to phase --*/
00386 respphase = RIC_ToRespPhase(resp, winsize) ;
00387 if (respphase == NULL) {
00388 THD_delete_3dim_dataset( new_dset , False ) ;
00389 return "***************************************\n"
00390 "PRIC_main: error transforming resp data\n"
00391 "***************************************" ;
00392 }
00393 PLUTO_set_meter(plint, 40);
00394
00395 /*-- calculate dataset voxel means if not already done --*/
00396 if (avg == NULL) {
00397 avg = RIC_CalcVoxelMeans(new_dset, ignore);
00398 if (avg == NULL) {
00399 THD_delete_3dim_dataset( new_dset , False ) ;
00400 mri_free(respphase);
00401 return "**************************************************\n"
00402 "PRIC_main: error calculating dataset voxel means 2\n"
00403 "**************************************************" ;
00404 }
00405 }
00406 PLUTO_set_meter(plint, 43);
00407
00408 /*-- calculate coefficients for each voxel --*/
00409 if (RIC_CalcCoeffAB(new_dset, respphase, avg, &ra, &rb, M, ignore)
00410 != 0) {
00411
00412 THD_delete_3dim_dataset( new_dset , False ) ;
00413 mri_free(respphase);
00414 return "***************************************************\n"
00415 "PRIC_main: error calculating resp a, b coefficients\n"
00416 "***************************************************" ;
00417 }
00418 }
00419 PLUTO_set_meter(plint, 50);
00420
00421 /*-- do cardiac correction if requested --*/
00422
00423 if (card != NULL) {
00424 /*-- correct the image data --*/
00425 if (RIC_CorrectDataset(new_dset, cardphase, ca, cb, M, ignore) != 0) {
00426 THD_delete_3dim_dataset( new_dset , False ) ;
00427 mri_free(cardphase);
00428 free(ca); free(cb);
00429 return "********************************************\n"
00430 "PRIC_main: error applying cardiac correction\n"
00431 "********************************************" ;
00432 }
00433 PLUTO_set_meter(plint, 60);
00434
00435 /*-- if requested, write phase data to file and pass to AFNI --*/
00436 if ( THD_filename_ok(cphase1d) ) {
00437 /* Write the file */
00438 fp = fopen(cphase1d, "w");
00439 nvals = cardphase->nx;
00440 cpdata = MRI_FLOAT_PTR(cardphase);
00441 for (ival = 0; ival < nvals; ival += 1) {
00442 fprintf(fp, "%f\n", cpdata[ival]);
00443 }
00444 fclose(fp);
00445
00446 /* Pass to afni */
00447 PLUTO_register_timeseries( cphase1d , cardphase ) ;
00448 }
00449
00450 mri_free(cardphase);
00451 free(ca); free(cb); free(avg); avg = NULL;
00452 }
00453 PLUTO_set_meter(plint, 70);
00454
00455 /*-- do resp correction if requested --*/
00456
00457 if (resp != NULL) {
00458 /*-- correct the image data --*/
00459 if (RIC_CorrectDataset(new_dset, respphase, ra, rb, M, ignore) != 0) {
00460 THD_delete_3dim_dataset( new_dset , False ) ;
00461 mri_free(respphase);
00462 free(ra); free(rb);
00463 return "*****************************************\n"
00464 "PRIC_main: error applying resp correction\n"
00465 "*****************************************" ;
00466 }
00467 PLUTO_set_meter(plint, 80);
00468
00469 /*-- if requested, write phase data to file and pass to AFNI --*/
00470 if ( THD_filename_ok(rphase1d) ) {
00471 /* Write the file */
00472 fp = fopen(rphase1d, "w");
00473 nvals = respphase->nx;
00474 rpdata = MRI_FLOAT_PTR(respphase);
00475 for (ival = 0; ival < nvals; ival += 1) {
00476 fprintf(fp, "%f\n", rpdata[ival]);
00477 }
00478 fclose(fp);
00479
00480 /* Pass to afni */
00481 PLUTO_register_timeseries( rphase1d , respphase ) ;
00482 }
00483
00484 mri_free(respphase);
00485 free(ra); free(rb); if (avg != NULL) free(avg);
00486 }
00487 PLUTO_set_meter(plint, 90);
00488
00489 /*-- give new dataset to AFNI --*/
00490
00491 if ( PLUTO_add_dset( plint , new_dset , DSET_ACTION_MAKE_CURRENT ) ) {
00492 THD_delete_3dim_dataset( new_dset , False ) ;
00493 return "*********************************************\n"
00494 "PRIC_main: failure to add new dataset to AFNI\n"
00495 "*********************************************" ;
00496 }
00497 PLUTO_set_meter(plint, 100);
00498
00499 /*-- done successfully!!! --*/
00500
00501 return NULL ;
00502 }
|
Variable Documentation
|
|
Definition at line 36 of file plug_retroicor.c. Referenced by PLUGIN_init(). |