def endElement(self, name): #print "END", name if name == 'molecule': if len(self.current_numbers) > 0: self.current_coordinates = numpy.array(self.current_coordinates)*angstrom molecule = Molecule(self.current_numbers, self.current_coordinates, self.current_title) molecule.extra = self.current_extra molecule.atoms_extra = self.current_atoms_extra name_to_index = {} for counter, name in enumerate(self.current_atom_names): name_to_index[name] = counter pairs = set() current_bonds_extra = {} for name1, name2, extra in self.current_bonds: i1 = name_to_index.get(name1) i2 = name_to_index.get(name2) if i1 is not None and i2 is not None: pair = frozenset([i1,i2]) if len(extra) > 0: current_bonds_extra[pair] = extra pairs.add(pair) molecule.bonds_extra = current_bonds_extra if len(pairs) == 0: molecule.graph = None else: molecule.graph = MolecularGraph(pairs, self.current_numbers) del self.current_atom_names del self.current_bonds self.molecules.append(molecule) self.current_title = None
def endElement(self, name): #print "END", name if name == 'molecule': if len(self.current_numbers) > 0: self.current_coordinates = np.array(self.current_coordinates)*angstrom molecule = Molecule(self.current_numbers, self.current_coordinates, self.current_title) molecule.extra = self.current_extra molecule.atoms_extra = self.current_atoms_extra name_to_index = {} for counter, name in enumerate(self.current_atom_names): name_to_index[name] = counter edges = set() current_bonds_extra = {} for name1, name2, extra in self.current_bonds: i1 = name_to_index.get(name1) i2 = name_to_index.get(name2) if i1 is not None and i2 is not None: edge = frozenset([i1, i2]) if len(extra) > 0: current_bonds_extra[edge] = extra edges.add(edge) molecule.bonds_extra = current_bonds_extra if len(edges) == 0: molecule.graph = None else: molecule.graph = MolecularGraph(edges, self.current_numbers) del self.current_atom_names del self.current_bonds self.molecules.append(molecule) self.current_title = None
def collect_molecules(self, parent, universe=None): Atom = context.application.plugins.get_node("Atom") Bond = context.application.plugins.get_node("Bond") Frame = context.application.plugins.get_node("Frame") if universe == None: universe = parent atom_to_index = {} atoms_extra = {} counter = 0 numbers = [] coordinates = [] for child in parent.children: if isinstance(child, Atom): atom_to_index[child] = counter if len(child.extra) > 0: atoms_extra[counter] = child.extra counter += 1 numbers.append(child.number) coordinates.append(child.get_frame_relative_to(universe).t) if len(numbers) > 0: molecule = Molecule(numbers, coordinates, parent.name) molecule.extra = parent.extra molecule.atoms_extra = atoms_extra molecule.bonds_extra = {} pairs = set([]) for child in parent.children: if isinstance(child, Bond): atoms = child.get_targets() pair = frozenset([atom_to_index[atoms[0]], atom_to_index[atoms[1]]]) if len(child.extra) > 0: molecule.bonds_extra[pair] = child.extra pairs.add(pair) if len(pairs) > 0: molecule.graph = MolecularGraph(pairs, molecule.numbers) else: molecule.graph = None result = [molecule] else: result = [] for child in parent.children: if isinstance(child, Frame): result.extend(self.collect_molecules(child, universe)) return result