Changeset 1141


Ignore:
Timestamp:
Jun 24, 2009, 2:07:08 PM (13 years ago)
Author:
Martin Svensson
Message:

References #180 The work with the plotting extension is now finished and should only be documented before this ticket is done.

Location:
plugins/base2/net.sf.basedb.illumina/trunk
Files:
2 deleted
4 edited

Legend:

Unmodified
Added
Removed
  • plugins/base2/net.sf.basedb.illumina/trunk/META-INF/extensions.xml

    r1135 r1141  
    3737      <factory-class>net.sf.basedb.illumina.extensions.plot.PlotFactory</factory-class>
    3838      <parameters>
    39         <width>1000</width>
    40         <height>700</height>       
     39        <width>800</width>
     40        <height>600</height>       
    4141      </parameters>
    4242    </action-factory>
  • plugins/base2/net.sf.basedb.illumina/trunk/META-INF/servlets.xml

    r1135 r1141  
    2626        <servlet-class>net.sf.basedb.illumina.servlet.IlluminaPlotServlet</servlet-class> 
    2727    <init-param>
    28       <param-name>maxWidth</param-name>
    29       <param-value>1000</param-value>
    30     </init-param>
    31     <init-param>
    32       <param-name>maxHeight</param-name>
    33       <param-value>800</param-value>
    34     </init-param>
    35     <init-param>
    36       <param-name>defaultWidth</param-name>
    37       <param-value>600</param-value>
    38     </init-param>
    39     <init-param>
    40       <param-name>defaultHeight</param-name>
    41       <param-value>400</param-value>
    42     </init-param>
    43     <init-param>
    4428      <param-name>defaultFormat</param-name>
    4529      <param-value>png</param-value>
  • plugins/base2/net.sf.basedb.illumina/trunk/src/net/sf/basedb/illumina/extensions/plot/PlotFactory.java

    r1135 r1141  
    2929import net.sf.basedb.clients.web.extensions.plot.PlotGenerator;
    3030import net.sf.basedb.clients.web.extensions.plot.PlotGeneratorBean;
    31 import net.sf.basedb.clients.web.util.HTML;
    3231import net.sf.basedb.core.BioAssaySet;
     32import net.sf.basedb.illumina.Illumina;
    3333import net.sf.basedb.illumina.servlet.IlluminaPlotServlet;
    3434import net.sf.basedb.util.Values;
     
    3737import net.sf.basedb.util.extensions.xml.VariableSetter;
    3838
    39 import java.util.ArrayList;
    40 import java.util.List;
    41 
    4239
    4340/**
    44   Factory for generating plots for Illumina Exression data.
     41  Factory for generating plots for Illumina bead summary data.
    4542  Plots will only be generated if the bioassay set has any
    4643  data stored in the database.
    4744  <p>
    4845  The image generation
    49   is handled by the standard plot servlet: {@link IlluminaPlotServlet}.
     46  is handled by the illumina plot servlet: {@link IlluminaPlotServlet}.
    5047 
    5148  @version 1.4
     
    5855
    5956  private String servletPath = null;
    60   private int width = 1200;
     57  private int width = 800;
    6158  private int height = 600;
    6259
     
    6865  {
    6966    BioAssaySet bas = (BioAssaySet)context.getClientContext().getCurrentItem();
    70     if (bas.getNumSpots() <= 0) return false;   
    71     if (bas.getRawDataType().getChannels() != 1) return false;   
     67    if (bas.getNumSpots() <= 0) return false;
     68    if (!bas.getRawDataType().equals(Illumina.getBeadSummaryType())) return false;   
    7269    return super.prepareContext(context);
    7370  }
     
    8279  public void setWidth(String width)
    8380  {
    84     this.width = Values.getInt(width, 400);
     81    this.width = Values.getInt(width, 800);
    8582  }
    8683 
    8784  public void setHeight(String height)
    8885  {
    89     this.height = Values.getInt(height, 300);
     86    this.height = Values.getInt(height, 600);
    9087  }
    9188
     
    9693    // Get context information
    9794    String ID = context.getClientContext().getSessionControl().getId();
    98     //DbControl dc = context.getClientContext().getDbControl();
     95    String servletName = "net.sf.basedb.illumina.extensions.overviewplots.illuminaPlots";
     96    servletPath = servletPath == null ?
     97        ExtensionsControl.getHomeUrl(servletName) + "/illuminaPlot.servlet" :
     98        servletPath;
    9999    BioAssaySet source = (BioAssaySet)context.getClientContext().getCurrentItem();
    100100    OverviewPlotAction[] actions = new OverviewPlotAction[1];
    101    
    102     // Control summary plot
    103     OverviewPlotBean overviewBean = new OverviewPlotBean();   
    104     overviewBean.setTitle("Control summary plots");
    105     overviewBean.setDescription("Control summary plots for this bioassay set.");
    106     overviewBean.setId("illuminaplots");
    107    
    108     List<String>  filters = new ArrayList<String>(2);
    109 //    filters.add(HTML.urlEncode("rep('controlGroupId') == '%:pm%'"));
    110 //    filters.add(HTML.urlEncode("rep('controlGroupId') == '%housekeeping%'"));
    111    
    112     List<String> series = new ArrayList<String> (2);
    113 //    series.add(HTML.urlEncode("Perfect match"));
    114 //    series.add(HTML.urlEncode("House keeping"));
    115    
    116     String columnFormula = HTML.urlEncode("raw('mean')");
    117 
    118     PlotGenerator[] plotGenerators = new PlotGenerator[1];
    119     overviewBean.setPlotGenerators(plotGenerators);
    120 
    121     actions[0] = overviewBean;   
    122101       
    123     // Generate plot url
    124     String xLabel = HTML.urlEncode("Raw bioassay");
    125     String yLabel = HTML.urlEncode("Signal");
    126    
    127102    StringBuilder urlString = new StringBuilder();
    128    
    129     servletPath = servletPath == null ? ExtensionsControl.getHomeUrl("net.sf.basedb.illumina.extensions.overviewplots.illuminaPlots") + "/illuminaPlot.servlet" : servletPath;
    130103    urlString.append(servletPath + "?ID=" + ID );
    131     urlString.append("&bioassayset_id=" + source.getId());       
    132     urlString.append("&width="+width+"&height=" + height);   
     104    urlString.append("&bioassayset_id=" + source.getId()); 
     105    urlString.append("&cache=overview/bioassayset." + source.getId() + "/controlsummaryplot.png");
    133106   
    134107    PlotGeneratorBean overviewPlot = new PlotGeneratorBean();
     
    136109    overviewPlot.setWidth(width);
    137110    overviewPlot.setHeight(height);
    138     overviewPlot.setTitle("Control summary plot");
     111    overviewPlot.setTitle("Controls summary plot");
    139112    overviewPlot.setUrl(urlString.toString());
    140        
    141     plotGenerators[0] = overviewPlot;   
     113   
     114    // Control summary plot
     115    OverviewPlotBean overviewBean = new OverviewPlotBean();   
     116    overviewBean.setTitle("Controls summary plot");
     117    overviewBean.setDescription("Controls summary plot for this bioassay set.");
     118    overviewBean.setId("illuminaPlot");
     119
     120    PlotGenerator[] plotGenerators = new PlotGenerator[]{overviewPlot};
     121    overviewBean.setPlotGenerators(plotGenerators);
     122    actions[0] = overviewBean;   
    142123       
    143124    return actions;
  • plugins/base2/net.sf.basedb.illumina/trunk/src/net/sf/basedb/illumina/servlet/IlluminaPlotServlet.java

    r1135 r1141  
    2323package net.sf.basedb.illumina.servlet;
    2424
    25 import net.sf.basedb.clients.web.util.HTML;
    2625import net.sf.basedb.core.Application;
    2726import net.sf.basedb.core.BioAssay;
     
    3029import net.sf.basedb.core.DynamicResultIterator;
    3130import net.sf.basedb.core.DynamicSpotQuery;
    32 import net.sf.basedb.core.File;
    33 import net.sf.basedb.core.ItemAlreadyExistsException;
    3431import net.sf.basedb.core.ItemQuery;
    35 import net.sf.basedb.core.Path;
    3632import net.sf.basedb.core.SessionControl;
    3733import net.sf.basedb.core.query.Dynamic;
     
    5753import java.io.InputStream;
    5854import java.io.OutputStream;
    59 import java.sql.SQLException;
    6055import java.util.ArrayList;
    6156import java.util.List;
     
    7570import org.jfree.chart.labels.StandardCategoryToolTipGenerator;
    7671import org.jfree.chart.plot.CategoryPlot;
    77 import org.jfree.chart.plot.CombinedDomainCategoryPlot;
    7872import org.jfree.chart.renderer.category.CategoryItemRenderer;
    7973import org.jfree.chart.renderer.category.LineAndShapeRenderer;
     
    8377
    8478/**
     79  This servlet can plot the controls summary for a Illumina bioassay set.
     80  The generated plot contains one dataset for perfectmatch report and
     81  one dataset for housekeeping report.
     82  It uses the JFreePlot package to generate the plots.
     83  This servlet accepts the following parameters:
     84 
     85  <table border="1" cellspacing="0" cellpadding="2">
     86  <tr>
     87    <th>Parameter</th>
     88    <th>Required</th>
     89    <th>Default value</th>
     90    <th>Description</th>
     91  </tr>
     92 
     93  <tr>
     94    <td>ID</td>
     95    <td>yes</td>
     96    <td></td>
     97    <td>The SessionControl ID. See {@link Application#getSessionControl(String, String)}.</td>
     98  </tr>
     99 
     100  <tr>
     101    <td>bioassayset_id</td>
     102    <td>yes</td>
     103    <td></td>
     104    <td>The ID of the bioassay set to plot.</td>
     105  </tr>
     106 
     107  <tr>
     108    <td>format</td>
     109    <td>no</td>
     110    <td>png</td>
     111    <td>
     112      The format of the image, "png" and "jpg" are the only supported values.
     113    </td>
     114  </tr>
     115 
     116  <tr>
     117    <td>cacheBase</td>
     118    <td>no</td>
     119    <td>plots/</td>
     120    <td>The base-directory where cached images should be stored.</td       
     121  </tr>
    85122 
    86123    @author martin
     
    91128  extends HttpServlet
    92129{
    93   /**
    94      
    95   */
    96   private int maxWidth = 1000;
    97   private int maxHeight = 800;
    98   private int defaultWidth = 600;
    99   private int defaultHeight = 400;
     130  private static final long serialVersionUID = -2969496770778710927L;
     131 
     132  private int width = 800;
     133  private int height = 600;
    100134  private String defaultFormat = "png";
    101135  private String cacheBase = "plots/";
     
    106140  {
    107141    ServletConfig cfg = getServletConfig();
    108     maxWidth = Values.getInt(cfg.getInitParameter("maxWidth"), maxWidth);
    109     maxHeight = Values.getInt(cfg.getInitParameter("maxHeight"), maxHeight);
    110     defaultWidth = Values.getInt(cfg.getInitParameter("defaultWidth"), defaultWidth);
    111     defaultHeight = Values.getInt(cfg.getInitParameter("defaultHeight"), defaultHeight);
    112142    defaultFormat = Values.getString(cfg.getInitParameter("defaultFormat"), defaultFormat);
    113143    cacheBase = Values.getString(cfg.getInitParameter("cacheBase"), cacheBase);
     
    115145 
    116146  @Override
    117   @SuppressWarnings("unchecked")
    118147  public void doGet(HttpServletRequest request, HttpServletResponse response)
    119148    throws IOException, ServletException
     
    122151   
    123152    // Where to get the source data
    124     final int bioAssaySetId = Values.getInt(request.getParameter("bioassayset_id"));
    125     //final String type = Values.getString(request.getParameter("type"), "histogram");
     153    final int bioAssaySetId = Values.getInt(request.getParameter("bioassayset_id"));   
    126154    String cacheKey = Values.getStringOrNull(request.getParameter("cache"));
    127  
    128     // Where to deliver the image
    129     final boolean download = Values.getBoolean(request.getParameter("download"));
    130     final String saveAs = Values.getStringOrNull(request.getParameter("saveAs"));
    131     final boolean overwrite = Values.getBoolean(request.getParameter("overwrite"));
    132  
    133     // Image settings, width, height and format
    134     int width = Values.getInt(request.getParameter("width"), defaultWidth);
    135     if (width <= 100) width = defaultWidth;
    136     if (width > maxWidth) width = maxWidth;
    137     int height = Values.getInt(request.getParameter("height"), defaultHeight);
    138     if (height <= 100) height = defaultHeight;
    139     if (height > maxHeight) height = maxHeight;
     155   
     156    // Image settings and format
    140157    String format = Values.getString(request.getParameter("format"), defaultFormat);
    141158    if (!format.equals("jpeg") && !format.equals("png"))
     
    145162   
    146163    // Axis, legends and titles
    147     String title = Values.getStringOrNull(request.getParameter("title"));
    148     String subTitle = Values.getStringOrNull(request.getParameter("subTitle"));   
     164    String title = "Controls summary";
     165    String subTitle = null;   
    149166     
    150167    StaticCache cache = Application.getStaticCache();
     
    155172    DbControl dc = null;
    156173    boolean wasError = false;
     174   
     175    // Get the cached image
    157176    try
    158177    {
     
    175194          final SessionControl sc = Application.getSessionControl(ID, request.getRemoteAddr());
    176195          dc = sc.newDbControl();
    177          
    178           BioAssaySet bas = BioAssaySet.getById(dc, bioAssaySetId);
    179           ItemQuery<BioAssay> bioassayQuery = bas.getBioAssays();
    180          
    181           // Prepare chart and datasets
    182           JFreeChart chart = null;
    183           DefaultCategoryDataset pmDataset = new DefaultCategoryDataset();
    184           DefaultCategoryDataset houseKeepingDataset = new DefaultCategoryDataset();
    185196         
    186197          String perfectMatch = ":pm";
     
    189200          String meanColumn = "mean";
    190201         
     202          // Prepare chart and datasets         
     203          DefaultCategoryDataset pmDataset = new DefaultCategoryDataset();
     204          DefaultCategoryDataset houseKeepingDataset = new DefaultCategoryDataset();
     205                   
     206          BioAssaySet bas = BioAssaySet.getById(dc, bioAssaySetId);
     207          ItemQuery<BioAssay> bioassayQuery = bas.getBioAssays();
     208          subTitle = bas.getName();
     209         
     210          // Prepare filter restrictions and select expression
    191211          Restriction pmRestriction = Restrictions.like(Dynamic.reporter(restrictionColumn), Expressions.string("%"+perfectMatch+"%"));
    192212          Restriction hkRestriction = Restrictions.like(Dynamic.reporter(restrictionColumn), Expressions.string("%"+houseKeeping+"%"));
     
    194214          Expression yExpression = Dynamic.rawData("mean");
    195215         
    196           List<BioAssay> bioassays = bioassayQuery.list(dc);
    197 //          if (bioassays.size() > 6 && bioassays.size() <= 12) width = bioassays.size() * 100;
    198 //          else if (bioassays.size() > 12
     216          // Get plot data for each bioassay
     217          List<BioAssay> bioassays = bioassayQuery.list(dc);
    199218          for (BioAssay ba : bioassays)
    200219          {
     
    209228            query.select(Selects.expression(Dynamic.reporter("controlGroupId"), restrictionColumn));
    210229           
    211             // Work through the iteration result to get the wanted values to plot
     230            // Work through the iteration result to get the wanted plot values
    212231            DynamicResultIterator result = query.iterate(dc);           
    213232            int cgiIndex = result.getIndex(restrictionColumn);
     
    225244              }
    226245            }
     246            // Calculate the mean for each filtered data list and add it to corresponding dataset.
    227247            pmDataset.addValue(Statistics.calculateMean(perfectMatchSpots), "Perfect match", ba.getName());
    228248            houseKeepingDataset.addValue(Statistics.calculateMean(houseKeepingSpots), "Housekeeping", ba.getName());
    229249          }
    230250         
     251          // Configure chart settings and create plot-image
     252          CategoryItemRenderer renderer1 = new LineAndShapeRenderer();
     253          CategoryItemRenderer renderer2 = new LineAndShapeRenderer();
    231254          NumberAxis axis = new NumberAxis("Signal");
    232255          axis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
    233           final CategoryItemRenderer renderer1 = new LineAndShapeRenderer();
    234           final CategoryItemRenderer renderer2 = new LineAndShapeRenderer();
     256          axis.setLabelFont(new Font("SansSerif", Font.BOLD, 14));         
    235257         
    236258          renderer1.setSeriesPaint(0, Color.red);
     
    238260              renderer1.setBaseToolTipGenerator(new StandardCategoryToolTipGenerator());
    239261             
    240               CategoryPlot subplot1 = new CategoryPlot(pmDataset, null, axis, renderer1);
    241               subplot1.setRenderer(0, renderer1);
     262              CategoryAxis domainAxis = new CategoryAxis("Bioassays");
     263              domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
     264              domainAxis.setLabelFont(new Font("SansSerif", Font.BOLD, 14));
     265              CategoryPlot subplot1 = new CategoryPlot(pmDataset, domainAxis, axis, renderer1);             
    242266              subplot1.setRenderer(1, renderer2);
    243267              subplot1.setDataset(1, houseKeepingDataset);
    244          
    245               final CategoryAxis domainAxis = new CategoryAxis("Raw bioassays");
    246               domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
    247               final CombinedDomainCategoryPlot plot = new CombinedDomainCategoryPlot(domainAxis);
    248 
    249               plot.add(subplot1, 1);             
    250              
    251               chart = new JFreeChart(
     268              subplot1.setDomainGridlinesVisible(true);
     269             
     270              JFreeChart chart = new JFreeChart(
    252271                      null, new Font("SansSerif", Font.BOLD, 12),
    253                       plot, true);
     272                      subplot1, true);
    254273          if (title != null) chart.setTitle(title);
    255274         
    256           if (subTitle != null) chart.addSubtitle(new TextTitle(subTitle));
     275          chart.addSubtitle(new TextTitle(subTitle));
    257276          image = chart.createBufferedImage(width, height);
    258         }
    259        
    260         // Store the image in the BASE file system
    261         if (saveAs != null)
    262         {
    263           Path path = new Path(saveAs, Path.Type.FILE);
    264           File f = File.getByPath(dc, path, true);
    265           f.setMimeType("image/"+format);
    266          
    267           if (f.isInDatabase())
    268           {
    269             if (!overwrite) throw new ItemAlreadyExistsException("File[path="+saveAs+"]");
    270           }
    271           else
    272           {
    273             dc.saveItem(f);
    274           }
    275           OutputStream out = f.getUploadStream(false);
    276           if (cachedImageIn != null)
    277           {
    278             FileUtil.copy(cachedImageIn, out);
    279             cachedImageIn.close();
    280             cachedImageIn = null;
    281           }
    282           else if (image != null)
    283           {
    284             if (cacheKey != null) cachedImageOut = cache.write(cacheKey, 100);
    285             if (cachedImageOut != null)
    286             {
    287               out = new TeeOutputStream(cachedImageOut, out);
    288             }
    289             ImageIO.write(image, format, out);
    290           }
    291           out.flush();
    292           out.close();
    293           dc.commit();
    294           image = null;
    295           cachedImageOut = null;
    296         }
     277        }       
    297278      }
    298279      catch (Throwable t)
     
    300281        wasError = true;
    301282        t.printStackTrace();
    302         if (saveAs == null)
    303         {
    304           // Generate error image
    305           try
     283        // Generate error image
     284        try
     285        {
     286          BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
     287          Graphics2D graphics = img.createGraphics();
     288          graphics.setBackground(Color.WHITE);
     289          graphics.clearRect(0, 0, width, height);
     290          graphics.setColor(Color.RED);
     291          FontRenderContext context = graphics.getFontRenderContext();
     292
     293          Font topFont = new Font("SansSerif", Font.BOLD, 12);
     294          Font stackTraceFont = new Font("SansSerif", Font.PLAIN, 12);
     295
     296          float x = .0f;
     297          float y = .0f;
     298          String causedBy = "";
     299          do
    306300          {
    307             BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    308             Graphics2D graphics = img.createGraphics();
    309             graphics.setBackground(Color.WHITE);
    310             graphics.clearRect(0, 0, width, height);
    311             graphics.setColor(Color.RED);
    312             FontRenderContext context = graphics.getFontRenderContext();
    313  
    314             Font topFont = new Font("SansSerif", Font.BOLD, 12);
    315             Font stackTraceFont = new Font("SansSerif", Font.PLAIN, 12);
    316  
    317             float x = .0f;
    318             float y = .0f;
    319             String causedBy = "";
    320             do
     301            graphics.setFont(topFont);
     302            String msg = causedBy + t.getClass().getSimpleName() + ": " + t.getMessage();
     303            x = 5.0f;
     304            Rectangle2D bounds = topFont.getStringBounds(msg, context);
     305            y += bounds.getHeight()+5;
     306            if (bounds.getWidth() > width - x)
    321307            {
    322               graphics.setFont(topFont);
    323               String msg = causedBy + t.getClass().getSimpleName() + ": " + t.getMessage();
    324               x = 5.0f;
    325               Rectangle2D bounds = topFont.getStringBounds(msg, context);
    326               y += bounds.getHeight()+5;
     308              msg = cutMiddle(msg, (width - x) / bounds.getWidth());
     309            }
     310            graphics.drawString(msg, x, y);
     311           
     312            graphics.setFont(stackTraceFont);
     313            x = 15.0f;
     314            for (StackTraceElement st : t.getStackTrace())
     315            {
     316              msg = "at " + st.getClassName() + "." + st.getMethodName() +
     317                ":" + st.getLineNumber();
     318              bounds = stackTraceFont.getStringBounds(msg, context);
     319              y += bounds.getHeight();
    327320              if (bounds.getWidth() > width - x)
    328321              {
     
    330323              }
    331324              graphics.drawString(msg, x, y);
    332              
    333               graphics.setFont(stackTraceFont);
    334               x = 15.0f;
    335               for (StackTraceElement st : t.getStackTrace())
    336               {
    337                 msg = "at " + st.getClassName() + "." + st.getMethodName() +
    338                   ":" + st.getLineNumber();
    339                 bounds = stackTraceFont.getStringBounds(msg, context);
    340                 y += bounds.getHeight();
    341                 if (bounds.getWidth() > width - x)
    342                 {
    343                   msg = cutMiddle(msg, (width - x) / bounds.getWidth());
    344                 }
    345                 graphics.drawString(msg, x, y);
    346               }
    347               t = t.getCause();
    348               causedBy = "Caused by: ";
    349             } while (t != null && y < height);
    350             image = img;
    351           }
    352           catch (Throwable t2)
    353           {
    354             t2.printStackTrace();
    355           }
    356         }
    357         else
    358         {
    359           // Let servlet container redirect to appropriate error page
    360           throw new ServletException(t);
     325            }
     326            t = t.getCause();
     327            causedBy = "Caused by: ";
     328          } while (t != null && y < height);
     329          image = img;
     330        }
     331        catch (Throwable t2)
     332        {
     333          t2.printStackTrace();
    361334        }
    362335      }
     
    365338      {
    366339        // Send image on HTTP response
    367         if (download)
    368         {
    369           response.setHeader("Content-Disposition", "attachment;filename="+HTML.urlEncode(title)+"." + format);
    370         }
    371340        response.setContentType("image/" + format);
    372341        response.setHeader("Cache-Control", "max-age=3600");
     
    390359      else
    391360      {
    392         if (saveAs != null)
    393         {
    394           // Image was save to BASE filesystem, redirect to close popup page
    395           response.sendRedirect(request.getContextPath()+"/common/close_popup.jsp?message=Plot+saved+successfully");
    396         }
    397         else
    398         {
    399           // Something went wrong when genering the error image - send redirect to a predefined image
    400           response.sendRedirect(request.getContextPath() + "/images/plot_error.gif");
    401         }
     361        // Something went wrong when genering the error image - send redirect to a predefined image
     362        response.sendRedirect(request.getContextPath() + "/images/plot_error.gif");
    402363      }
    403364    }
     
    427388    return msg.substring(0, beginAt) + "..." + msg.substring(beginAt + charactersToCut);
    428389  }
    429    
    430   /*
    431     Pick out the spot data that have the filter in the specified column   
    432    */
    433   private List<Number> getFilteredSpotData(DynamicResultIterator iterator,
    434       String filter, String filterColumn)
    435     throws SQLException
    436   {   
    437     int columnIndex = iterator.getIndex(filterColumn);
    438     List<Number> filteredSpotData = new ArrayList<Number>();
    439     while (iterator.hasNext())
    440     {
    441       SqlResult result = iterator.next();
    442       String controlGroupId = result.getString(columnIndex);
    443      
    444     }
    445     return filteredSpotData;
    446   }
    447390}
Note: See TracChangeset for help on using the changeset viewer.