精华内容
下载资源
问答
  • 化学中的包含关系
    千次阅读
    2017-10-20 17:44:58
    1、模糊查询
    SELECT
    *
    FROM
    ct_tool_platform t
    WHERE
    t.platform LIKE('%windows%')


    2、mysql自带模糊查询
    SELECT
    *
    FROM
    ct_tool_platform
    WHERE
    locate("Windows",platform)
    3、只适用于字段间用逗号分隔
    find_in_set('aa@email.com', emails);
    更多相关内容
  • 化学方程式描述了化学React发生的事情。 该方程式标识了React物(起始原料)和产物(最终物质),参与者的公式,参与者的相(固体,液体,气体)以及每种物质的量。 平衡化学方程式是指建立React物和产物数量之间...
  • 类型变体的对称关系 ReO3 类型变体的对称关系 Oliver Bock 和 Ulrich Müller * Marburg,大学化学系 2001 年 11 月 28 日在编辑部收到65 岁生日目录。 ReO3 结构类型的变体之间的关系通过其空间群之间的群-子群...
  • 为了调查食品尤其是包含复合香气的食品(如葡萄酒和酒精饮料等)的气味活性化合物的构成机理,提出了一种将LDA模型应用于红酒气味与化学分子关系挖掘的方法。该方法在红酒风味数据集上,将红酒看作文档,气味和...
  • 使用扫描电子显微镜(SEM),能量色散谱仪(EDS),X射线衍射(XRD)测量,透射率研究了CdSe纳米晶体薄膜的结构和光学性质与前驱体Selenium代硫酸钠浓度或氨气浓度的函数关系。电子显微镜(TEM)和紫外可见分光...
  • 为此,采用了包含流场化学场、光场和热结构计算模块的全耦合仿真平台,数值解析了在不同流场条件下的出光性能,重点分析了内流场不同方向上激波对近场输出光斑的影响及相互关系,从而确定了相关气动部件的优化设计...
  • 全世界只有3.14 % 的人关注了数据与算法之美前段时间,我带侄子上了一堂化学课,回来之后,他一直意犹未尽找我的聊化学的事,期间他也问了身为数学专业的我一个交叉问题:叔,...

    全世界只有3.14 % 的人关注了

    数据与算法之美


    640?wx_fmt=png前段时间,我带侄子上了一堂化学课,回来之后,他一直意犹未尽找我的聊化学的事,期间他也问了身为数学专业的我一个交叉问题:


    叔,数学化学有啥关系?


    那堂超有趣的实验课  

    640?wx_fmt=jpeg


    640?wx_fmt=png作为一个资深的数学界十八线网红,这种问题我可是回答过很多次。

    首先,化学经常研究的是物质的结构及其相互之间的化合和分解,用「仪器观察、实验证实、实物核查」的方式记录证实这些客观物质规律。


    数学在其中就充当「工具」的作用,因为数学是所有东西数量和形式方面的概括,它能客观反应世界的变化规律。


    640?wx_fmt=png这要怎么说,让我们回顾一下一道 N 年前的化学高考题:


    640?wx_fmt=png


    640?wx_fmt=png这道题的第四问,研究化学分子的结构模型,基本上是一个数学问题。用数学的方式表达C60和C70的之间的结构关系。


    问:为什么C60和C70中会有五边形和六边形?



    640?wx_fmt=png答:因为他们长得像足球。



    640?wx_fmt=png


    问:这道题怎么做?


    首先,因为顶点数为70(C70中70的意思为顶点数),而每个顶点都连接着三条棱,又因为每条棱与两个顶点相连接,棱数将被重复计算一次,必须再除以2,所以可以算棱数:


    640?wx_fmt=png


    然后,从面与棱的关系来考虑C70的棱数。设 x 个五边形面,y 个六边形面。又因为一个五边形有5条边(棱),一个六边形有6条边(棱),并且一条棱被两个面(五边形与六边形,或两个六边形)共用,所以可得未知数 x 和 y 关于棱数表达式:


    640?wx_fmt=png


    两个未知数,需要两个方程,又因为题目中说C70与C60一样,顶点数、面数和棱(边)数遵循欧拉定理。这里的欧拉定理就是指由欧拉发现的诸多以欧拉命名的公式或定理中的一个,即”简单多面体的欧拉示性数等于2“,用公式表示就是:


    640?wx_fmt=png


    其中V表示顶点数(来自英文Vertical,顶点的意思);E表示棱数(来自英文Edge,边界、边缘或棱的意思);F表示面数(来自英文Face,表面、脸面的意思)。因此可得:


    640?wx_fmt=png


    化简得

    640?wx_fmt=png


    (上式说明了共有37个面)解方程组:


    640?wx_fmt=png



    640?wx_fmt=png


    640?wx_fmt=png答:即C70有12个五边形和25个六边形。


    640?wx_fmt=png回答完的这个化学问题,真的感觉数学很强大啊!


    而后我开始思考,侄子他为什么要问我这个问题?


    难道是因为课堂气氛轻松,实验视觉效果震撼,而且可以通过摸、闻、听来感受化学,并且上课时,老师还鼓励小朋友与家长一起动手做实验,加强孩子和爸妈的互动?


    我觉得可能是,在孩子 3~12 岁这个充满天马行空的想象力创造力的年纪,这也许已经激起了他们对「未知世界的探索欲」以及「科学常识的求知欲」。


    课堂中介绍氮气  

    640?wx_fmt=jpeg


    他们这个年纪想象力丰富、思维发散、跳跃,他们相信自己“看到的”、脑袋里想象的。趁这个年龄感受一下科学的趣味性,看到一个包含科学的世界。


    所以,在卢sir亲身体验完后这堂课后,觉得应该要把这个科学实验课堂推荐给你们的孩子,让他们感受不一样的化学,不一样的科学。


    课堂实验  

    640?wx_fmt=jpeg


    640?wx_fmt=png下面赶快来看一下,到底卢sir会推荐给你们一款怎样的实验课程吧。



        实验课堂介绍    


    640?wx_fmt=png《冰火奇遇记》这个课堂一共分为3个部分,分别是「冰火介绍、冰火奇遇、科学小实验」。而这堂科学课堂到底是怎么样的?又能学到什么?请看图:


    640?wx_fmt=png


    在整个课堂中,主要是让孩子在最轻松自由的环境中学习,共同探讨科学的奥妙,用最直观有趣的方式学习枯燥的科学原理,用最生动活泼的科学实验提升小朋友的观察探索能力 。


    640?wx_fmt=jpeg总的来说,就是好玩、有趣、学科学。



    PART 1  冰火介绍:可以触摸的奇幻科学秀


    氮气,空气中占比最多的气体,在这一环节中,我们通过不一样的方式感受他们的存在。

    640?wx_fmt=jpeg

    孩子们尽情享受液氮气体的美容澡!


    “火焰掌”,重头戏登场,独门秘技!能在手上燃烧的火!

    640?wx_fmt=png

    课堂科学实验:火焰掌



    PART 2 冰火相遇


    这个环节中,冰火将相遇,在这一场中冰火的激烈碰撞,全场大爆炸,让我们一起感受不一样的冬天!

    640?wx_fmt=jpeg


    全场烟雾弥漫,突变仙宫…

    640?wx_fmt=jpeg



    PART 3 动手实验‘玩’科学


    在这个环节,我们把那些生硬的科学名词变成一个个有趣又好玩的“游戏”。比如:


    - 把「吸水膨胀」变成「人工造雪」

    - 把「分子扩散」变成了「牛奶开花,水上作画」

    - 把「化学反应」变成「火山爆发」


    人工造雪

    640?


    广州冬天不下雪,怎么自己进行“造雪”?


    这个实验很容易就把孩子开心坏了,而且实验中用到的材料是一种面粉和果酱增稠剂,它吸水后变成一种白色蓬松的物质,看起来像真雪一样。


    牛奶开花

    640?


    在牛奶上滴上色素,在色素上滴上洗涤灵,彩色就会荡漾开去,这样就可以和宝宝一起在牛奶上做一副神奇的画作。

    640?wx_fmt=jpeg


    火山爆发

    640?wx_fmt=jpeg

    酸碱中和产生气体,造成火山喷发现象。


    640?wx_fmt=png平时在周末,假期,爸妈都有一个难题带孩子去哪玩?逛商场,太累人!游乐园,人太多!博物馆,看不懂!


    而卢sir推荐的这一堂,专门为 3-12 岁孩子设计,集「科学性、 趣味性、普及性」于一体的一个轻学习场所,就给了你一个科学的选择。


    而且在这个相对轻松的环境,指导老师鼓励小朋友与家长一起动手做实验,也激发孩子们对「未知世界的探索欲」以及「科学常识的求知欲」,提升了孩子们的逻辑思维能力、自主探究能力、实践操作能力,更重要的是发挥了孩子们的「想象力和创造力」。



        活动详情   


    活动安全性保障


    实验中需要的材料多是家中常见物品,如「白醋、油、全脂牛奶、白糖、水等是配料,洗衣液、剃须泡沫」等,孩子本身就有所了解,不会出现误食、误用情况。


    比如实验中用到的色素,是食用色素,造雪粉,是一种用于面粉、果酱的增稠剂等。


    另外,我们还会给每位孩子都配备实验室工作服,安全防护,不怕弄脏衣服,而且增加了仪式感。



    活动详情


    适合年龄:3 ~ 12岁


    开课时间:

    2018年12月29日下午2点30分~下午4点(已报满)

    2018年12月30日下午2点30分~下午4点(已报满)

    2018年12月30日上午10点 ~上午11点30分


    集合时间:开课前10分钟


    活动地点:广州市越秀区西湖路18号广百新翼大厦2323(北京路步行街广百百货旁)


    招募人数:每期15个家庭(不足10个将取消,取消会提前通知并退款)


    交通方式:自驾或公共交通


    特别备注:本次活动仅限「广州」



    卢sir粉丝大优惠


    这堂科学课,原价158元,每个一大一小。


    卢sir推荐,首先为你们争取到了 10 元粉丝优惠券


    另外,团购活动,一次购买两份,邀请朋友孩子一起参加,每人再减10元。


    原价 158 元的科学实验课,只要 138 元可以购买到,相当于便宜了20块


    而且,我们和课程老师们对于课程内容,还进行了一步打磨,更加系统化,互动性更强,重点强化和巩固孩子们感兴趣的内容。


    趁着这次活动特惠,赶快带着你的孩子来体验这一场特别的奇幻科学实验课堂吧。


    活动费用说明


    活动费用:

    原价:158元/一大一小

    粉丝特惠:148元/一大一小

    团购优惠:276元/两大两大(相当于138元/小孩)


    费用包含:

    费用包含实验器材、DIY小实验、活动组织策划、师资、服装使用等(不含车费)


    退款说明:

    因个人原因,开课前7天以上可免费取消;

    因个人原因,开课前7天以内申请取消,将无法退款,可自行转让或延期;

    因不可抗因素,组织方取消活动,将全额退款。



       报名方式   


    点击下面的小程序即可报名640?wx_fmt=gif

    640?wx_fmt=png


    另外,关于报名和此次活动的一切问题都可以咨询咱们的Math老师。

    640?wx_fmt=jpeg


    640?wx_fmt=gif 点击“阅读原文"立即购买

    展开全文
  • 该墓于1980年在东南耶路撒冷的建筑作业发现,其中包含数个藏有耶稣家族名称的藏骨堂。 为了寻求有关这种关系的物理证据,我们调查了詹姆斯藏有古代骨库的内部数千年的沉积物的地球化学。 为了进行比较,我们类似...
  • 包含数百万个分子的可靠量子力学特性的精选数据集变得越来越可用。从这些数据集中获取化学知识的新型机器学习工具的开发具有革新化学发现过程的潜力。作者对这个新兴领域的最新突破发表评论,并讨论未来几年的挑战.....

    2020年8月17日发表在nature communications上的一篇关于"Machine learning for chemical discovery"评论的文章,通讯作者是卢森堡大学物理和材料科学系的Alexandre Tkatchenko教授。发现具有所需属性的化学物质是一个漫长而艰辛的过程。包含数百万个分子的可靠量子力学特性的精选数据集变得越来越可用。从这些数据集中获取化学知识的新型机器学习工具的开发具有革新化学发现过程的潜力。作者对这个新兴领域的最新突破发表评论,并讨论未来几年的挑战。

    迈向化学发现革命

    分子和材料的计算设计和发现依赖于对日益增长的化学空间的探索。新药、抗病毒药、抗生素、催化剂、电池材料,以及一般具有定制特性的化学品的发现和配制,都需要转变范式,在广阔的化学空间中进行未知的大片搜索 从量子力学(QM)的基本视角来看,这种范式的转变源于分子特性表现出复杂的相关性,在多特性优化算法中,可以得到候选分子的整个帕累托前沿,实现 "设计自由"。以10多万个类药物小分子的数据为例,发现它们的分子电子(最高占用分子轨道-最低未占用分子轨道)间隙与它们的极化性完全不相关,这与广泛引用的化学规则相反。这意味着有可能设计出高导电性和弱相互作用的分子,或者表现出稳定的介电击穿但又具有强相互作用的分子。

    显然,化学发现不仅涉及到寻找 "特殊的分子",而且还涉及到预测反应途径和分子之间的相互作用,优化催化条件,消除不受欢迎的副作用,以及其他许多重要的自由度。鉴于这种巨大的可能性空间,用统计学的观点来进行化学设计和发现是必须的。这也是目前应用于分子和材料科学的机器学习(ML)技术兴起的主要原因。目前的情况可以与20世纪80年代和90年代用于分子和材料建模的量子化学和固态电子结构代码的持续发展所取得的巨大进步相比较。稳步发展的更精确的量子力学近似和越来越高效的电子结构代码导致了 "化学建模革命"。同样,结合量子力学和统计力学的第一原理,并以越来越多的分子大数据为基础,开发新的ML方法,可能导致 "化学发现革命"。

    化学发现和ML必将共同发展,但实现它们之间的真正协同作用需要解决许多突出的挑战。利用ML提高分子模拟的准确性和效率的潜力已经毋庸置疑。数据驱动的高通量材料发现也已被确立为自己的领域。物理启发的ML算法可以识别新的候选药物,发现非晶材料中的新相,以基本精确的量子力进行分子动力学,并对化学环境提供前所未有的统计见解。到目前为止,这些应用大多是在理想化的条件下完成的。未来的工作应该集中在使分子模拟和ML方法更紧密的嵌入,通过ML算法结合QM和统计力学,开发共价和非共价分子相互作用的通用ML近似,并开发大型化学空间的定向探索算法。显然,所有这些进展都应该在不断增长的社区策划的微观和宏观分子特性数据集上进行持续评估。

    从分子大数据到化学发现

    任何科学领域的ML模型的质量和可靠性都取决于数据的不断增加。2010-2012年ML在分子和材料建模中的首次应用依赖于包含100-1000 QM系统特性的小数据集。物理学启发的ML模型和复杂的原子论描述符的发展是至关重要的,过去的8年中,ML模型的预测能力至少提高了两个数量级,这是一个令人难以置信的科学进步。如今,先进的ML模型能够通过仅从1%到2%的数据中学习来实现大分子数据集的QM特性的预测准确性。这样的数据效率和准确性对于计算机化学发现至关重要。

    最近,重点已转移到构建和探索越来越大的化学空间。诸如QM9 ,ANI-1x 和QM7-X 之类的数据集包含多达10的7次方个分子结构的QM属性,并能够基本完全覆盖小类药分子的化学空间。这些数据已被用于许多应用,如考证构建小分子的快速评估神经网络势能,开发改进的半经验量子方法,以及对分子量子特性划分为原子和碎片贡献的新见解。

    ML在分子建模中的另一个独特应用是ML驱动的分子动力学模拟。ML力场能够结合高层次QM的准确性与经典力场的效率。例如,梯度域ML力场可以对小分子进行MD模拟,对电子和原子核进行基本精确的量子处理。对于元素固体,高斯近似势(GAP)如今被用于对数千个原子的单位单元进行MD模拟,并获得对物质的非晶态等的新认识。

    化学空间的广泛探索和单分子的长时间MD模拟都是化学发现的有利工具。ML的另一个重要应用是具有目标特性的分子的逆合成设计。最终,ML还应该能够引导基于计算的新分子和材料发现,并通过实验数据来证实这些发现。事实上,在寻找有机发光二极管、氧化还原流电池和抗生素等许多例子中,已经成功地进行了ML驱动的发现。

    ML在化学发现中最显著的方面是,对化学空间的相应的统计学观点往往能够提出新的问题并获得新的见解。对大量化学空间的整体分析可以发现具有意想不到性质的分子,为新的化学反应机制提供提示,甚至提出新的物理化学关系。这种新的发现往往是由跨学科的研究团队做出的,他们能够协同结合他们的物理定律和专家知识,化学直觉和复杂的ML算法。

    化学发现的机器学习前景

    目前ML在化学发现方面的成功应用只是触及了可能性的表面。为了实现 "化学发现革命",还有许多概念上、理论上和实践上的挑战等待解决。在这里,作者讨论一下认为目前最紧迫、最有趣的挑战。

    通用ML方法应具有准确预测分子的能量和电子性质的能力。此外,这种方法应统一描述在相同基础上的组成和构型自由度。大多数现有的机器学习方法仅描述了相关自由度和理化观测值的有限子集。该领域的进一步进步要求针对各种系统和理化特性开发通用的ML模型  。

    从原子相互作用的角度来看,当前的ML表示法已成功地描述了局部化学键合,但它们完全错过了长距离静电,极化和范德华分散相互作用。分子间相互作用理论与ML的结合是研究复杂分子系统未来发展的重要方向。

    一个新的想法是将ML与近似哈密顿量相结合,以基于密度泛函理论、分子轨道技术或多体分散方法的电子相互作用。ML方法用于预测哈密顿参数,并通过相应哈密顿量的对角化来计算量子力学可观测值。挑战在于在ML和近似哈密顿量之间实现更紧密的集成,并在预测精度和计算效率之间找到适当的平衡。

    ML预测的验证最终需要与实验可观察到的进行比较,例如反应速率、光谱、溶剂化能、熔融温度以及其他相关参数。计算这些可观察物理量需要将QM、统计模拟和快速ML预测紧密集成,所有这些都集成在一个全面的分子模拟框架中。

    解决以上挑战将需要提出创新的跨学科方法,将量子和统计力学、化学知识和复杂的ML工具紧密结合在一起,并以不断增长的数据集为基础,这些数据集涵盖了广阔的化学领域,并且领域越来越广。

    参考资料

    Tkatchenko, A. Machine learning for chemical discovery. Nat Commun 11, 4125 (2020). 

    https://doi.org/10.1038/s41467-020-17844-8

    展开全文
  • 射线数据确定的结构包含以氮为中心的共享边缘锶八面体的波纹层。 层之间有倾斜的金链(Au-Au - 距离 3.04 Å;见图) Tab. 1 y 来自 X 射线数据的 Sr2AuN 原子参数:Cmcm; 4; 3.790 (1) 埃; b 19.005 (1)
  • SMILES化学式解析

    千次阅读 2019-01-16 13:41:23
    化学式,所有的元素(键信息在元素) package com . Demo2 ; import java . util . ArrayList ; public class ChemicalFormula { private ArrayList < ChemicalElement > Formula ; /** ...

    解析和匹配

    一,建立对象

    (一)键
    package com.Demo2;
    
    import java.util.ArrayList;
    
    public class ChemicalKey {
        //键的名称
        private String key;
        //键的指向的对象
        private ArrayList<ChemicalElement> chemicalElements;
        public static String[] allKeys;
        //构造函数
        public ChemicalKey(String key) {
            this.key = key;
            chemicalElements = new ArrayList<ChemicalElement>(2);
        }
    
        /**键,两边的元素
         * @param
         */
        public void setTarget(ChemicalElement target1,ChemicalElement target2) {
            try{
                chemicalElements.add(target1);
                chemicalElements.add(target2);
            }catch (Exception e){
                System.out.println("键连接的元素超过2个了!");
            }
        }
        //获得键两边元素
        public ArrayList<ChemicalElement> getChemicalElements() {
            return chemicalElements;
        }
        public void print(){
            for(int i=0;i<2;i++){
                System.out.print(chemicalElements.get(i).getLabel());
                System.out.print('-');
            }
            System.out.println();
        }
       //把一些常见的键,存起来,String形式,不是对象
        private static void  SetterAllKeys(){
            allKeys = new String[6];
            allKeys[0]=".";
            allKeys[1]="-";
            allKeys[2]="=";
            allKeys[3]="#";
            allKeys[4]="/";
            allKeys[5]="\\\\";
        }
    
        public String getKey() {
            return key;
        }
    
        /**获得所有的Key字符
         * @return
         */
        public static String[] getAllKeys(){
            SetterAllKeys();
            return allKeys;
        }
    }
    
    (二)元素

    每个元素都是独立的对象,元素有属性:1,元素名字 label 2,元素的临近的元素environments_2 3,临近元素相应的键keys_2
    其他为了方便设置的 4,元素的整体序号 mark 5 所有元素的符号,string类型,6,断键
    缺少:离子键的带的电荷量

    package com.Demo2;
    
    import java.util.ArrayList;
    
    public class ChemicalElement {
        //元素名称
        private String label;
        //元素的整体序号
        private int mark;
        //周围的元素和相应的键
    
        private ArrayList<ChemicalElement> environments_2;
    
        private ChemicalKey[] Keys;
        private ArrayList<ChemicalKey> Keys_2;
        //是元素的个数
        public int count=0;
        private static String[] allElement;
        //断开的键的类型
        private ChemicalKey disconnectKey;
    
    
        public ChemicalElement(String label, int mark) {
            this.label = label;
            this.mark = mark;
            this.Keys = new ChemicalKey[4];
            this.Keys_2  =new ArrayList<>();
            this.environments_2 = new ArrayList<>();
        }
    
    
    
    
        //设置断键
        public void setDisconnectKey(ChemicalKey disconnectKey) {
            this.disconnectKey = disconnectKey;
        }
        //设置断键的数字,这里假设一个原SMILES表示最多一个断键
        public void setMark(int mark) {
            this.mark = mark;
        }
        /**添加key的方法,同时把键连接的元素也添加进去
         * @param key
         */
        public void addToKeys(ChemicalKey key,ChemicalElement ce){
            Keys_2.add(key);
            this.environments_2.add(ce);
    
        }
        //返回,list,周围的元素
        public ArrayList<ChemicalElement> getEnvironments_2() {
            return environments_2;
        }
    
        /**返回所有的键
         * @return
         */
        public ArrayList<ChemicalKey> getKeys_2() {
            return Keys_2;
        }
    
    //获得断键的序号,默认为0
        public int getMark() {
            return mark;
        }
    //获得断键信息
        public ChemicalKey getDisconnectKey() {
            return disconnectKey;
        }
        /**获得元素名称
         * @return
         */
        public String getLabel() {
            return new String(label);
        }
        //获得与之相连元素的键对象
        public ChemicalKey getKeyy(ChemicalElement ce){
    
            for(ChemicalKey ck:Keys_2){
                if(ck.getChemicalElements().contains(ce)){//某个键,包含这个元素,返回这个键的对象
                    System.out.println("!!!!!检测到元素在键:"+ck.getKey()+"中");
                    return ck;
                }
            }
            return null;
        }
    
    
        public static void main(String[] args) {
            ChemicalElement c1 = new ChemicalElement("H",0);
    
        }
    
        private static void SetAllElement(){
            allElement = new String[100];
            allElement[0]="C";
            allElement[1]="N";
            allElement[2]="O";
            allElement[3]="F";
            allElement[4]="Br";
            allElement[5]="Cl";
            allElement[6]="H";
            allElement[7]="S";
        }
        public static String[] getAllElement() {
            SetAllElement();
            return allElement;
        }
    
    }
    
    (三)化学式

    化学式,所有的元素(键信息在元素中)

    package com.Demo2;
    
    import java.util.ArrayList;
    
    public class ChemicalFormula {
        private ArrayList<ChemicalElement> Formula;
    
        /**
         * @return
         */
        public ArrayList<ChemicalElement> getFormula() {
            return Formula;
        }
    
        /**
         * @param formula
         */
        public void setFormula(ArrayList<ChemicalElement> formula) {
            Formula = formula;
        }
    }
    

    二,解析

    解析没有达到的一些地方:

    • Aromaticity 芳香环的结构识别。小写的字母表示 未识别
    • 离子键等带 [] 这个结构的
    • @符号,立体结构
    • 断键合并,默认是没有重复数字的如1212 ,像1111这种不行。
      简单说,本程序识别,仅仅是带括号,大些字母的那种
    Input:   String  s, //待解析的字符串
           Int  count, //当前解析的位置
    Parse(S,Position)   
    While(count<s长度){
    判断是不是断开的键——数字  
    判断是不是键——-=#.\/         
    判断是不是元素——CNOFSBrCl[]++
    判断是不是括号
       Parse(s',position')
       (出现括号“[”,将括号当成规模小一点的子问题,仍用这个方法。因此,这个方法要返回头元素,或者第一个元素;
    出现括号“]”,终结条件,返回头元素)
    }
    

    在这里插入图片描述

    package com.Demo2;
    
    import java.util.ArrayList;
    
    public class ParseChain {
        /**
         * 待解析的字符串对象
         */
        private String smiles;
    
        /**
         * 解析字符串的位置标记
         */
        private int position;
    
    
        /**
         * 解析后存放的位置
         * cmf:化学式存放
         * MyElements_2 以前的list存放
         */
        private ArrayList<ChemicalElement> MyElements_2;
        private ChemicalFormula cmf;
    
        /**MyElement 要删除的
         * 构造函数
         * @param smiles
         */
        public ParseChain(String smiles) {
            this.smiles = smiles.toUpperCase();
            String[] smilesList =this.smiles.split("");
            MyElements_2 = new ArrayList<ChemicalElement>();
            cmf = new ChemicalFormula();
        }
    
        
        public ArrayList<ChemicalElement> getMyElements_2() {
            return MyElements_2;
        }
    
        public ChemicalFormula getCmf() {
            return cmf;
        }
    
        public ChemicalElement Parsing(){
            String[] smilesList =this.smiles.split(""); //将字符串转成数组
            //第一步,完成图示解C步骤
            ChemicalElement st = subParsing(smilesList,null,null);
            //第二步,从C步骤,完成B步骤,对数字相同的进行拼凑;断键合并
            Combine();
            cmf.setFormula(MyElements_2);  //解析完,将元素存到化学键中
            return st;
        }
        private ChemicalElement subParsing(String[] smileList,ChemicalElement formerElement,ChemicalKey formerKey){
            //头元素,记录信息
            ChemicalElement start = null;
            while(position<smileList.length){
                System.out.print(smileList[position]);
                //是否是数字,表示断键
                if((position<smileList.length) && Character.isDigit(smileList[position].charAt(0))){
                    formerElement.setMark((int)smileList[position].charAt(0));  //旧-将数字加进去
                    formerElement.setDisconnectKey(formerKey);  //将断键的类型加上去
                    formerKey = new ChemicalKey("-");            //将标记键置为默认
                    position++;
                }
                //是键
                else if(isKey(smileList[position])){
                    formerKey = new ChemicalKey(smileList[position]);//将键对象保存
                    position++;
                }
                //是元素
                else if(isElement(smileList[position])){
                    ChemicalElement current=null;
                    if(smileList[position].equals("[")) {  //离子情形
                        ArrayList<String> Ion = new ArrayList<>();
                        for (int i = position; i < smileList.length; i++) {
                            if (smileList[position].equals("]")) {  //结束的情形
                                position++;
                                break;}
                            if (smileList[position].equals("[") || smileList[position].equals("+") || smileList[position].toUpperCase().equals("H")) {
                                continue;
                            }
                            Ion.add(smileList[position]);
                        }
                        current = new ChemicalElement(Ion.toString(), 0);
                    }else {
                        current = new ChemicalElement(smileList[position], 0); //旧-将元素添加进去
                    }
                    MyElements_2.add(current);         //新-将元素添加到MyElements_2
    
                    if(start==null){    //第一个元素
                        start=current;
                    }
                    if(formerElement==null){   //旧-前面是空的,第一个元素情形;此时,键也应该是空的
                        formerElement = current;
                        formerKey = new ChemicalKey("-");
                    }else {
    
                        //新 添加元素
                        formerKey.setTarget(current,formerElement); //键 ---(m,n)
                        formerElement.addToKeys(formerKey,current);  //元素---添加键
                        current.addToKeys(formerKey,formerElement);
    
                        //旧-更新前一个元素;更新键值
                        formerElement = current;
                        formerKey = new ChemicalKey("-");
                    }
                    position++;
                }
                   //括号内() 迭代,返回头元素
                else if(smileList[position].equals("(")){
                    //旧-此时第一个元素应该被外面的吸纳,其他的循环就好;此时前置的元素依然不能变,即使出现了)符号,这个也是不能变的。
                    position++;
                    //判断后面的元素是不是键,如果是,要提前存起来,更新。
                    if(isKey(smileList[position])){
                        formerKey = new ChemicalKey(smileList[position]);
                    }
                    ChemicalElement ce =  subParsing(smileList,null,null);
                    if(formerElement!=null){  //括号前面的部分处理
    
                        //新的添加方式
                        formerKey.setTarget(ce,formerElement);
                        formerElement.addToKeys(formerKey,ce);
                        ce.addToKeys(formerKey,formerElement);
                    }else{
                        formerElement = ce;
                        formerKey = new ChemicalKey("-");
                    }
                    //括号后面部分的处理
                    formerKey = new ChemicalKey("-");
                    position++;
                }
                else if(smileList[position].equals(")")){  //这里不对位置进行操作 留在109处理
                    // 但是要对formerkey做处理 留在109 循环出来后
                    return start;
                }
            }
            return start;
        }
    
        //判断是否是键
        String[] allKeys = ChemicalKey.getAllKeys();
        public boolean isKey(String element){
            for(String c:allKeys){
                if(element.equals(c)){
                    //  System.out.println("是键");
                    return true;
                }
            }
            return false;
        }
        //判断是否是元素  
        //两位的元素没搞,比如Br Cl
        String[] elements = ChemicalElement.getAllElement();
        public boolean isElement(String element){
            for(String s:elements){
                if(element.equals(s)){
                    //   System.out.println("是元素");
                    return true;
                }
                if(element.equals("[")){
                    return true;
                }
            }
            return false;
        }
    
        //将断开的键合起来
        // 断键信息1111 这种形式标记的 没搞
        private void Combine(){
            int maxNumber =0;
            for(ChemicalElement ce :MyElements_2){
                if(ce.getMark()>maxNumber)
                    maxNumber =ce.getMark();
            }
            for(int i=0;i<MyElements_2.size();i++){
                if(MyElements_2.get(i).getMark()!=0){
                    for(int j=i+1;j<MyElements_2.size();j++){
                        if(MyElements_2.get(i).getMark()==MyElements_2.get(j).getMark()){
                            MyElements_2.get(i).getDisconnectKey().setTarget(MyElements_2.get(i),MyElements_2.get(j));
                            MyElements_2.get(i).addToKeys(MyElements_2.get(i).getDisconnectKey(),MyElements_2.get(j));
                            MyElements_2.get(j).addToKeys(MyElements_2.get(i).getDisconnectKey(),MyElements_2.get(i));
                            break;
                        }
                    }
                }
            }
    
        }
    }
    
    

    三,匹配

    经过查资料,这是一个NP问题,属于图的同构问题。采用一个类似深度优先遍历加回溯的方案,算法叫VF算法。算法流程:
    在这里插入图片描述
    中文文章解释:(百度吧)
    1,SMILES表达式的子结构关系检测算法_彭彬
    2,VF算法在化学结构检索中的应用_李琰
    3,基于VF2算法的分子二维子结构检索_李欣
    英文原文:
    1,An_Improved_Algorithm_for_Matching_Large_Graphs
    2,(Sub)Graph Isomorphism Algorithm for Matching Large Graphs Luigi P. Cordella, Pasquale Foggia, Carlo Sansone,and Mario Vento
    过程主要设计的概念:

    • SSR 状态空间。上面说到这是一个图问题,所以深度遍历过程中会有一个解空间树。这个SSR状态空间,就是真正解的一个子集空间,用来记录路径的。
    • 候选状态集。 当进行到某个元素,这个候选状态集就是:接下来的所有的可选路径。
    • Feasibility Rules 。回溯的条件,对于问题,不满足一定条件,就回溯。
    package com.Demo2;
    
    import java.util.*;
    
    public class VFMatch {
        //query和db图   dbG=databaseGraph
        private ChemicalFormula quG;
        private ChemicalFormula dbG;
        //Ms用于存放空间状态点,也应该是个Map才对
        //由于匹配过程,一一对应,不会出现一对多,所以mapde 键是元素是可以的
        private Map<ChemicalElement,ChemicalElement> Ms;
    
        public VFMatch(ChemicalFormula quG, ChemicalFormula dbG) {
            this.quG = quG;
            this.dbG = dbG;
        }
    
        /**
         * @param state  临时的态
         * @param quG     query
         * @param dbG     dbG
         * @return         boolean
         */
        public boolean Match(HashMap<ChemicalElement,ChemicalElement> state, ChemicalFormula quG, ChemicalFormula dbG){
            boolean flag = false;
            //Mqu 已经在state中的query元素  Mdb 已经在state中的db元素
            Set<ChemicalElement> quG_Mid0 = state.keySet();
            ArrayList<ChemicalElement> Mqu = new ArrayList<>(quG_Mid0);
            Collection<ChemicalElement> dbG_Mid0 = state.values();
            ArrayList<ChemicalElement> Mdb= new ArrayList<>(dbG_Mid0);
            //IF M(S)cover all the nodes of G2
            if(Mqu.size()!=0 && Mqu.size()==quG.getFormula().size()){
                    System.out.println("到了最后+++++++++++++++++++++++++++++++++++++");
                    flag =  true;
            }else{
                //compute the candidate of inclusion of Ms
                Map<Integer,ArrayList<ChemicalElement>> P = new HashMap<>();
                CandidateP(P,quG,dbG,Mqu,Mdb);
                System.out.println("计算完成候选的结果");
                Set<Integer> entry = P.keySet();
                //Foreach p in P:
                for(int number:entry){
                    ChemicalElement que = P.get(number).get(0); //query
                    ChemicalElement dbe = P.get(number).get(1);  //db
                    //IF the feasibility rules succeed for inclusion of p in Ms
                    if(FeasibilityRules(que,dbe,Mqu,Mdb,state)){
                        //compute the state s'
                        state.put(que,dbe);  //添加进去
                        //call match(s')
                        flag = Match(state,quG,dbG);
                        state.remove(que);  //回溯,要删除之前的状态
                    }
                    if(flag==true){ 
                        break;//找到一个解,就返回解,不再探索
                    }
                }
                //从这里出来,就是说明没有那走到最后,所以返回
            }
            return flag;
        }
    
    
        /**搜索的空间P Candidate Pair Set
         * @param result 所有可能性集合容器
         * @param quG  query
         * @param bgG  database
         * @param Mqu  M_query
         * @param Mdb  M_database
         * @return
         * <1,<C,N>>  <2,<C,C>> ...
         */
        public void CandidateP(Map<Integer,ArrayList<ChemicalElement>> result, ChemicalFormula quG, ChemicalFormula bgG,
                                                               ArrayList<ChemicalElement> Mqu, ArrayList<ChemicalElement> Mdb){
            int count=0;
            for(ChemicalElement ce:quG.getFormula()){
                if(!Mqu.contains(ce)) {  //query元素没被选的元素
                    for (ChemicalElement qe : bgG.getFormula()) {
                        if(!Mdb.contains(qe)){ //db元素,没被选的元素
                            System.out.print(ce.getLabel()+"-"+qe.getLabel()+" ");
                            ArrayList<ChemicalElement> res = new ArrayList<>();
                            res.add(ce);
                            res.add(qe);
                            result.put(count,res);
                            count++;
                        }
                    }
                }
            }
        }
    
        /**
         * @param quG query
         * @param dbG dataBase
         * @param Mqu  已经加入的结点集合
         * @param Mdb
         * @param match 已经匹配好的对象
         * @return
         */
        public boolean FeasibilityRules(ChemicalElement quG,ChemicalElement dbG,ArrayList<ChemicalElement> Mqu,ArrayList<ChemicalElement> Mdb,
                                        Map<ChemicalElement,ChemicalElement> match){
    
            if(!quG.getLabel().equals(dbG.getLabel())){       //两个元素名称是否一致
                return  false;
            }
            if(quG.getEnvironments_2().size()>dbG.getEnvironments_2().size()){  //quG的度要小于等于dbG的度
                return false;
            }
            if(Mqu.size()==0){   //如果是第一对元素,
                System.out.println("   是第一个元素");
                return true;
            }
            //接下来检测,M中是否已经有跟quG相连的元素,如果相连,必须满足条件:
            //1)quG_vID和dbG_vID与已经match的那些节点对中的【至少】一对(quVid,dbVid)分别相邻(quG_vID和dbG_vID分别是已经match的节点quVid和dbVid的“neighbor节点”)
            //2)如果存在多个相邻对(quVid,dbVid),则必须要求【所有的】邻接边对( edge(quG_vID,quVid), edge(dbG_vID,dbVid) )的label一样
    
            for(ChemicalElement quG_Mid:Mqu){
                if(quG_Mid.getEnvironments_2().contains(quG)){ //quG_Mid是quG的连接元素  
                    ChemicalElement dbG_Mid = match.get(quG_Mid);  //映射的元素
                    if(!dbG_Mid.getEnvironments_2().contains(dbG)){  //映射元素dbG_Mid与dbG之间没有连接
                        return false;
                    }
                    /***
                     * 下面是需要改正的,键对象创建的太多了。
                     * 需要把键当成元素的属性,目前是元素是键的属性,用一个map比较好
                     */
                    if(!quG.getKeyy(quG_Mid).getKey().equals( dbG.getKeyy(dbG_Mid).getKey())){  //同一个键对象
                        return false;
                    }
                }
            }
            //从这里出来,
            //1)可能是不存在与Mqu相连接的情况,因此 return true
            //2) 存在于Mqu相连接的情况,且验证符合
            return true;
        }
    }
    
    
    展开全文
  • 通过对工作面水质进行化验总结,运用AquaChem软件绘制Piper三线图,对7199工作面4个月的水质进行统计分析,结果表明:7199工作面突水水源中包含顶板砂岩水、分界砂岩水、第四系底含水和侏罗白垩水。为更准确地确定突水...
  • ( )【单选题】学校教育的各门学科,从知识传授角度来说,都是科学知识,而科学知识必须运用科学准确的语言来表达。这突出强调了讲授语设计必须遵守( )。【单选题】关于中国传统音乐的形式与内容,下面的说法错误的是:...
  • 计算思维在化学上的应用.pdf

    千次阅读 2021-07-01 04:19:42
    计算思维在化学上的应用作业题目2——化学化学软件与计算机的表示、存储、执行的关系(专业:化学)1.计算思维与化学计算思维是运用计算机科学的基础概念进行问题求解、系统设计、以及人类行为理解等涵盖计算机...
  • title: “White Wine Quality” author: “Kira” ===========...哪个化学成分影响葡萄酒的质量? 设置文件的可读性 单变量情节部分 从数据可得,该数据集有4898 条数据和13个变量。 查看 quality 的分布 3 4 5 6 ...
  • 然后根据爬取的数据,把对应的关系读取到写入到neo4j 通过Django制作了网站,可以对neo4j进行对应的查询,底层通过neo4j的语句查询 查询到对应的数据后,前端使用echarts进行一个关系图谱的展示 并且完胜了...
  • 物理化学笔记(1) 量子化学基础

    千次阅读 2020-04-01 18:09:49
    物理化学笔记(1)量子化学基础 化学是人类关于原子和分子的知识和智慧的结晶。一个优秀的化学家需要适当了解其他科学分支的观测角度,在一定程度上听得懂其他学者的语言。但更重要和根本的是化学家一定要能流利地...
  • 1. CDK (Chemistry Development ...CDK是结构化学信息学和生物信息学的开源Java库。 该项目由Christoph Steinbeck,Egon Willighagen与Jmol和JChemPaint的开发人员Dan Gezelter于2000年发起。迄今为止,它是在科学...
  • 文档级关系抽取介绍

    千次阅读 2021-04-09 13:37:00
    CDR是生物医学领域的人类标注的化学疾病关系抽取数据集,由500份文档组成,该数据集的任务是预测化学和疾病概念之间的二元相互作用关系。 SCIREX数据集是发表在ACL2020上的《SCIREX: A Challenge Dataset for ...
  • :此目录包含各种简短的Matlab函数,需要时存储库的其他Matlab程序会调用这些函数。 依赖关系: MATLAB。 该存储库的大多数代码都是用Matlab编写的(以扩展名.m表示)。 这些代码的一些可能也与GNU Octave兼容...
  • 本文作者:陈想,浙江大学在读博士,研究方向为自然语言处理张宁豫,浙江大学助理研究员,研究方向为自然语言处理、知识表示与推理1. 前言关系抽取(Relation Extraction, ...
  • RDKit | 基于分子指纹可视化化学空间

    千次阅读 2020-01-13 09:11:41
    根据化学结构可视化化合物空间 方法 计算分子指纹 为每种化合物生成一个指纹并减小其尺寸,以便可以将其绘制在平面上。根据相似性原理,“相似的化合物具有相似的性质”,具有相似结构和性质的化合物应紧密地...
  • 然而在开放域的真实关系抽取场景,文本中包含大量开放的实体关系关系种类繁多,而且关系数量也会不断增长,远超过人为定义的关系种类数量。 在这种情况下,传统关系分类模型无法有效获取文本蕴含的实体间的...
  • Chemistry Development Kit (CDK) 为分子信息学的常见任务提供方法,包括化学结构的 2D 和 3D 渲染、I/O 例程、SMILES 解析和生成、环搜索、同构检查、结构图生成等。 用 Ja​​va 实现,它既可用于服务器端计算...
  • 类图关系 概述 面向对象是符合人们对现实世界的思维模式,利用面向对象设计,特别是采用各种设计模式来解决问题时,会设计多个类,然后创建多个对象,一个设计良好的类,应该是兼顾信息和行为并且高内聚。而不同的类...
  • 关系数据库设计:谈谈规范化技术

    千次阅读 多人点赞 2020-08-19 21:42:31
    通过实际案例介绍关系数据库设计的规范化技术(Normalization),为什么需要规范化,常见的第一范式、第二范式和第三范式,反规范化应用的场景以及外键的取舍问题。
  • 在传统的卤化银摄像系统,图像信息被转换成胶片化学信号,并存储在对应的点 上 。 因此,胶片同时具有图像捕捉和图像存储的功能 。 图像捕捉的另-种方法是将图像信 息转换为电子信号 。 在这种情况下,图像...
  • 以下选项的叙述,正确的是A、在循环队列,只需要队头指针就能反映队列元素的动态变化情况B、在循环队列,只需要队尾指针就能反映队列元素的动态变化情况C、循环队列有队头和队尾两个指针,因此,循环队列...
  • 导读土壤微生物在生死过程塑造了全球元素循环。活体土壤微生物是陆地生物地球化学的主要引擎,驱动着土壤有机质(地球上最大的陆地碳库和植物养分的主要来源)的周转。它们的代谢功能受到与其他土壤微生物种群、土壤...
  • 生物医学研究正以如此指数级的速度增长,以致于科学家、研究人员和从业人员不再能够处理该领域大量出版的文献。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,948
精华内容 6,779
热门标签
关键字:

化学中的包含关系