plugins/base1/se.lu.onk/trunk/BaseFile_deprecated/src/basefile/BASEFileSpotSection.java

Code
Comments
Other
Rev Date Author Line
97 20 Apr 06 enell 1 /*
97 20 Apr 06 enell 2  * plugins
97 20 Apr 06 enell 3  * Copyright (C) 2006 Johan Enell
97 20 Apr 06 enell 4  * 
97 20 Apr 06 enell 5  * This program is free software; you can redistribute it and/or
97 20 Apr 06 enell 6  * modify it under the terms of the GNU General Public License
97 20 Apr 06 enell 7  * as published by the Free Software Foundation; either version 2
97 20 Apr 06 enell 8  * of the License, or (at your option) any later version.
97 20 Apr 06 enell 9  * 
97 20 Apr 06 enell 10  * This program is distributed in the hope that it will be useful,
97 20 Apr 06 enell 11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
97 20 Apr 06 enell 12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
97 20 Apr 06 enell 13  * GNU General Public License for more details.
97 20 Apr 06 enell 14  * 
97 20 Apr 06 enell 15  * You should have received a copy of the GNU General Public License
97 20 Apr 06 enell 16  * along with this program; if not, write to the Free Software
97 20 Apr 06 enell 17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
97 20 Apr 06 enell 18  */
97 20 Apr 06 enell 19 package basefile;
97 20 Apr 06 enell 20
97 20 Apr 06 enell 21 import java.util.ArrayList;
97 20 Apr 06 enell 22 import java.util.Arrays;
114 16 Jun 06 enell 23 import java.util.Collections;
103 01 Jun 06 enell 24 import java.util.Comparator;
103 01 Jun 06 enell 25 import java.util.Iterator;
97 20 Apr 06 enell 26 import java.util.List;
97 20 Apr 06 enell 27
248 28 Mar 07 enell 28 public class BASEFileSpotSection<R, S> extends BASEFileDataSection
97 20 Apr 06 enell 29 {
97 20 Apr 06 enell 30
250 30 Mar 07 enell 31   private final ArrayList<S> spotData = new ArrayList<S>();
250 30 Mar 07 enell 32   private final ArrayList<R> reporterData = new ArrayList<R>();
250 30 Mar 07 enell 33   
250 30 Mar 07 enell 34   public BASEFileSpotSection()
250 30 Mar 07 enell 35   {
250 30 Mar 07 enell 36     super("spots");
265 27 Apr 07 enell 37     this.setChannels(0);
265 27 Apr 07 enell 38     this.setAssayFields();
265 27 Apr 07 enell 39     this.setAssays();
250 30 Mar 07 enell 40   }
250 30 Mar 07 enell 41   
248 28 Mar 07 enell 42   public BASEFileSpotSection(BASEFileSection bfs) throws BASEFileException
97 20 Apr 06 enell 43   {
248 28 Mar 07 enell 44     super(bfs);
248 28 Mar 07 enell 45     if (!bfs.isType("spots"))
248 28 Mar 07 enell 46     {
248 28 Mar 07 enell 47       throw new BASEFileException("Section must be of type 'spots' to create an assay section.");
248 28 Mar 07 enell 48     }
250 30 Mar 07 enell 49     init();
97 20 Apr 06 enell 50   }
247 27 Mar 07 enell 51   
247 27 Mar 07 enell 52   @Deprecated
247 27 Mar 07 enell 53   public BASEFileSpotSection(int height, int width)
97 20 Apr 06 enell 54   {
250 30 Mar 07 enell 55     this();
97 20 Apr 06 enell 56     this.height = height;
97 20 Apr 06 enell 57     this.width = width;
97 20 Apr 06 enell 58   }
97 20 Apr 06 enell 59   
247 27 Mar 07 enell 60   @Deprecated
247 27 Mar 07 enell 61   public final void setDataMatrix(int height, int width)
247 27 Mar 07 enell 62   {
248 28 Mar 07 enell 63     this.height = height;
248 28 Mar 07 enell 64     this.width = width;
248 28 Mar 07 enell 65     this.spotData.ensureCapacity(height*width);
248 28 Mar 07 enell 66     this.reporterData.ensureCapacity(height);
247 27 Mar 07 enell 67   }
247 27 Mar 07 enell 68   
103 01 Jun 06 enell 69   public void sortSpot(Comparator<S> comparator)
103 01 Jun 06 enell 70   {
114 16 Jun 06 enell 71     Collections.sort(spotData, comparator);
103 01 Jun 06 enell 72   }
131 09 Aug 06 enell 73
131 09 Aug 06 enell 74   public void sortReporter(Comparator<R> comparator)
131 09 Aug 06 enell 75   {
131 09 Aug 06 enell 76     Collections.sort(reporterData, comparator);
131 09 Aug 06 enell 77   }
103 01 Jun 06 enell 78   
103 01 Jun 06 enell 79   public Iterator<S> spotIterator()
103 01 Jun 06 enell 80   {
103 01 Jun 06 enell 81     return spotData.iterator();
103 01 Jun 06 enell 82   }
250 30 Mar 07 enell 83   
250 30 Mar 07 enell 84   @SuppressWarnings("unchecked")
250 30 Mar 07 enell 85   @Override
250 30 Mar 07 enell 86   public void addData(Object... data)
250 30 Mar 07 enell 87     throws BASEFileException
250 30 Mar 07 enell 88   {
250 30 Mar 07 enell 89     super.addData(data);
250 30 Mar 07 enell 90     if (data.length < 2)
250 30 Mar 07 enell 91     {
250 30 Mar 07 enell 92       throw new BASEFileException("Must have at least two objects to add");
250 30 Mar 07 enell 93     }
250 30 Mar 07 enell 94     S[] spots = (S[]) new Object[data.length - 1];
250 30 Mar 07 enell 95     System.arraycopy(data, 1, spots, 0, spots.length);
250 30 Mar 07 enell 96     reporterData.add((R) data[0]);
250 30 Mar 07 enell 97     spotData.addAll(Arrays.asList(spots));
250 30 Mar 07 enell 98   }
103 01 Jun 06 enell 99
250 30 Mar 07 enell 100   public void addData(R reporter, S... spots) throws BASEFileException
97 20 Apr 06 enell 101   {
250 30 Mar 07 enell 102     Object[] data = new Object[spots.length + 1];
250 30 Mar 07 enell 103     data[0] = reporter;
250 30 Mar 07 enell 104     System.arraycopy(spots, 0, data, 1, spots.length);
250 30 Mar 07 enell 105     addData(data);
97 20 Apr 06 enell 106   }
97 20 Apr 06 enell 107   
97 20 Apr 06 enell 108   public void set(int i, R reporter, S... spots)
97 20 Apr 06 enell 109   {
97 20 Apr 06 enell 110     if (spotData == null || reporterData == null) return;
97 20 Apr 06 enell 111     if (spots.length != width) return;
97 20 Apr 06 enell 112     reporterData.set(i, reporter);
97 20 Apr 06 enell 113     i = i * width;
97 20 Apr 06 enell 114     for (S s : spots)
97 20 Apr 06 enell 115     {
97 20 Apr 06 enell 116       spotData.set(i++, s);
97 20 Apr 06 enell 117     }
97 20 Apr 06 enell 118   }
97 20 Apr 06 enell 119   
97 20 Apr 06 enell 120   public S setSpot(R reporter, int i, S spot)
97 20 Apr 06 enell 121   {
97 20 Apr 06 enell 122     if (spotData == null) return null;
97 20 Apr 06 enell 123     if (i >= width) return null;
97 20 Apr 06 enell 124     i = reporterData.indexOf(reporter) + i;
97 20 Apr 06 enell 125     return spotData.set(i, spot);
97 20 Apr 06 enell 126   }
97 20 Apr 06 enell 127   
97 20 Apr 06 enell 128   public R setReporter(int i, R reporter)
97 20 Apr 06 enell 129   {
97 20 Apr 06 enell 130     if (reporterData == null) return null;
97 20 Apr 06 enell 131     return reporterData.set(i, reporter);
97 20 Apr 06 enell 132   }
97 20 Apr 06 enell 133
250 30 Mar 07 enell 134   public List<Integer> getAssays()
97 20 Apr 06 enell 135   {
97 20 Apr 06 enell 136     return this.findFieldIntList("assays");
97 20 Apr 06 enell 137   }
97 20 Apr 06 enell 138
248 28 Mar 07 enell 139   public int getAssaysColIndex(String col) throws BASEFileException
248 28 Mar 07 enell 140   {
248 28 Mar 07 enell 141     return this.getColIndex("assays", col);
248 28 Mar 07 enell 142   }
248 28 Mar 07 enell 143
250 30 Mar 07 enell 144   public List<String> getAssayFields()
97 20 Apr 06 enell 145   {
97 20 Apr 06 enell 146     return this.findFieldList("assayFields");
97 20 Apr 06 enell 147   }
248 28 Mar 07 enell 148
248 28 Mar 07 enell 149   public int getAssayFieldsColIndex(String col) throws BASEFileException
248 28 Mar 07 enell 150   {
248 28 Mar 07 enell 151     return this.getColIndex("assayFields", col);
248 28 Mar 07 enell 152   }
97 20 Apr 06 enell 153   
97 20 Apr 06 enell 154   public boolean isValid()
97 20 Apr 06 enell 155   {
250 30 Mar 07 enell 156     if (getColumns() == null) return false;
250 30 Mar 07 enell 157     if (getAssayFields() == null) return false;
250 30 Mar 07 enell 158     if (getAssays() == null) return false;
97 20 Apr 06 enell 159     return true;
97 20 Apr 06 enell 160   }
97 20 Apr 06 enell 161
104 01 Jun 06 enell 162   public R getReporter(int i)
104 01 Jun 06 enell 163   {
104 01 Jun 06 enell 164     return reporterData.get(i);
104 01 Jun 06 enell 165   }
104 01 Jun 06 enell 166
104 01 Jun 06 enell 167   public S getSpot(int i)
104 01 Jun 06 enell 168   {
104 01 Jun 06 enell 169     return spotData.get(i);
104 01 Jun 06 enell 170   }
253 10 Apr 07 enell 171   
253 10 Apr 07 enell 172   public S getSpot(int x, int y)
253 10 Apr 07 enell 173   {
253 10 Apr 07 enell 174     return getSpot(y * getWidth() + x);
253 10 Apr 07 enell 175   }
136 10 Aug 06 enell 176
113 14 Jun 06 enell 177   public List<S> spotSubList(int fromIndex, int toIndex)
113 14 Jun 06 enell 178   {
113 14 Jun 06 enell 179     return spotData.subList(fromIndex, toIndex);
113 14 Jun 06 enell 180   }
103 01 Jun 06 enell 181
136 10 Aug 06 enell 182   public List<R> reporterSubList(int fromIndex, int toIndex)
136 10 Aug 06 enell 183   {
136 10 Aug 06 enell 184     return reporterData.subList(fromIndex, toIndex);
136 10 Aug 06 enell 185   }
136 10 Aug 06 enell 186   
114 16 Jun 06 enell 187   public int getSpotSize()
103 01 Jun 06 enell 188   {
114 16 Jun 06 enell 189     return spotData.size();
103 01 Jun 06 enell 190   }
136 10 Aug 06 enell 191
136 10 Aug 06 enell 192   public int getReporterSize()
136 10 Aug 06 enell 193   {
136 10 Aug 06 enell 194     return reporterData.size();
136 10 Aug 06 enell 195   }
248 28 Mar 07 enell 196
250 30 Mar 07 enell 197   public final int getChannels()
250 30 Mar 07 enell 198   {
250 30 Mar 07 enell 199     return findIntOpt("channels");
250 30 Mar 07 enell 200   }
250 30 Mar 07 enell 201   
250 30 Mar 07 enell 202   public final String setChannels(int channels)
250 30 Mar 07 enell 203   {
250 30 Mar 07 enell 204     return setHeader("channels", channels);
250 30 Mar 07 enell 205   }
250 30 Mar 07 enell 206
250 30 Mar 07 enell 207   public final String setExtraFloats(Object... values)
250 30 Mar 07 enell 208   {
250 30 Mar 07 enell 209     return setHeader("setExtraFloats", values);
250 30 Mar 07 enell 210   }
250 30 Mar 07 enell 211
250 30 Mar 07 enell 212   public final String setAssayFields(Object... values)
250 30 Mar 07 enell 213   {
250 30 Mar 07 enell 214     return setHeader("assayFields", values);
250 30 Mar 07 enell 215   }
250 30 Mar 07 enell 216
250 30 Mar 07 enell 217   public final String setAssays(Integer... values)
250 30 Mar 07 enell 218   {
250 30 Mar 07 enell 219     return setHeader("assays", (Object[]) values);
250 30 Mar 07 enell 220   }
250 30 Mar 07 enell 221
248 28 Mar 07 enell 222   @Override
248 28 Mar 07 enell 223   public int getDataLineLength()
248 28 Mar 07 enell 224   {
250 30 Mar 07 enell 225     int length = this.getColumns().size() -1;
250 30 Mar 07 enell 226     length += this.getAssayFields().size() * this.getAssays().size();
248 28 Mar 07 enell 227     return length;
248 28 Mar 07 enell 228   }
250 30 Mar 07 enell 229
250 30 Mar 07 enell 230   @Override
250 30 Mar 07 enell 231   public String getDataLine(int i)
250 30 Mar 07 enell 232   {
253 10 Apr 07 enell 233     String line = getReporter(i).toString();
253 10 Apr 07 enell 234     for (int j = 0; j < getWidth(); ++j)
253 10 Apr 07 enell 235     {
253 10 Apr 07 enell 236       line += "\t"+getSpot(i, j);
253 10 Apr 07 enell 237     }
253 10 Apr 07 enell 238     return line;
250 30 Mar 07 enell 239   }
250 30 Mar 07 enell 240
250 30 Mar 07 enell 241   @Override
250 30 Mar 07 enell 242   protected void init() throws BASEFileException
250 30 Mar 07 enell 243   {
250 30 Mar 07 enell 244     super.init();
250 30 Mar 07 enell 245     setHeight(getCount());
250 30 Mar 07 enell 246     setWidth(getAssays().size());
250 30 Mar 07 enell 247     spotData.ensureCapacity(getHeight()*getWidth());
250 30 Mar 07 enell 248     reporterData.ensureCapacity(getHeight());
250 30 Mar 07 enell 249   }
250 30 Mar 07 enell 250
250 30 Mar 07 enell 251   @Override
250 30 Mar 07 enell 252   public void validate() throws BASEFileException
250 30 Mar 07 enell 253   {
250 30 Mar 07 enell 254     super.validate();
250 30 Mar 07 enell 255     if (getHeader("channels") == null) throw new BadSectionException("Data section must contain channels header");
250 30 Mar 07 enell 256     if (getHeader("assays") == null) throw new BadSectionException("Data section must contain assays header");
250 30 Mar 07 enell 257     if (getHeader("assayFields") == null) throw new BadSectionException("Data section must contain assayFields header");
250 30 Mar 07 enell 258     if (getHeader("columns") == null) throw new BadSectionException("Data section must contain columns header");
250 30 Mar 07 enell 259     if (getHeader("setExtraFloats") != null)
250 30 Mar 07 enell 260     {
250 30 Mar 07 enell 261       List<String> assayFields = getAssayFields();
250 30 Mar 07 enell 262       for (String s : findFieldList("setExtraFloats"))
250 30 Mar 07 enell 263       {
250 30 Mar 07 enell 264         if (!assayFields.contains(s))
250 30 Mar 07 enell 265         {
250 30 Mar 07 enell 266           throw new BadSectionException("Header assayFields must contain "+s);
250 30 Mar 07 enell 267         }
250 30 Mar 07 enell 268       }
250 30 Mar 07 enell 269     }
250 30 Mar 07 enell 270     if (getReporterSize() != getHeight()) throw new BadSectionException("The size of the reporter list and height doesn't match");
250 30 Mar 07 enell 271     if (getSpotSize() != getHeight()*getWidth()) throw new BadSectionException("The size of the spot list and height*width doesn't match");
250 30 Mar 07 enell 272   }
97 20 Apr 06 enell 273 }