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

Code
Comments
Other
Rev Date Author Line
2404 06 May 14 nicklas 1 package net.sf.basedb.reggie.dao;
2404 06 May 14 nicklas 2
2404 06 May 14 nicklas 3 import java.util.ArrayList;
2404 06 May 14 nicklas 4 import java.util.Collection;
2404 06 May 14 nicklas 5 import java.util.List;
2404 06 May 14 nicklas 6
2404 06 May 14 nicklas 7 import org.json.simple.JSONObject;
2404 06 May 14 nicklas 8
2404 06 May 14 nicklas 9 import net.sf.basedb.core.DbControl;
2404 06 May 14 nicklas 10 import net.sf.basedb.core.DerivedBioAssay;
6056 13 Nov 20 nicklas 11 import net.sf.basedb.core.File;
6056 13 Nov 20 nicklas 12 import net.sf.basedb.core.FileSetMember;
2721 01 Oct 14 nicklas 13 import net.sf.basedb.core.Include;
2404 06 May 14 nicklas 14 import net.sf.basedb.core.InvalidDataException;
2404 06 May 14 nicklas 15 import net.sf.basedb.core.ItemQuery;
2706 29 Sep 14 nicklas 16 import net.sf.basedb.core.Job;
2721 01 Oct 14 nicklas 17 import net.sf.basedb.core.RawBioAssay;
2914 11 Nov 14 nicklas 18 import net.sf.basedb.core.Type;
2404 06 May 14 nicklas 19 import net.sf.basedb.core.query.Expressions;
2404 06 May 14 nicklas 20 import net.sf.basedb.core.query.Hql;
2914 11 Nov 14 nicklas 21 import net.sf.basedb.core.query.Orders;
2404 06 May 14 nicklas 22 import net.sf.basedb.core.query.Restrictions;
2404 06 May 14 nicklas 23 import net.sf.basedb.reggie.Reggie;
2404 06 May 14 nicklas 24
2404 06 May 14 nicklas 25 /**
2404 06 May 14 nicklas 26   Class for loading information that is related to aligned sequences.
2404 06 May 14 nicklas 27   
2404 06 May 14 nicklas 28   @author nicklas
2404 06 May 14 nicklas 29   @since 2.16
2404 06 May 14 nicklas 30 */
2404 06 May 14 nicklas 31 public class AlignedSequences 
2404 06 May 14 nicklas 32   extends ReggieItem<DerivedBioAssay>
2404 06 May 14 nicklas 33 {
2404 06 May 14 nicklas 34
2404 06 May 14 nicklas 35   /**
2404 06 May 14 nicklas 36     Value for the {@link Annotationtype#ANALYSIS_RESULT} annotation 
2404 06 May 14 nicklas 37     when the alignment was successful.
2404 06 May 14 nicklas 38   */
2404 06 May 14 nicklas 39   public static final String ALIGN_SUCCESSFUL = "Successful";
2404 06 May 14 nicklas 40   
2404 06 May 14 nicklas 41   /**
2404 06 May 14 nicklas 42     Value for the {@link Annotationtype#ANALYSIS_RESULT} annotation when
2404 06 May 14 nicklas 43     the alignment failed.
2404 06 May 14 nicklas 44   */
2404 06 May 14 nicklas 45   public static final String ALIGN_FAILED = "Failed";
2404 06 May 14 nicklas 46
2914 11 Nov 14 nicklas 47   /**
2914 11 Nov 14 nicklas 48     Find all aligned sequences items by case name. This method will check for {@link Subtype#ALIGNED_SEQUENCES}
2914 11 Nov 14 nicklas 49     derived bioassays with a name matching the case name (eg. xxx.r.m.c.lib.g.k.a).
2914 11 Nov 14 nicklas 50     @since 2.18
2914 11 Nov 14 nicklas 51    */
2914 11 Nov 14 nicklas 52   public static List<AlignedSequences> findByCaseName(DbControl dc, String name)
2914 11 Nov 14 nicklas 53   {
2914 11 Nov 14 nicklas 54     // Get rid of suffixes in the name (eg. 'C' which is used for pre-neoadjuvant forms)
2914 11 Nov 14 nicklas 55     if (name.length() > 7) name = name.substring(0, 7);    
2404 06 May 14 nicklas 56   
2914 11 Nov 14 nicklas 57     // Look for a library with the given name 
2914 11 Nov 14 nicklas 58     ItemQuery<DerivedBioAssay> query = DerivedBioAssay.getQuery();
2914 11 Nov 14 nicklas 59     Subtype.ALIGNED_SEQUENCES.addFilter(dc, query);
2917 11 Nov 14 nicklas 60     query.setIncludes(Reggie.INCLUDE_IN_CURRENT_PROJECT);
2914 11 Nov 14 nicklas 61     query.restrict(Restrictions.like(Hql.property("name"), Expressions.parameter("name", name+".%", Type.STRING)));
2914 11 Nov 14 nicklas 62     query.order(Orders.asc(Hql.property("name")));
2914 11 Nov 14 nicklas 63   
2914 11 Nov 14 nicklas 64     List<DerivedBioAssay> tmp = query.list(dc);
2914 11 Nov 14 nicklas 65     return toList(tmp);
2914 11 Nov 14 nicklas 66   }
2914 11 Nov 14 nicklas 67   
2404 06 May 14 nicklas 68   /**
2404 06 May 14 nicklas 69     Get demuxed sequences item when the id is known.
2404 06 May 14 nicklas 70   */
2404 06 May 14 nicklas 71   public static AlignedSequences getById(DbControl dc, int id)
2404 06 May 14 nicklas 72   {
2404 06 May 14 nicklas 73     return new AlignedSequences(DerivedBioAssay.getById(dc, id));
2404 06 May 14 nicklas 74   }
2404 06 May 14 nicklas 75   
2404 06 May 14 nicklas 76   public static AlignedSequences getByName(DbControl dc, String name)
2404 06 May 14 nicklas 77   {
2404 06 May 14 nicklas 78     ItemQuery<DerivedBioAssay> query = DerivedBioAssay.getQuery();
2404 06 May 14 nicklas 79     query.setIncludes(Reggie.INCLUDE_IN_CURRENT_PROJECT);
2404 06 May 14 nicklas 80     Subtype.ALIGNED_SEQUENCES.addFilter(dc, query);
2404 06 May 14 nicklas 81     query.restrict(Restrictions.eq(Hql.property("name"), Expressions.string(name)));
2404 06 May 14 nicklas 82     
2404 06 May 14 nicklas 83     List<DerivedBioAssay> list = query.list(dc);
2404 06 May 14 nicklas 84     if (list.size() > 1)
2404 06 May 14 nicklas 85     {
2404 06 May 14 nicklas 86       throw new InvalidDataException(
2404 06 May 14 nicklas 87           "More than one item with the name " + name + " was found. " +
2404 06 May 14 nicklas 88           "This wizard can't be used until that is corrected.");
2404 06 May 14 nicklas 89     }
2404 06 May 14 nicklas 90     AlignedSequences aligned = null;
2404 06 May 14 nicklas 91     if (list.size() == 1)
2404 06 May 14 nicklas 92     {
2404 06 May 14 nicklas 93       aligned = new AlignedSequences(list.get(0));
2404 06 May 14 nicklas 94     }
2404 06 May 14 nicklas 95     return aligned;
2404 06 May 14 nicklas 96   }
2404 06 May 14 nicklas 97   
2706 29 Sep 14 nicklas 98   public static AlignedSequences getByJob(DbControl dc, Job job)
2706 29 Sep 14 nicklas 99   {
2706 29 Sep 14 nicklas 100     ItemQuery<DerivedBioAssay> query = DerivedBioAssay.getQuery();
2706 29 Sep 14 nicklas 101     query.setIncludes(Reggie.INCLUDE_IN_CURRENT_PROJECT);
2706 29 Sep 14 nicklas 102     Subtype.ALIGNED_SEQUENCES.addFilter(dc, query);
2706 29 Sep 14 nicklas 103     query.restrict(Restrictions.eq(Hql.property("job"), Hql.entity(job)));
2706 29 Sep 14 nicklas 104
2706 29 Sep 14 nicklas 105     List<DerivedBioAssay> list = query.list(dc);
2706 29 Sep 14 nicklas 106     if (list.size() > 1)
2706 29 Sep 14 nicklas 107     {
2706 29 Sep 14 nicklas 108       throw new InvalidDataException(
2706 29 Sep 14 nicklas 109           "More than one item with job " + job.getName() + " was found. " +
2706 29 Sep 14 nicklas 110           "This wizard can't be used until that is corrected.");
2706 29 Sep 14 nicklas 111     }
2706 29 Sep 14 nicklas 112     AlignedSequences aligned = null;
2706 29 Sep 14 nicklas 113     if (list.size() == 1)
2706 29 Sep 14 nicklas 114     {
2706 29 Sep 14 nicklas 115       aligned = new AlignedSequences(list.get(0));
2706 29 Sep 14 nicklas 116     }
2706 29 Sep 14 nicklas 117     return aligned;
2706 29 Sep 14 nicklas 118   }
2706 29 Sep 14 nicklas 119
2706 29 Sep 14 nicklas 120   
2404 06 May 14 nicklas 121   public static List<AlignedSequences> toList(Collection<DerivedBioAssay> bioassays)
2404 06 May 14 nicklas 122   {
2404 06 May 14 nicklas 123     List<AlignedSequences> lib = new ArrayList<AlignedSequences>(bioassays.size());
2404 06 May 14 nicklas 124     for (DerivedBioAssay ba : bioassays)
2404 06 May 14 nicklas 125     {
2404 06 May 14 nicklas 126       lib.add(new AlignedSequences(ba));
2404 06 May 14 nicklas 127     }
2404 06 May 14 nicklas 128     return lib;
2404 06 May 14 nicklas 129   }
2404 06 May 14 nicklas 130   
7209 26 May 23 nicklas 131   public static AlignedSequences get(DerivedBioAssay bioAssay)
7209 26 May 23 nicklas 132   {
7436 15 Nov 23 nicklas 133     return bioAssay == null ? null : new AlignedSequences(bioAssay);
7209 26 May 23 nicklas 134   }
7209 26 May 23 nicklas 135
2404 06 May 14 nicklas 136   private AlignedSequences(DerivedBioAssay bioAssay)
2404 06 May 14 nicklas 137   {
2404 06 May 14 nicklas 138     super(bioAssay);
2404 06 May 14 nicklas 139
2404 06 May 14 nicklas 140   }  
2404 06 May 14 nicklas 141   
2404 06 May 14 nicklas 142   /**
2404 06 May 14 nicklas 143     Get the derived bioassay that represents the demuxed sequences in BASE.
2404 06 May 14 nicklas 144   */
2404 06 May 14 nicklas 145   public DerivedBioAssay getDerivedBioAssay()
2404 06 May 14 nicklas 146   {
2404 06 May 14 nicklas 147     return getItem();
2404 06 May 14 nicklas 148   }
2404 06 May 14 nicklas 149
2404 06 May 14 nicklas 150   public Library getLibrary(DbControl dc)
2404 06 May 14 nicklas 151   {
2404 06 May 14 nicklas 152     return Library.getById(dc, getItem().getExtract().getId());
2404 06 May 14 nicklas 153   }
2404 06 May 14 nicklas 154   
2420 13 May 14 nicklas 155   public MaskedSequences getMaskedSequences(DbControl dc)
2404 06 May 14 nicklas 156   {
2404 06 May 14 nicklas 157     ItemQuery<DerivedBioAssay> query = getItem().getParents();
2420 13 May 14 nicklas 158     Subtype.MASKED_SEQUENCES.addFilter(dc, query);
2404 06 May 14 nicklas 159     query.include(Reggie.INCLUDE_IN_CURRENT_PROJECT);
2404 06 May 14 nicklas 160
2404 06 May 14 nicklas 161     List<DerivedBioAssay> tmp = query.list(dc);
2420 13 May 14 nicklas 162     DerivedBioAssay masked = null;
2404 06 May 14 nicklas 163     if (tmp.size() > 1)
2404 06 May 14 nicklas 164     {
2404 06 May 14 nicklas 165       throw new InvalidDataException(
2404 06 May 14 nicklas 166         "More than one parent item was found for " + getName() +
2404 06 May 14 nicklas 167         "This wizard can't be used until that is corrected.");
2404 06 May 14 nicklas 168     }
2404 06 May 14 nicklas 169     else if (tmp.size() == 1)
2404 06 May 14 nicklas 170     {
2420 13 May 14 nicklas 171       masked = tmp.get(0);
2420 13 May 14 nicklas 172     }
2420 13 May 14 nicklas 173     return masked == null ? null : MaskedSequences.getById(dc, masked.getId());
2404 06 May 14 nicklas 174   }
2404 06 May 14 nicklas 175   
2721 01 Oct 14 nicklas 176   /**
5845 26 Feb 20 nicklas 177     Get the merged sequences item that is an immediate parent item to
5845 26 Feb 20 nicklas 178     this aligned sequences. NOTE! Typically only for the MIPs pipeline.
5845 26 Feb 20 nicklas 179     The RNAseq pipeline has a masked item inbetween.
5845 26 Feb 20 nicklas 180     @since 4.26
5845 26 Feb 20 nicklas 181   */
5845 26 Feb 20 nicklas 182   public MergedSequences getMergedSequences(DbControl dc)
5845 26 Feb 20 nicklas 183   {
5845 26 Feb 20 nicklas 184     ItemQuery<DerivedBioAssay> query = getItem().getParents();
5845 26 Feb 20 nicklas 185     Subtype.MERGED_SEQUENCES.addFilter(dc, query);
5845 26 Feb 20 nicklas 186     query.include(Reggie.INCLUDE_IN_CURRENT_PROJECT);
5845 26 Feb 20 nicklas 187
5845 26 Feb 20 nicklas 188     List<DerivedBioAssay> tmp = query.list(dc);
5845 26 Feb 20 nicklas 189     DerivedBioAssay merged = null;
5845 26 Feb 20 nicklas 190     if (tmp.size() > 1)
5845 26 Feb 20 nicklas 191     {
5845 26 Feb 20 nicklas 192       throw new InvalidDataException(
5845 26 Feb 20 nicklas 193         "More than one parent item was found for " + getName() +
5845 26 Feb 20 nicklas 194         "This wizard can't be used until that is corrected.");
5845 26 Feb 20 nicklas 195     }
5845 26 Feb 20 nicklas 196     else if (tmp.size() == 1)
5845 26 Feb 20 nicklas 197     {
5845 26 Feb 20 nicklas 198       merged = tmp.get(0);
5845 26 Feb 20 nicklas 199     }
5845 26 Feb 20 nicklas 200     return merged == null ? null : MergedSequences.getById(dc, merged.getId());
5845 26 Feb 20 nicklas 201   }
5845 26 Feb 20 nicklas 202
7268 22 Jun 23 nicklas 203   /**
7268 22 Jun 23 nicklas 204     Find the next name to give a "Derived bioassay" child item. This assumes that
7268 22 Jun 23 nicklas 205     all child items are using the naming convention. foo.x, foo.x2, and
7268 22 Jun 23 nicklas 206     so on. NOTE! The first child item have no number!
7268 22 Jun 23 nicklas 207     @return The next unused name
7268 22 Jun 23 nicklas 208     @since 4.49
7268 22 Jun 23 nicklas 209   */
7268 22 Jun 23 nicklas 210   public String getNextDerivedBioAssayName(DbControl dc, Subtype childType)
7268 22 Jun 23 nicklas 211   {
7268 22 Jun 23 nicklas 212     DerivedBioAssay aligned = getItem();
7268 22 Jun 23 nicklas 213     ItemQuery<DerivedBioAssay> query = null;
7268 22 Jun 23 nicklas 214     if (aligned.isInDatabase())
7268 22 Jun 23 nicklas 215     {
7268 22 Jun 23 nicklas 216       query = aligned.getChildren();
7268 22 Jun 23 nicklas 217       childType.addFilter(dc, query);
7268 22 Jun 23 nicklas 218       query.setIncludes(Include.ALL);
7268 22 Jun 23 nicklas 219     }
7268 22 Jun 23 nicklas 220     return getNextChildItemName(dc, query, childType.getItemSuffix(), true);
7268 22 Jun 23 nicklas 221   }
7268 22 Jun 23 nicklas 222
5845 26 Feb 20 nicklas 223   
5845 26 Feb 20 nicklas 224   /**
2721 01 Oct 14 nicklas 225     Find the next name to give a "Raw bioassay" child item. This assumes that
5705 06 Nov 19 nicklas 226     all child items are using the naming convention. foo.x, foo.x2, and
2721 01 Oct 14 nicklas 227     so on. NOTE! The first child item have no number!
2721 01 Oct 14 nicklas 228     @return The next unused name
2721 01 Oct 14 nicklas 229   */
5705 06 Nov 19 nicklas 230   public String getNextRawBioAssayName(DbControl dc, Rawdatatype rawDataType)
2721 01 Oct 14 nicklas 231   {
2721 01 Oct 14 nicklas 232     DerivedBioAssay aligned = getItem();
6193 30 Mar 21 nicklas 233     ItemQuery<RawBioAssay> query = null;
6193 30 Mar 21 nicklas 234     if (aligned.isInDatabase())
6193 30 Mar 21 nicklas 235     {
6193 30 Mar 21 nicklas 236       query = aligned.getRawBioAssays();
6193 30 Mar 21 nicklas 237       rawDataType.addFilter(dc, query);
6193 30 Mar 21 nicklas 238       query.setIncludes(Include.ALL);
6193 30 Mar 21 nicklas 239     }
5705 06 Nov 19 nicklas 240     return getNextChildItemName(dc, query, rawDataType.getItemSuffix(), true);
2721 01 Oct 14 nicklas 241   }
2721 01 Oct 14 nicklas 242
6056 13 Nov 20 nicklas 243   /**
6056 13 Nov 20 nicklas 244     Get the file of the given type.
6056 13 Nov 20 nicklas 245     @since 4.28
6056 13 Nov 20 nicklas 246   */
6056 13 Nov 20 nicklas 247   public File getFile(DbControl dc, Datafiletype fileType)
6056 13 Nov 20 nicklas 248   {
6056 13 Nov 20 nicklas 249     DerivedBioAssay item = getItem();
6056 13 Nov 20 nicklas 250     File f = null;
6056 13 Nov 20 nicklas 251     if (item.hasFileSet())
6056 13 Nov 20 nicklas 252     {
6056 13 Nov 20 nicklas 253       FileSetMember member = item.getFileSet().getMember(fileType.load(dc));
6056 13 Nov 20 nicklas 254       if (member != null) f = member.getFile();
6056 13 Nov 20 nicklas 255     }
6056 13 Nov 20 nicklas 256     return f;
6056 13 Nov 20 nicklas 257   }
6056 13 Nov 20 nicklas 258
2721 01 Oct 14 nicklas 259   
2404 06 May 14 nicklas 260   @Override
2404 06 May 14 nicklas 261   protected void initJSON(JSONObject json) 
2404 06 May 14 nicklas 262   {
2404 06 May 14 nicklas 263     super.initJSON(json);
2404 06 May 14 nicklas 264   }
2404 06 May 14 nicklas 265   
2404 06 May 14 nicklas 266
2404 06 May 14 nicklas 267 }