Why perfect match is directional

User 8139ea8dbd

24-02-2009 04:40:31

I think I asked a similar question a while ago, but could not find the post. Can someone explain again why these two return different results? Thanks.











select jc_equals(





'[H]\N=C(\C)N1CCC(CC1)Oc1ccc(cc1)N(Cc1ccc2ccc(cc2c1)C(\N)=N/[H])(O)(=O)CC(O)=O'





,





'CC(=N)N1CCC(CC1)Oc1ccc(cc1)N(Cc1ccc2ccc(cc2c1)C(N)=N)(O)(=O)CC(O)=O'





)





from dual;





 





return 1;





 





select jc_equals(





'CC(=N)N1CCC(CC1)Oc1ccc(cc1)N(Cc1ccc2ccc(cc2c1)C(N)=N)(O)(=O)CC(O)=O'





,





'[H]\N=C(\C)N1CCC(CC1)Oc1ccc(cc1)N(Cc1ccc2ccc(cc2c1)C(\N)=N/[H])(O)(=O)CC(O)=O'





)





from dual;





 





return 0;

ChemAxon aa7c50abf8

24-02-2009 09:08:40

Which JChem version is it? With recent versions (I tested with 5.1.2 and 5.1.4), both statements return 1.





As far as I know, perfect match is not supposed to be directional.

User 8139ea8dbd

24-02-2009 18:15:30

We are using version 5.1.4





SELECT prop_value from gnf_imc.jchemproperties where PROP_NAME like '%JChemVersion';





returns 5.1.4





I think the two structures are different, should return 0, because explicit hydrogen is required in one structure (Remove explicit hydrogen will not remove them).

ChemAxon 42004978e8

26-02-2009 11:05:28

Hi,





There are two issues here.





First, for us the two operations resulted in the same action and there is matching. For you there is a different behaviour for the two searches, which shouldn't occur.





Second: for perfect (duplicate) search type explicit hydrogens can match on implicit hydrogens because usually it's only a question of representation.





However for your structures the explicit hydrogen causes a trans double bond stereo configuration, which is not present in the other structure and should hinder matching. We will check why these structures match.





Bye,





Robert

ChemAxon aa7c50abf8

26-02-2009 15:58:43

For the problem of the apparent lack of commutativity between perfect search parameters: do you get same inconsistent behaviour, if you are searching in tables, as opposed to comparing to structures as literal values using FROM DUAL?

User 8139ea8dbd

26-02-2009 22:08:34

We will do a bit more testing, but I think we need to first convince you that the bug does exist. The following is the log from sqlplus (maybe our Java version is old?):





SQL> select JCHEM_CORE_PKG.GETENVIRONMENT() from dual;





JCHEM_CORE_PKG.GETENVIRONMENT()


--------------------------------------------------------------------------------


Oracle environment:


Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bi


PL/SQL Release 10.2.0.3.0 - Production


CORE    10.2.0.3.0      Production


TNS for Solaris: Version 10.2.0.3.0 - Production


NLSRTL Version 10.2.0.3.0 - Production





JChem Server environment:


Java VM vendor: Sun Microsystems Inc.


Java version: 1.5.0_17


Java VM version: 1.5.0_17-b04





JCHEM_CORE_PKG.GETENVIRONMENT()


--------------------------------------------------------------------------------


JChem version: 5.1.4


JChem Index version: 50103


JDBC driver version: 10.2.0.3.0





SQL> select jc_equals('[H]\N=C(\C)N1CCC(CC1)Oc1ccc(cc1)N(Cc1ccc2ccc(cc2c1)C(\N)=N/[H])(O)(=O)CC(O)=O','CC(=N)N1CCC(CC1)Oc1ccc(cc1)N(Cc1ccc2ccc(cc2c1)C(N)=N)(O)(=O)CC(O)=O' ) from dual;





