Closed DANAJK closed 3 years ago
change to get_nifti_header
@DANAJK which notebook please?
If you add it to the sirf_registration notebook, you will see that nothing gets output.
e.g. flo.print_header()
@DANAJK @KrisThielemans Python print_header
calls (via C interface) C++ print_headers
, which calls dump_headers
:
/// Dump info of multiple nifti images
template<class dataType>
void NiftiImageData<dataType>::dump_headers(const std::vector<const NiftiImageData<dataType>*> &ims)
{
std::cout << "\nPrinting info for " << ims.size() << " nifti image(s):\n";
dump_nifti_element(ims, "analyze_75_orient", &nifti_image::analyze75_orient);
dump_nifti_element(ims, "analyze75_orient", &nifti_image::analyze75_orient);
dump_nifti_element(ims, "byteorder", &nifti_image::byteorder);
dump_nifti_element(ims, "cal_max", &nifti_image::cal_max);
dump_nifti_element(ims, "cal_min", &nifti_image::cal_min);
dump_nifti_element(ims, "datatype", &nifti_image::datatype);
dump_nifti_element(ims, "dt", &nifti_image::dt);
dump_nifti_element(ims, "du", &nifti_image::du);
dump_nifti_element(ims, "dv", &nifti_image::dv);
dump_nifti_element(ims, "dw", &nifti_image::dw);
dump_nifti_element(ims, "dx", &nifti_image::dx);
dump_nifti_element(ims, "dy", &nifti_image::dy);
dump_nifti_element(ims, "dz", &nifti_image::dz);
dump_nifti_element(ims, "ext_list", &nifti_image::ext_list);
dump_nifti_element(ims, "freq_dim", &nifti_image::freq_dim);
dump_nifti_element(ims, "iname_offset", &nifti_image::iname_offset);
dump_nifti_element(ims, "intent_code", &nifti_image::intent_code);
dump_nifti_element(ims, "intent_p1", &nifti_image::intent_p1);
dump_nifti_element(ims, "intent_p2", &nifti_image::intent_p2);
dump_nifti_element(ims, "intent_p3", &nifti_image::intent_p3);
dump_nifti_element(ims, "nbyper", &nifti_image::nbyper);
dump_nifti_element(ims, "ndim", &nifti_image::ndim);
dump_nifti_element(ims, "nifti_type", &nifti_image::nifti_type);
dump_nifti_element(ims, "num_ext", &nifti_image::num_ext);
dump_nifti_element(ims, "nvox", &nifti_image::nvox);
dump_nifti_element(ims, "nx", &nifti_image::nx);
dump_nifti_element(ims, "ny", &nifti_image::ny);
dump_nifti_element(ims, "nz", &nifti_image::nz);
dump_nifti_element(ims, "nt", &nifti_image::nt);
dump_nifti_element(ims, "nu", &nifti_image::nu);
dump_nifti_element(ims, "nv", &nifti_image::nv);
dump_nifti_element(ims, "nw", &nifti_image::nw);
dump_nifti_element(ims, "phase_dim", &nifti_image::phase_dim);
dump_nifti_element(ims, "qfac", &nifti_image::qfac);
dump_nifti_element(ims, "qform_code", &nifti_image::qform_code);
dump_nifti_element(ims, "qoffset_x", &nifti_image::qoffset_x);
dump_nifti_element(ims, "qoffset_y", &nifti_image::qoffset_y);
dump_nifti_element(ims, "qoffset_z", &nifti_image::qoffset_z);
dump_nifti_element(ims, "quatern_b", &nifti_image::quatern_b);
dump_nifti_element(ims, "quatern_c", &nifti_image::quatern_c);
dump_nifti_element(ims, "quatern_d", &nifti_image::quatern_d);
dump_nifti_element(ims, "scl_inter", &nifti_image::scl_inter);
dump_nifti_element(ims, "scl_slope", &nifti_image::scl_slope);
dump_nifti_element(ims, "sform_code", &nifti_image::sform_code);
dump_nifti_element(ims, "slice_code", &nifti_image::slice_code);
dump_nifti_element(ims, "slice_dim", &nifti_image::slice_dim);
dump_nifti_element(ims, "slice_duration", &nifti_image::slice_duration);
dump_nifti_element(ims, "slice_end", &nifti_image::slice_end);
dump_nifti_element(ims, "slice_start", &nifti_image::slice_start);
dump_nifti_element(ims, "swapsize", &nifti_image::swapsize);
dump_nifti_element(ims, "time_units", &nifti_image::time_units);
dump_nifti_element(ims, "toffset", &nifti_image::toffset);
dump_nifti_element(ims, "xyz_units", &nifti_image::xyz_units);
dump_nifti_element(ims, "dim", &nifti_image::dim, 8);
dump_nifti_element(ims, "pixdim", &nifti_image::pixdim, 8);
std::vector<std::shared_ptr<const nifti_image> > images;
for(unsigned i=0;i<ims.size();i++)
images.push_back(ims[i]->get_raw_nifti_sptr());
// Print transformation matrices
std::vector<AffineTransformation<float> > qto_ijk_vec, qto_xyz_vec, sto_ijk_vec, sto_xyz_vec;
for(unsigned j=0; j<images.size(); j++) {
qto_ijk_vec.push_back(images[j]->qto_ijk.m);
qto_xyz_vec.push_back(images[j]->qto_xyz.m);
sto_ijk_vec.push_back(images[j]->sto_ijk.m);
sto_xyz_vec.push_back(images[j]->sto_xyz.m);
}
std::cout << "\t" << std::left << std::setw(19) << "qto_ijk:" << "\n";
AffineTransformation<float>::print(qto_ijk_vec);
std::cout << "\t" << std::left << std::setw(19) << "qto_xyz:" << "\n";
AffineTransformation<float>::print(qto_xyz_vec);
std::cout << "\t" << std::left << std::setw(19) << "sto_ijk:" << "\n";
AffineTransformation<float>::print(sto_ijk_vec);
std::cout << "\t" << std::left << std::setw(19) << "sto_xyz:" << "\n";
AffineTransformation<float>::print(sto_xyz_vec);
// Print original datatype
std::string original_datatype = "orig_datatype: ";
std::cout << "\t" << std::left << std::setw(19) << original_datatype;
for(unsigned i=0; i<ims.size(); i++)
std::cout << std::setw(19) << ims[i]->get_original_datatype();
// Print min
std::string min_header = "min: ";
std::cout << "\n\t" << std::left << std::setw(19) << min_header;
for(unsigned i=0; i<ims.size(); i++)
std::cout << std::setw(19) << ims[i]->get_min();
// Print max
std::cout << "\n\t" << std::left << std::setw(19) << "max: ";
for(unsigned i=0; i<ims.size(); i++)
std::cout << std::setw(19) << ims[i]->get_max();
// Print mean
std::cout << "\n\t" << std::left << std::setw(19) << "mean: ";
for(unsigned i=0; i<ims.size(); i++)
std::cout << std::setw(19) << ims[i]->get_mean();
// Print if image contains nans
std::cout << "\n\t" << std::left << std::setw(19) << "contains nans?: ";
for(unsigned i=0; i<ims.size(); i++)
std::cout << std::setw(19) << ims[i]->get_contains_nans();
std::cout << "\n\n";
}
The naming and the amount of printed data suggests that Richard needed this print purely for debugging - do we really need to dump all this data on the notebook user? I rather doubt.
The naming and the amount of printed data suggests that Richard needed this print purely for debugging - do we really need to dump all this data on the notebook user? I rather doubt.
A continuing problem with nifti (or any other fileformat) is if the header is correct etc. so yes, debugging, useful.
What about
print_header()
but let it do std::cout << get_nifti_header_info() << std::endl
which would do the hard workstd::stringstream
like
std::string get_nifti_header_info()
{
std::stringstream stream;
stream << whatever;
return stream.str();
}
replacing all std::cout
with stream
.
get_nifti_header_info()
seems easy enough. Of course, I guess we don't need this for 3.1, but I'll let @DANAJK decide on that.
When using a Jupyter notebook,
print_header()
sends its output to a terminal window, not into the notebook.Also, the method returns the NIfTI header and this should perhaps be reflected in the name of the method?