public void SetTrajectory(PrimaryStructureTrajectory trajectory) { this.PrimaryStructureTrajectory = trajectory; this.secondaryStructureTrajectory = new SecondaryStructureTrajectory(PrimaryStructure, trajectory, Settings.StrideExecutablePath, Settings.TmpFilePath); }
public IEnumerator Render(int meshQuality) { // if currently rendering, then store render request if (rendering) { awaitingMeshQuality = meshQuality; awaitingRender = true; yield break; } rendering = true; System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch(); watch.Start(); // primary structure render PrimaryStructureFrame frame = null; if (PrimaryStructureTrajectory != null && frameNumber != null) { frame = PrimaryStructureTrajectory.GetFrame((int)frameNumber); } // We use a clone of the render settings so any settings updates dont interfere with the builds MoleculeRenderSettings renderSettingsClone = renderSettings.Clone(); yield return(StartCoroutine(primaryStructureRenderer.RenderStructure(renderSettingsClone, frame, meshQuality))); // secondary structure render SecondaryStructure secondaryStructureToBuild = null; if (secondaryStructureTrajectory != null && frameNumber != null && buildSecondaryStructureTrajectory) { string loadException = null; Thread thread = new Thread(() => { try { secondaryStructureToBuild = secondaryStructureTrajectory.GetStructure((int)frameNumber); } catch (FileParseException ex) { loadException = ex.Message; } }); thread.Start(); while (thread.IsAlive) { yield return(null); } if (loadException != null) { MoleculeEvents.RaiseShowMessage(loadException + " - Aborting trajectory secondary structure builds.", true); buildSecondaryStructureTrajectory = false; } } else { secondaryStructureToBuild = secondaryStructure; } yield return(StartCoroutine(secondaryStructureRenderer.RenderStructure(renderSettingsClone, frame, secondaryStructureToBuild))); primaryStructureRenderer.ShowStructure(); secondaryStructureRenderer.ShowStructure(); // simulation box render if (renderSettingsClone.ShowSimulationBox) { moleculeBox.gameObject.SetActive(true); BoundingBox box = boundingBox; if (renderSettingsClone.CalculateBoxEveryFrame && frame != null) { box = new BoundingBox(frame, true); } moleculeBox.Build(box); } else { moleculeBox.gameObject.SetActive(false); } //Cleanup.ForeceGC(); rendering = false; watch.Stop(); if (Settings.DebugMessages) { //console.BannerBuildTime = watch.ElapsedMilliseconds.ToString(); } //UnityEngine.Debug.Log("Ending model build. Elapsed time [" + watch.ElapsedMilliseconds.ToString() + "]"); yield break; }
// Loads a molecule trajectory. Will only work if molecule is already loaded public IEnumerator LoadMoleculeTrajectory(int moleculeID, string filePath) { if (!molecules.ContainsKey(moleculeID)) { MoleculeEvents.RaiseShowMessage("Can't load molecule trajectory. No molecule found.", true); yield break; } if (loadingTrajectory) { MoleculeEvents.RaiseShowMessage("Can't Load Trajectory: another trajectory currently loading", true); yield break; } PrimaryStructure primaryStructure = molecules[moleculeID].PrimaryStructure; int atomCount = loadTrajectoryAtomCount(filePath); if (atomCount != primaryStructure.AtomCount()) { MoleculeEvents.RaiseShowMessage("Trajectory atom count [" + atomCount + " doesn't match loaded structure atom count [" + primaryStructure.AtomCount() + "]", true); yield break; } MoleculeEvents.RaiseShowMessage("Loading trajectory. Please wait", false); loadingTrajectory = true; PrimaryStructureTrajectory trajectory = null; string loadException = null; Thread thread = new Thread(() => { try { int startFrame = 0; int frameFrequency = 1; int frameCount = Settings.MaxTrajectoryFrames; if (filePath.EndsWith(".xtc")) { trajectory = XTCTrajectoryParser.GetTrajectory(filePath, startFrame, frameCount, frameFrequency); } else if (filePath.EndsWith(".dcd")) { trajectory = DCDTrajectoryParser.GetTrajectory(filePath, startFrame, frameCount, frameFrequency); } else if (filePath.EndsWith(".gro")) { trajectory = GROTrajectoryParser.GetTrajectory(filePath, startFrame, frameCount, frameFrequency); } } catch (FileParseException ex) { loadException = ex.Message; } }); thread.Start(); while (thread.IsAlive) { yield return(null); } if (loadException != null) { MoleculeEvents.RaiseShowMessage("Error Loading Trajectory File: " + loadException, true); loadingTrajectory = false; yield break; } if (trajectory != null) { molecules[moleculeID].SetTrajectory(trajectory); MoleculeEvents.RaiseTrajectoryLoaded(moleculeID, filePath, trajectory.FrameCount()); } loadingTrajectory = false; }