【WPF C#】PorphyStruct类卟啉和类咕啉的结构分析

前言

    首先,热烈祝贺家姐申请到了国家自然科学基金(8月底),找一些化学领域的程序和软件,助我姐一臂之力,顺便自己研究一下源码。

卟啉类化合物的结构分析

PorphyStruct,一种用于分析不同卟啉类非平面畸变模式的新型数字工具 - 该程序利用法向坐标结构分解技术 (NSD),并采用与为卟啉建立的等效的法向模式组来描述定量地计算来自corroles、norcorroles、porphycenes 和其他卟啉类化合物的周边原子的面外位错模式,并与已建立的术语进行类比。

87b7152b931473843204d0ede3433065.png

e6c0ad85d78b8dabe0181d6e0db9f174.png

79735d3d7cc1e6d04bce2dfcaeb35758.png

2460b270b5c8af8a5ad654076ff0f140.png

结语

      业余时间对于机器学习及其在化学领域的应用研究也该提上日程了。对机器学习的研究也为将来将其应用到工业领域各个方面做好准备。

f0fbf25125c0e6e2de8db3f4346056bb.png

87c96f81839bccd3a7ffd20dd73b046a.png

5a20377060201de4c4ffd46069c2d55e.png

附-程序主界面交互逻辑:

