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