diff --git a/src/apps/structure-info/model.ts b/src/apps/structure-info/model.ts index c06c66e4eeb80a6655db82a9511f0a6c1c1cdcde..6a8ce63093eedd9d2c305346fbc74f06cdb75e08 100644 --- a/src/apps/structure-info/model.ts +++ b/src/apps/structure-info/model.ts @@ -196,7 +196,7 @@ async function run(mmcif: mmCIF_Database) { //printIHMModels(models[0]); printUnits(structure); //printRings(structure); - printLinks(structure, true, true); + //printLinks(structure, true, true); //printModRes(models[0]); //printSecStructure(models[0]); } diff --git a/src/mol-model/structure/structure/structure.ts b/src/mol-model/structure/structure/structure.ts index 22666fb137319710faae97b12058c3861003ecaf..78ef1b4703407f526c2f9844385e92232f8d14b1 100644 --- a/src/mol-model/structure/structure/structure.ts +++ b/src/mol-model/structure/structure/structure.ts @@ -94,25 +94,27 @@ namespace Structure { export function create(units: ReadonlyArray<Unit>): Structure { return new Structure(units); } + /** + * Construct a Structure from a model. + * + * Generally, a single unit corresponds to a single chain, with the exception + * of consecutive "single atom chains". + */ export function ofModel(model: Model): Structure { const chains = model.atomicHierarchy.chainSegments; const builder = new StructureBuilder(); - const { residueSegments: { segmentMap: residueIndex } } = model.atomicHierarchy; - for (let c = 0; c < chains.count; c++) { const start = chains.segments[c]; - let end = chains.segments[c + 1]; - let rStart = residueIndex[start], rEnd = residueIndex[end - 1]; - while (rEnd - rStart <= 1 && c + 1 < chains.count) { + // merge all consecutive "single atom chains" + while (c + 1 < chains.count + && chains.segments[c + 1] - chains.segments[c] === 1 + && chains.segments[c + 2] - chains.segments[c + 1] === 1) { c++; - end = chains.segments[c + 1]; - rStart = rEnd; - rEnd = residueIndex[end - 1]; } - const elements = SortedArray.ofBounds(start, end); + const elements = SortedArray.ofBounds(start, chains.segments[c + 1]); builder.addUnit(Unit.Kind.Atomic, model, SymmetryOperator.Default, elements); }