int _PD_cksum_var_read(PDBfile *file, char *name, char *type, syment *ep, void *vr) {int rv, ok; inti ni, len; intb bpi; unsigned char rdig[PD_CKSUM_LEN], cdig[PD_CKSUM_LEN]; char *path; rv = TRUE; /* if requested, check MD5 checksum for this var */ if ((file->cksum.use & PD_MD5_RW) && (strstr(name, PD_MD5_DIR) == NULL)) {len = strlen(PD_MD5_DIR) + strlen(name) + strlen(PD_MD5_SUFFIX) + 2; path = CMAKE_N(char, len); /* read checksum as /&md5/<varname> */ snprintf(path, len, "%s%s", PD_MD5_DIR, name); if (PD_query_entry(file, path, NULL) == NULL) /* if preferred form is not there check archaic form - /&md5/<varname>-md5 */ {snprintf(path, len, "%s%s%s", PD_MD5_DIR, name, PD_MD5_SUFFIX); /* make sure &md5 var has been created */ if (PD_query_entry(file, path, NULL) == NULL) PD_error("NO MD5 CHECKSUM AVAILABLE FOR THIS VARIABLE - _PD_CKSUM_VAR_READ", PD_READ);} else {ni = _PD_comp_num(ep->dimensions); bpi = _PD_lookup_size(type, file->host_chart); /* do checksum in local memory on vr just read */ memset(cdig, 0, PD_CKSUM_LEN); PM_md5_checksum_array(vr, ni, bpi, cdig); /* read previous checksum */ PD_read(file, path, rdig); CFREE(path); /* return -1 and set PD_error if MD5 mismatch */ ok = _PD_cksum_compare(cdig, rdig); if (ok == FALSE) {rv = -1; /* NOTE: this must be treated as generic because of the PD_read above */ PD_error("MD5 CHECKSUM OF VARIABLE FAILED - _PD_CKSUM_VAR_READ", PD_GENERIC);};};};
int main(int argc, char** argv) { if(argc < 4) { fprintf(stderr, "Useage: %s <input file> <output file> <t stride>\n", argv[0]); return 1; } int tstride; if(sscanf(argv[3], "%d", &tstride) != 1) { fprintf(stderr, "\tERROR: t stride must be an integer\n"); return 1; } // Open input file PDBfile *in; if((in = PD_open(argv[1], "r")) == NULL) { fprintf(stderr, "\tERROR: Could not open input file '%s'\n", argv[1]); return 1; } // Open output file PDBfile *out; if((out = PD_open(argv[2], "w")) == NULL) { fprintf(stderr, "\tERROR: Could not open output file '%s'\n", argv[2]); return 1; } // Get list of variables int nvars; char **var_names = PD_ls(in, NULL, NULL, &nvars); if((var_names == (char**) NULL) || (nvars < 1)) { fprintf(stderr, "\tERROR: No variables\n"); return 1; } // Go through the variables char *varname; for(int var=0;var<nvars;var++) { varname = var_names[var]; syment *ep; // PDB query types dimdes* dims; // Query size of the variable if((ep = PD_query_entry(in, varname, NULL)) == (syment*) NULL) { fprintf(stderr, "\tError querying variable %s\n", varname); return 1; } dims = PD_entry_dimensions(ep); int nd = 0; // Count number of dimensions int varsize = 1; // Number of elements long inds[12]; while(dims != (dimdes*) NULL) { long min, max; min = dims->index_min; max = dims->index_max; if(nd > 3) { fprintf(stderr, "\tERROR: Can't handle variable '%s': more than 4D\n", varname); return 2; } inds[3*nd] = min; inds[3*nd + 1] = max; inds[3*nd + 2] = 1L; varsize *= max - min + 1; nd++; dims = dims->next; } // Get variable type char *typ; typ = PD_entry_type(ep); if((strcmp(varname, "t_array") == 0) && (nd == 1)) { float *fdata = new float[varsize]; // Read the data from the PDB file inds[2] = tstride; int nread; if( (nread = PD_read_as_alt(in, varname, "float", fdata, inds)) == 0) { fprintf(stderr, "\tWARNING: Could not read t_array. Ignoring\n"); delete[] fdata; continue; } inds[0] = 0L; inds[1] = nread-1; inds[2] = 1L; if(PD_write_alt(out, varname, "float", fdata, 1, inds) == FALSE) { fprintf(stderr, "\tWARNING: Could not write '%s'. Ignoring\n", varname); } delete[] fdata; }else if(nd == 4) { // Reducing time resolution if(strcasecmp(typ, "integer") == 0) { int *idata = new int[varsize]; // Read the data from the PDB file inds[2] = tstride; int nread; if( (nread = PD_read_as_alt(in, varname, "integer", idata, inds)) == 0) { fprintf(stderr, "\tWARNING: Could not read '%s'. Ignoring\n", varname); delete[] idata; continue; } if( nread % (varsize / (inds[1] - inds[0] + 1)) != 0 ) { fprintf(stderr, "ERROR: Accounting error: (%ld, %ld), %d, %d\n", inds[0], inds[1], varsize, nread); delete[] idata; continue; } nread = nread / (varsize / (inds[1] - inds[0] + 1)); inds[0] = 0L; inds[1] = nread - 1; inds[2] = 1L; if(PD_write_alt(out, varname, "integer", idata, 4, inds) == FALSE) { fprintf(stderr, "\tWARNING: Could not write '%s'. Ignoring\n", varname); } delete[] idata; }else if( (strcasecmp(typ, "float") == 0) || (strcasecmp(typ, "double") == 0) ) { // Convert doubles to floats float *fdata = new float[varsize]; // Read the data from the PDB file inds[2] = tstride; int nread; if( (nread = PD_read_as_alt(in, varname, "float", fdata, inds)) == 0) { fprintf(stderr, "\tWARNING: Could not read '%s'. Ignoring\n", varname); delete[] fdata; continue; } if( nread % (varsize / (inds[1] - inds[0] + 1)) != 0 ) { fprintf(stderr, "ERROR: Accounting error: (%ld, %ld), %d, %d\n", inds[0], inds[1], varsize, nread); delete[] fdata; continue; } nread = nread / (varsize / (inds[1] - inds[0] + 1)); inds[0] = 0L; inds[1] = nread - 1; inds[2] = 1L; if(PD_write_alt(out, varname, "float", fdata, 4, inds) == FALSE) { fprintf(stderr, "\tWARNING: Could not write '%s'. Ignoring\n", varname); } delete[] fdata; }else { fprintf(stderr, "\tWARNING: '%s' has unrecognised type '%s'. Ignoring\n", varname, typ); } }else { // Just copy the data across if(strcasecmp(typ, "integer") == 0) { int *idata = new int[varsize]; // Read the data from the PDB file if (PD_read_as(in, varname, "integer", idata) == 0) { fprintf(stderr, "\t\tWARNING: Could not read variable. Ignoring\n"); delete[] idata; continue; } if(PD_write_alt(out, varname, "integer", idata, nd, inds) == FALSE) { fprintf(stderr, "\tWARNING: Could not write variable '%s'\n", varname); } delete[] idata; }else if( (strcasecmp(typ, "float") == 0) || (strcasecmp(typ, "double") == 0) ) { // Convert doubles to floats float *fdata = new float[varsize]; // Read the data from the PDB file if (PD_read_as(in, varname, "float", fdata) == 0) { fprintf(stderr, "\tWARNING: Could not read variable '%s'. Ignoring\n", varname); delete[] fdata; continue; } if(PD_write_alt(out, varname, "float", fdata, nd, inds) == FALSE) { fprintf(stderr, "\tWARNING: Could not write variable '%s'\n", varname); } delete[] fdata; }else { fprintf(stderr, "WARNING: '%s' has unrecognised type '%s'. Ignoring\n", varname, typ); } } } PD_close(in); PD_close(out); return 0; }