Class SpotBatcher

  • All Implemented Interfaces:
    AutoCloseable, Batcher

    public class SpotBatcher
    extends AbstractBatcher
    Batcher class for per-spot intensity values for bioassaysets. This batcher is normally used when a new bioassayset has been created that uses a different cube and/or layer to store it's data than the source bioassayset.

    Code example: Swap the intensities of channel 1 and 2

    // Get source bioassayset
    DbControl dc = ...
    BioAssaySet source = ...
    
    // Create new transformation and bioassayset to hold the
    // new intensities, we use the same data cube as the source
    // but a different layer
    Transformation t = source.newTransformation();
    dc.saveItem(t);
    BioAssaySet bas = t.newProduct(null, "new", true);
    dc.saveItem(bas);
    
    // Create a query that selects the data of
    // the source bioassayset
    DynamicSpotQuery query = source.getSpotData();
    
    // Execute the query, and use the batcher to swap the
    // intensities
    SpotBatcher batcher = bas.getSpotBatcher();
    DynamicResultIterator result = query.iterate(dc);
    int column = result.getIndex(VirtualColumn.COLUMN.getName());
    int position = result.getIndex(VirtualColumn.POSITION.getName());
    int ch1 = result.getIndex(VirtualColumn.channel(1).getName());
    int ch2 = result.getIndex(VirtualColumn.channel(2).getName());
    while (result.hasNext())
    {
       SqlResult r = result.next();
       batcher.insert(r.getShort(column), r.getInt(position), 
          r.getFloat(ch2), r.getFloat(ch1));
    }
    
    // Close and commit
    batcher.close();
    dc.commit();
    
    Version:
    2.0
    Author:
    Nicklas
    See Also:
    BioAssaySet.getSpotBatcher()
    Last modified
    $Date: 2014-06-10 15:52:45 +0200 (ti, 10 jun 2014) $
    • Field Detail

      • bioAssaySet

        private final BioAssaySet bioAssaySet
        The bioassayset this batcher inserts data for.
      • numChannels

        private final int numChannels
        The number of channels used in the raw data type of the experiment where the bioassayset belongs.
      • queuedInsertCount

        private int queuedInsertCount
        The number of queued inserts. Used to check when a flush is needed.
      • totalInsertCount

        private int totalInsertCount
        The total number of inserts done by this batcher.
      • bytes

        private long bytes
        The number of bytes this batcher has added to the experiment.
      • bytesPerRow

        private final long bytesPerRow
        The number of bytes used by a single row.
      • spotSql

        private PreparedStatement spotSql
        The statement that inserts spot data.
        INSERT INTO Dynamic#PerSpot (cube, layer, column, position, ch1, ch2, ...)
        VALUES (cube, layer, ?, ?, ?, ?, ...)
        
      • spotSqlStatement

        private String spotSqlStatement
        The SQL string for the spotSql statement.
    • Constructor Detail

      • SpotBatcher

        SpotBatcher​(DbControl dc,
                    BioAssaySet bioAssaySet)
        Create a new spot batcher for a bioassayset. It is assumed that the calling code has checked that the bioassayset is allowed to receive more data (ie. it's data cube layer hasn't been committed to the database).
    • Method Detail

      • insert

        public void insert​(short column,
                           int position,
                           float... intensities)
                    throws BaseException
        Insert intensities for a given column/position coordinate.
        Parameters:
        column - The column coordinate
        position - The position coordinate
        intensities - An array holding the intensities for the coordinate, the length must match the number of channels of the raw data type
        Throws:
        InvalidDataException - If the intensities array is null or of the incorrect length
        BaseException - If there is another error
      • insert

        public int insert​(AbstractSqlQuery query)
                   throws BaseException
        Insert spot intensities using a query. The query MUST select data in the following order: column, position, ch1, ch2, ...

        Internally this method converts the query into a INSERT INTO ... SELECT ... query, making it very fast, since the data for each spot doesn't have to be retreived, processed and then inserted one row at a time. It is possible to call this method multiple times with the same or different query.

        Here is an alternative to the example above:

        // Get source bioassayset
        DbControl dc = ...
        BioAssaySet source = ...
        
        // Create new transformation and bioassayset to hold the
        // new intensities, we use the same data cube as the source
        // but a different layer
        Transformation t = source.newTransformation();
        dc.saveItem(t);
        BioAssaySet bas = t.newProduct(null, "new", true);
        dc.saveItem(bas);
        
        // Create a query that selects the data of
        // the source bioassayset, swap the order of the channels
        DynamicSpotQuery query = source.getSpotData();
        query.select(Dynamic.select(VirtualColumn.COLUMN));
        query.select(Dynamic.select(VirtualColumn.POSITION));
        query.select(Dynamic.select(VirtualColumn.channel(2)));
        query.select(Dynamic.select(VirtualColumn.channel(1)));
        
        // Execute the query, and use the batcher to insert the result
        SpotBatcher batcher = bas.getSpotBatcher();
        batcher.insert(query);
        
        // Close and commit
        batcher.close();
        dc.commit();
        
        Parameters:
        query - The query that selects the data to be inserted
        Returns:
        int The number of spots inserted
        Throws:
        BaseException - If there is an error