using System.Diagnostics;
using System.Reflection;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Navigation;
using ChemSharp.Mathematics;
using ChemSharp.Molecules.HelixToolkit;
using HelixToolkit.Wpf;
using Microsoft.Win32;
using PorphyStruct.Core;
using PorphyStruct.ViewModel;
using PorphyStruct.ViewModel.IO;
using ThemeCommons.Controls;
using MacrocycleViewModel = PorphyStruct.ViewModel.Windows.MacrocycleViewModel;namespace PorphyStruct.WPF;/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : DefaultWindow//MainWindow` 类包含了主窗口的各种操作和事件处理方法,用于管理应用程序的主要功能,包括打开文件、分析数据、保存结果、查看统计信息等
{public MacrocycleViewModel ViewModel { get; private set; }/// <summary>/// Should not be null!/// </summary>public static string Version => Assembly.GetEntryAssembly()!.GetCustomAttribute<AssemblyInformationalVersionAttribute>()!.InformationalVersion!;public MainWindow(){Settings.Instance.Load();// 加载应用程序设置Atom3D.SelectionColor = Brushes.Fuchsia;// 设置选中的原子颜色InitializeComponent();// 初始化主窗口CheckUpdate(); // 检查更新}/// <summary>/// Checks for new Versions on Startup在启动时检查新版本/// </summary>private async void CheckUpdate(bool force = false){if (!Settings.Instance.AutoUpdate && !force) return;// 如果禁用自动更新或不强制更新,直接返回(Updater u, bool current) = await Updater.CreateAsync(); // 创建 Updater 实例来检查更新if (!current) UpdateMsg.Visibility = Visibility.Visible;// 如果不是最新版本,显示更新消息else if (force) MessageBox.Show($"You already have the latest Version of PorphyStruct ({u.Latest})");// 如果是强制更新,显示已经是最新版本的消息if (!current && force){// 如果不是最新版本且需要强制更新,打开浏览器到最新版本的下载页面Process.Start(new ProcessStartInfo("http://github.com/jenskrumsieck/porphystruct/releases/latest") { UseShellExecute = true });UpdateMsg.Visibility = Visibility.Collapsed;}}/// <summary>/// Handles Atom selection// 处理鼠标左键点击 3D 视图中的原子选择/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Viewport3D_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e){var hits = Viewport3D.Viewport.FindHits(e.GetPosition(Viewport3D));foreach (var hit in hits.OrderBy(s => s.Distance)){if (hit.Visual.GetType() != typeof(Atom3D)) continue;var av3d = hit.Visual as Atom3D;if (av3d != null) ViewModel.SelectedAtom = av3d.Atom;}}/// <summary>/// Drag and Drop Handler// 处理拖放文件到窗口的操作/// </summary>/// <param name="sender"></param>/// <param name="e"></param>/// <exception cref="InvalidOperationException"></exception>private void OnFileDrop(object sender, DragEventArgs e){if (!e.Data.GetDataPresent(DataFormats.FileDrop)) return;var files = (string[])e.Data.GetData(DataFormats.FileDrop, false);OpenFile((files ?? throw new InvalidOperationException()).First());}/// <summary>/// Handles open File Dialog/ 处理打开文件对话框的操作/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Open_OnClick(object sender, RoutedEventArgs e){var path = string.IsNullOrEmpty(Settings.Instance.DefaultImportPath)? Environment.GetFolderPath(Environment.SpecialFolder.Desktop)//Environment.SpecialFolder.Desktop: Settings.Instance.DefaultImportPath;var ofd = new OpenFileDialog{InitialDirectory = "V:\\learn\\chem\\tests-data-master\\data",//pathFilter = Constants.OpenFileFilter,Multiselect = false};if (ofd.ShowDialog(this) != true) return;OpenFile(ofd.FileName);}/// <summary>/// Handles actual file opening// 处理实际的文件打开操作/// </summary>/// <param name="path"></param>internal void OpenFile(string path){DataContext = ViewModel = new MacrocycleViewModel(path);ViewModel.SelectedIndexChanged += ViewModelOnSelectedIndexChanged;Viewport3D.CameraController.CameraTarget =MathV.Centroid(ViewModel.Macrocycle.Atoms.Select(s => s.Location).ToList()).ToPoint3D();Activate();}// 处理选中索引更改事件private void ViewModelOnSelectedIndexChanged(object? sender, EventArgs e){if (ViewModel?.SelectedItem != null)Viewport3D.CameraController.CameraTarget =MathV.Centroid(ViewModel.SelectedItem.Analysis.Atoms.Select(s => s.Location)).ToPoint3D();// 设置相机目标到选中的分析对象MainTabMenu.Focus();// 焦点切换到主选项卡菜单}// 准备分析操作private async Task PrepareAnalysis(){//Block UI interaction during this// 阻止在此期间的用户界面交互MainGrid.IsEnabled = false;TitleGrid.IsEnabled = false;AnalyzePopup.IsOpen = false;await ViewModel.Analyze();// 调用分析操作MainGrid.IsEnabled = true;TitleGrid.IsEnabled = true;}// 处理分析按钮的点击事件private async void Analyze_OnClick(object sender, RoutedEventArgs e){Settings.Instance.UseExtendedBasis = false;await PrepareAnalysis();}// 处理扩展分析按钮的点击事件private async void AnalyzeExt_OnClick(object sender, RoutedEventArgs e){Settings.Instance.UseExtendedBasis = true;await PrepareAnalysis();}// 处理旋转按钮的点击事件   对当前选定的项目或数据执行旋转操作。具体的旋转操作可能包括旋转、缩放或平移等,这取决于项目或数据的类型和应用的功能private void Rotate_OnClick(object sender, RoutedEventArgs e) => ViewModel.SelectedItem.Rotate();// 处理保存按钮的点击事件   在用户点击保存按钮时,打开一个保存窗口,允许用户选择保存选定的项目或数据的位置和文件名private void Save_OnClick(object sender, RoutedEventArgs e){var sw = new SaveWindow(ViewModel.SelectedItem);sw.ShowDialog();}// 处理 URL 链接点击事件   允许用户点击一个URL链接后,在默认的Web浏览器中打开该链接,以便用户可以访问相关的在线资源或链接private void URL_OnClicked(object sender, RequestNavigateEventArgs e) =>Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri) { UseShellExecute = true });// 处理信息按钮的点击事件  在用户点击信息按钮时,显示或隐藏一个信息弹出窗口,以便用户可以查看额外的信息或说明private void Info_OnClick(object sender, RoutedEventArgs e) => TogglePopup(InfoPopup);// 处理追加按钮的点击事件/*这段代码的作用是允许用户添加新的比较数据。它首先从 `AppendedData` 中获取用户选择的数据,* 然后将不再需要的比较数据从列表中移除,接着将用户选择的本地数据添加到比较数据中,* 最后准备新的比较数据并切换比较弹出窗口的可见性,以便用户查看比较结果*/private void Append_OnClick(object sender, RoutedEventArgs e){var path = string.IsNullOrEmpty(Settings.Instance.DefaultImportPath)? Environment.GetFolderPath(Environment.SpecialFolder.Desktop): Settings.Instance.DefaultImportPath;var ofd = new OpenFileDialog{InitialDirectory = path,Filter = Constants.CompareFileFilter,Multiselect = false};if (ofd.ShowDialog(this) != true) return;var data = new CompareData(ofd.FileName);ViewModel.SelectedItem.CompareData.Add(data);AppendedData.SelectedItems.Add(data);}// 处理比较追加按钮的点击事件private void CompareAdd_OnClick(object sender, RoutedEventArgs e){var appendedData = AppendedData.SelectedItems.Cast<CompareData>().ToList();var remove = ViewModel.SelectedItem.CompareData.Except(appendedData);foreach (var item in remove) ViewModel.SelectedItem.CompareData.Remove(item);//将不包含在 `appendedData` 中的项添加到 `remove` 列表中。var localData = LocalData.SelectedItems.Cast<AnalysisViewModel>();//一个 `AnalysisViewModel` 类型的列表,它表示用户从本地数据中选择的项。foreach (var item in localData)// 对于每个 `localData` 中的项,创建一个新的 `CompareData`,并将其添加到 `ViewModel.SelectedItem.CompareData` 中ViewModel.SelectedItem.CompareData.Add(new CompareData(item.Title, item.Analysis.DataPoints.ToList()));ViewModel.SelectedItem.PrepareCompare();//准备比较数据,可能会重新计算一些比较数据。TogglePopup(ComparePopUp);//切换比较弹出窗口的可见性}// 处理比较按钮的点击事件  在用户点击比较按钮时,清除之前的比较数据并重新准备新的比较数据,然后切换比较弹出窗口的可见性,以便用户查看比较结果。private void Compare_OnClick(object sender, RoutedEventArgs e){ViewModel.SelectedItem.CompareData.Clear();//清除已存储的比较数据ViewModel.SelectedItem.PrepareCompare();//准备比较数据,可能会重新计算一些比较数据。TogglePopup(ComparePopUp);//切换比较弹出窗口的可见性,如果当前是可见的,则隐藏它;如果当前是隐藏的,则显示它。}// 切换弹出窗口的可见性private static void TogglePopup(UIElement sender) => sender.Visibility =sender.Visibility == Visibility.Collapsed ? Visibility.Visible : Visibility.Collapsed;// 处理设置按钮的点击事件private void Settings_OnClick(object sender, RoutedEventArgs e) => new SettingsWindow().ShowDialog();// 处理统计信息按钮的点击事件private void Stats_OnClick(object sender, RoutedEventArgs e) => new StatisticsWindow().Show();// 处理批处理按钮的点击事件private void Batch_OnClick(object sender, RoutedEventArgs e) => new BatchWindow().Show();// 处理隔离按钮的点击事件private void Isolation_OnClick(object sender, RoutedEventArgs e) => new IsolationWindow(this).ShowDialog();/// <summary>/// Shows Analyze Popup显示分析弹出窗口/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void AnalyzeBtn_Click(object sender, RoutedEventArgs e) => AnalyzePopup.IsOpen = true;// 处理更新按钮的点击事件private void Update_Click(object sender, RoutedEventArgs e) => CheckUpdate(true);
}

