Hi everyone, Thanks for the all the replies I got- they were very helpful and they confirmed my suspicions. Anyway, in order to pass on the information acquired: Some book chapters were given as suggested readings: Chapter 11 of Beginning Perl for Bioinformatics By James Tisdall (I'll almost certainly be getting this). It was also said that obtaining the desired data isn't easy, because the .pdb format was written in the days of FORTRAN. The .pdb file format specifies the contents of files by the contents of specific column numbers, rather than by field. It was also suggested that depending on what I wanted to do, I might consider using another database such as MMDB or CATH/SCOP. Here is an example of the relevant part of the .PDB file to my question: ATOM 1 N SER 1 2.400 1.898 -4.584 1.00 0.00 N ATOM 2 CA SER 1 1.762 3.219 -4.845 1.00 0.00 C ATOM 3 C SER 1 0.295 3.018 -5.223 1.00 0.00 C The 6th, 7th and 8th fields contain the x, y, and z coordinates of the atoms which make up the amino acid code. Here is a link to an institution in Venezuela that work on obtaining the 3d coordinates of amino acids in proteins: http:// www.cecalc.ula.ve/BIOINFO/ Finally, the approach I used was as follows (a brief snippet of C code) typedef struct { char amino_acid_code[3]; double x; double y; double z; } amino_acid_position; char record_id[6], amino_acid_code[3]; char carbon_code[3]; int serial_number1; do // keep reading entries until we get to the first atom entry { fscanf(in, "%s", record_id); } while (strcmp("ATOM", record_id)!=0); fscanf(in, "%*d %s %s %*s %d %lf %lf %lf %*f %*f %*s", carbon_code, amino_acid_code, &serial_number1, &x, &y, &z); do // get data on the location of each of the Carbon-Alpha atom for this amino acid residue { // store the serial number so we can use it as a comparison with the next read to determine when we've found a new amino acid if (strcmp("CA", carbon_code)) { x_1=x; y_1=y; z_1=z; } fscanf(in, "%s %*d %s %s %*s %d %lf %lf %lf %*f %*f %*s", record_id, carbon_code, amino_acid_code, &serial_number1, &x, &y, &z); } while (serial_number1==serial_number2 && strcmp("TER", record_id)! =0 ); Cheers, Brad Davis davis@zoology.ubc.ca