bool output_odfs(const tipl::image<unsigned char,3>& mni_mask, const char* out_name, const char* ext, std::vector<std::vector<float> >& odfs, const tessellated_icosahedron& ti, const float* vs, const float* mni, const std::string& report, bool record_odf = true) { begin_prog("output"); ImageModel image_model; if(report.length()) image_model.voxel.report = report.c_str(); image_model.voxel.dim = mni_mask.geometry(); image_model.voxel.ti = ti; image_model.voxel.max_fiber_number = 5; image_model.voxel.need_odf = record_odf; image_model.voxel.template_odfs.swap(odfs); image_model.file_name = out_name; image_model.voxel.mask = mni_mask; std::copy(mni,mni+16,image_model.voxel.trans_to_mni); std::copy(vs,vs+3,image_model.voxel.vs.begin()); if (prog_aborted() || !image_model.reconstruct<reprocess_odf>()) return false; image_model.save_fib(ext); image_model.voxel.template_odfs.swap(odfs); return true; }
bool output_odfs(const image::basic_image<unsigned char,3>& mni_mask, const char* out_name, const char* ext, std::vector<std::vector<float> >& odfs, const tessellated_icosahedron& ti, const float* vs, const float* mni, const std::string& report, bool record_odf = true) { begin_prog("output"); ImageModel image_model; if(report.length()) image_model.voxel.report = report.c_str(); image_model.voxel.dim = mni_mask.geometry(); image_model.voxel.ti = ti; image_model.voxel.odf_decomposition = false; image_model.voxel.odf_deconvolusion = false; image_model.voxel.half_sphere = false; image_model.voxel.max_fiber_number = 5; image_model.voxel.z0 = 0.0; image_model.voxel.need_odf = record_odf; image_model.voxel.template_odfs.swap(odfs); image_model.voxel.param = mni; image_model.file_name = out_name; image_model.mask = mni_mask; std::copy(vs,vs+3,image_model.voxel.vs.begin()); if (prog_aborted() || !image_model.reconstruct<reprocess_odf>(1)) return false; image_model.save_fib(ext); image_model.voxel.template_odfs.swap(odfs); return true; }
bool reconstruct(unsigned int thread_count) { begin_prog("reconstruction"); voxel.image_model = this; voxel.CreateProcesses<ProcessType>(); voxel.init(thread_count); boost::thread_group threads; for (unsigned int index = 1;index < thread_count;++index) threads.add_thread(new boost::thread(&Voxel::thread_run,&voxel, index,thread_count,mask)); voxel.thread_run(0,thread_count,mask); threads.join_all(); return !prog_aborted(); }
void MainWindow::loadFib(QString filename) { std::string file_name = filename.toLocal8Bit().begin(); begin_prog("load fib"); std::shared_ptr<fib_data> new_handle(new fib_data); if (!new_handle->load_from_file(&*file_name.begin())) { if(!prog_aborted()) QMessageBox::information(this,"error",new_handle->error_msg.c_str(),0); return; } tracking_window* new_mdi = new tracking_window(this,new_handle); new_mdi->setAttribute(Qt::WA_DeleteOnClose); new_mdi->setWindowTitle(filename); new_mdi->showNormal(); addFib(filename); add_work_dir(QFileInfo(filename).absolutePath()); QDir::setCurrent(QFileInfo(filename).absolutePath()); }
void thread_run(unsigned char thread_index,unsigned char thread_count, const std::vector<unsigned char>& mask) { unsigned int sum_mask = std::accumulate(mask.begin(),mask.end(),(unsigned int)0)/thread_count; unsigned int cur = 0; for(unsigned int voxel_index = thread_index; voxel_index < dim.size() && (thread_index != 0 || check_prog(cur,sum_mask));voxel_index += thread_count) { if (!mask[voxel_index]) continue; cur += mask[voxel_index]; voxel_data[thread_index].init(); voxel_data[thread_index].voxel_index = voxel_index; for (int index = 0; index < process_list.size(); ++index) process_list[index].run(*this,voxel_data[thread_index]); if(prog_aborted()) break; } }
void MainWindow::on_batch_src_clicked() { QString dir = QFileDialog::getExistingDirectory( this, "Open directory", ui->workDir->currentText()); if(dir.isEmpty()) return; add_work_dir(dir); { QStringList dir_list; dir_list << dir; bool all = false; bool choice = false; begin_prog("batch creating src"); for(unsigned int i = 0;check_prog(i,dir_list.size()) && !prog_aborted();++i) { QDir cur_dir = dir_list[i]; QStringList new_list = cur_dir.entryList(QStringList(""),QDir::AllDirs|QDir::NoDotAndDotDot); for(unsigned int index = 0;index < new_list.size();++index) dir_list << cur_dir.absolutePath() + "/" + new_list[index]; std::vector<std::shared_ptr<DwiHeader> > dwi_files; if(QFileInfo(dir_list[i] + "/data.nii.gz").exists() && QFileInfo(dir_list[i] + "/bvals").exists() && QFileInfo(dir_list[i] + "/bvecs").exists() && load_4d_nii(QString(dir_list[i] + "/data.nii.gz").toLocal8Bit().begin(),dwi_files)) { DwiHeader::output_src(QString(dir_list[i] + "/data.src.gz").toLocal8Bit().begin(),dwi_files,0); continue; } QStringList nifti_file_list = cur_dir.entryList(QStringList("*.nii.gz"),QDir::Files|QDir::NoSymLinks); for (unsigned int index = 0;index < nifti_file_list.size();++index) { if(QFileInfo(dir_list[i] + "/" + QFileInfo(nifti_file_list[index]).baseName()+".bval").exists() && QFileInfo(dir_list[i] + "/" + QFileInfo(nifti_file_list[index]).baseName()+".bvec").exists() && load_4d_nii(QString(dir_list[i] + "/" + nifti_file_list[index]).toLocal8Bit().begin(),dwi_files)) { DwiHeader::output_src(QString(dir_list[i] + "/" + QFileInfo(nifti_file_list[index]).baseName() + ".src.gz").toLocal8Bit().begin(),dwi_files,0); continue; } } QStringList dicom_file_list = cur_dir.entryList(QStringList("*.dcm"),QDir::Files|QDir::NoSymLinks); if(dicom_file_list.empty()) continue; for (unsigned int index = 0;index < dicom_file_list.size();++index) dicom_file_list[index] = dir_list[i] + "/" + dicom_file_list[index]; QString output = dir_list[i] + "/" + QFileInfo(get_src_name(dicom_file_list[0])).baseName()+".src.gz"; if(QFileInfo(output).exists()) { if(!all) { QMessageBox msgBox; msgBox.setText(QString("Existing SRC file ") + output); msgBox.setInformativeText("Overwrite?"); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No | QMessageBox::NoAll); msgBox.setDefaultButton(QMessageBox::Save); switch(msgBox.exec()) { case QMessageBox::YesToAll: all = true; case QMessageBox::Yes: choice = true; break; case QMessageBox::NoAll: all = true; case QMessageBox::No: choice = false; break; } } if(!choice) continue; } if(!load_all_files(dicom_file_list,dwi_files) || prog_aborted()) continue; if(dwi_files.size() == 1) //MPRAGE or T2W { std::sort(dicom_file_list.begin(),dicom_file_list.end(),compare_qstring()); image::io::volume v; image::io::dicom header; std::vector<std::string> file_list; for(unsigned int index = 0;index < dicom_file_list.size();++index) file_list.push_back(dicom_file_list[index].toLocal8Bit().begin()); if(!v.load_from_files(file_list,file_list.size()) || !header.load_from_file(dicom_file_list[0].toLocal8Bit().begin())) continue; image::basic_image<float,3> I; image::vector<3> vs; v >> I; v.get_voxel_size(vs.begin()); gz_nifti nii_out; image::flip_xy(I); nii_out << I; nii_out.set_voxel_size(vs); std::string manu,make,seq,report; header.get_text(0x0008,0x0070,manu);//Manufacturer header.get_text(0x0008,0x1090,make); header.get_text(0x0018,0x1030,seq); std::replace(manu.begin(),manu.end(),' ',(char)0); make.erase(std::remove(make.begin(),make.end(),' '),make.end()); std::ostringstream out; out << manu.c_str() << " " << make.c_str() << " " << seq << ".TE=" << header.get_float(0x0018,0x0081) << ".TR=" << header.get_float(0x0018,0x0080) << "."; report = out.str(); std::copy(report.begin(),report.begin() + std::min<int>(80,report.length()+1),nii_out.nif_header.descrip); QString output_name = QFileInfo(get_src_name(dicom_file_list[0])).absolutePath() + "/" + QFileInfo(get_src_name(dicom_file_list[0])).baseName()+ "."+seq.c_str() + ".nii.gz"; nii_out.save_to_file(output_name.toLocal8Bit().begin()); } else { for(unsigned int index = 0;index < dwi_files.size();++index) if(dwi_files[index]->get_bvalue() < 100) { dwi_files[index]->set_bvalue(0); dwi_files[index]->set_bvec(0,0,0); } DwiHeader::output_src(output.toLocal8Bit().begin(),dwi_files,0); } }