in packages/miew/src/io/parsers/CIFParser.js [242:331]
_extractAtoms(complex, complexData) {
const atomData = complexData.atom_site;
if (!atomData) {
throw new AtomDataError('CIF parsing error: atom_site is not specified!');
}
for (let f = 0, n = cRequiredAtomFields.length; f < n; ++f) {
if (!atomData[cRequiredAtomFields[f]]) {
throw new AtomDataError(`CIF parsing error: requires field ${cRequiredAtomFields[f]} not found!`);
}
}
const { asymDict } = this;
// required fields
const resIdc = arrize(atomData.auth_seq_id);
const x = arrize(atomData.Cartn_x);
const y = arrize(atomData.Cartn_y);
const z = arrize(atomData.Cartn_z);
const names = arrize(atomData.label_atom_id);
const count = names.length;
// optional fields
const group = arrize(atomData.group_PDB) || [];
const chainIdc = arrize(atomData.auth_asym_id) || [];
const chainLabelIdc = arrize(atomData.label_asym_id) || [];
const serials = arrize(atomData.id) || [];
const iCodes = arrize(atomData.pdbx_PDB_ins_code) || [];
const resNames = arrize(atomData.label_comp_id) || [];
const elements = arrize(atomData.type_symbol) || [];
const tempFactors = arrize(atomData.B_iso_or_equiv) || [];
const occupancies = arrize(atomData.occupancy) || [];
const charges = arrize(atomData.pdbx_formal_charge) || [];
const altLocs = arrize(atomData.label_alt_id) || [];
const models = arrize(atomData.pdbx_PDB_model_num) || [];
const molecules = arrize(atomData.label_entity_id) || [];
let chain = null;
let residue = null;
for (let i = 0; i < count; ++i) {
const model = models[i] || 1;
if (model !== 1) {
continue;
}
const chainID = String(chainIdc[i] || ' ');
if (!chain || chain.getName() !== chainID) {
chain = complex.getChain(chainID) || complex.addChain(chainID);
}
asymDict[String(chainLabelIdc[i] || ' ')] = chainID;
const resSeq = resIdc[i];
const iCode = String(iCodes[i] || ' ');
const resName = String(resNames[i] || '');
if (!residue || residue.getSequence() !== resSeq || residue.getICode() !== iCode) {
residue = chain.addResidue(resName, resSeq, iCode);
// store residue in appropriate molecule
const moleculeIdx = molecules[i] - 1;
let entity = this.molecules[moleculeIdx];
if (!entity) { // create new molecule if it hasn't been created
this.molecules[moleculeIdx] = { name: '', residues: [] };
entity = this.molecules[moleculeIdx];
}
entity.residues.push(residue);
}
const name = names[i];
const element = elements[i] || nameToElement(name);
const type = Element.getByName(element);
const role = Element.Role[name.trim()];
const xyz = new THREE.Vector3(x[i], y[i], z[i]);
const het = group[i] === 'HETATM' || false;
const serial = serials[i] || i;
const tempFactor = tempFactors[i] || 0.0;
const occupancy = occupancies[i] || 0.0;
const altLoc = String(altLocs[i] || '');
const charge = charges[i] || 0;
residue.addAtom(
name,
type,
xyz,
role,
het,
serial,
altLoc,
occupancy,
tempFactor,
charge,
);
}
}