Merge branch 'releases/Release_2_11_3_Branch'
[jalview.git] / src / jalview / datamodel / ContactListImpl.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21 package jalview.datamodel;
22
23 import java.awt.Color;
24
25 import jalview.renderer.ContactGeometry.contactInterval;
26
27 /**
28  * helper class to compute min/max/mean for a range on a contact list
29  * 
30  * @author jprocter
31  *
32  */
33 public class ContactListImpl implements ContactListI
34 {
35   ContactListProviderI clist;
36
37   public static ContactListI newContactList(ContactListProviderI list)
38   {
39     return new ContactListImpl(list);
40   }
41
42   public ContactListImpl(ContactListProviderI list)
43   {
44     clist = list;
45   }
46
47   @Override
48   public int getPosition()
49   {
50     return clist.getPosition();
51   }
52
53   @Override
54   public double getContactAt(int column)
55   {
56     return clist.getContactAt(column);
57   }
58
59   @Override
60   public int getContactHeight()
61   {
62     return clist.getContactHeight();
63   }
64
65   @Override
66   public ContactRange getRangeFor(int from_column, int to_column)
67   {
68     // TODO: consider caching ContactRange for a particular call ?
69     if (clist instanceof ContactListI)
70     {
71       // clist may implement getRangeFor in a more efficient way, so use theirs
72       return ((ContactListI) clist).getRangeFor(from_column, to_column);
73     }
74     if (from_column < 0)
75     {
76       from_column = 0;
77     }
78     if (to_column >= getContactHeight())
79     {
80       to_column = getContactHeight() - 1;
81     }
82     ContactRange cr = new ContactRange();
83     cr.setFrom_column(from_column);
84     cr.setTo_column(to_column);
85     double tot = 0;
86     for (int i = from_column; i <= to_column; i++)
87     {
88       double contact = getContactAt(i);
89       tot += contact;
90       if (i == from_column)
91       {
92         cr.setMin(contact);
93         cr.setMax(contact);
94         cr.setMinPos(i);
95         cr.setMaxPos(i);
96       }
97       else
98       {
99         if (cr.getMax() < contact)
100         {
101           cr.setMax(contact);
102           cr.setMaxPos(i);
103         }
104         if (cr.getMin() < contact)
105         {
106           cr.setMin(contact);
107           cr.setMinPos(i);
108         }
109       }
110     }
111     if (tot > 0 && to_column > from_column)
112     {
113       cr.setMean(tot / (1 + to_column - from_column));
114     }
115     else
116     {
117       cr.setMean(tot);
118     }
119     return cr;
120   }
121
122   @Override
123   public int[] getMappedPositionsFor(int cStart, int cEnd)
124   {
125     return clist.getMappedPositionsFor(cStart, cEnd);
126   }
127
128   @Override
129   public Color getColourForGroup()
130   {
131     return clist.getColourForGroup();
132   }
133 }