561048eb144bff37c82de94d9536a6a5a0998208
[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   public static ContactListI newContactList(ContactListProviderI list)
14   {
15     return new ContactListImpl(list);
16   }
17
18   public ContactListImpl(ContactListProviderI list)
19   {
20     clist = list;
21   }
22
23   @Override
24   public double getContactAt(int column)
25   {
26     return clist.getContactAt(column);
27   }
28
29   @Override
30   public int getContactHeight()
31   {
32     return clist.getContactHeight();
33   }
34
35   @Override
36   public ContactRange getRangeFor(int from_column, int to_column)
37   {
38     if (clist instanceof ContactListI)
39     {
40       // clist may implement getRangeFor in a more efficient way, so use theirs
41       return ((ContactListI) clist).getRangeFor(from_column, to_column);
42     }
43     if (from_column < 0)
44     {
45       from_column = 0;
46     }
47     if (to_column > getContactHeight())
48     {
49       to_column = getContactHeight();
50     }
51     ContactRange cr = new ContactRange();
52     cr.setFrom_column(from_column);
53     cr.setTo_column(to_column);
54     double tot = 0;
55     for (int i = from_column; i <= to_column; i++)
56     {
57       double contact = getContactAt(i);
58       tot += contact;
59       if (i == from_column)
60       {
61         cr.setMin(contact);
62         cr.setMax(contact);
63         cr.setMinPos(i);
64         cr.setMaxPos(i);
65       }
66       else
67       {
68         if (cr.getMax() < contact)
69         {
70           cr.setMax(contact);
71           cr.setMaxPos(i);
72         }
73         if (cr.getMin() < contact)
74         {
75           cr.setMin(contact);
76           cr.setMinPos(i);
77         }
78       }
79     }
80     if (tot > 0)
81     {
82       cr.setMean(tot / (1 + to_column - from_column));
83     }
84     else
85     {
86       cr.setMean(tot);
87     }
88     return cr;
89   }
90
91 }