/********************************************************************** igbhead - program to display and remove/modify/create IGB headers usage igbhead [options] file author: Edward Vigmond **********************************************************************/ #include #include #include "IGBheader.h" #include "cmdline.h" using namespace std; void output_header( IGBheader* ); main( int argc, char* argv[] ) { gengetopt_args_info args_info; // let's call our cmdline parser if (cmdline_parser (argc, argv, &args_info) != 0) exit(1); if( argc == 1 || args_info.inputs_num != 1 ) { cerr << "\nigbhead [OPTIONS] file" << endl; cerr << "\tadd, edit or remove igb headers" << endl; cerr << "\trun igbhead --help to see options" << endl << endl; exit(0); } // the last arg must be a file name gzFile in = gzopen( args_info.inputs[0], "r" ); if( in == NULL ) { cerr << "File not found: " << args_info.inputs[0] << endl; exit(1); } IGBheader* header= new IGBheader( in ); if( header->read() == 0 ) gzrewind( in ); // just output the current header if( argc==2 ) { output_header( header ); gzclose( in ); exit(0); } if( args_info.x_given ) header->x( args_info.x_arg ); if( args_info.y_given ) header->y( args_info.y_arg ); if( args_info.z_given ) header->z( args_info.z_arg ); if( args_info.t_given ) header->t( args_info.t_arg ); if( args_info.data_type_given ) header->type( args_info.data_type_arg ); if( args_info.system_given ) header->systeme( args_info.system_arg ); if( args_info.dim_x_given ) header->dim_x( args_info.dim_x_arg ); if( args_info.dim_y_given ) header->dim_y( args_info.dim_y_arg ); if( args_info.dim_z_given ) header->dim_z( args_info.dim_z_arg ); if( args_info.dim_t_given ) header->dim_t( args_info.dim_t_arg ); if( args_info.fac_x_given ) header->fac_x( args_info.fac_x_arg ); if( args_info.fac_y_given ) header->fac_y( args_info.fac_y_arg ); if( args_info.fac_z_given ) header->fac_z( args_info.fac_z_arg ); if( args_info.fac_t_given ) header->fac_t( args_info.fac_t_arg ); if( args_info.org_x_given ) header->org_x( args_info.org_x_arg ); if( args_info.org_y_given ) header->org_y( args_info.org_y_arg ); if( args_info.org_z_given ) header->org_z( args_info.org_z_arg ); if( args_info.org_t_given ) header->org_t( args_info.org_t_arg ); if( args_info.inc_x_given ) header->inc_x( args_info.inc_x_arg ); if( args_info.inc_y_given ) header->inc_y( args_info.inc_y_arg ); if( args_info.inc_z_given ) header->inc_z( args_info.inc_z_arg ); if( args_info.inc_t_given ) header->inc_t( args_info.inc_t_arg ); if( args_info.x_units_given ) header->unites_x( args_info.x_units_arg ); if( args_info.y_units_given ) header->unites_y( args_info.y_units_arg ); if( args_info.z_units_given ) header->unites_z( args_info.z_units_arg ); if( args_info.t_units_given ) header->unites_t( args_info.t_units_arg ); if( args_info.clear_comment_given ) header->comment(NULL); if( args_info.comment_given ) header->comment( args_info.comment_arg ); if( args_info.data_factor_given ) header->facteur( args_info.data_factor_arg ); if( args_info.data_zero_given ) header->zero( args_info.data_zero_arg ); if( args_info.author_given ) header->aut_name( args_info.author_arg ); if( args_info.transparent_given ){ if( strlen(args_info.transparent_arg)!=2*Data_Size[header->type()] ){ cerr << "Incorrect tranparent value specified\n"; exit(1); } // convert hex digits to bytes char* v = new char[Data_Size[header->type()]]; char s[3], *pp; s[2] = '\0'; for( int i=0; itype()]; i++ ){ s[0] = args_info.transparent_arg[i*2]; s[1] = args_info.transparent_arg[i*2+1]; v[i] = strtol( s, &pp, 16 ); } header->transparent( v ); } if( args_info.no_transparent_given ) header->transparent( NULL ); // count the number of data bytes if( args_info.jive_time_given ) { z_off_t zo = gztell( in ); const int bufsize=8196; char buff[bufsize]; long nb=0, nr; while( (nr=gzread( in, buff, bufsize )) == bufsize ) nb += nr; nb += nr; header->t( float(nb)/header->x()/header->y()/header->z() ); gzseek( in, zo, SEEK_SET ); } // make a temporary file string tmpfn = "."; tmpfn += args_info.inputs[0]; tmpfn += ".tmp"; // determine output file and if it is compressed bool compressed=false; string ofn; if( args_info.frankenstein_given ){ ofn = args_info.frankenstein_arg; gzclose( in ); IGBheader *h = new IGBheader(in=gzopen( args_info.frankenstein_arg,"r" )); if( h->read() == 0 ) gzrewind( in ); h->~IGBheader(); } else ofn = args_info.inputs[0]; if(args_info.output_file_given) ofn = args_info.output_file_arg; if( ofn.rfind(".gz") == ofn.length()-3 ) compressed=true; gzFile gzout; FILE* fout; if( compressed ) header->fileptr(gzout = gzopen( tmpfn.c_str(), "w" ) ); else header->fileptr(fout= fopen( tmpfn.c_str(), "w" ) ); if( !args_info.decapitate_given ) header->write(); const int bufsize=1024; char buf[bufsize]; int nb; if( compressed ){ while( (nb=gzread( in, buf, bufsize )) > 0 ) gzwrite( gzout, buf, nb ); gzclose( gzout ); } else { while( (nb=gzread( in, buf, bufsize )) > 0 ) fwrite(buf, nb, 1, fout); fclose( fout ); } gzclose( in ); rename( tmpfn.c_str(), ofn.c_str() ); } void output_header( IGBheader* header ) { bool tf; printf( "x dimension:\t%d\n", header->x() ); printf( "y dimension:\t%d\n", header->y() ); printf( "z dimension:\t%d\n", header->z() ); printf( "t dimension:\t%d\n", header->t() ); printf( "data type:\t%s\n", Header_Type[header->type()] ); header->unites(tf); if( tf == true ) { printf( "Pixel units:\t%s\n", header->unites() ); } if( header->transparent() != NULL ) { printf( "Transparent:\t%s\n", header->transparentstr() ); } header->zero(tf); if( tf == true ) { printf( "Pixel zero:\t%g\n", header->zero() ); } header->unites(tf); if( tf == true ) { printf( "Pixel scaling:\t%g\n", header->facteur() ); } header->dim_x(tf); if( tf == true ) { printf( "X size:\t\t%g\n", header->dim_x() ); } header->unites_x(tf); if( tf == true ) { printf( "X units:\t%s\n", header->unites_x() ); } header->inc_x(tf); if( tf == true ) { printf( "Increment in x:\t%g\n", header->inc_x() ); } header->org_x(tf); if( tf == true ) { printf( "X origin:\t%g\n", header->org_x() ); } header->fac_x(tf); if( tf == true ) { printf( "X scale factor:\t%g\n", header->fac_x() ); } header->dim_y(tf); if( tf == true ) { printf( "Y size:\t\t%g\n", header->dim_y() ); } header->unites_y(tf); if( tf == true ) { printf( "Y units:\t%s\n", header->unites_y() ); } header->inc_y(tf); if( tf == true ) { printf( "Increment in y:\t%g\n", header->inc_y() ); } header->org_y(tf); if( tf == true ) { printf( "Y origin:\t%g\n", header->org_y() ); } header->fac_y(tf); if( tf == true ) { printf( "Y scale factor:\t%s\n\n", header->fac_y() ); } header->dim_z(tf); if( tf == true ) { printf( "Z size:\t\t%g\n", header->dim_z() ); } header->unites_z(tf); if( tf == true ) { printf( "Z units:\t%s\n", header->unites_z() ); } header->inc_z(tf); if( tf == true ) { printf( "Increment in z:\t%g\n", header->inc_z() ); } header->org_z(tf); if( tf == true ) { printf( "Z origin:\t%g\n", header->org_z() ); } header->fac_z(tf); if( tf == true ) { printf( "Z scale factor:\t%g\n", header->fac_z() ); } header->dim_t(tf); if( tf == true ) { printf( "T size:\t\t%g\n", header->dim_t() ); } header->unites_t(tf); if( tf == true ) { printf( "T units:\t%s\n", header->unites_t() ); } header->inc_t(tf); if( tf == true ) { printf( "Increment in t:\t%g\n", header->inc_t() ); } header->org_t(tf); if( tf == true ) { printf( "T origin:\t%g\n", header->org_t() ); } header->fac_t(tf); if( tf == true ) { printf( "T scale factor:\t%g\n", header->fac_t() ); } printf( "Created on:\t%s\n", header->systemestr()); header->aut_name(tf); if( tf == true ) { printf( "Author:\t\t%s\n", header->aut_name() ); } if( header->comment() != NULL ){ char **cm = header->comment(); int i=0; while( cm[i] != NULL ) printf( "#%s\n", cm[i++] ); } }