#include <cmath>
namespace gdcm {
const Tag t1(0x0020,0x000d);
const Tag t2(0x0020,0x000e);
const Tag t3(0x0020,0x0052);
const Tag t4(0x0020,0x0037);
class DiscriminateVolume
{
private:
std::vector< Directory::FilenamesType > SortedFiles;
std::vector< Directory::FilenamesType > UnsortedFiles;
{
if( valueref )
{
size_t len = strlen( valueref );
Directory::FilenamesType::const_iterator file = filesubset.begin();
for(; file != filesubset.end(); ++file)
{
const char *filename = file->c_str();
const char * value = s.GetValue(filename, t);
if( value && strncmp(value, valueref, len ) == 0 )
{
theReturn.push_back( filename );
}
}
}
return theReturn;
}
{
std::cout << "IOP: " << iopval << std::endl;
IPPSorter ipp;
ipp.SetComputeZSpacing( true );
ipp.SetZSpacingTolerance( 1e-3 );
bool b = ipp.Sort( subset );
if( !b )
{
std::cerr << "Failed to sort: " << subset.begin()->c_str() << std::endl;
for(
Directory::FilenamesType::const_iterator file = subset.begin();
file != subset.end(); ++file)
{
std::cerr << *file << std::endl;
}
UnsortedFiles.push_back( subset );
return ;
}
ipp.Print( std::cout );
SortedFiles.push_back( ipp.GetFilenames() );
}
{
s, subset, t3, frameuid);
std::set< std::string > iopset;
for(
Directory::FilenamesType::const_iterator file = files.begin();
file != files.end(); ++file)
{
const char * value = s.GetValue(file->c_str(), gdcm::t4 );
assert( value );
iopset.insert( value );
}
size_t n = iopset.size();
if ( n == 0 )
{
assert( files.empty() );
return;
}
std::cout << "Frame of Ref: " << frameuid << std::endl;
if ( n == 1 )
{
ProcessAIOP(s, files, iopset.begin()->c_str() );
}
else
{
const char *f = files.begin()->c_str();
std::cerr << "More than one IOP: " << f << std::endl;
for(
std::set< std::string >::const_iterator it = iopset.begin();
it != iopset.end(); ++it )
{
for(
Directory::FilenamesType::const_iterator file = files.begin();
file != files.end(); ++file)
{
std::string value = s.GetValue(file->c_str(), gdcm::t4 );
if( value != it->c_str() )
{
const double crossdot = ref.
CrossDot(dc);
const double eps = std::fabs( 1. - crossdot );
if( eps < 1e-6 )
{
std::cerr << "Problem with IOP discrimination: " << file->c_str()
<< " " << it->c_str() << std::endl;
return;
}
}
}
}
for(
std::set< std::string >::const_iterator it = iopset.begin();
it != iopset.end(); ++it )
{
const char *iopvalue = it->c_str();
s, files, t4, iopvalue );
ProcessAIOP(s, iopfiles, iopvalue );
}
}
}
void ProcessASeries(Scanner const & s, const char * seriesuid)
{
std::cout << "Series: " << seriesuid << std::endl;
s, s.GetFilenames(), t2, seriesuid);
for(
gdcm::Scanner::ValuesType::const_iterator it = vt3.begin()
; it != vt3.end(); ++it )
{
ProcessAFrameOfRef(s, seriesfiles, it->c_str());
}
}
void ProcessAStudy(Scanner const & s, const char * studyuid)
{
std::cout << "Study: " << studyuid << std::endl;
for(
gdcm::Scanner::ValuesType::const_iterator it = vt2.begin()
; it != vt2.end(); ++it )
{
ProcessASeries(s, it->c_str());
}
}
public:
void Print( std::ostream & os )
{
os << "Sorted Files: " << std::endl;
for(
std::vector< Directory::FilenamesType >::const_iterator it = SortedFiles.begin();
it != SortedFiles.end(); ++it )
{
os << "Group: " << std::endl;
for(
Directory::FilenamesType::const_iterator file = it->begin();
file != it->end(); ++file)
{
os << *file << std::endl;
}
}
os << "Unsorted Files: " << std::endl;
for(
std::vector< Directory::FilenamesType >::const_iterator it = UnsortedFiles.begin();
it != UnsortedFiles.end(); ++it )
{
os << "Group: " << std::endl;
for(
Directory::FilenamesType::const_iterator file = it->begin();
file != it->end(); ++file)
{
os << *file << std::endl;
}
}
}
std::vector< Directory::FilenamesType > const & GetSortedFiles() const { return SortedFiles; }
std::vector< Directory::FilenamesType > const & GetUnsortedFiles() const { return UnsortedFiles; }
void ProcessIntoVolume( Scanner const & s )
{
for(
gdcm::Scanner::ValuesType::const_iterator it = vt1.begin()
; it != vt1.end(); ++it )
{
ProcessAStudy( s, it->c_str() );
}
}
};
}
int main(int argc, char *argv[])
{
std::string dir1;
if( argc < 2 )
{
const char *extradataroot = NULL;
#ifdef GDCM_BUILD_TESTING
#endif
if( !extradataroot )
{
return 1;
}
dir1 = extradataroot;
dir1 += "/gdcmSampleData/ForSeriesTesting/VariousIncidences/ST1";
}
else
{
dir1 = argv[1];
}
d.
Load( dir1.c_str(), true );
if( !b )
{
std::cerr << "Scanner failed" << std::endl;
return 1;
}
gdcm::DiscriminateVolume dv;
dv.ProcessIntoVolume( s );
dv.Print( std::cout );
return 0;
}