/*
* Copyright (c) 2009 The Jackson Laboratory
*
* This software was developed by Gary Churchill's Lab at The Jackson
* Laboratory (see http://research.jax.org/faculty/churchill).
*
* This is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this software. If not, see <http://www.gnu.org/licenses/>.
*/
package org.jax.qtl.project;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
import org.jax.qtl.cross.Cross;
import org.jax.qtl.cross.GeneticMarker;
import org.jax.qtl.cross.GeneticMarkerPair;
import org.jax.qtl.cross.MarkerPairQtlBasketItem;
import org.jax.qtl.cross.QtlBasket;
import org.jax.qtl.cross.QtlBasketItem;
import org.jax.qtl.cross.SingleMarkerQtlBasketItem;
import org.jax.qtl.jaxbgenerated.CommentType;
import org.jax.qtl.jaxbgenerated.CrossType;
import org.jax.qtl.jaxbgenerated.GeneticMarkerType;
import org.jax.qtl.jaxbgenerated.JQtlProjectMetadata;
import org.jax.qtl.jaxbgenerated.QtlBasketItemType;
import org.jax.qtl.jaxbgenerated.QtlBasketType;
import org.jax.r.jriutilities.RInterface;
import org.jax.r.project.RProject;
/**
* The data structure that is at the root of a QTL project.
* @author <A HREF="mailto:keith.sheppard@jax.org">Keith Sheppard</A>
*/
public class QtlProject extends RProject
{
/**
* our logger
*/
private static final Logger LOG = Logger.getLogger(
QtlProject.class.getName());
/**
* the data model for this project
*/
private final QtlDataModel dataModel;
/**
* our JAXB object factory
*/
private final org.jax.qtl.jaxbgenerated.ObjectFactory objectFactory =
new org.jax.qtl.jaxbgenerated.ObjectFactory();
/**
* Constructor for restoring a saved project.
* @param rInterface
* the R interface for this project
* @param projectMetadata
* the project metadata
*/
public QtlProject(
RInterface rInterface,
JQtlProjectMetadata projectMetadata)
{
super(rInterface, projectMetadata);
this.dataModel = new QtlDataModel(rInterface);
this.restoreCrossMetaData(projectMetadata.getCross());
}
private void restoreCrossMetaData(List<CrossType> jaxbCrosses)
{
// iterate through the JAXB cross metadata, and add the
// metadata to our projects data structures
Map<String, Cross> crossMap = this.dataModel.getCrossMap();
for(CrossType jaxbCross: jaxbCrosses)
{
Cross matchingCross = crossMap.get(jaxbCross.getCrossIdentifier());
if(matchingCross == null)
{
LOG.warning(
"could not find cross named " +
jaxbCross.getCrossIdentifier() +
" in restored R workspace");
}
else
{
// add all QTL baskets to the current cross
List<QtlBasketType> jaxbQtlBaskets = jaxbCross.getQtlBasket();
if(!jaxbQtlBaskets.isEmpty())
{
for(QtlBasketType jaxbQtlBasket: jaxbQtlBaskets)
{
QtlBasket qtlBasket = new QtlBasket(
matchingCross,
jaxbQtlBasket.getBasketName());
for(QtlBasketItemType jaxbItem: jaxbQtlBasket.getQtlBasketItem())
{
if(jaxbItem.getMarker().size() == 1)
{
// since the marker size is 1, we're adding
// a single qtl maker item
GeneticMarkerType currJaxbMarker =
jaxbItem.getMarker().get(0);
GeneticMarker currMarker = new GeneticMarker(
currJaxbMarker.getMarkerName(),
currJaxbMarker.getChromosomeName(),
currJaxbMarker.getMarkerPositionCentimorgans());
SingleMarkerQtlBasketItem singleMarkerQtlBasketItem =
new SingleMarkerQtlBasketItem(
currMarker,
jaxbItem.getComment().getContent());
qtlBasket.getContents().add(
singleMarkerQtlBasketItem);
}
else if(jaxbItem.getMarker().size() == 2)
{
// since the marker size is 2, we're adding
// a marker pair
GeneticMarkerType jaxbMarker1 =
jaxbItem.getMarker().get(0);
GeneticMarker marker1 = new GeneticMarker(
jaxbMarker1.getMarkerName(),
jaxbMarker1.getChromosomeName(),
jaxbMarker1.getMarkerPositionCentimorgans());
GeneticMarkerType jaxbMarker2 =
jaxbItem.getMarker().get(1);
GeneticMarker marker2 = new GeneticMarker(
jaxbMarker2.getMarkerName(),
jaxbMarker2.getChromosomeName(),
jaxbMarker2.getMarkerPositionCentimorgans());
GeneticMarkerPair currMarkerPair = new GeneticMarkerPair(
marker1,
marker2);
MarkerPairQtlBasketItem markerPairQtlBasketItem =
new MarkerPairQtlBasketItem(
currMarkerPair,
jaxbItem.getComment().getContent());
qtlBasket.getContents().add(
markerPairQtlBasketItem);
}
else
{
// we can't deal with anything but 1 or 2!
LOG.severe(
"bad marker count in QTL basket " +
"configuration: " + jaxbItem.getMarker().size());
}
}
// toss the qtl basket map into the cross that it
// belongs to
matchingCross.getQtlBasketMap().put(
jaxbQtlBasket.getBasketName(),
qtlBasket);
}
}
}
}
}
/**
* Constructor for creating a new project
* @param rInterface
* the R interface for this project
*/
public QtlProject(
RInterface rInterface)
{
super(rInterface);
this.dataModel = new QtlDataModel(rInterface);
}
/**
* Get the data model for this project
* @return the dataModel
*/
public QtlDataModel getDataModel()
{
return this.dataModel;
}
/**
* Extract the metadata from our project data structure
* @return
* the metadata
*/
@Override
public JQtlProjectMetadata getMetadata()
{
JQtlProjectMetadata jaxbProjectMetadata =
this.objectFactory.createJQtlProjectMetadata();
jaxbProjectMetadata.setProjectName(
this.getName());
jaxbProjectMetadata.getRHistoryItem().addAll(
this.getRHistory());
// iterate through all of the crosses, pulling out metadata as we go
List<CrossType> jaxbCrosses = jaxbProjectMetadata.getCross();
jaxbCrosses.clear();
Cross[] crosses = this.dataModel.getCrosses();
for(Cross cross: crosses)
{
CrossType currJaxbCross = this.objectFactory.createCrossType();
currJaxbCross.setCrossIdentifier(cross.getAccessorExpressionString());
// extract all of the QTL baskets from the current cross
for(QtlBasket qtlBasket: cross.getQtlBaskets())
{
QtlBasketType currJaxbBasket =
this.objectFactory.createQtlBasketType();
currJaxbBasket.setBasketName(qtlBasket.getName());
List<QtlBasketItem> contents = qtlBasket.getContents();
for(QtlBasketItem qtlBasketItem: contents)
{
QtlBasketItemType jaxbQtlBasketItem =
this.objectFactory.createQtlBasketItemType();
List<GeneticMarkerType> jaxbMarkers =
jaxbQtlBasketItem.getMarker();
if(qtlBasketItem instanceof SingleMarkerQtlBasketItem)
{
// convert the single-marker QTL type into a
// JAXB type
SingleMarkerQtlBasketItem singleMarkerQtlBasketItem =
(SingleMarkerQtlBasketItem)qtlBasketItem;
GeneticMarker marker =
singleMarkerQtlBasketItem.getMarker();
GeneticMarkerType jaxbMarker =
this.objectFactory.createGeneticMarkerType();
jaxbMarker.setChromosomeName(marker.getChromosomeName());
jaxbMarker.setMarkerName(marker.getMarkerName());
jaxbMarker.setMarkerPositionCentimorgans(
marker.getMarkerPositionCentimorgans());
jaxbMarkers.add(jaxbMarker);
}
else
{
// convert the marker pair QTL type into a
// JAXB type
MarkerPairQtlBasketItem markerPairQtlBasketItem =
(MarkerPairQtlBasketItem)qtlBasketItem;
GeneticMarker[] markerPair = new GeneticMarker[2];
markerPair[0] = markerPairQtlBasketItem.getMarkerPair().getMarkerOne();
markerPair[1] = markerPairQtlBasketItem.getMarkerPair().getMarkerTwo();
for(GeneticMarker marker: markerPair)
{
GeneticMarkerType jaxbMarker =
this.objectFactory.createGeneticMarkerType();
jaxbMarker.setChromosomeName(marker.getChromosomeName());
jaxbMarker.setMarkerName(marker.getMarkerName());
jaxbMarker.setMarkerPositionCentimorgans(
marker.getMarkerPositionCentimorgans());
jaxbMarkers.add(jaxbMarker);
}
}
// add the item's comment too
CommentType jaxbComment =
this.objectFactory.createCommentType();
jaxbComment.setContent(qtlBasketItem.getComment());
jaxbQtlBasketItem.setComment(jaxbComment);
currJaxbBasket.getQtlBasketItem().add(jaxbQtlBasketItem);
}
currJaxbCross.getQtlBasket().add(currJaxbBasket);
}
jaxbCrosses.add(currJaxbCross);
}
return jaxbProjectMetadata;
}
}