diff --git a/xtc-length.c b/xtc-length.c index 5553b1dcf19aa8b01666e3ecef46a8f6552a8dbb..2a4f40b2c286db5a5c24eccd8fa3e728b5e009f1 100644 --- a/xtc-length.c +++ b/xtc-length.c @@ -2,6 +2,7 @@ #include <stdint.h> #include <locale.h> #include <string.h> +#include <stdbool.h> #include <sys/stat.h> @@ -28,7 +29,7 @@ void print_header(const uint8_t header[92]){ printf("\n"); } -int get_xtc_num_frames(const char *filename, int *nframes, int *natoms, float *psec){ +int get_xtc_num_frames(const char *filename, int *nframes, int *natoms, float *psec, bool quiet){ long size = file_size(filename); FILE *xtc = fopen(filename, "rb"); @@ -40,13 +41,12 @@ int get_xtc_num_frames(const char *filename, int *nframes, int *natoms, float *p double avg_frame_size = 0.; int est_nframes = 0; while(fread(header, 92, 1, xtc)){ // Loop over frames - //print_header(header); (*nframes)++; *natoms = u4_from_buffer(header+4); uint32_t frame_size = u4_from_buffer(header+88); // Read frame size from header uint32_t skip = (frame_size+3) & ~((uint32_t)3); // Round up to 4 bytes avg_frame_size += (skip - avg_frame_size + 92) / *nframes; - if(*nframes % 10 == 0){ + if(!quiet && *nframes % 10 == 0){ est_nframes = size / avg_frame_size; uint32_t ps_tmp = u4_from_buffer(header+12); memcpy(psec, &ps_tmp, 4); @@ -65,20 +65,32 @@ int get_xtc_num_frames(const char *filename, int *nframes, int *natoms, float *p } int main(const int argc, const char *argv[]){ + const char *help_text = "Count number of frames and simulation time of GROMACS XTC file\n" + "Usage: xtc-length <xtc name> [-q]\n\n" + "Default behaviour is to provide running estimate of file length\n" + "This can be suppressed using the '-q' flag\n"; + setlocale(LC_ALL, ""); if(argc < 2){ printf("ERROR: Incorrect usage - must give input filename\n"); return -1; } + if(!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")){ + printf("%s", help_text); + return 0; + } + bool quiet = false; + if(argc >= 3 && !strcmp(argv[2], "-q")) quiet = true; int nframes, natoms; float psec; - if(get_xtc_num_frames(argv[1], &nframes, &natoms, &psec)){ + if(get_xtc_num_frames(argv[1], &nframes, &natoms, &psec, quiet)){ printf("ERROR: Error reading XTC file\n"); return -1; } - printf("\rTrajectory contains %'d frames (%'.2f ns) of %'d atoms.\n", nframes, psec/1000, natoms); + if(!quiet) printf("\r"); + printf("Trajectory contains %'d frames (%'.2f ns) of %'d atoms.\n", nframes, psec/1000, natoms); return 0; }