参考源码:

https://github.com/JensKrumsieck/PorphyStruct 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/100471.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ac7260网卡不能连5g

之前路由器是双频&#xff0c;最近为了连物联网一堆&#xff0c;把双频拆成两个wifi 结果电脑上装的pdd网卡就罢工了&#xff0c;连4g可以&#xff0c;但是连5g网络就不行&#xff0c;连上却没网&#xff0c;导致网盘下东西慢。刚开始以为是tplink的易展问题&#xff0c;结果看…

【继RNN之后的一项技术】Transfomer 学习笔记

谷歌团队在17年的神作&#xff0c;论文17年6月发布 https://arxiv.org/abs/1706.03762 被NIPS2017收录&#xff0c;目前引用量已经逼近3w。 以下内容参考李沐老师的课程《动⼿学深度学习(Pytorch版)》 简介 注意力 自主性&#xff1a;有目的的搜索某样东西&#xff08;键&…

CSS中如何实现文字描边效果(Text Stroke)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 文字描边效果&#xff08;Text Stroke&#xff09;⭐ 示例⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个…

肖sir__设计测试用例方法之判定表06_(黑盒测试)

设计测试用例方法之判定表 1、判定表&#xff1a;是一种表达逻辑判断的工具。 2、判定表&#xff1a;包含四部分 1&#xff09;条件桩&#xff08;condition stub&#xff09;:列出问题的 所有条件&#xff08;通常条件次序无关紧要&#xff09;。 2&#xff09;条件项&#x…

