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

Code
Comments
Other
Rev Date Author Line
5434 17 May 19 nicklas 1 package net.sf.basedb.reggie.dao;
5434 17 May 19 nicklas 2
5434 17 May 19 nicklas 3 import java.lang.reflect.Field;
5543 06 Aug 19 nicklas 4 import java.lang.reflect.Modifier;
5434 17 May 19 nicklas 5
5479 10 Jun 19 nicklas 6 import org.json.simple.JSONObject;
5479 10 Jun 19 nicklas 7
5434 17 May 19 nicklas 8 import net.sf.basedb.core.Annotatable;
5434 17 May 19 nicklas 9 import net.sf.basedb.core.DbControl;
5434 17 May 19 nicklas 10 import net.sf.basedb.core.ItemQuery;
5472 05 Jun 19 nicklas 11 import net.sf.basedb.core.Type;
5434 17 May 19 nicklas 12 import net.sf.basedb.core.query.Annotations;
5434 17 May 19 nicklas 13 import net.sf.basedb.core.query.Expressions;
5434 17 May 19 nicklas 14 import net.sf.basedb.core.query.Hql;
7201 25 May 23 nicklas 15 import net.sf.basedb.core.query.Restriction;
5434 17 May 19 nicklas 16 import net.sf.basedb.core.query.Restrictions;
5434 17 May 19 nicklas 17
5434 17 May 19 nicklas 18 /**
5434 17 May 19 nicklas 19   Class for collection pipeline-specific settings that
5434 17 May 19 nicklas 20   are needed in various stages during the lab and analysis
5434 17 May 19 nicklas 21   processes.
5434 17 May 19 nicklas 22   
5434 17 May 19 nicklas 23   Expect this class to evolve as more things are implemented.
5434 17 May 19 nicklas 24   
5434 17 May 19 nicklas 25   @author nicklas
5434 17 May 19 nicklas 26   @since 4.23
5434 17 May 19 nicklas 27 */
5434 17 May 19 nicklas 28 public class Pipeline 
5434 17 May 19 nicklas 29 {
5434 17 May 19 nicklas 30
5434 17 May 19 nicklas 31   /**
5434 17 May 19 nicklas 32     The RNA sequencing pipeline.
5434 17 May 19 nicklas 33   */
7218 30 May 23 nicklas 34   public static final Pipeline RNA_SEQ = new Pipeline("RNA_SEQ", "RNAseq", false, true)
5865 12 Mar 20 nicklas 35     {
5865 12 Mar 20 nicklas 36       /**
5865 12 Mar 20 nicklas 37         On the NovaSeq we use the TruSeq Unique Dual indexes, otherwise, the TruSeq Single indexes
5865 12 Mar 20 nicklas 38       */
5865 12 Mar 20 nicklas 39       @Override
5865 12 Mar 20 nicklas 40       public BarcodeSet getBarcodeSet(String flowcellType) 
5865 12 Mar 20 nicklas 41       {
5865 12 Mar 20 nicklas 42         return FlowCell.FLOW_CELL_TYPE_NOVASEQ.equals(flowcellType) ? BarcodeSet.TRUSEQ_UNIQUE_DUAL : BarcodeSet.TRUSEQ_SINGLE;
5865 12 Mar 20 nicklas 43       }
5865 12 Mar 20 nicklas 44     };
5434 17 May 19 nicklas 45   
5434 17 May 19 nicklas 46   /**
5434 17 May 19 nicklas 47     The MIPs DNA sequencing pipeline.
5434 17 May 19 nicklas 48   */
7218 30 May 23 nicklas 49   public static final Pipeline MIPS = new Pipeline("MIPS", "MIPs", true, true);
5434 17 May 19 nicklas 50
5434 17 May 19 nicklas 51   /**
5546 07 Aug 19 nicklas 52     The legacy RNAseq alignment and analysis pipeline that uses Tophat and Cufflinks.
5543 06 Aug 19 nicklas 53   */
7218 30 May 23 nicklas 54   public static final Pipeline RNASEQ_LEGACY = new Pipeline("RNASEQ_LEGACY", "RNAseq/Legacy", false, true);
5543 06 Aug 19 nicklas 55
5543 06 Aug 19 nicklas 56   /**
5546 07 Aug 19 nicklas 57     The new RNAseq alignment and analysis pipeline that uses Hisat and StringTie.
5546 07 Aug 19 nicklas 58   */
7218 30 May 23 nicklas 59   public static final Pipeline RNASEQ_HISAT_STRINGTIE = new Pipeline("RNASEQ_HISAT_STRINGTIE", "RNAseq/Hisat/StringTie", false, true);
5546 07 Aug 19 nicklas 60
5725 13 Nov 19 nicklas 61   /**
6811 25 Aug 22 nicklas 62     The RNAseq 2023 alignment and analysis pipeline that uses newer versions of 
6807 24 Aug 22 nicklas 63     Hisat and StringTie.
6811 25 Aug 22 nicklas 64     @since 4.40
6807 24 Aug 22 nicklas 65   */
7218 30 May 23 nicklas 66   public static final Pipeline RNASEQ_HISAT_2023 = new Pipeline("RNASEQ_HISAT_2023", "RNAseq/Hisat/2023", false, true);
6811 25 Aug 22 nicklas 67
6811 25 Aug 22 nicklas 68   /**
6811 25 Aug 22 nicklas 69     The RNAseq 2023 alignment and analysis pipeline that uses newer versions of 
6811 25 Aug 22 nicklas 70     Hisat and StringTie.
6811 25 Aug 22 nicklas 71     @since 4.40
6811 25 Aug 22 nicklas 72   */
7218 30 May 23 nicklas 73   public static final Pipeline RNASEQ_STRINGTIE_2023 = new Pipeline("RNASEQ_STRINGTIE_2023", "RNAseq/StringTie/2023", false, true);
6811 25 Aug 22 nicklas 74
6807 24 Aug 22 nicklas 75   
6807 24 Aug 22 nicklas 76   /**
5725 13 Nov 19 nicklas 77     The new RNAseq alignment and analysis pipeline that uses Hisat and VariantCalling.
5725 13 Nov 19 nicklas 78     @since 4.24
5725 13 Nov 19 nicklas 79   */
7218 30 May 23 nicklas 80   public static final Pipeline RNASEQ_HISAT_VARIANTCALL = new Pipeline("RNASEQ_HISAT_VARIANTCALL", "RNAseq/Hisat/VariantCall", false, true);
5546 07 Aug 19 nicklas 81   
6461 01 Nov 21 nicklas 82   /**
6461 01 Nov 21 nicklas 83     Pipeline for genotyping from blood DNA.
6461 01 Nov 21 nicklas 84     @since 4.34
6461 01 Nov 21 nicklas 85   */
7218 30 May 23 nicklas 86   public static final Pipeline DNA_GENOTYPING = new Pipeline("DNA_GENOTYPING", "DNA/Genotyping", true, false);
5725 13 Nov 19 nicklas 87   
5546 07 Aug 19 nicklas 88   /**
6865 09 Nov 22 nicklas 89     Pipeline for methylation from tumor DNA.
6865 09 Nov 22 nicklas 90     @since 4.41
6865 09 Nov 22 nicklas 91   */
7218 30 May 23 nicklas 92   public static final Pipeline DNA_METHYLATION = new Pipeline("DNA_METHYLATION", "DNA/Methylation", true, true);
6865 09 Nov 22 nicklas 93   
6865 09 Nov 22 nicklas 94   /**
7054 21 Feb 23 nicklas 95     Pipeline for Whole Genome Sequencing of tumor DNA.
7054 21 Feb 23 nicklas 96     @since 4.45
7054 21 Feb 23 nicklas 97   */
7218 30 May 23 nicklas 98   public static final Pipeline DNA_TUMOR_WGS = new Pipeline("DNA_TUMOR_WGS", "DNA/Tumor/WGS", true, true);
7054 21 Feb 23 nicklas 99   
7054 21 Feb 23 nicklas 100   /**
7054 21 Feb 23 nicklas 101     Pipeline for Whole Genome Sequencing of blood DNA.
7054 21 Feb 23 nicklas 102     @since 4.45
7054 21 Feb 23 nicklas 103   */
7218 30 May 23 nicklas 104   public static final Pipeline DNA_NORMAL_WGS = new Pipeline("DNA_NORMAL_WGS", "DNA/Normal/WGS", true, false);
7054 21 Feb 23 nicklas 105   
7054 21 Feb 23 nicklas 106   /**
7411 10 Nov 23 nicklas 107     Pipeline for paired variant calling of tumor/normal DNA.
7411 10 Nov 23 nicklas 108     @since 4.50
7411 10 Nov 23 nicklas 109   */
7411 10 Nov 23 nicklas 110   public static final Pipeline DNA_PAIRED_VARIANTCALL = new Pipeline("DNA_PAIRED_VARIANTCALL", "DNA/Paired/VariantCall", true, true);
7411 10 Nov 23 nicklas 111   
7411 10 Nov 23 nicklas 112   /**
5491 13 Jun 19 nicklas 113     Get a pipeline by it's display name.
5491 13 Jun 19 nicklas 114     @param name The name of the pipeline
5491 13 Jun 19 nicklas 115     @return A pipeline object or null if not found
5491 13 Jun 19 nicklas 116   */
5491 13 Jun 19 nicklas 117   public static Pipeline getByName(String name)
5491 13 Jun 19 nicklas 118   {
7308 28 Aug 23 nicklas 119     if (name != null)
5491 13 Jun 19 nicklas 120     {
7308 28 Aug 23 nicklas 121       for (Field f : Pipeline.class.getDeclaredFields())
5543 06 Aug 19 nicklas 122       {
7308 28 Aug 23 nicklas 123         if (Modifier.isStatic(f.getModifiers()) && f.getType() == Pipeline.class)
5543 06 Aug 19 nicklas 124         {
7308 28 Aug 23 nicklas 125           try
7308 28 Aug 23 nicklas 126           {
7308 28 Aug 23 nicklas 127             Pipeline pipeline = (Pipeline)f.get(null);
7308 28 Aug 23 nicklas 128             if (pipeline.getName().equals(name)) return pipeline;
7308 28 Aug 23 nicklas 129           } 
7308 28 Aug 23 nicklas 130           catch (IllegalArgumentException | IllegalAccessException e) 
7308 28 Aug 23 nicklas 131           {} // Should not happen
7308 28 Aug 23 nicklas 132         }
5543 06 Aug 19 nicklas 133       }
5491 13 Jun 19 nicklas 134     }
5491 13 Jun 19 nicklas 135     return null;
5491 13 Jun 19 nicklas 136   }
5491 13 Jun 19 nicklas 137   
5491 13 Jun 19 nicklas 138   /**
5434 17 May 19 nicklas 139     Get the pipeline by name of the static constant defined in this class.
5434 17 May 19 nicklas 140     
5434 17 May 19 nicklas 141     @param cName The name of the static constant
5434 17 May 19 nicklas 142     @return A pipeline object or null if not found
5434 17 May 19 nicklas 143   */
5434 17 May 19 nicklas 144   public static Pipeline getByCName(String cName)
5434 17 May 19 nicklas 145   {
5434 17 May 19 nicklas 146     if (cName == null) return null;
5434 17 May 19 nicklas 147     Pipeline pipeline = null;
5434 17 May 19 nicklas 148     try
5434 17 May 19 nicklas 149     {
5470 05 Jun 19 nicklas 150       Field f = Pipeline.class.getDeclaredField(cName);
5434 17 May 19 nicklas 151       pipeline = (Pipeline)f.get(null);
5434 17 May 19 nicklas 152     }
5434 17 May 19 nicklas 153     catch (NoSuchFieldException ex)
5434 17 May 19 nicklas 154     {}
5434 17 May 19 nicklas 155     catch (IllegalAccessException ex)
5434 17 May 19 nicklas 156     {}
5434 17 May 19 nicklas 157     catch (ClassCastException ex)
5434 17 May 19 nicklas 158     {}
5434 17 May 19 nicklas 159     return pipeline;
5434 17 May 19 nicklas 160   }
5434 17 May 19 nicklas 161   
5472 05 Jun 19 nicklas 162   /**
7308 28 Aug 23 nicklas 163     Get the pipeline from the "Pipeline" annotation on the given item.
7308 28 Aug 23 nicklas 164     @since 4.49
7308 28 Aug 23 nicklas 165   */
7308 28 Aug 23 nicklas 166   public static Pipeline getFromItem(DbControl dc, ReggieItem<?> item)
7308 28 Aug 23 nicklas 167   {
7308 28 Aug 23 nicklas 168     return Pipeline.getByName((String)Annotationtype.PIPELINE.getAnnotationValue(dc, item.getItem()));
7308 28 Aug 23 nicklas 169   }
7308 28 Aug 23 nicklas 170   
7308 28 Aug 23 nicklas 171   /**
5472 05 Jun 19 nicklas 172     Add a filter to the given query to only return items that
5472 05 Jun 19 nicklas 173     has been annotated as belonging to a specific pipeline. The
5472 05 Jun 19 nicklas 174     pipeline must be specified by setting the "pipeline" parameter
5472 05 Jun 19 nicklas 175     on the query.
5472 05 Jun 19 nicklas 176   */
5472 05 Jun 19 nicklas 177   public static void createFilterParameter(DbControl dc, ItemQuery<?> query)
5472 05 Jun 19 nicklas 178   {
5493 13 Jun 19 nicklas 179     createFilterParameter(dc, query, null);
5493 13 Jun 19 nicklas 180   }
5493 13 Jun 19 nicklas 181   
5493 13 Jun 19 nicklas 182   /**
5493 13 Jun 19 nicklas 183     Add a filter to the given query to only return items that
5493 13 Jun 19 nicklas 184     has been annotated as belonging to a specific pipeline. The
5493 13 Jun 19 nicklas 185     pipeline must be specified by setting the "pipeline" parameter
5493 13 Jun 19 nicklas 186     on the query.
5493 13 Jun 19 nicklas 187   */
5493 13 Jun 19 nicklas 188   public static void createFilterParameter(DbControl dc, ItemQuery<?> query, String alias)
5493 13 Jun 19 nicklas 189   {
5493 13 Jun 19 nicklas 190     query.join(Annotations.innerJoin(alias, Annotationtype.PIPELINE.load(dc), "ppln"));
5472 05 Jun 19 nicklas 191     query.restrict(Restrictions.eq(Hql.alias("ppln"), Expressions.parameter("pipeline", Type.STRING)));
5472 05 Jun 19 nicklas 192   }
5493 13 Jun 19 nicklas 193
5472 05 Jun 19 nicklas 194   
5492 13 Jun 19 nicklas 195   private final String id;
5434 17 May 19 nicklas 196   private final String name;
7218 30 May 23 nicklas 197   private final boolean dnaPipeline;
7218 30 May 23 nicklas 198   private final boolean tumorPipeline;
5434 17 May 19 nicklas 199   
7218 30 May 23 nicklas 200   private Pipeline(String id, String name, boolean dnaPipeline, boolean tumorPipeline)
5434 17 May 19 nicklas 201   {
5492 13 Jun 19 nicklas 202     this.id = id;
5434 17 May 19 nicklas 203     this.name = name;
7218 30 May 23 nicklas 204     this.dnaPipeline = dnaPipeline;
7218 30 May 23 nicklas 205     this.tumorPipeline = tumorPipeline;
5434 17 May 19 nicklas 206   }
5434 17 May 19 nicklas 207   
5492 13 Jun 19 nicklas 208   public String getId()
5492 13 Jun 19 nicklas 209   {
5492 13 Jun 19 nicklas 210     return id;
5492 13 Jun 19 nicklas 211   }
5492 13 Jun 19 nicklas 212   
5434 17 May 19 nicklas 213   public String getName()
5434 17 May 19 nicklas 214   {
5434 17 May 19 nicklas 215     return name;
5434 17 May 19 nicklas 216   }
5434 17 May 19 nicklas 217   
5434 17 May 19 nicklas 218   /**
7218 30 May 23 nicklas 219     Is pipeline processing DNA items?
7218 30 May 23 nicklas 220     @since 4.48
7218 30 May 23 nicklas 221   */
7218 30 May 23 nicklas 222   public boolean isDnaPipeline()
7218 30 May 23 nicklas 223   {
7218 30 May 23 nicklas 224     return dnaPipeline;
7218 30 May 23 nicklas 225   }
7218 30 May 23 nicklas 226   
7218 30 May 23 nicklas 227   /**
7218 30 May 23 nicklas 228     Is pipeline processing RNA items?
7218 30 May 23 nicklas 229     @since 4.48
7218 30 May 23 nicklas 230   */
7218 30 May 23 nicklas 231   public boolean isRnaPipeline()
7218 30 May 23 nicklas 232   {
7218 30 May 23 nicklas 233     return !dnaPipeline;
7218 30 May 23 nicklas 234   }
7218 30 May 23 nicklas 235
7218 30 May 23 nicklas 236   /**
7218 30 May 23 nicklas 237     Is pipeline processing Tumor items?
7218 30 May 23 nicklas 238     @since 4.48
7218 30 May 23 nicklas 239   */
7218 30 May 23 nicklas 240   public boolean isTumorPipeline()
7218 30 May 23 nicklas 241   {
7218 30 May 23 nicklas 242     return tumorPipeline;
7218 30 May 23 nicklas 243   }
7218 30 May 23 nicklas 244
7218 30 May 23 nicklas 245   /**
7218 30 May 23 nicklas 246     Is pipeline processing Normal items?
7218 30 May 23 nicklas 247     @since 4.48
7218 30 May 23 nicklas 248   */
7218 30 May 23 nicklas 249   public boolean isNormalPipeline()
7218 30 May 23 nicklas 250   {
7218 30 May 23 nicklas 251     return !tumorPipeline;
7218 30 May 23 nicklas 252   }
7218 30 May 23 nicklas 253
7218 30 May 23 nicklas 254   
7218 30 May 23 nicklas 255   /**
5434 17 May 19 nicklas 256     Set the PIPELINE annotation on the given item to this pipeline.
5434 17 May 19 nicklas 257   */
5434 17 May 19 nicklas 258   public boolean setAnnotation(DbControl dc, Annotatable item)
5434 17 May 19 nicklas 259   {
5434 17 May 19 nicklas 260     return Annotationtype.PIPELINE.setAnnotationValue(dc, item, getName());
5434 17 May 19 nicklas 261   }
5434 17 May 19 nicklas 262   
5434 17 May 19 nicklas 263   /**
5434 17 May 19 nicklas 264     Add a filter to the given query to only return items that
5434 17 May 19 nicklas 265     has been annotated as belonging to this pipeline.
5434 17 May 19 nicklas 266   */
5434 17 May 19 nicklas 267   public void addFilter(DbControl dc, ItemQuery<?> query)
5434 17 May 19 nicklas 268   {
5493 13 Jun 19 nicklas 269     addFilter(dc, query, null);
5493 13 Jun 19 nicklas 270   }
5493 13 Jun 19 nicklas 271   
5493 13 Jun 19 nicklas 272   /**
5493 13 Jun 19 nicklas 273     Add a filter to the given query to only return items that
7201 25 May 23 nicklas 274     has been annotated as belonging to this pipeline. This method
7201 25 May 23 nicklas 275     also joins the Pipeline annotation with alias 'ppln'.
5493 13 Jun 19 nicklas 276   */
5493 13 Jun 19 nicklas 277   public void addFilter(DbControl dc, ItemQuery<?> query, String alias)
5493 13 Jun 19 nicklas 278   {
5493 13 Jun 19 nicklas 279     query.join(Annotations.innerJoin(alias, Annotationtype.PIPELINE.load(dc), "ppln"));
7201 25 May 23 nicklas 280     query.restrict(restriction("ppln"));
5434 17 May 19 nicklas 281   }
5434 17 May 19 nicklas 282   
5479 10 Jun 19 nicklas 283   /**
7201 25 May 23 nicklas 284     Create a restriction to use in a query for matching items with this pipeline.
7201 25 May 23 nicklas 285     The 'Pipeline' annotation must already be joined with the query under the given
7201 25 May 23 nicklas 286     alias.
7201 25 May 23 nicklas 287     @since 4.48
7201 25 May 23 nicklas 288   */
7201 25 May 23 nicklas 289   public Restriction restriction(String alias)
7201 25 May 23 nicklas 290   {
7201 25 May 23 nicklas 291     return Restrictions.eq(Hql.alias(alias), Expressions.string(getName()));
7201 25 May 23 nicklas 292   }
7201 25 May 23 nicklas 293   
7201 25 May 23 nicklas 294   /**
5865 12 Mar 20 nicklas 295     Get a default barcode set depending on the flow cell type.
5865 12 Mar 20 nicklas 296     The default implemenation returns null.
5865 12 Mar 20 nicklas 297     @since 4.26
5865 12 Mar 20 nicklas 298   */
5865 12 Mar 20 nicklas 299   public BarcodeSet getBarcodeSet(String flowcellType)
5865 12 Mar 20 nicklas 300   {
5865 12 Mar 20 nicklas 301     return null;
5865 12 Mar 20 nicklas 302   }
5865 12 Mar 20 nicklas 303   
5865 12 Mar 20 nicklas 304   /**
5479 10 Jun 19 nicklas 305     Get the information as a JSON object ready to be sent as an AJAX response.
5479 10 Jun 19 nicklas 306   */
5479 10 Jun 19 nicklas 307   public JSONObject asJSONObject()
5479 10 Jun 19 nicklas 308   {
5479 10 Jun 19 nicklas 309     JSONObject json = new JSONObject();
5543 06 Aug 19 nicklas 310     json.put("id", getId());
5479 10 Jun 19 nicklas 311     json.put("name", getName());
5479 10 Jun 19 nicklas 312     return json;
5479 10 Jun 19 nicklas 313   }
5479 10 Jun 19 nicklas 314
5434 17 May 19 nicklas 315 }