extensions/net.sf.basedb.reggie/trunk/src/net/sf/basedb/reggie/dao/CopyNumber.java

Code
Comments
Other
Rev Date Author Line
7270 28 Jun 23 nicklas 1 package net.sf.basedb.reggie.dao;
7270 28 Jun 23 nicklas 2
7270 28 Jun 23 nicklas 3 import java.util.ArrayList;
7270 28 Jun 23 nicklas 4 import java.util.Collection;
7270 28 Jun 23 nicklas 5 import java.util.List;
7270 28 Jun 23 nicklas 6
7270 28 Jun 23 nicklas 7 import org.json.simple.JSONObject;
7270 28 Jun 23 nicklas 8
7270 28 Jun 23 nicklas 9 import net.sf.basedb.core.DbControl;
7270 28 Jun 23 nicklas 10 import net.sf.basedb.core.DerivedBioAssay;
7270 28 Jun 23 nicklas 11 import net.sf.basedb.core.File;
7270 28 Jun 23 nicklas 12 import net.sf.basedb.core.FileSetMember;
7270 28 Jun 23 nicklas 13 import net.sf.basedb.core.InvalidDataException;
7270 28 Jun 23 nicklas 14 import net.sf.basedb.core.ItemQuery;
7270 28 Jun 23 nicklas 15 import net.sf.basedb.core.Job;
7270 28 Jun 23 nicklas 16 import net.sf.basedb.core.Type;
7270 28 Jun 23 nicklas 17 import net.sf.basedb.core.query.Expressions;
7270 28 Jun 23 nicklas 18 import net.sf.basedb.core.query.Hql;
7270 28 Jun 23 nicklas 19 import net.sf.basedb.core.query.Orders;
7270 28 Jun 23 nicklas 20 import net.sf.basedb.core.query.Restrictions;
7270 28 Jun 23 nicklas 21 import net.sf.basedb.reggie.Reggie;
7270 28 Jun 23 nicklas 22
7270 28 Jun 23 nicklas 23 /**
7270 28 Jun 23 nicklas 24   Class for loading information that is related to CopyNumber items.
7270 28 Jun 23 nicklas 25   
7270 28 Jun 23 nicklas 26   @author nicklas
7270 28 Jun 23 nicklas 27   @since 4.49
7270 28 Jun 23 nicklas 28 */
7270 28 Jun 23 nicklas 29 public class CopyNumber 
7270 28 Jun 23 nicklas 30   extends ReggieItem<DerivedBioAssay>
7270 28 Jun 23 nicklas 31 {
7270 28 Jun 23 nicklas 32
7270 28 Jun 23 nicklas 33   
7270 28 Jun 23 nicklas 34   /**
7270 28 Jun 23 nicklas 35     Find all copy-number items by case name. This method will check for {@link Subtype#COPY_NUMBER}
7270 28 Jun 23 nicklas 36     derived bioassays with a name matching the case name (eg. xxx.d.cn).
7270 28 Jun 23 nicklas 37    */
7270 28 Jun 23 nicklas 38   public static List<CopyNumber> findByCaseName(DbControl dc, String name)
7270 28 Jun 23 nicklas 39   {
7270 28 Jun 23 nicklas 40     // Get rid of suffixes in the name (eg. 'C' which is used for pre-neoadjuvant forms)
7270 28 Jun 23 nicklas 41     if (name.length() > 7) name = name.substring(0, 7);    
7270 28 Jun 23 nicklas 42   
7270 28 Jun 23 nicklas 43     // Look for a library with the given name 
7270 28 Jun 23 nicklas 44     ItemQuery<DerivedBioAssay> query = DerivedBioAssay.getQuery();
7270 28 Jun 23 nicklas 45     Subtype.COPY_NUMBER.addFilter(dc, query);
7270 28 Jun 23 nicklas 46     query.setIncludes(Reggie.INCLUDE_IN_CURRENT_PROJECT);
7270 28 Jun 23 nicklas 47     query.restrict(Restrictions.like(Hql.property("name"), Expressions.parameter("name", name+".%", Type.STRING)));
7270 28 Jun 23 nicklas 48     query.order(Orders.asc(Hql.property("name")));
7270 28 Jun 23 nicklas 49   
7270 28 Jun 23 nicklas 50     List<DerivedBioAssay> tmp = query.list(dc);
7270 28 Jun 23 nicklas 51     return toList(tmp);
7270 28 Jun 23 nicklas 52   }
7270 28 Jun 23 nicklas 53   
7270 28 Jun 23 nicklas 54   /**
7270 28 Jun 23 nicklas 55     Get copy-number item when the id is known.
7270 28 Jun 23 nicklas 56   */
7270 28 Jun 23 nicklas 57   public static CopyNumber getById(DbControl dc, int id)
7270 28 Jun 23 nicklas 58   {
7270 28 Jun 23 nicklas 59     return new CopyNumber(DerivedBioAssay.getById(dc, id));
7270 28 Jun 23 nicklas 60   }
7270 28 Jun 23 nicklas 61   
7270 28 Jun 23 nicklas 62   public static CopyNumber getByName(DbControl dc, String name)
7270 28 Jun 23 nicklas 63   {
7270 28 Jun 23 nicklas 64     ItemQuery<DerivedBioAssay> query = DerivedBioAssay.getQuery();
7270 28 Jun 23 nicklas 65     query.setIncludes(Reggie.INCLUDE_IN_CURRENT_PROJECT);
7270 28 Jun 23 nicklas 66     Subtype.COPY_NUMBER.addFilter(dc, query);
7270 28 Jun 23 nicklas 67     query.restrict(Restrictions.eq(Hql.property("name"), Expressions.string(name)));
7270 28 Jun 23 nicklas 68     
7270 28 Jun 23 nicklas 69     List<DerivedBioAssay> list = query.list(dc);
7270 28 Jun 23 nicklas 70     if (list.size() > 1)
7270 28 Jun 23 nicklas 71     {
7270 28 Jun 23 nicklas 72       throw new InvalidDataException(
7270 28 Jun 23 nicklas 73           "More than one item with the name " + name + " was found. " +
7270 28 Jun 23 nicklas 74           "This wizard can't be used until that is corrected.");
7270 28 Jun 23 nicklas 75     }
7270 28 Jun 23 nicklas 76     CopyNumber meth = null;
7270 28 Jun 23 nicklas 77     if (list.size() == 1)
7270 28 Jun 23 nicklas 78     {
7270 28 Jun 23 nicklas 79       meth = new CopyNumber(list.get(0));
7270 28 Jun 23 nicklas 80     }
7270 28 Jun 23 nicklas 81     return meth;
7270 28 Jun 23 nicklas 82   }
7270 28 Jun 23 nicklas 83   
7270 28 Jun 23 nicklas 84   public static CopyNumber getByJob(DbControl dc, Job job)
7270 28 Jun 23 nicklas 85   {
7270 28 Jun 23 nicklas 86     ItemQuery<DerivedBioAssay> query = DerivedBioAssay.getQuery();
7270 28 Jun 23 nicklas 87     query.setIncludes(Reggie.INCLUDE_IN_CURRENT_PROJECT);
7270 28 Jun 23 nicklas 88     Subtype.COPY_NUMBER.addFilter(dc, query);
7270 28 Jun 23 nicklas 89     query.restrict(Restrictions.eq(Hql.property("job"), Hql.entity(job)));
7270 28 Jun 23 nicklas 90
7270 28 Jun 23 nicklas 91     List<DerivedBioAssay> list = query.list(dc);
7270 28 Jun 23 nicklas 92     if (list.size() > 1)
7270 28 Jun 23 nicklas 93     {
7270 28 Jun 23 nicklas 94       throw new InvalidDataException(
7270 28 Jun 23 nicklas 95           "More than one item with job " + job.getName() + " was found. " +
7270 28 Jun 23 nicklas 96           "This wizard can't be used until that is corrected.");
7270 28 Jun 23 nicklas 97     }
7270 28 Jun 23 nicklas 98     CopyNumber cn = null;
7270 28 Jun 23 nicklas 99     if (list.size() == 1)
7270 28 Jun 23 nicklas 100     {
7270 28 Jun 23 nicklas 101       cn = new CopyNumber(list.get(0));
7270 28 Jun 23 nicklas 102     }
7270 28 Jun 23 nicklas 103     return cn;
7270 28 Jun 23 nicklas 104   }
7270 28 Jun 23 nicklas 105
7270 28 Jun 23 nicklas 106   
7270 28 Jun 23 nicklas 107   public static List<CopyNumber> toList(Collection<DerivedBioAssay> bioassays)
7270 28 Jun 23 nicklas 108   {
7270 28 Jun 23 nicklas 109     List<CopyNumber> lib = new ArrayList<CopyNumber>(bioassays.size());
7270 28 Jun 23 nicklas 110     for (DerivedBioAssay ba : bioassays)
7270 28 Jun 23 nicklas 111     {
7270 28 Jun 23 nicklas 112       lib.add(new CopyNumber(ba));
7270 28 Jun 23 nicklas 113     }
7270 28 Jun 23 nicklas 114     return lib;
7270 28 Jun 23 nicklas 115   }
7270 28 Jun 23 nicklas 116   
7270 28 Jun 23 nicklas 117   private CopyNumber(DerivedBioAssay bioAssay)
7270 28 Jun 23 nicklas 118   {
7270 28 Jun 23 nicklas 119     super(bioAssay);
7270 28 Jun 23 nicklas 120
7270 28 Jun 23 nicklas 121   }  
7270 28 Jun 23 nicklas 122   
7270 28 Jun 23 nicklas 123   /**
7270 28 Jun 23 nicklas 124     Get the derived bioassay that represents the copy-number item in BASE.
7270 28 Jun 23 nicklas 125   */
7270 28 Jun 23 nicklas 126   public DerivedBioAssay getDerivedBioAssay()
7270 28 Jun 23 nicklas 127   {
7270 28 Jun 23 nicklas 128     return getItem();
7270 28 Jun 23 nicklas 129   }
7270 28 Jun 23 nicklas 130
7270 28 Jun 23 nicklas 131   /**
7270 28 Jun 23 nicklas 132     Get the parent tumor alignment item.
7270 28 Jun 23 nicklas 133   */
7270 28 Jun 23 nicklas 134   public AlignedSequences getTumorAlignment(DbControl dc)
7270 28 Jun 23 nicklas 135   {
7270 28 Jun 23 nicklas 136     ItemQuery<DerivedBioAssay> query = getItem().getParents();
7270 28 Jun 23 nicklas 137     Subtype.ALIGNED_SEQUENCES.addFilter(dc, query);
7270 28 Jun 23 nicklas 138     Pipeline.DNA_TUMOR_WGS.addFilter(dc, query);
7270 28 Jun 23 nicklas 139     query.include(Reggie.INCLUDE_IN_CURRENT_PROJECT);
7270 28 Jun 23 nicklas 140
7270 28 Jun 23 nicklas 141     List<DerivedBioAssay> tmp = query.list(dc);
7270 28 Jun 23 nicklas 142     if (tmp.size() == 0)
7270 28 Jun 23 nicklas 143     {
7270 28 Jun 23 nicklas 144       throw new InvalidDataException(
7270 28 Jun 23 nicklas 145         "No tumor alignment was found for " + getName() +
7270 28 Jun 23 nicklas 146         ". This wizard can't be used until that is corrected.");
7270 28 Jun 23 nicklas 147     }
7270 28 Jun 23 nicklas 148     else if (tmp.size() > 1)
7270 28 Jun 23 nicklas 149     {
7270 28 Jun 23 nicklas 150       throw new InvalidDataException(
7270 28 Jun 23 nicklas 151         "More than one tumor alignment item was found for " + getName() +
7270 28 Jun 23 nicklas 152         ". This wizard can't be used until that is corrected.");
7270 28 Jun 23 nicklas 153     }
7270 28 Jun 23 nicklas 154     return AlignedSequences.get(tmp.get(0));
7270 28 Jun 23 nicklas 155   }
7270 28 Jun 23 nicklas 156
7270 28 Jun 23 nicklas 157   /**
7270 28 Jun 23 nicklas 158     Get the parent normal alignment item.
7270 28 Jun 23 nicklas 159   */
7270 28 Jun 23 nicklas 160   public AlignedSequences getNormalAlignment(DbControl dc)
7270 28 Jun 23 nicklas 161   {
7270 28 Jun 23 nicklas 162     ItemQuery<DerivedBioAssay> query = getItem().getParents();
7270 28 Jun 23 nicklas 163     Subtype.ALIGNED_SEQUENCES.addFilter(dc, query);
7270 28 Jun 23 nicklas 164     Pipeline.DNA_NORMAL_WGS.addFilter(dc, query);
7270 28 Jun 23 nicklas 165     query.include(Reggie.INCLUDE_IN_CURRENT_PROJECT);
7270 28 Jun 23 nicklas 166   
7270 28 Jun 23 nicklas 167     List<DerivedBioAssay> tmp = query.list(dc);
7270 28 Jun 23 nicklas 168     if (tmp.size() == 0)
7270 28 Jun 23 nicklas 169     {
7270 28 Jun 23 nicklas 170       throw new InvalidDataException(
7270 28 Jun 23 nicklas 171         "No normal alignment was found for " + getName() +
7270 28 Jun 23 nicklas 172         ". This wizard can't be used until that is corrected.");
7270 28 Jun 23 nicklas 173     }
7270 28 Jun 23 nicklas 174     else if (tmp.size() > 1)
7270 28 Jun 23 nicklas 175     {
7270 28 Jun 23 nicklas 176       throw new InvalidDataException(
7270 28 Jun 23 nicklas 177         "More than one normal alignment item was found for " + getName() +
7270 28 Jun 23 nicklas 178         ". This wizard can't be used until that is corrected.");
7270 28 Jun 23 nicklas 179     }
7270 28 Jun 23 nicklas 180     return AlignedSequences.get(tmp.get(0));
7270 28 Jun 23 nicklas 181   }
7270 28 Jun 23 nicklas 182
7270 28 Jun 23 nicklas 183   /**
7270 28 Jun 23 nicklas 184     Get the file of the given type.
7270 28 Jun 23 nicklas 185   */
7270 28 Jun 23 nicklas 186   public File getFile(DbControl dc, Datafiletype fileType)
7270 28 Jun 23 nicklas 187   {
7270 28 Jun 23 nicklas 188     DerivedBioAssay item = getItem();
7270 28 Jun 23 nicklas 189     File f = null;
7270 28 Jun 23 nicklas 190     if (item.hasFileSet())
7270 28 Jun 23 nicklas 191     {
7270 28 Jun 23 nicklas 192       FileSetMember member = item.getFileSet().getMember(fileType.load(dc));
7270 28 Jun 23 nicklas 193       if (member != null) f = member.getFile();
7270 28 Jun 23 nicklas 194     }
7270 28 Jun 23 nicklas 195     return f;
7270 28 Jun 23 nicklas 196   }
7270 28 Jun 23 nicklas 197
7270 28 Jun 23 nicklas 198   
7270 28 Jun 23 nicklas 199   @Override
7270 28 Jun 23 nicklas 200   protected void initJSON(JSONObject json) 
7270 28 Jun 23 nicklas 201   {
7270 28 Jun 23 nicklas 202     super.initJSON(json);
7270 28 Jun 23 nicklas 203   }
7270 28 Jun 23 nicklas 204
7270 28 Jun 23 nicklas 205 }