void main() { Super(0); rlvc_open_system(); rlkb_open_keyboard(); /* rlkb_debug_on(); un-rem this for debuggers! */ rlsc_open_video(); rlsd_open_sound(); rltrk_open_tracker(); init_screen_space(); load_all_files(); test_loop(); rltrk_close_tracker(); rlsd_close_sound(); rlsc_close_video(); rlkb_close_keyboard(); rlvc_close_system(); }
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); } }
int src(int ac, char *av[]) { po::options_description rec_desc("dicom parsing options"); rec_desc.add_options() ("help", "help message") ("action", po::value<std::string>(), "src:dicom parsing") ("source", po::value<std::string>(), "assign the directory for the dicom files") ("recursive", po::value<std::string>(), "search subdirectories") ("b_table", po::value<std::string>(), "assign the b-table") ("bval", po::value<std::string>(), "assign the b value") ("bvec", po::value<std::string>(), "assign the b vector") ("output", po::value<std::string>(), "assign the output filename") ; if(!ac) { std::cout << rec_desc << std::endl; return 1; } po::variables_map vm; po::store(po::command_line_parser(ac, av).options(rec_desc).run(), vm); po::notify(vm); std::string source = vm["source"].as<std::string>(); std::string ext; if(source.size() > 4) ext = std::string(source.end()-4,source.end()); boost::ptr_vector<DwiHeader> dwi_files; QStringList file_list; if(ext ==".nii" || ext == ".dcm" || ext == "dseq" || ext == "i.gz") { std::cout << "image=" << source.c_str() << std::endl; file_list << source.c_str(); } else { std::cout << "load files in directory " << source.c_str() << std::endl; QDir directory = QString(source.c_str()); if(vm.count("recursive")) { std::cout << "search recursively in the subdir" << std::endl; file_list = search_files(source.c_str(),"*.dcm"); } else { file_list = directory.entryList(QStringList("*.dcm"),QDir::Files|QDir::NoSymLinks); if(file_list.empty()) file_list = directory.entryList(QStringList("*.nii.gz"),QDir::Files|QDir::NoSymLinks); for (unsigned int index = 0;index < file_list.size();++index) file_list[index] = QString(source.c_str()) + "/" + file_list[index]; } std::cout << "A total of " << file_list.size() <<" files found in the directory" << std::endl; } if(file_list.empty()) { std::cout << "No file found for creating src" << std::endl; return -1; } if(!load_all_files(file_list,dwi_files)) { std::cout << "Invalid file format" << std::endl; return -1; } if(vm.count("b_table")) { std::string table_file_name = vm["b_table"].as<std::string>(); std::ifstream in(table_file_name.c_str()); if(!in) { std::cout << "Failed to open b-table" <<std::endl; return -1; } std::string line; std::vector<double> b_table; while(std::getline(in,line)) { std::istringstream read_line(line); std::copy(std::istream_iterator<double>(read_line), std::istream_iterator<double>(), std::back_inserter(b_table)); } if(b_table.size() != dwi_files.size()*4) { std::cout << "Mismatch between b-table and the loaded images" << std::endl; return -1; } for(unsigned int index = 0,b_index = 0;index < dwi_files.size();++index,b_index += 4) { dwi_files[index].set_bvalue(b_table[b_index]); dwi_files[index].set_bvec(b_table[b_index+1],b_table[b_index+2],b_table[b_index+3]); } std::cout << "B-table " << table_file_name << " loaded" << std::endl; } if(vm.count("bval") && vm.count("bvec")) { std::vector<double> bval,bvec; std::cout << "load bval=" << vm["bval"].as<std::string>() << std::endl; std::cout << "load bvec=" << vm["bvec"].as<std::string>() << std::endl; load_bval(vm["bval"].as<std::string>().c_str(),bval); load_bvec(vm["bvec"].as<std::string>().c_str(),bvec); if(bval.size() != dwi_files.size()) { std::cout << "Mismatch between bval file and the loaded images" << std::endl; return -1; } if(bvec.size() != dwi_files.size()*3) { std::cout << "Mismatch between bvec file and the loaded images" << std::endl; return -1; } for(unsigned int index = 0;index < dwi_files.size();++index) { dwi_files[index].set_bvalue(bval[index]); dwi_files[index].set_bvec(bvec[index*3],bvec[index*3+1],bvec[index*3+2]); } } if(dwi_files.empty()) { std::cout << "No file readed. Abort." << std::endl; return 1; } double max_b = 0; for(unsigned int index = 0;index < dwi_files.size();++index) { if(dwi_files[index].get_bvalue() < 100) dwi_files[index].set_bvalue(0); max_b = std::max(max_b,(double)dwi_files[index].get_bvalue()); } if(max_b == 0.0) { std::cout << "Cannot find b-table from the header. You may need to load an external b-table using--b_table or --bval and --bvec." << std::endl; return 1; } std::cout << "Output src " << vm["output"].as<std::string>().c_str() << std::endl; DwiHeader::output_src(vm["output"].as<std::string>().c_str(),dwi_files,0); return 0; }
int src(void) { std::string source = po.get("source"); std::string ext; if(source.size() > 4) ext = std::string(source.end()-4,source.end()); std::string output; if(po.has("output")) output = po.get("output"); if(QFileInfo(output.c_str()).exists()) { std::cout << output << " exists. skipping..." << std::endl; return 1; } std::vector<std::shared_ptr<DwiHeader> > dwi_files; QStringList file_list; if(ext ==".nii" || ext == ".dcm" || ext == "dseq" || ext == "i.gz") { std::cout << "image=" << source.c_str() << std::endl; std::istringstream ss(source); std::string token; while(std::getline(ss, token, ',')) file_list << source.c_str(); if(!po.has("output")) output = file_list.front().toStdString() + ".src.gz"; } else { std::cout << "load files in directory " << source.c_str() << std::endl; QDir directory = QString(source.c_str()); if(po.has("recursive")) { std::cout << "search recursively in the subdir" << std::endl; file_list = search_files(source.c_str(),"*.dcm"); } else { file_list = directory.entryList(QStringList("*.dcm"),QDir::Files|QDir::NoSymLinks); if(file_list.empty()) file_list = directory.entryList(QStringList("*.nii.gz"),QDir::Files|QDir::NoSymLinks); if(file_list.empty()) file_list = directory.entryList(QStringList("*.fdf"),QDir::Files|QDir::NoSymLinks); for (unsigned int index = 0;index < file_list.size();++index) file_list[index] = QString(source.c_str()) + "/" + file_list[index]; } std::cout << "A total of " << file_list.size() <<" files found in the directory" << std::endl; if(!po.has("output")) output = source + ".src.gz"; } if(file_list.empty()) { std::cout << "No file found for creating src" << std::endl; return 1; } if(!load_all_files(file_list,dwi_files)) { std::cout << "Invalid file format" << std::endl; return 1; } if(po.has("b_table")) { std::string table_file_name = po.get("b_table"); std::ifstream in(table_file_name.c_str()); if(!in) { std::cout << "Failed to open b-table" <<std::endl; return 1; } std::string line; std::vector<double> b_table; while(std::getline(in,line)) { std::istringstream read_line(line); std::copy(std::istream_iterator<double>(read_line), std::istream_iterator<double>(), std::back_inserter(b_table)); } if(b_table.size() != dwi_files.size()*4) { std::cout << "Mismatch between b-table and the loaded images" << std::endl; return 1; } for(unsigned int index = 0,b_index = 0;index < dwi_files.size();++index,b_index += 4) { dwi_files[index]->set_bvalue(b_table[b_index]); dwi_files[index]->set_bvec(b_table[b_index+1],b_table[b_index+2],b_table[b_index+3]); } std::cout << "B-table " << table_file_name << " loaded" << std::endl; } if(po.has("bval") && po.has("bvec")) { std::vector<double> bval,bvec; std::cout << "load bval=" << po.get("bval") << std::endl; std::cout << "load bvec=" << po.get("bvec") << std::endl; load_bval(po.get("bval").c_str(),bval); load_bvec(po.get("bvec").c_str(),bvec); if(bval.size() != dwi_files.size()) { std::cout << "Mismatch between bval file and the loaded images" << std::endl; return 1; } if(bvec.size() != dwi_files.size()*3) { std::cout << "Mismatch between bvec file and the loaded images" << std::endl; return 1; } for(unsigned int index = 0;index < dwi_files.size();++index) { dwi_files[index]->set_bvalue(bval[index]); dwi_files[index]->set_bvec(bvec[index*3],bvec[index*3+1],bvec[index*3+2]); } } if(dwi_files.empty()) { std::cout << "No file readed. Abort." << std::endl; return 1; } double max_b = 0; for(unsigned int index = 0;index < dwi_files.size();++index) { if(dwi_files[index]->get_bvalue() < 100) dwi_files[index]->set_bvalue(0); max_b = std::max(max_b,(double)dwi_files[index]->get_bvalue()); } if(max_b == 0.0) { std::cout << "Cannot find b-table from the header. You may need to load an external b-table using--b_table or --bval and --bvec." << std::endl; return 1; } std::cout << "Output src to " << output << std::endl; DwiHeader::output_src(output.c_str(),dwi_files, po.get<int>("up_sampling",0), po.get<int>("sort_b_table",0)); return 0; }