diff options
Diffstat (limited to 'src/sfac.c')
-rw-r--r-- | src/sfac.c | 108 |
1 files changed, 108 insertions, 0 deletions
@@ -162,3 +162,111 @@ double complex get_sfac(const char *n, double s, double en) return fq - fq0 + f1f2; } + + +/* Load PDB file into a memory format suitable for efficient(ish) structure + * factor calculation */ +struct molecule *load_molecule() +{ + struct molecule *mol; + FILE *fh; + char line[1024]; + char *rval; + int i; + + mol = malloc(sizeof(struct molecule)); + if ( mol == NULL ) return NULL; + mol->n_species = 0; + + fh = fopen("molecule.pdb", "r"); + if ( fh == NULL ) { + fprintf(stderr, "Couldn't open file\n"); + return NULL; + } + + do { + + char el[4]; + int j, r; + int done = 0; + float x, y, z, occ, B; + char *coords; + + rval = fgets(line, 1023, fh); + + /* Only interested in atoms */ + if ( strncmp(line, "HETATM", 6) != 0 ) continue; + + /* The following crimes against programming style + * were brought to you by Wizbit Enterprises, Inc. */ + if ( line[76] == ' ' ) { + el[0] = line[77]; + el[1] = '\0'; + } else { + el[0] = line[76]; + el[1] = line[77]; + el[2] = '\0'; + } + + coords = line + 29; + r = sscanf(coords, "%f %f %f %f %f", &x, &y, &z, &occ, &B); + if ( r != 5 ) { + fprintf(stderr, "WTF?\n"); + abort(); + } + + for ( j=0; j<mol->n_species; j++ ) { + + struct mol_species *spec; + int n; + + spec = mol->species[j]; + + if ( strcmp(spec->species, el) != 0 ) continue; + + n = mol->species[j]->n_atoms; + + spec->x[n] = x; + spec->y[n] = y; + spec->z[n] = z; + spec->occ[n] = occ; + spec->B[n] = B; + mol->species[j]->n_atoms++; + + done = 1; + + } + + if ( !done ) { + + /* Need to create record for this species */ + struct mol_species *spec; + + spec = malloc(sizeof(struct mol_species)); + + memcpy(spec->species, el, 4); + spec->x[0] = x; + spec->y[0] = y; + spec->z[0] = z; + spec->occ[0] = occ; + spec->B[0] = B; + spec->n_atoms = 1; + + mol->species[mol->n_species] = spec; + mol->n_species++; + + } + + + } while ( rval != NULL ); + + fclose(fh); + + printf("There are %i species\n", mol->n_species); + for ( i=0; i<mol->n_species; i++ ) { + printf("'%s': %i\n", mol->species[i]->species, + mol->species[i]->n_atoms); + } + + return mol; +} |