【数学建模竞赛】优化类赛题常用算法解析

优化类建模 问题理解和建模&#xff1a;首先&#xff0c;需要深入理解问题&#xff0c;并将问题抽象为数学模型。这包括确定问题的目标函数、约束条件和决策变量。 模型分析和求解方法选择&#xff1a;对建立的数学模型进行分析&#xff0c;可以使用数学工具和方法&#xff0c;…

【STM32】学习笔记(串口通信)

串口通信 通信接口硬件电路电平标准USARTUSART框图 通信接口 串口是一种应用十分广泛的通讯接口&#xff0c;串口成本低、容易使用、通信线路简单&#xff0c;可实现两个设备的互相通信 单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信&#…

【Linux从入门到精通】通信 | 管道通信(匿名管道 命名管道)

本派你文章主要是对进程通信进行详解。主要内容是介绍 为什么通信、怎么进行通信。其中本篇文章主要讲解的是管道通信。希望本篇文章会对你有所帮助。 文章目录 一、进程通信简单介绍 1、1 什么是进程通信 1、2 为什么要进行通信 1、3 进程通信的方式 二、匿名管道 2、1 什么是…

LeetCode刷题笔记【25】:贪心算法专题-3(K次取反后最大化的数组和、加油站、分发糖果)

文章目录 前置知识1005.K次取反后最大化的数组和题目描述分情况讨论贪心算法 134. 加油站题目描述暴力解法贪心算法 135. 分发糖果题目描述暴力解法贪心算法 总结 前置知识 参考前文 参考文章&#xff1a; LeetCode刷题笔记【23】&#xff1a;贪心算法专题-1&#xff08;分发饼…

List常见面试问题

List的特点有哪些&#xff1f; Java中的List是一种存放有序的、可以重复的数据的集合&#xff0c;它允许重复元素的存在。List中的元素都有对应的一个序列号(索引)记录着元素的位置&#xff0c;因此可以通过这个序列号来访问元素。 ‍ Java中集合有哪些&#xff1f; Java中…

风辞远的科技茶屋:来自未来的信号枪

很久之前&#xff0c;有位朋友问我&#xff0c;现在科技资讯这么发达了&#xff0c;你们还写啊写做什么呢&#xff1f; 我是这么看的。最终能够凝结为资讯的那个新闻点&#xff0c;其实是一系列事情最终得出的结果&#xff0c;而这个结果又会带来更多新的结果。其中这些“得出”…

算法通过村第五关-队列和Hash黄金笔记|LRU的设计与实现

文章目录 前言1. LRU的含义2. Hash双向链表实现LRU总结 前言 提示&#xff1a;我曾如此渴望命运的波澜&#xff0c;到最后才发现&#xff1a;人生最曼妙的风景&#xff0c;竟是内心的淡定从容。 我们层如此盼望世界的认可&#xff0c;到最后才知道&#xff1a;世界是自己&#…

罕见病 对称性脂肪瘤(MSL) 马德龙病

如果你体内脂肪瘤分布大致如下 而且个数不断增多 这篇文章适合你 症状 脂肪瘤个数一直增加 而且很对称 比如: 左手臂一个 右手臂一个 别名 多发性对称性脂肪增多症 Multiple symmetric lipomatosis (MSL) 多发性对称性脂肪瘤&#xff08;MSL&#xff09; 脂肪瘤 马德龙病(…