6eb4cdb301afe4680b4015ef4b4cefbd3a0927c2
[jalview.git] / src / jalview / datamodel / ContactListImpl.java
1 package jalview.datamodel;
2
3 /**
4  * helper class to compute min/max/mean for a range on a contact list
5  * 
6  * @author jprocter
7  *
8  */
9 public class ContactListImpl implements ContactListI
10 {
11   ContactListProviderI clist;
12
13
14   public static ContactListI newContactList(ContactListProviderI list)
15   {
16     return new ContactListImpl(list);
17   }
18
19   public ContactListImpl(ContactListProviderI list)
20   {
21     clist = list;
22   }
23
24   @Override
25   public double getContactAt(int column)
26   {
27     return clist.getContactAt(column);
28   }
29
30   @Override
31   public int getContactHeight()
32   {
33     return clist.getContactHeight();
34   }
35
36   @Override
37   public ContactRange getRangeFor(int from_column, int to_column)
38   {
39     if (clist instanceof ContactListI)
40     {
41       // clist may implement getRangeFor in a more efficient way, so use theirs
42       return ((ContactListI) clist).getRangeFor(from_column, to_column);
43     }
44     if (from_column < 0)
45     {
46       from_column = 0;
47     }
48     if (to_column > getContactHeight())
49     {
50       to_column = getContactHeight();
51     }
52     ContactRange cr = new ContactRange();
53     cr.setFrom_column(from_column);
54     cr.setTo_column(to_column);
55     double tot = 0;
56     for (int i = from_column; i < to_column; i++)
57     {
58       double contact = getContactAt(i);
59       tot += contact;
60       if (i == from_column)
61       {
62         cr.setMin(contact);
63         cr.setMax(contact);
64         cr.setMinPos(i);
65         cr.setMaxPos(i);
66       }
67       else
68       {
69         if (cr.getMax() < contact)
70         {
71           cr.setMax(contact);
72           cr.setMaxPos(i);
73         }
74         if (cr.getMin() < contact)
75         {
76           cr.setMin(contact);
77           cr.setMinPos(i);
78         }
79       }
80     }
81     if (tot > 0)
82     {
83       cr.setMean(tot / (to_column - from_column));
84     }
85     else
86     {
87       cr.setMean(tot);
88     }
89     return cr;
90   }
91
92 }