29 char field00[7], field01[6], field02[2], field03[3], field04[3],
30 field05[2], field06[5], field08[2], field09[5],
31 field10[2], field11[4], field12[9], field13[9], field14[9],
32 field15[7], field16[7], field17[2], field18[4], field19[3],
33 field20[5], field21[3], field22[3];
35 const char *element_name[] = {
36 "H",
"HE",
"LI",
"BE",
"B",
"C",
"N",
"O",
"F",
"NE",
37 "NA",
"MG",
"AL",
"SI",
"P",
"S",
"CL",
"AR",
"K",
"CA",
38 "SC",
"TI",
"V",
"CR",
"MN",
"FE",
"CO",
"NI",
"CU",
"ZN" 40 float element_mass[30] = {
41 1.008f , 4.003f, 6.940f, 9.012f, 10.810f, 12.011f, 14.007f, 16.000f, 18.998f, 20.179f,
42 22.990f, 24.305f, 26.982f, 28.086f, 30.974f, 32.060f, 35.453f, 39.948f, 39.098f, 40.080f,
43 44.956f, 47.880f, 50.942f, 51.996f, 54.938f, 55.847f, 58.933f, 58.710f, 63.546f, 65.380f
45 int frequent_element[5] = {5, 6, 7, 14, 15};
46 unsigned i,
j,
k, line_width, atom_count;
47 const char *program =
"lib_pio";
49 fin = fopen(file_name,
"r");
57 if (line != fgets(line, 100, fin))
error_fgets(program);
59 if (sscanf(line,
"%6s", recd_name) != 1)
continue;
60 if (strcmp(recd_name,
"ATOM") == 0 || strcmp(recd_name,
"HETATM") == 0 || strcmp(recd_name,
"LABEL") == 0) atom_count++;
69 if (line != fgets(line, 100, fin))
error_fgets(program);
71 if (sscanf(line,
"%6s", recd_name) != 1)
continue;
72 if (strcmp(recd_name,
"ATOM") == 0 || strcmp(recd_name,
"HETATM") == 0 || strcmp(recd_name,
"LABEL") == 0) {
74 for (j = 0; j < 80; j++) {
75 if (line[j] ==
'\n') {
80 for (j = line_width; j < 80; j++) {
84 fld2s(field00, new_pdb[i].recd);
86 fld2i(field01, 5, &(new_pdb[i].serial));
91 fld2s(field04, new_pdb[i].loc);
93 fld2s(field05, new_pdb[i].alt);
95 fld2s(field06, new_pdb[i].res);
97 fld2s(field08, new_pdb[i].chain);
99 fld2i(field09, 4, &(new_pdb[i].seq));
100 get_fld(line, 27, 27, field10);
101 fld2s(field10, new_pdb[i].icode);
102 get_fld(line, 28, 30, field11);
103 get_fld(line, 31, 38, field12);
104 new_pdb[
i].
x = (float) atof(field12);
105 get_fld(line, 39, 46, field13);
106 new_pdb[
i].
y = (float) atof(field13);
107 get_fld(line, 47, 54, field14);
108 new_pdb[
i].
z = (float) atof(field14);
109 get_fld(line, 55, 60, field15);
111 get_fld(line, 61, 66, field16);
112 new_pdb[
i].
beta = (float) atof(field16);
113 get_fld(line, 67, 67, field17);
114 get_fld(line, 68, 70, field18);
115 fld2i(field18, 3, &(new_pdb[i].footnote));
116 get_fld(line, 71, 72, field19);
117 get_fld(line, 73, 76, field20);
118 fld2s(field20, new_pdb[i].segid);
119 get_fld(line, 77, 78, field21);
120 fld2s(field21, new_pdb[i].element);
121 get_fld(line, 79, 80, field22);
122 fld2s(field22, new_pdb[i].charge);
125 if ((strcmp(new_pdb[i].
type,
"QV") == 0 && strcmp(new_pdb[i].loc,
"OL") == 0) || (strcmp(new_pdb[i].type,
"QP") == 0 && strcmp(new_pdb[i].loc,
"DB") == 0)) {
129 else if (strcmp(new_pdb[i].type,
"DE") == 0 && strcmp(new_pdb[i].loc,
"NS") == 0) {
134 for (j = 1; j < 30; ++
j) {
136 if (new_pdb[i].type[0] ==
'H' || (new_pdb[i].type[0] ==
' ' && new_pdb[i].type[1] ==
'H')) {
137 new_pdb[
i].
weight = element_mass[0];
140 else if (strcmp(new_pdb[i].type, element_name[j]) == 0) {
141 new_pdb[
i].
weight = element_mass[
j];
147 if (j == 30)
for (k = 0; k < 5; ++
k) {
148 if (strncmp(new_pdb[i].type, element_name[frequent_element[k]], 1) == 0) {
149 new_pdb[
i].
weight = element_mass[frequent_element[
k]];
155 printf(
"lib_pio> Warning: Unable to identify atom type %s, assigning carbon mass.\n", new_pdb[i].type);
156 new_pdb[
i].
weight = element_mass[5];
164 if (i != atom_count) {
168 *num_atoms = atom_count;
void fld2s(char *field, char *str)
void error_fgets(const char *program)
void get_fld(char *line, unsigned i1, unsigned i2, char *field)
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
void fld2i(char *field, unsigned n, int *num)
void error_open_filename(int error_number, const char *program, char *argv)
void error_atom_count(int error_number, const char *program, int i, int atom_count)
void * alloc_vect(unsigned int n, size_t elem_size)