Changeset 3035


Ignore:
Timestamp:
Dec 15, 2006, 4:37:01 PM (15 years ago)
Author:
Johan Enell
Message:

References #439

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/plugins/core/net/sf/basedb/plugins/BioAssaySetExporter.java

    r2993 r3035  
    2626
    2727import net.sf.basedb.core.AnnotationType;
     28import net.sf.basedb.core.AnyToAny;
    2829import net.sf.basedb.core.BaseException;
    2930import net.sf.basedb.core.BioAssay;
     
    6465import net.sf.basedb.core.plugin.Request;
    6566import net.sf.basedb.core.plugin.Response;
     67import net.sf.basedb.core.query.Aggregations;
    6668import net.sf.basedb.core.query.Dynamic;
     69import net.sf.basedb.core.query.Expression;
     70import net.sf.basedb.core.query.Expressions;
    6771import net.sf.basedb.core.query.Hql;
    6872import net.sf.basedb.core.query.JoinType;
     
    188192
    189193 
    190   private void exportBASE(BioAssaySet bas, File file, Map<String, String> parameters,
    191     List<String> reporterFields, List<String> spotFields, Boolean serialFormat, Boolean mergeReporters)
     194  void exportBaseFileMatrix(BioAssaySet bas, File file, Map<String, String> parameters,
     195    List<String> reporterFields, List<String> spotFields, Boolean mergeReporters)
    192196    throws IOException, SQLException
    193197  {
    194198    DbControl dc = bas.getDbControl();
    195199    PrintWriter out = new PrintWriter(file.getUploadStream(false));
    196 
    197     // header and parameter section
     200    Map<String, QueryItem> qis = getBaseFileQIMap(dc, bas);
     201
     202    exportBaseFileSectionHead(out, parameters);
     203    exportBaseFileSectionAssays(out, dc, bas);
     204
     205    DynamicSpotQuery query = bas.getSpotData();
     206    for (String field : reporterFields)
     207    {
     208      QueryItem qi = qis.get(field);
     209      query.select(Selects.expression(BioAssaySetUtil.createJepExpression(dc, bas, qi.getJep(), true), field));
     210    }
     211    for (String field : spotFields)
     212    {
     213      QueryItem qi = qis.get(field);
     214      query.select(Selects.expression(BioAssaySetUtil.createJepExpression(dc, bas, qi.getJep(), true), field));
     215    }
     216    if (mergeReporters)
     217    {
     218      // not implemented
     219    }   
     220    exportBaseFileSectionSpots(out, dc, bas, query, reporterFields, spotFields, bas.getBioAssays().list(dc));
     221  }
     222 
     223 
     224  private void exportBaseFileSectionHead(PrintWriter out, Map<String, String> parameters)
     225  {
    198226    out.println("BASEfile");
    199227    if (!parameters.isEmpty())
     
    206234      out.println();
    207235    }
    208    
    209     // assay section   
     236  }
     237 
     238 
     239  private void exportBaseFileSectionAssays(PrintWriter out, DbControl dc, BioAssaySet bas)
     240  {
    210241    out.println("section\tassays");
    211242    out.println("count\t" + bas.getBioAssays().count(dc));
     
    230261    }
    231262    out.println();
     263  }
     264
     265 
     266  private void exportBaseFileSectionSpots(PrintWriter out, DbControl dc, BioAssaySet bas, DynamicSpotQuery query,
     267    List<String> reporterFields, List<String> spotFields, List<BioAssay> assays)
     268    throws SQLException
     269  {
     270    char[] tabs = new char[spotFields.size()];
     271    Arrays.fill(tabs, '\t');
    232272   
    233     // spot section(s)
    234     String fieldString = spotFields.toString().substring(1, spotFields.toString().length() - 1).replace(", ", "\t");
    235     String columnString = reporterFields.toString().substring(1, reporterFields.toString().length() - 1).replace(", ", "\t") + "\tassayData";
    236 
    237     if (serialFormat)
    238     {
    239       for (BioAssay ba : bas.getBioAssays().list(dc))
    240       {
    241         out.println("section\tspots");
    242         out.println("channels\t" + bas.getRawDataType().getChannels());
    243         out.println("assayFields\t" + fieldString);
    244         out.println("columns\t" + columnString);
    245         out.println("assays\t" + ba.getId());
    246         out.println("count\t" + ba.getNumSpots());
    247         out.println("%");
     273    out.println("section\tspots");
     274    out.println("channels\t" + bas.getRawDataType().getChannels());
     275    out.print("assayFields");
     276    for (String field : spotFields)
     277    {
     278      out.print("\t" + field);
     279    }
     280    out.println();
     281    out.print("columns");
     282    for (String field : reporterFields)
     283    {
     284      out.print("\t" + field);
     285    }
     286    out.println("\tassayData");
     287    out.print("assays\t");
     288    for (BioAssay ba : assays)
     289    {
     290      out.print(ba.getId());
     291    }
     292    out.println();
     293    out.println("count\t" + bas.getNumReporters()); //TODO: count number of column/position
     294    out.println("%");
     295   
     296    ArrayList<Short> columnNo = new ArrayList<Short>(assays.size());
     297    for (BioAssay ba : assays)
     298    {
     299      columnNo.add(ba.getDataCubeColumnNo());
     300    }
     301   
     302    query.select(Selects.expression(Dynamic.column(VirtualColumn.POSITION), "_position"));
     303    query.select(Selects.expression(Dynamic.column(VirtualColumn.COLUMN), "_column"));
     304    query.order(Orders.asc(Dynamic.column(VirtualColumn.POSITION)));
     305    query.order(Orders.asc(Dynamic.column(VirtualColumn.COLUMN)));
     306   
     307    DynamicResultIterator iterator = query.iterate(dc);
     308    List<Integer> reporterIndex = new ArrayList<Integer>(reporterFields.size());
     309    List<Integer> spotIndex = new ArrayList<Integer>(spotFields.size());
     310    for (String column : reporterFields)
     311    {
     312      reporterIndex.add(iterator.getIndex(column));
     313    }
     314    for (String field : spotFields)
     315    {
     316      spotIndex.add(iterator.getIndex(field));
     317    }
     318    int posIndex = iterator.getIndex("_position");
     319    int colIndex = iterator.getIndex("_column");
     320   
     321    Integer prevPos = null;
     322    HashMap<Short, String> spotValues = new HashMap<Short, String>();
     323    String reporter = null;
     324    while (iterator.hasNext())
     325    {
     326      SqlResult r = iterator.next();
     327      Integer currentPos = r.getInt(posIndex);
     328     
     329      if (prevPos != null && !currentPos.equals(prevPos))
     330      {
     331        //Print reporter fields
     332        out.print(reporter);
    248333       
    249         Integer aliasIndex = 0;
    250         Map<String, String> aliases = new HashMap<String, String>();
    251         DynamicSpotQuery query = ba.getSpotData();
    252         for (String field : reporterFields)
    253         {
    254           ++aliasIndex;
    255           query.select(Selects.expression(BioAssaySetUtil.createJepExpression(dc, bas, field, true), aliasIndex.toString()));
    256           aliases.put(field, aliasIndex.toString());
    257         }
    258         for (String field : spotFields)
    259         {
    260           ++aliasIndex;
    261           query.select(Selects.expression(BioAssaySetUtil.createJepExpression(dc, bas, field, true),
    262             aliasIndex.toString()));
    263           aliases.put(field, aliasIndex.toString());
    264         }
    265         if (mergeReporters)
    266         {
    267           // not implemented
    268         }
    269         DynamicResultIterator result = query.iterate(dc);
     334        //Print spot fields
     335        for (Short col : columnNo)
     336        {
     337          String spot = spotValues.get(col);
     338          if (spot != null)
     339          {
     340            out.print(spot);
     341          }
     342          else
     343          {
     344            out.print(tabs);
     345          }
     346        }
     347        out.println();
    270348       
    271         List<Integer> reporterIndex = new ArrayList<Integer>(reporterFields.size());
    272         List<Integer> spotIndex = new ArrayList<Integer>(spotFields.size());
    273         for (String column : reporterFields)
    274         {
    275           reporterIndex.add(result.getIndex(aliases.get(column)));
    276         }
    277         for (String field : spotFields)
    278         {
    279           spotIndex.add(result.getIndex(aliases.get(field)));
    280         }
    281 
    282         while (result.hasNext())
    283         {
    284           SqlResult r = result.next();
    285           boolean del = false;
    286           for (Integer column : reporterIndex)
    287           {
    288             if (del)
    289             {
    290               out.print("\t");
    291             }
    292             out.print(r.getString(column) != null ? r.getString(column) : "");
    293             del = true;
    294           }
    295           for (Integer field : spotIndex)
    296           {
    297             out.print("\t");
    298             out.print(r.getString(field) != null ? r.getString(field) : "");
    299           }
    300           out.println();
    301         }
    302         out.println();
    303       }
    304     }
    305     else
    306     {
    307       // matrix format
    308     }
     349        reporter = null;
     350        spotValues = new HashMap<Short, String>();
     351      }
     352
     353      if (reporter == null)
     354      {
     355        String field = r.getString(reporterIndex.get(0));
     356        reporter = field == null ? "" : field;
     357        for (int i = 1; i < reporterIndex.size(); ++i)
     358        {
     359          field = r.getString(reporterIndex.get(i));
     360          reporter += "\t";
     361          reporter += field == null ? "" : field;
     362        }
     363      }
     364     
     365      String spot = "";
     366      for (int i = 0; i < spotIndex.size(); ++i)
     367      {
     368        String field   = r.getString(spotIndex.get(i));
     369        spot += "\t";
     370        spot += field == null ? "" : field;
     371      }
     372      spotValues.put(r.getShort(colIndex), spot);
     373      prevPos = r.getInt(posIndex);
     374    }
     375  }
     376 
     377 
     378  void exportBaseFileSerial(BioAssaySet bioAssaySet, File file, Map<String, String> parameters,
     379    List<String> reporterFields, List<String> spotFields, Boolean mergeReporters)
     380    throws IOException, SQLException
     381  {
     382    DbControl dc = sc.newDbControl();
     383    BioAssaySet bas = BioAssaySet.getById(dc, bioAssaySet.getId());
     384    PrintWriter out = new PrintWriter(file.getUploadStream(false));
     385    Map<String, QueryItem> qis = getBaseFileQIMap(dc, bas);
     386
     387    exportBaseFileSectionHead(out, parameters);
     388    exportBaseFileSectionAssays(out, dc, bas);
    309389   
    310   }
    311  
     390    for (BioAssay ba : bas.getBioAssays().list(dc))
     391    {
     392      DynamicSpotQuery query = ba.getSpotData();
     393      for (String field : reporterFields)
     394      {
     395        QueryItem qi = qis.get(field);
     396        query.select(Selects.expression(BioAssaySetUtil.createJepExpression(dc, bas, qi.getJep(), true), field));
     397      }
     398      for (String field : spotFields)
     399      {
     400        QueryItem qi = qis.get(field);
     401        query.select(Selects.expression(BioAssaySetUtil.createJepExpression(dc, bas, qi.getJep(), true), field));
     402      }
     403      if (mergeReporters)
     404      {
     405        // not implemented
     406      }
     407
     408      exportBaseFileSectionSpots(out, dc, bas, query, reporterFields, spotFields, Collections.singletonList(ba));
     409     
     410      out.println();
     411    }
     412  }
     413
    312414
    313415  private void exportMeV(BioAssaySet bioassayset, File file,
     
    543645       
    544646        Enumeration<String, String> fields = new Enumeration<String, String>();
    545         List<String[]> enumList = new ArrayList<String[]>();
    546647        BioAssaySet bas = (BioAssaySet) job.getValue(bioAssaySetParameter.getName());
    547         //Spotfields
    548         fields.add("pos()", "Position");
    549         int channels = bas.getRawDataType().getChannels();
    550         for (int channel = 1; channel <= channels; ++channel)
    551         {
    552           fields.add("ch("+channel+")", "Ch"+channel);
    553         }
    554         //Formulas
    555         ItemQuery<Formula> queryFormula = Formula.getQuery(Formula.Type.COLUMN_EXPRESSION, bas.getRawDataType());
    556         queryFormula.include(Include.MINE, Include.SHARED, Include.IN_PROJECT, Include.OTHERS);
    557         queryFormula.order(Orders.asc(Hql.property("name")));
    558         for (Formula f : queryFormula.list(dc))
    559         {
    560           fields.add(f.getFormula(0), "[Formula] "+f.getName());
    561         }
    562        
    563         //Extrefields
    564         ItemQuery<ExtraValue> query = bas.getExtraValues();
    565         query.order(Orders.asc(Hql.property("extraValueType.name")));
    566         for (ExtraValue ev : query.list(dc))
    567         {
    568           ExtraValueType evt = ev.getExtraValueType();
    569           fields.add("xtra('" + evt.getExternalId() + "')", "[Extra] "+evt.getName());
    570         }
    571        
    572         //Rawdata fields
    573         enumList.clear();
    574         enumList.add(new String[] {"raw('position')", "[Raw] Position"});
    575         enumList.add(new String[] {"raw('block')", "[Raw] Block"});
    576         enumList.add(new String[] {"raw('metaGridX')", "[Raw] Meta grid X"});
    577         enumList.add(new String[] {"raw('metaGridY')", "[Raw] Meta grid Y"});
    578         enumList.add(new String[] {"raw('row')", "[Raw] Row"});
    579         enumList.add(new String[] {"raw('column')", "[Raw] Column"});
    580         enumList.add(new String[] {"raw('x')", "[Raw] X"});
    581         enumList.add(new String[] {"raw('y')", "[Raw] Y"});
    582         List<RawDataProperty> rdpList = new ArrayList<RawDataProperty>(bas.getRawDataType().getProperties());
    583         for (RawDataProperty rdp : rdpList)
    584         {
    585           enumList.add(new String[] {"raw('"+rdp.getName()+"')", "[Raw] "+rdp.getTitle()});
    586         }
    587         Collections.sort(enumList, new Comparator<String[]>()
    588         {
    589           public int compare(String[] e1, String[] e2)
    590           {
    591             return e1[1].compareTo(e2[1]);
    592           }
    593         });
    594         for (String[] e : enumList)
    595         {
    596           fields.add(e[0], e[1]);
    597         }
    598        
    599         fields.sortValues();
     648        for (QueryItem qi : getBaseFileSpotQI(bas))
     649        {
     650          fields.add(qi.getName(), qi.getTitle());
     651        }
     652        for (QueryItem qi : getBaseFileFormulaQI(dc, bas))
     653        {
     654          fields.add(qi.getName(), qi.getTitle());
     655        }
     656        for (QueryItem qi : getBaseFileExtraQI(dc, bas))
     657        {
     658          fields.add(qi.getName(), qi.getTitle());
     659        }
     660        for (QueryItem qi : getBaseFileRawQI(bas))
     661        {
     662          fields.add(qi.getName(), qi.getTitle());
     663        }
    600664        //Limsfields???
    601        
    602665        usedFieldsParameter = new PluginParameter<String>(
    603666          "usedFields",
     
    605668          "The spot information that is exporter. The position is allways exported when avarage on reporter is false.",
    606669          new StringParameterType(null, null, true, 0, 0, 0, fields));
    607        
    608         List<ExtendedProperty> eps = ExtendedProperties.getProperties(ReporterData.class.toString());
    609         Collections.sort(eps, new Comparator<ExtendedProperty>()
    610         {
    611           public int compare(ExtendedProperty e1, ExtendedProperty e2)
    612           {
    613             return e1.getTitle().compareTo(e2.getTitle());
    614           }
    615         });
     670
    616671        Enumeration<String, String> columns = new Enumeration<String, String>();
    617         columns.add("rep('name')", "Reporter name");
    618         columns.add("rep('externalId')", "Reporter ID");
    619         columns.add("rep('symbol')", "Gene symbol");
    620         columns.add("rep('description')", "Description");
    621         columns.add("rep('lastUpdate')", "Last updated");
    622         for (ExtendedProperty ep : eps)
    623         {
    624           columns.add("rep('"+ep.getName()+"')", ep.getTitle());
    625         }
    626         columns.sortValues();
     672        for (QueryItem qi : getBaseFileReporterQI())
     673        {
     674          columns.add(qi.getName(), qi.getTitle());
     675        }
    627676        usedColumnsParameter = new PluginParameter<String>(
    628677          "usedColumns",
     
    658707    return about;
    659708  }
    660 
     709 
     710 
     711  private List<QueryItem> getBaseFileExtraQI(DbControl dc, BioAssaySet bas)
     712  {
     713    List<QueryItem> items = new ArrayList<QueryItem>();
     714    ItemQuery<ExtraValue> query = bas.getExtraValues();
     715    query.order(Orders.asc(Hql.property("extraValueType.name")));
     716    for (ExtraValue ev : query.list(dc))
     717    {
     718      ExtraValueType evt = ev.getExtraValueType();
     719      items.add(new QueryItem("_xc_"+evt.getExternalId(), "[Extra] "+evt.getName(), "xtra('" + evt.getExternalId() + "')"));
     720    }
     721    Collections.sort(items, new QueryItemTitleComparator());
     722    return items;
     723  }
     724 
     725 
     726  private List<QueryItem> getBaseFileFormulaQI(DbControl dc, BioAssaySet bas)
     727  {
     728    List<QueryItem> items = new ArrayList<QueryItem>();
     729    ItemQuery<Formula> queryFormula = Formula.getQuery(Formula.Type.COLUMN_EXPRESSION, bas.getRawDataType());
     730    queryFormula.include(Include.MINE, Include.SHARED, Include.IN_PROJECT, Include.OTHERS);
     731    queryFormula.order(Orders.asc(Hql.property("name")));
     732    for (Formula f : queryFormula.list(dc))
     733    {
     734      items.add(new QueryItem(f.getName(), "[Formula] "+f.getName(), f.getFormula(0)));
     735    }
     736    Collections.sort(items, new QueryItemTitleComparator());
     737    return items;
     738  }
     739 
     740 
     741  private List<QueryItem> getBaseFileSpotQI(BioAssaySet bas)
     742  {
     743    List<QueryItem> items = new ArrayList<QueryItem>();
     744    items.add(new QueryItem("position", "Position", "pos()"));
     745    int channels = bas.getRawDataType().getChannels();
     746    for (int channel = 1; channel <= channels; ++channel)
     747    {
     748      items.add(new QueryItem("intensity"+channel, "Int ch"+channel, "ch("+channel+")"));
     749    }
     750    Collections.sort(items, new QueryItemTitleComparator());
     751    return items;
     752  }
     753 
     754 
     755  private Map<String, QueryItem> getBaseFileQIMap(DbControl dc, BioAssaySet bas)
     756  {
     757    Map<String, QueryItem> items = new HashMap<String, QueryItem>();
     758    for (QueryItem qi : getBaseFileExtraQI(dc, bas)) items.put(qi.getName(), qi);
     759    for (QueryItem qi : getBaseFileFormulaQI(dc, bas)) items.put(qi.getName(), qi);
     760    for (QueryItem qi : getBaseFileRawQI(bas)) items.put(qi.getName(), qi);
     761    for (QueryItem qi : getBaseFileReporterQI()) items.put(qi.getName(), qi);
     762    for (QueryItem qi : getBaseFileSpotQI(bas)) items.put(qi.getName(), qi);
     763    return items;
     764  }
     765 
     766  private List<QueryItem> getBaseFileRawQI(BioAssaySet bas)
     767  {
     768    List<QueryItem> items = new ArrayList<QueryItem>();
     769    items.add(new QueryItem("rawPosition", "[Raw] Position", "raw('position')"));
     770    items.add(new QueryItem("block", "[Raw] Array block", "raw('block')"));
     771    items.add(new QueryItem("metaGridX", "[Raw] Meta grid X", "raw('metaGridX')"));
     772    items.add(new QueryItem("metaGridY", "[Raw] Meta grid Y", "raw('metaGridY')"));
     773    items.add(new QueryItem("numRow", "[Raw] Row in block", "raw('row')"));
     774    items.add(new QueryItem("numCol", "[Raw] Column in block", "raw('column')"));
     775    items.add(new QueryItem("x", "[Raw] X coordinate", "raw('x')"));
     776    items.add(new QueryItem("y", "[Raw] Y coordinate", "raw('y')"));
     777    for (RawDataProperty rdp : bas.getRawDataType().getProperties())
     778    {
     779      items.add(new QueryItem(rdp.getName(), "[Raw] "+rdp.getTitle(), "raw('"+rdp.getName()+"')"));
     780    }
     781    Collections.sort(items, new QueryItemTitleComparator());
     782    return items;
     783  }
     784 
     785 
     786  private List<QueryItem> getBaseFileReporterQI()
     787  {
     788    List<QueryItem> items = new ArrayList<QueryItem>();
     789    items.add(new QueryItem("reporter", "Reporter (internal id)", "rep('id')"));
     790    items.add(new QueryItem("reporterName", "Reporter Name", "rep('name')"));
     791    items.add(new QueryItem("reporterId", "Reporter ID", "rep('externalId')"));
     792    items.add(new QueryItem("geneSymbol", "Gene symbol", "rep('symbol')"));
     793    items.add(new QueryItem("description", "Description", "rep('description')"));
     794    items.add(new QueryItem("lastUpdate", "Last updated", "rep('lastUpdate')"));
     795    for (ExtendedProperty ep : ExtendedProperties.getProperties(ReporterData.class.toString()))
     796    {
     797      items.add(new QueryItem(ep.getName(), ep.getTitle(), "rep('"+ep.getName()+"')"));
     798    }
     799    Collections.sort(items, new QueryItemTitleComparator());
     800    return items;
     801  }
     802 
    661803
    662804  public List<AnnotationType> getExperimentalFactors(DbControl dc, BioAssaySet bas)
     
    756898      BioAssaySet bioassayset=(BioAssaySet)job.getValue("bioAssaySet");
    757899      bioassayset = BioAssaySet.getById(dc, bioassayset.getId());
     900     
     901//      AnyToAny ata = AnyToAny.getNew(dc, bioassayset, file, file.getPath().toString(), false);
     902//      if (!ata.isInDatabase()) dc.saveItem(ata);
    758903
    759904      progress.display(0, "Exporting ...");
     
    767912        List<String> spotFields = new ArrayList<String>((List<String>) job.getValues("usedFields"));
    768913       
    769         boolean serialFormat = (Boolean) job.getValue("serialFormat");
    770914        boolean geneAverage = (Boolean) job.getValue("geneAverages");
    771915       
    772         exportBASE(bioassayset, file, Collections.EMPTY_MAP, reporterFields, spotFields, serialFormat, geneAverage);
     916        if ((Boolean) job.getValue("serialFormat"))
     917        {
     918          exportBaseFileSerial(bioassayset, file, Collections.EMPTY_MAP, reporterFields, spotFields, geneAverage);
     919        }
     920        else
     921        {
     922          exportBaseFileMatrix(bioassayset, file, Collections.EMPTY_MAP, reporterFields, spotFields, geneAverage);
     923        }
    773924      }
    774925      else
     
    836987  private static final String FORMAT_BASEFILE = "BASEfile";
    837988  private static final String FORMAT_MEV = "MeV";
     989 
     990 
     991
     992  public class QueryItem
     993  {
     994    private String name;
     995   
     996    private String title;
     997   
     998    private String jep;
     999   
     1000    QueryItem(String name, String title, String jep)
     1001    {
     1002      this.name = name;
     1003      this.title = title;
     1004      this.jep = jep;
     1005    }
     1006
     1007    public final String getJep()
     1008    {
     1009      return jep;
     1010    }
     1011
     1012    public final String getName()
     1013    {
     1014      return name;
     1015    }
     1016
     1017    public final String getTitle()
     1018    {
     1019      return title;
     1020    }
     1021  }
     1022 
     1023 
     1024  private class QueryItemTitleComparator
     1025    implements Comparator<QueryItem>
     1026  {
     1027    public int compare(QueryItem qi1, QueryItem qi2)
     1028    {
     1029      return qi1.getTitle().compareTo(qi2.getTitle());
     1030    }
     1031  }
    8381032}
Note: See TracChangeset for help on using the changeset viewer.