JAL-1705 JAL-1191 SequenceOntologyLite added as hard-coded alternative
[jalview.git] / src / jalview / io / gff / InterProScanHelper.java
1 package jalview.io.gff;
2
3 import jalview.datamodel.AlignmentI;
4 import jalview.datamodel.SequenceFeature;
5 import jalview.datamodel.SequenceI;
6 import jalview.util.StringUtils;
7
8 import java.io.IOException;
9 import java.util.List;
10 import java.util.Map;
11
12 /**
13  * A handler to parse GFF in the format generated by InterProScan
14  */
15 public class InterProScanHelper extends Gff3Helper
16 {
17   private static final String INTER_PRO_SCAN = "InterProScan";
18
19   private static final String SIGNATURE_DESC = "signature_desc";
20
21   /**
22    * Process one GFF feature line (as modelled by SequenceFeature)
23    * 
24    * @param seq
25    *          the sequence with which this feature is associated
26    * @param gff
27    *          the gff column data
28    * @param align
29    *          the alignment we are adding GFF to
30    * @param newseqs
31    *          any new sequences referenced by the GFF
32    * @param relaxedIdMatching
33    *          if true, match word tokens in sequence names
34    * @return a sequence feature if one should be added to the sequence, else
35    *         null (i.e. it has been processed in another way e.g. to generate a
36    *         mapping)
37    * @throws IOException
38    */
39   @Override
40   public SequenceFeature processGff(SequenceI seq, String[] gff,
41           AlignmentI align, List<SequenceI> newseqs,
42           boolean relaxedIdMatching) throws IOException
43   {
44     /*
45      * ignore the 'polypeptide' match of the whole sequence
46      */
47     if (".".equals(gff[SOURCE_COL]))
48     {
49       return null;
50     }
51
52     return super.processGff(seq, gff, align, newseqs, relaxedIdMatching);
53   }
54
55   /**
56  * 
57  */
58   @Override
59   protected SequenceFeature buildSequenceFeature(String[] gff,
60           Map<String, List<String>> attributes)
61   {
62     SequenceFeature sf = super.buildSequenceFeature(gff, attributes);
63
64     /*
65      * signature_desc is a more informative source of description
66      */
67     List<String> desc = attributes.get(SIGNATURE_DESC);
68     String description = StringUtils.listToDelimitedString(desc, ", ");
69     if (description.length() > 0)
70     {
71       sf.setDescription(description);
72     }
73
74     /*
75      * Set sequence feature group as 'InterProScan', and type as the source
76      * database for this match (e.g. 'Pfam')
77      */
78     sf.setType(gff[SOURCE_COL]);
79     sf.setFeatureGroup(INTER_PRO_SCAN);
80
81     return sf;
82   }
83
84   /**
85    * Tests whether the GFF data looks like it was generated by InterProScan
86    * 
87    * @param columns
88    * @return
89    */
90   public static boolean recognises(String[] columns)
91   {
92     SequenceOntologyI so = SequenceOntologyFactory.getInstance();
93     String type = columns[TYPE_COL];
94     if (so.isA(type, SequenceOntologyI.PROTEIN_MATCH)
95             || (".".equals(columns[SOURCE_COL]) && so.isA(type,
96                     SequenceOntologyI.POLYPEPTIDE)))
97     {
98       return true;
99     }
100     return false;
101   }
102
103   /**
104    * Overriden method, because InterProScan GFF has the target sequence id in
105    * GFF field 'ID' rather than the usual 'Target' :-O
106    */
107   @Override
108   protected String findTargetId(String target, Map<String, List<String>> set)
109   {
110     List<String> ids = set.get(ID);
111     if (ids == null || ids.size() != 1)
112     {
113       return null;
114     }
115     return ids.get(0);
116   }
117
118 }