int main_nufft(int argc, char* argv[]) { bool adjoint = false; bool inverse = false; bool use_gpu = false; bool precond = false; bool dft = false; struct nufft_conf_s conf = nufft_conf_defaults; struct iter_conjgrad_conf cgconf = iter_conjgrad_defaults; long coilim_vec[3] = { 0 }; float lambda = 0.; const struct opt_s opts[] = { OPT_SET('a', &adjoint, "adjoint"), OPT_SET('i', &inverse, "inverse"), OPT_VEC3('d', &coilim_vec, "x:y:z", "dimensions"), OPT_VEC3('D', &coilim_vec, "", "()"), OPT_SET('t', &conf.toeplitz, "Toeplitz embedding for inverse NUFFT"), OPT_SET('c', &precond, "Preconditioning for inverse NUFFT"), OPT_FLOAT('l', &lambda, "lambda", "l2 regularization"), OPT_UINT('m', &cgconf.maxiter, "", "()"), OPT_SET('s', &dft, "DFT"), }; cmdline(&argc, argv, 3, 3, usage_str, help_str, ARRAY_SIZE(opts), opts); long coilim_dims[DIMS] = { 0 }; md_copy_dims(3, coilim_dims, coilim_vec); // Read trajectory long traj_dims[DIMS]; complex float* traj = load_cfl(argv[1], DIMS, traj_dims); assert(3 == traj_dims[0]); num_init(); if (inverse || adjoint) { long ksp_dims[DIMS]; const complex float* ksp = load_cfl(argv[2], DIMS, ksp_dims); assert(1 == ksp_dims[0]); assert(md_check_compat(DIMS, ~(PHS1_FLAG|PHS2_FLAG), ksp_dims, traj_dims)); md_copy_dims(DIMS - 3, coilim_dims + 3, ksp_dims + 3); if (0 == md_calc_size(DIMS, coilim_dims)) { estimate_im_dims(DIMS, coilim_dims, traj_dims, traj); debug_printf(DP_INFO, "Est. image size: %ld %ld %ld\n", coilim_dims[0], coilim_dims[1], coilim_dims[2]); } complex float* img = create_cfl(argv[3], DIMS, coilim_dims); md_clear(DIMS, coilim_dims, img, CFL_SIZE); const struct linop_s* nufft_op; if (!dft) nufft_op = nufft_create(DIMS, ksp_dims, coilim_dims, traj_dims, traj, NULL, conf, use_gpu); else nufft_op = nudft_create(DIMS, FFT_FLAGS, ksp_dims, coilim_dims, traj_dims, traj); if (inverse) { const struct operator_s* precond_op = NULL; if (conf.toeplitz && precond) precond_op = nufft_precond_create(nufft_op); lsqr(DIMS, &(struct lsqr_conf){ lambda }, iter_conjgrad, CAST_UP(&cgconf), nufft_op, NULL, coilim_dims, img, ksp_dims, ksp, precond_op); if (conf.toeplitz && precond) operator_free(precond_op); } else {
int main_nufft(int argc, char* argv[]) { int c; bool adjoint = false; bool inverse = false; bool toeplitz = false; bool precond = false; bool use_gpu = false; bool two = false; bool calib = false; bool sizeinit = false; bool stoch = false; long coilim_dims[DIMS]; md_singleton_dims(DIMS, coilim_dims); int maxiter = 50; float lambda = 0.00; const char* pat_str = NULL; while (-1 != (c = getopt(argc, argv, "d:m:l:p:aihCto:w:2:c:S"))) { switch (c) { case '2': two = true; break; case 'i': inverse = true; break; case 'a': adjoint = true; break; case 'C': precond = true; break; case 'S': stoch = true; break; case 'c': calib = true; inverse = true; case 'd': sscanf(optarg, "%ld:%ld:%ld", &coilim_dims[0], &coilim_dims[1], &coilim_dims[2]); sizeinit = true; break; case 'm': maxiter = atoi(optarg); break; case 'p': pat_str = strdup(optarg); break; case 'l': lambda = atof(optarg); break; case 't': toeplitz = true; break; case 'h': usage(argv[0], stdout); help(); exit(0); default: usage(argv[0], stderr); exit(1); } } if (argc - optind != 3) { usage(argv[0], stderr); exit(1); } // Read trajectory long traj_dims[2]; complex float* traj = load_cfl(argv[optind + 0], 2, traj_dims); assert(3 == traj_dims[0]); if (!sizeinit) estimate_im_dims(coilim_dims, traj_dims, traj); num_init(); // Load pattern / density compensation (if any) complex float* pat = NULL; long pat_dims[2]; if (pat_str) { pat = load_cfl(pat_str, 2, pat_dims); assert(pat_dims[0] == 1); assert(pat_dims[1] == traj_dims[1]); } if (inverse || adjoint) { long ksp_dims[DIMS]; const complex float* ksp = load_cfl(argv[optind + 1], DIMS, ksp_dims); coilim_dims[COIL_DIM] = ksp_dims[COIL_DIM]; long out_dims[DIMS]; if (calib) { md_singleton_dims(DIMS, out_dims); estimate_im_dims(out_dims, traj_dims, traj); out_dims[COIL_DIM] = ksp_dims[COIL_DIM]; } else { md_copy_dims(DIMS, out_dims, coilim_dims); } complex float* out = create_cfl(argv[optind + 2], DIMS, out_dims); complex float* img = out; if (calib) img = md_alloc(DIMS, coilim_dims, CFL_SIZE); md_clear(DIMS, coilim_dims, img, CFL_SIZE); struct iter_conjgrad_conf cgconf = iter_conjgrad_defaults; cgconf.maxiter = maxiter; cgconf.l2lambda = 0.; cgconf.tol = 0; const struct linop_s* nufft_op; // Get nufft_op if (two) #ifdef BERKELEY_SVN nufft_op = nufft2_create(ksp_dims, coilim_dims, traj, pat, toeplitz, precond, &cgconf, use_gpu); #else assert(!two); #endif else
int main_nufft(int argc, char* argv[]) { int c; bool adjoint = false; bool inverse = false; bool use_gpu = false; bool sizeinit = false; struct nufft_conf_s conf = nufft_conf_defaults; struct iter_conjgrad_conf cgconf = iter_conjgrad_defaults; long coilim_dims[DIMS]; md_singleton_dims(DIMS, coilim_dims); float lambda = 0.; while (-1 != (c = getopt(argc, argv, "d:m:l:aiht"))) { switch (c) { case 'i': inverse = true; break; case 'a': adjoint = true; break; case 'd': sscanf(optarg, "%ld:%ld:%ld", &coilim_dims[0], &coilim_dims[1], &coilim_dims[2]); sizeinit = true; break; case 'm': cgconf.maxiter = atoi(optarg); break; case 'l': lambda = atof(optarg); break; case 't': conf.toeplitz = true; break; case 'h': usage(argv[0], stdout); help(); exit(0); default: usage(argv[0], stderr); exit(1); } } if (argc - optind != 3) { usage(argv[0], stderr); exit(1); } // Read trajectory long traj_dims[DIMS]; complex float* traj = load_cfl(argv[optind + 0], DIMS, traj_dims); assert(3 == traj_dims[0]); num_init(); if (inverse || adjoint) { long ksp_dims[DIMS]; const complex float* ksp = load_cfl(argv[optind + 1], DIMS, ksp_dims); assert(1 == ksp_dims[0]); assert(md_check_compat(DIMS, ~(PHS1_FLAG|PHS2_FLAG), ksp_dims, traj_dims)); md_copy_dims(DIMS - 3, coilim_dims + 3, ksp_dims + 3); if (!sizeinit) { estimate_im_dims(DIMS, coilim_dims, traj_dims, traj); debug_printf(DP_INFO, "Est. image size: %ld %ld %ld\n", coilim_dims[0], coilim_dims[1], coilim_dims[2]); } complex float* img = create_cfl(argv[optind + 2], DIMS, coilim_dims); md_clear(DIMS, coilim_dims, img, CFL_SIZE); const struct linop_s* nufft_op = nufft_create(DIMS, ksp_dims, coilim_dims, traj_dims, traj, NULL, conf, use_gpu); if (inverse) { lsqr(DIMS, &(struct lsqr_conf){ lambda }, iter_conjgrad, &cgconf, nufft_op, NULL, coilim_dims, img, ksp_dims, ksp); } else {