package search;

import java.awt.Color;
import java.io.IOException;
import java.sql.SQLException;

import chemaxon.enumeration.supergraph.SupergraphException;
import chemaxon.jchem.db.DatabaseSearchException;
import chemaxon.jchem.db.TransferException;
import chemaxon.sss.search.MolSearchOptions;
import chemaxon.sss.search.SearchException;
import chemaxon.struc.Molecule;
import chemaxon.util.HitColoringAndAlignmentOptions;
import chemaxon.util.HitDisplayTool;

/**
 * Example code for hit coloring and alignment
 * 
 * Searches two query molecules in the same target, 
 * the second query is the rotated pair of the first one.
 * 
 * Hits in the target can be shown in colour and/or
 * aligned to query independently.
 * 
 * @author Tamas Csizmazia
 * @author Edvard Buki
 * @version 5.0.3, 04/26/2008
 *
 */
public class VisualizationExample {

    public static void main(String[] args)
    	throws TransferException, SQLException, IOException, 
    		DatabaseSearchException, SearchException, SupergraphException{

	// We will look for hits in this molecule
        Molecule target = MoleculeImport.importMol("target.mrv", true);
        
        HitColoringAndAlignmentOptions colouringOptions =
	    new HitColoringAndAlignmentOptions();

        // hit should be coloured in target 
	colouringOptions.coloring = true;
	colouringOptions.hitColor = Color.RED;
	colouringOptions.nonHitColor = Color.GREEN;

	//**********************************************
	//* First search: only colouring, no alignment *
	//**********************************************

	// target will not be aligned to query
        colouringOptions.alignmentMode 
	= HitColoringAndAlignmentOptions.ALIGNMENT_OFF;

	// importing first query molecule 
	Molecule query = MoleculeImport.importMol("query1.mrv", true);

	// Tool for performing coloring and alignment
        HitDisplayTool hdt = new HitDisplayTool(
    	    colouringOptions,
    	    new MolSearchOptions(),
    	    null,  //only aromatization
    	    query);
        Molecule result = hdt.getHit(target);

        // Showing query with hit colouring in target (no alignment)
        Util.showMolecule(query, 0, 200);
        Util.showMolecule(result, 1, 200);

        //***********************************************************
	//* Second search: repeating previous search with alignment *
        //***********************************************************
        
	// target will be aligned to query
        colouringOptions.alignmentMode 
	= HitColoringAndAlignmentOptions.ALIGNMENT_ROTATE;
        
        hdt = new HitDisplayTool(
        	colouringOptions,
        	new MolSearchOptions(),
        	null,
        	query);
        result = hdt.getHit(target);

        Util.showMolecule(query, 4, 200);
        Util.showMolecule(result, 5, 200);

        //*******************************************************
	//* Third search: searching second query with alignment *
        //*******************************************************
        
        query = MoleculeImport.importMol("query2.mrv", true);

        hdt = new HitDisplayTool(
        	colouringOptions,
        	new MolSearchOptions(),
        	null,
        	query);
        result = hdt.getHit(target);

        Util.showMolecule(query, 8, 200);
        Util.showMolecule(result, 9, 200);
    }
}