void Start() { List <Atom> atoms; List <List <int> > connections; string model_name; try { model_name = ParseInputModelFile(); PDBParser.ParseAtomsAndConnections(@"Assets/MModels/" + model_name, out atoms, out connections); } catch (System.IO.IOException) { print("Parsing input error"); return; } /* Spawn the objects */ foreach (Atom atom in atoms) { /* Units in Nano meters */ Vector3 atom_position = new Vector3(atom.x_, atom.y_, atom.z_); atoms_bounding_box_.AddPoint(atom_position); /* Instantiate the atom */ GameObject temp = Instantiate(prefab_atom, atom_position, Quaternion.identity); temp.transform.parent = transform; temp.isStatic = this.gameObject.isStatic; /* Find ISphere component, and set the atom information */ ISphere isphere = temp.GetComponent <ISphere>(); isphere.atom_ = atom; ispheres_.Add(isphere); /* Insert to the dictionaries used */ InsertToAtomsDictionary(isphere); InsertToResiudesDictionary(isphere); InsertToChainsDictionary(isphere); } /* Parse connections, currently the application does not do something with these connections */ foreach (List <int> c in connections) { int atom_id = c[0]; for (int i = 1; i < c.Count; i++) { ISphere connection_isphere = ispheres_[c[i]]; ispheres_[atom_id].connections_.Add(connection_isphere); } } /* Spawn bonds */ Transform bonds_transform = transform.GetChild(0); int bonds = 0; /* For all resisudes */ foreach (KeyValuePair <int, List <ISphere> > value in residue_dictionary) { /* Get combinations of two atoms */ List <ISphere> resiude_atoms = value.Value; for (int ia = 0; ia < resiude_atoms.Count; ia++) { ISphere a = resiude_atoms[ia]; Vector3 a_position = a.transform.position; float a_covalent_radius = AtomicRadii.GetCovalentRadius(a.atom_.element_); for (int ib = 0; ib < resiude_atoms.Count; ib++) { if (!(ia > ib)) { continue; } ISphere b = resiude_atoms[ib]; Vector3 b_position = b.transform.position; float b_covalent_radius = AtomicRadii.radii_covalent[b.atom_.element_]; /* If their distance is smaller then the sume of radius + plus a bias, then spawn a bond */ float distance = Vector3.Distance(a_position, b_position); if (distance <= a_covalent_radius + b_covalent_radius + 0.015) { bonds++; GameObject temp = Instantiate(prefab_bond, a_position, Quaternion.identity); temp.transform.parent = bonds_transform; temp.isStatic = this.gameObject.isStatic; /* Rotate it accordingly */ Vector3 direction = b_position - a_position; Quaternion toRotation = Quaternion.FromToRotation(new Vector3(0, 1, 0), direction); temp.transform.rotation = toRotation; /* Set size and radius */ ICylinder icylinder = temp.GetComponent <ICylinder>(); icylinder.radius_ = AtomicRadii.ball_and_stick_bond_radius; icylinder.height_ = distance; } } } } Debug.Log("Spawned: " + bonds + " bonds"); /* Position the model and the camera in the world */ SetCameraAndPanelBoxPosition(atoms_bounding_box_); bonds_selected_[0] = null; bonds_selected_[1] = null; /* Set some default info on the world panel */ SELECTION_MODE_SPHERE_RADIUS = AtomicRadii.ball_and_stick_radius * 5.0f; transform.GetChild(1).GetComponent <ModePanel>().SetRadius(SELECTION_MODE_SPHERE_RADIUS); info_ui_ = Camera.main.transform.Find("AtomInfoBox").GetComponent <AtomInfoBox>(); }
// Start is called before the first frame update void Start() { List <Atom> atoms; List <List <int> > connections; PDBParser.ParseAtomsAndConnections(@"Assets/MModels/1tes.pdb", out atoms, out connections); //PDBParser.ParseAtomsAndConnections(@"Assets/MModels/4f0h.pdb", out atoms, out connections); //PDBParser.ParseAtomsAndConnections(@"Assets/MModels/1s5l.pdb", out atoms, out connections); //PDBParser.ParseAtomsAndConnections(@"Assets/MModels/1ea4.pdb", out atoms, out connections); Bounds atoms_bounding_box = new Bounds(); foreach (Atom atom in atoms) { /* Units in Nano meters */ Vector3 atom_position = new Vector3(atom.x_, atom.y_, atom.z_); atoms_bounding_box.Encapsulate(atom_position); /* Instantiate the object */ GameObject temp = Instantiate(prefab_atom, atom_position, Quaternion.identity); temp.transform.parent = transform; temp.isStatic = this.gameObject.isStatic; InsertToResiudesDictionary(atom, temp); } Transform bonds_transform = transform.GetChild(0); int bonds = 0; foreach (KeyValuePair <int, List <Tuple <GameObject, Atom> > > value in residue_dictionary) { List <Tuple <GameObject, Atom> > resiude_atoms = value.Value; for (int ia = 0; ia < resiude_atoms.Count; ia++) { GameObject a = resiude_atoms[ia].Item1; Vector3 a_position = a.transform.position; float a_covalent_radius = AtomicRadii.GetCovalentRadius(resiude_atoms[ia].Item2.element_); for (int ib = 0; ib < resiude_atoms.Count; ib++) { if (!(ia > ib)) { continue; } GameObject b = resiude_atoms[ib].Item1; Vector3 b_position = b.transform.position; float b_covalent_radius = AtomicRadii.radii_covalent[resiude_atoms[ib].Item2.element_]; float distance = Vector3.Distance(a_position, b_position); if (distance <= a_covalent_radius + b_covalent_radius + 0.015) { bonds++; GameObject temp = Instantiate(prefab_bond, a_position, Quaternion.identity); temp.transform.parent = bonds_transform; temp.isStatic = this.gameObject.isStatic; Vector3 direction = b_position - a_position; Quaternion toRotation = Quaternion.FromToRotation(new Vector3(0, 1, 0), direction); temp.transform.rotation = toRotation; ICylinderBench icylinder = temp.GetComponent <ICylinderBench>(); if (icylinder != null) { icylinder.radius_ = AtomicRadii.ball_and_stick_bond_radius; icylinder.height_ = distance; } else { temp.transform.localScale = new Vector3(0.5f, 0.5f * distance, 0.5f); } } } } } Debug.Log("Spawned: " + bonds + " bonds"); }