Ver Fonte

tweak mapping

JonStargaryen há 4 anos atrás
pai
commit
e12dc2b089
1 ficheiros alterados com 17 adições e 19 exclusões
  1. 17 19
      src/mol-io/writer/sdf/encoder.ts

+ 17 - 19
src/mol-io/writer/sdf/encoder.ts

@@ -87,14 +87,15 @@ export class SdfEncoder implements Encoder<string> {
 
         // traverse once to determine all actually present atoms
         const atoms = this.getAtoms(source, sortedFields, label_atom_id, pdbx_PDB_model_num, ctab);
-        atoms.forEach((av, ak) => {
-            const { id } = this.split(ak);
-            bondMap.map.get(ak)!.forEach((bv, bk) => {
-                const { id: partnerId, label: partnerLabel } = this.split(bk);
-                if (id < partnerId && atoms.has(bk) && !this.skipHydrogen(partnerLabel)) {
+        for (let i = 0, il = atoms.length; i < il; i++) {
+            const name = atoms[i];
+            bondMap.map.get(name)!.forEach((bv, bk) => {
+                const partnerId = atoms.indexOf(bk);
+                const partnerLabel = this.getLabel(bk);
+                if (i < partnerId && atoms.indexOf(bk) > -1 && !this.skipHydrogen(partnerLabel)) {
                     const { order } = bv;
-                    StringBuilder.writeIntegerPadLeft(bonds, id, 3);
-                    StringBuilder.writeIntegerPadLeft(bonds, partnerId, 3);
+                    StringBuilder.writeIntegerPadLeft(bonds, i + 1, 3);
+                    StringBuilder.writeIntegerPadLeft(bonds, partnerId + 1, 3);
                     StringBuilder.writeIntegerPadLeft(bonds, order, 3);
                     StringBuilder.writeSafe(bonds, '  0  0  0  0\n'); 
                     // TODO 2nd value: Single bonds: 0 = not stereo, 1 = Up, 4 = Either, 6 = Down, 
@@ -102,11 +103,11 @@ export class SdfEncoder implements Encoder<string> {
                     bondCount++;
                 }
             });
-        });
+        }
 
         // write counts line
         // 'Important specifications here relate to the number of atoms, bonds, and atom lists, the chiral flag setting, and the Ctab version.'
-        StringBuilder.writeIntegerPadLeft(this.builder, atoms.size, 3);
+        StringBuilder.writeIntegerPadLeft(this.builder, atoms.length, 3);
         StringBuilder.writeIntegerPadLeft(this.builder, bondCount, 3);
         StringBuilder.write(this.builder, '  0     0  0  0  0  0  0999 V2000\n'); // TODO 2nd value: chiral flag: 0=not chiral, 1=chiral 
 
@@ -117,8 +118,8 @@ export class SdfEncoder implements Encoder<string> {
         StringBuilder.writeSafe(this.builder, 'M  END\n');
     }
 
-    private getAtoms(source: any, fields: Field<any, any>[], label_atom_id: Field<any, any>, pdbx_PDB_model_num: Field<any, any>, ctab: StringBuilder): Map<string, { id: number, label: string }> {
-        const atoms = new Map<string, any>();
+    private getAtoms(source: any, fields: Field<any, any>[], label_atom_id: Field<any, any>, pdbx_PDB_model_num: Field<any, any>, ctab: StringBuilder): string[] {
+        const atoms = [];
         let index = 0;
 
         for (let _c = 0; _c < source.length; _c++) {
@@ -135,12 +136,12 @@ export class SdfEncoder implements Encoder<string> {
                 }
 
                 const laiv = label_atom_id.value(key, data, index) as string;
-                const lai = this.split(laiv);
-                if (this.skipHydrogen(lai.label)) {
+                const lai = this.getLabel(laiv);
+                if (this.skipHydrogen(lai)) {
                     index++;
                     continue;
                 }
-                atoms.set(laiv, lai);
+                atoms.push(laiv);
                 
                 for (let _f = 0, _fl = fields.length; _f < _fl; _f++) {
                     const f: Field<any, any> = fields[_f]!;
@@ -163,11 +164,8 @@ export class SdfEncoder implements Encoder<string> {
         return label.startsWith('H');
     }
 
-    private split(s: string) {
-        return {
-            id: Number.parseInt(s.replace(/[^0-9]+/, '')),
-            label: s.replace(/[^A-Z]+/, '')
-        }
+    private getLabel(s: string) {
+        return s.replace(/[^A-Z]+/g, '');
     }
 
     private writeFullCategory<Ctx>(sb: StringBuilder, category: Category<Ctx>, context?: Ctx) {