JC_EQUALS('[H]\N=C(\C)N1CCC(CC1)OC1CCC(CC1)N(CC1CCC2CCC(CC2C1)C(\N)=N/[H])(O)


--------------------------------------------------------------------------------


                                                                               1





SQL>  select jc_equals('CC(=N)N1CCC(CC1)Oc1ccc(cc1)N(Cc1ccc2ccc(cc2c1)C(N)=N)(O)(=O)CC(O)=O','[H]\N=C(\C)N1CCC(CC1)Oc1ccc(cc1)N(Cc1ccc2ccc(cc2c1)C(\N)=N/[H])(O)(=O)CC(O)=O') from dual;





JC_EQUALS('CC(=N)N1CCC(CC1)OC1CCC(CC1)N(CC1CCC2CCC(CC2C1)C(N)=N)(O)(=O)CC(O)=


--------------------------------------------------------------------------------


                                                                               0

User 8139ea8dbd

26-02-2009 22:57:40

We inserted the two smiles into a test database (which has exactly the same setting as the database where we run "from dual"). You can see there is a difference between fetching smiles from table or pass as parameters in from dual.





SQL> select JCHEM_CORE_PKG.GETENVIRONMENT() from dual;





JCHEM_CORE_PKG.GETENVIRONMENT()


--------------------------------------------------------------------------------


Oracle environment:


Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bi


PL/SQL Release 10.2.0.3.0 - Production


CORE    10.2.0.3.0      Production


TNS for Solaris: Version 10.2.0.3.0 - Production


NLSRTL Version 10.2.0.3.0 - Production





JChem Server environment:


Java VM vendor: Sun Microsystems Inc.


Java version: 1.5.0_17


Java VM version: 1.5.0_17-b04





JCHEM_CORE_PKG.GETENVIRONMENT()


--------------------------------------------------------------------------------


JChem version: 5.1.4


JChem Index version: 50103


JDBC driver version: 10.2.0.3.0








SQL> select cpd_sid, vc.jc_smiles from vendor_cpd vc


where jc_equals(vc.jc_smiles,'CC(=N)N1CCC(CC1)Oc1ccc(cc1)N(Cc1ccc2ccc(cc2c1)C(N)=N)(O)(=O)CC(O)=O' ) =1 ;


  2


   CPD_SID


----------


JC_SMILES


--------------------------------------------------------------------------------


  98765432


[H]\N=C(\C)N1CCC(CC1)Oc1ccc(cc1)N(Cc1ccc2ccc(cc2c1)C(\N)=N/[H])(O)(=O)CC(O)=O





  98765433


CC(=N)N1CCC(CC1)Oc1ccc(cc1)N(Cc1ccc2ccc(cc2c1)C(N)=N)(O)(=O)CC(O)=O








SQL> select cpd_sid, vc.jc_smiles from vendor_cpd vc


where jc_equals(vc.jc_smiles, '[H]\N=C(\C)N1CCC(CC1)Oc1ccc(cc1)N(Cc1ccc2ccc(cc2c1)C(\N)=N/[H])(O)(=O)CC(O)=O' ) =1 ;


  2


   CPD_SID


----------


JC_SMILES


--------------------------------------------------------------------------------


  98765432


[H]\N=C(\C)N1CCC(CC1)Oc1ccc(cc1)N(Cc1ccc2ccc(cc2c1)C(\N)=N/[H])(O)(=O)CC(O)=O





  98765433


CC(=N)N1CCC(CC1)Oc1ccc(cc1)N(Cc1ccc2ccc(cc2c1)C(N)=N)(O)(=O)CC(O)=O





SQL> select jc_equals('[H]\N=C(\C)N1CCC(CC1)Oc1ccc(cc1)N(Cc1ccc2ccc(cc2c1)C(\N)=N/[H])(O)(=O)CC(O)=O', 'CC(=N)N1CCC(CC1)Oc1ccc(cc1)N(Cc1ccc2ccc(cc2c1)C(N)=N)(O)(=O)CC(O)=O') from dual;





JC_EQUALS('[H]\N=C(\C)N1CCC(CC1)OC1CCC(CC1)N(CC1CCC2CCC(CC2C1)C(\N)=N/[H])(O)


--------------------------------------------------------------------------------


                                                                               1





SQL> select jc_equals('CC(=N)N1CCC(CC1)Oc1ccc(cc1)N(Cc1ccc2ccc(cc2c1)C(N)=N)(O)(=O)CC(O)=O','[H]\N=C(\C)N1CCC(CC1)Oc1ccc(cc1)N(Cc1ccc2ccc(cc2c1)C(\N)=N/[H])(O)(=O)CC(O)=O') from dual;





JC_EQUALS('CC(=N)N1CCC(CC1)OC1CCC(CC1)N(CC1CCC2CCC(CC2C1)C(N)=N)(O)(=O)CC(O)=


--------------------------------------------------------------------------------


                                                                               0

ChemAxon aa7c50abf8

26-02-2009 23:06:31

Does this Oracle user has "absoluteStereo" or "standardizerConfig" entries in the prop_name column in his jc_idx_property table? Or anything else other than entries ending with ".idxTable", ".JChemProperties" or ".debuglevel"?

User 4cd5052280

26-02-2009 23:31:09

Quote:
Does this Oracle user has "absoluteStereo" or "standardizerConfig" entries in the prop_name column in his jc_idx_property table? Or anything else other than entries ending with ".idxTable", ".JChemProperties" or ".debuglevel"?









No, there are no entires other than ones ending with .JchemPropeties or .idxTable in the jc_idx_property table.














There is an entry in the Jchempropertie table for that user:





idxtable.VENDOR_CPD$JC_IDX_JCX.absoluteStereo     false

ChemAxon aa7c50abf8

27-02-2009 09:50:31

Please, could you do the following:





1. Add the following lines to cartridge/conf/logging.properties:











Code:
chemaxon.jchem.handlers = java.util.logging.FileHandler


chemaxon.jchem.cartridge.rmi.impl.MolSearchImpl.level = FINEST








2. Reload or restart JChem Server





3. Execute both "FROM DUAL" statements





4. Retrieve recent lines in the latest log files in cartridge/logs. Two times having a pattern similar to the following:











Code:
Feb 27, 2009 10:20:56 AM chemaxon.jchem.cartridge.rmi.impl.MolSearchImpl init


FINE: searchTypeToken=perfect, query=[H]\N=C(\C)N1CCC(CC1)Oc1ccc(cc1)N(Cc1ccc2ccc(cc2c1)C(\N)=N/[H])[S](O)(=O)CC(O)=O, standardizer=null, queryStdrNeededtrue, options=null, absStereo=false


Feb 27, 2009 10:20:56 AM chemaxon.jchem.cartridge.rmi.impl.MolSearchImpl isMatching


FINER: isMatching: target=CC(=N)N1CCC(CC1)Oc1ccc(cc1)N(Cc1ccc2ccc(cc2c1)C(N)=N)[S](O)(=O)CC(O)=O, targetStdrNeeded=true


Feb 27, 2009 10:20:56 AM chemaxon.jchem.cartridge.rmi.impl.MolSearchImpl isMatching


FINER: isMatching: returning isMatching=1






5. Post these log lines (12 lines in total, if my math is correct).








Thanks





Peter

User f50dadc210

27-02-2009 20:11:27

I tried to use JChem API to do perfect match using these two smiles.  The code is as the follows.








String query = "CC(=N)N1CCC(CC1)Oc1ccc(cc1)N(Cc1ccc2ccc(cc2c1)C(N)=N)(O)(=O)CC(O)=O";


String target = "[H]\\N=C(\\C)N1CCC(CC1)Oc1ccc(cc1)N(Cc1ccc2ccc(cc2c1)C(\\N)=N/[H])(O)(=O)CC(O)=O";


MolSearch ms = new MolSearch();


ms.setQuery(new MolHandler(query, true).getMolecule());


ms.setTarget(new MolHandler(target).getMolecule());


SearchOptions so = new SearchOptions();


so.setSearchType(SearchConstants.PERFECT);


ms.setSearchOptions(so);


if (ms.findFirst() != null) {


System.out.println("Yes");


} else {


System.out.println("No matching");


}





It returns "No matching".   The java version is 1.6 and Jchem version is 5.1.5.   Would you please show me the correct code?





Thanks

ChemAxon aa7c50abf8

01-03-2009 10:52:01

Code:
ms.setQuery(new MolHandler(query, true).getMolecule());






should read








Code:
ms.setQuery(new MolHandler(query, false).getMolecule());






instead.





When the query structure gets unmarshalled for PERFECT search, the queryMode parameter of MolHandler(String, boolean) has to be set to false. When set to false, this flag tells the structure format handlers (in this particular case the SMILES parser) not to interpret query features as such (i.e. it tells that the query structure should be unmarshalled as SMILES and not as SMARTS). This is required by the definition of PERFECT search.

ChemAxon 42004978e8

02-03-2009 13:15:10

Hi,





We corrected the search behaviour, the two structures doesn't match each other in perfect search.  We had a bug in handling hydrogens in cis/trans configuration.





The fix will be released with version 5.2 this month.





However your programs inconsistent behaviour which we couldn't reproduce is still an open question. Please send us the previously mentioned log file.





Bye,





Robert

ChemAxon 42004978e8

09-03-2009 13:46:10

Hi,





This topic contained two different questions:





1, The first part dealt with directionality of perfect search, and if explicit Hs in Cis/Trans configuration are considered during seraching.  -this part remained here





2, The second part dealt with the exact and perfect search depending on (de)aromatization of a molecule.





This can be found here:





http://www.chemaxon.com/forum/ftopic4629.html





Please follow it.








Bye,





Robert

ChemAxon 42004978e8

10-03-2009 11:06:20

Hi,





Your code returns no matching for us as well. In case of perfect search you are comparing two molecules. In this case there shouldn't be a smarts import of the query structure, so both query and target should be imported with "false" setting in MolHandler.


For other searches smarts import is suitable (set "true"), because there might be query features in the query structure.





In version 5.3 we will have a method MolSearch.setQuery(String) which will import the query as smiles or smarts based on the search type.





Bye,


Robert





I write my correction as comment:


Quote:
I tried to use JChem API to do perfect match using these two smiles.  The code is as the follows.








String query = "CC(=N)N1CCC(CC1)Oc1ccc(cc1)N(Cc1ccc2ccc(cc2c1)C(N)=N)(O)(=O)CC(O)=O";


String target = "[H]\\N=C(\\C)N1CCC(CC1)Oc1ccc(cc1)N(Cc1ccc2ccc(cc2c1)C(\\N)=N/[H])(O)(=O)CC(O)=O";


MolSearch ms = new MolSearch();


ms.setQuery(new MolHandler(query, true).getMolecule());












ms.setQuery(new MolHandler(query).getMolecule());











Quote:
ms.setTarget(new MolHandler(target).getMolecule());


SearchOptions so = new SearchOptions();


so.setSearchType(SearchConstants.PERFECT);


ms.setSearchOptions(so);


if (ms.findFirst() != null) {


System.out.println("Yes");


} else {


System.out.println("No matching");


}





It returns "No matching".   The java version is 1.6 and Jchem version is 5.1.5.   Would you please show me the correct code?





Thanks






.

ChemAxon 42004978e8

13-03-2009 10:14:45

Hi,














Version 5.2 with the correction of C/T specific explicit hydrogen handling has been released.





Robert