Changeset 743


Ignore:
Timestamp:
Aug 25, 2008, 4:39:11 PM (13 years ago)
Author:
Martin Svensson
Message:

References #117 The normalization is now done. Nothing has been tested yet. Also added a new interface and two new classes to hold the spot data when it is picked out from the database.

Location:
plugins/base2/net.sf.basedb.normalizers/trunk/src/net/sf/basedb/plugins
Files:
3 added
1 edited

Legend:

Unmodified
Added
Removed
  • plugins/base2/net.sf.basedb.normalizers/trunk/src/net/sf/basedb/plugins/AverageNormalization.java

    r742 r743  
    3030import net.sf.basedb.core.BioAssaySet;
    3131import net.sf.basedb.core.DbControl;
     32import net.sf.basedb.core.DynamicResultIterator;
    3233import net.sf.basedb.core.DynamicSpotQuery;
    3334import net.sf.basedb.core.FloatParameterType;
     
    4041import net.sf.basedb.core.StringParameterType;
    4142import net.sf.basedb.core.Transformation;
     43import net.sf.basedb.core.Type;
     44import net.sf.basedb.core.VirtualColumn;
    4245import net.sf.basedb.core.plugin.About;
    4346import net.sf.basedb.core.plugin.AboutImpl;
     
    4649import net.sf.basedb.core.plugin.Request;
    4750import net.sf.basedb.core.plugin.Response;
     51import net.sf.basedb.core.query.Aggregations;
     52import net.sf.basedb.core.query.Dynamic;
     53import net.sf.basedb.core.query.Expression;
     54import net.sf.basedb.core.query.Expressions;
     55import net.sf.basedb.core.query.Restriction;
     56import net.sf.basedb.core.query.Restrictions;
     57import net.sf.basedb.core.query.Selects;
     58import net.sf.basedb.core.query.SqlResult;
    4859import net.sf.basedb.core.signal.SignalHandler;
    4960import net.sf.basedb.core.signal.SignalReceivedException;
     
    5364import net.sf.basedb.util.Values;
    5465
     66import java.sql.SQLException;
    5567import java.util.ArrayList;
    5668import java.util.Arrays;
     
    116128  );
    117129   
     130  // Expressions used to get data
     131  private final Expression ch1 = Dynamic.column(VirtualColumn.channel(1));
     132  private final Expression ch2 = Dynamic.column(VirtualColumn.channel(2));
     133  // Create restriction: column = :bioAssayColumn
     134  Restriction bioAssayRestriction = Restrictions.eq(
     135    Dynamic.column(VirtualColumn.COLUMN),
     136    Expressions.parameter("bioAssayColumn") );
     137 
    118138  /*
    119139    From SignalTarget interface
     
    226246        Job currentJob = this.getCurrentJob(dc);
    227247       
     248        int noOfChannels = source.getRawDataType().getChannels();
    228249        boolean useGlobalAvgInt = yesOption.equals((String)job.getValue("useGlobalAverageIntensity"));
    229         float refValue;
    230        
    231         List<BioAssay> assays = source.getBioAssays().list(dc);;
     250        float refValue = 0;
     251       
    232252        DynamicSpotQuery query = source.getSpotData();
    233253       
     254        // Get the reference value to use when calculating the scale factor     
    234255        if (useGlobalAvgInt)
    235256        {
    236           //FIXME Calculate the global average intensity
    237           refValue = 0;
     257          double total = 0;
     258          long numberOfSpots = 0;
     259          query.select(Selects.expression(ch1, "ch1"));
     260          List<BioAssay> assays = source.getBioAssays().list(dc);
     261          query.restrict(bioAssayRestriction);
     262       
     263          for (BioAssay assay : assays)
     264          {
     265            // Load spot data for this bioassay
     266            short bioassayColumn = assay.getDataCubeColumnNo();
     267            query.setParameter("bioAssayColumn", (int)bioassayColumn, Type.INT);
     268            DynamicResultIterator it;
     269            int ch1Index;
     270            switch (noOfChannels)
     271            {
     272            case 1:
     273              it = query.iterate(dc);
     274              ch1Index = it.getIndex("ch1");
     275              while (it.hasNext())
     276              {
     277                SqlResult r = it.next();
     278                total = total + r.getFloat(ch1Index);
     279                numberOfSpots++;
     280              }
     281              it.close();
     282              break;
     283             
     284            case 2:
     285              query.select(Selects.expression(ch2, "ch2"));
     286              it = query.iterate(dc);
     287              ch1Index = it.getIndex("ch1");
     288              int ch2Index = it.getIndex("ch2");
     289              while (it.hasNext())
     290              {
     291                SqlResult r = it.next();
     292                float ratio = r.getFloat(ch1Index)/r.getFloat(ch2Index);
     293                total = total + ratio;
     294                numberOfSpots++;
     295              }
     296              it.close();
     297              break;
     298            }
     299          }
     300          refValue = new Float(total / numberOfSpots);
    238301        }
    239302        else
     
    241304          refValue = (Float)job.getValue("referenceValue");         
    242305        }
     306               
    243307        //Normalize the data
    244         BioAssaySet child = null;
    245        
     308        BioAssaySet child = null;       
    246309        child = normalize(dc, source, currentJob, refValue, progress);
    247310       
     
    317380   
    318381    // Query to receive spot data
    319     DynamicSpotQuery query = configureQuery(source.getSpotData());
    320    
    321     // FIXME Do the normalization
     382    DynamicSpotQuery query = source.getSpotData();
     383       
     384    // Create restriction: column = :bioAssayColumn
     385    Restriction bioAssayRestriction = Restrictions.eq(
     386      Dynamic.column(VirtualColumn.COLUMN),
     387      Expressions.parameter("bioAssayColumn") );
     388   
     389    query.select(Dynamic.select(VirtualColumn.POSITION));
     390    query.select(Selects.expression(ch1, "ch1"));
     391    query.select(Selects.expression(ch2, "ch2"));
     392    query.restrict(bioAssayRestriction);
     393   
     394    // Normalize one bioassay at a time
     395    List<BioAssay> assays = source.getBioAssays().list(dc);
     396    int noOfChannels = source.getRawDataType().getChannels();
     397   
     398    try
     399    {
     400      for (BioAssay assay : assays)
     401      {
     402        checkInterrupted();
     403       
     404        float scaleFactor = 0;
     405        List<Normalizable> data = new ArrayList<Normalizable> ();
     406       
     407        // Load spot data for this bioassay
     408        short bioassayColumn = assay.getDataCubeColumnNo();
     409        query.setParameter("bioAssayColumn", (int)bioassayColumn, Type.INT);
     410       
     411       
     412        DynamicResultIterator it = query.iterate(dc);
     413        int positionIndex = it.getIndex(VirtualColumn.POSITION.getName());
     414        int ch1Index = it.getIndex("ch1");
     415 
     416        Normalizable spot;
     417        // Copy bioassay data to SpotData objects
     418        while (it.hasNext())
     419        {
     420          checkInterrupted();
     421          SqlResult r = it.next();
     422          switch (noOfChannels)
     423          {
     424          case 1:
     425            spot = new SpotData1Ch(r.getInt(positionIndex), r.getFloat(ch1Index));
     426            break;
     427           
     428          case 2:
     429            int ch2Index = it.getIndex("ch2");
     430            spot = new SpotData2Ch(r.getInt(positionIndex), r.getFloat(ch1Index), r.getFloat(ch2Index));
     431            break;
     432           
     433          default:
     434            throw new BaseException(" channels raw data is not supported by this plug-in");
     435          }
     436          data.add(spot);
     437        }
     438        it.close();
     439       
     440        // Continue with next bioassay if there is no data
     441        int dataSize = data.size();
     442        if (dataSize == 0) continue;
     443        double sum = 0;
     444        for (Normalizable d : data)
     445        {
     446          sum = sum + d.getNormalizableData();
     447        }
     448        float assayAverage = new Float(sum/dataSize);
     449        scaleFactor = refValue / assayAverage;
     450       
     451        for (Normalizable d : data)
     452        {
     453          d.setNormalizableData(scaleFactor * d.getNormalizableData());
     454          batcher.insert(bioassayColumn, d.getPosition(), d.getChannelData());
     455        }
     456      }
     457    }
     458    catch(SQLException e)
     459    {
     460      throw new BaseException(e);
     461    }
    322462    return null;
    323463  }
    324  
    325   private DynamicSpotQuery configureQuery(DynamicSpotQuery query)
    326   {
    327     return query;
    328   }
    329464}
Note: See TracChangeset for help on using the changeset viewer.