6870 |
16 Nov 22 |
nicklas |
1 |
package net.sf.basedb.reggie.grid; |
6870 |
16 Nov 22 |
nicklas |
2 |
|
6870 |
16 Nov 22 |
nicklas |
3 |
import java.util.ArrayList; |
6870 |
16 Nov 22 |
nicklas |
4 |
import java.util.List; |
6870 |
16 Nov 22 |
nicklas |
5 |
|
6870 |
16 Nov 22 |
nicklas |
6 |
import net.sf.basedb.core.AnyToAny; |
6870 |
16 Nov 22 |
nicklas |
7 |
import net.sf.basedb.core.DataFileType; |
6870 |
16 Nov 22 |
nicklas |
8 |
import net.sf.basedb.core.DbControl; |
6870 |
16 Nov 22 |
nicklas |
9 |
import net.sf.basedb.core.DerivedBioAssay; |
6870 |
16 Nov 22 |
nicklas |
10 |
import net.sf.basedb.core.Directory; |
6870 |
16 Nov 22 |
nicklas |
11 |
import net.sf.basedb.core.File; |
6870 |
16 Nov 22 |
nicklas |
12 |
import net.sf.basedb.core.FileServer; |
6870 |
16 Nov 22 |
nicklas |
13 |
import net.sf.basedb.core.FileSetMember; |
6870 |
16 Nov 22 |
nicklas |
14 |
import net.sf.basedb.core.ItemList; |
6870 |
16 Nov 22 |
nicklas |
15 |
import net.sf.basedb.core.ItemNotFoundException; |
6870 |
16 Nov 22 |
nicklas |
16 |
import net.sf.basedb.core.ItemSubtype; |
6870 |
16 Nov 22 |
nicklas |
17 |
import net.sf.basedb.core.Job; |
6870 |
16 Nov 22 |
nicklas |
18 |
import net.sf.basedb.core.Path; |
6870 |
16 Nov 22 |
nicklas |
19 |
import net.sf.basedb.core.Sample; |
6870 |
16 Nov 22 |
nicklas |
20 |
import net.sf.basedb.core.SessionControl; |
6870 |
16 Nov 22 |
nicklas |
21 |
import net.sf.basedb.core.Software; |
6981 |
17 Jan 23 |
nicklas |
22 |
import net.sf.basedb.core.StringParameterType; |
6870 |
16 Nov 22 |
nicklas |
23 |
import net.sf.basedb.opengrid.JobDefinition; |
6870 |
16 Nov 22 |
nicklas |
24 |
import net.sf.basedb.opengrid.JobStatus; |
6870 |
16 Nov 22 |
nicklas |
25 |
import net.sf.basedb.opengrid.OpenGridCluster; |
6870 |
16 Nov 22 |
nicklas |
26 |
import net.sf.basedb.opengrid.OpenGridSession; |
6870 |
16 Nov 22 |
nicklas |
27 |
import net.sf.basedb.opengrid.ScriptBuilder; |
6870 |
16 Nov 22 |
nicklas |
28 |
import net.sf.basedb.opengrid.config.ClusterConfig; |
6870 |
16 Nov 22 |
nicklas |
29 |
import net.sf.basedb.opengrid.config.JobConfig; |
6870 |
16 Nov 22 |
nicklas |
30 |
import net.sf.basedb.opengrid.service.JobCompletionHandler; |
6870 |
16 Nov 22 |
nicklas |
31 |
import net.sf.basedb.reggie.Reggie; |
6870 |
16 Nov 22 |
nicklas |
32 |
import net.sf.basedb.reggie.XmlConfig; |
6870 |
16 Nov 22 |
nicklas |
33 |
import net.sf.basedb.reggie.dao.Annotationtype; |
6870 |
16 Nov 22 |
nicklas |
34 |
import net.sf.basedb.reggie.dao.BeadChip; |
6870 |
16 Nov 22 |
nicklas |
35 |
import net.sf.basedb.reggie.dao.BiomaterialList; |
6870 |
16 Nov 22 |
nicklas |
36 |
import net.sf.basedb.reggie.dao.Datafiletype; |
6870 |
16 Nov 22 |
nicklas |
37 |
import net.sf.basedb.reggie.dao.Dna; |
6870 |
16 Nov 22 |
nicklas |
38 |
import net.sf.basedb.reggie.dao.Fileserver; |
6870 |
16 Nov 22 |
nicklas |
39 |
import net.sf.basedb.reggie.dao.MergedSequences; |
6870 |
16 Nov 22 |
nicklas |
40 |
import net.sf.basedb.reggie.dao.Methylation; |
6870 |
16 Nov 22 |
nicklas |
41 |
import net.sf.basedb.reggie.dao.Scan; |
6870 |
16 Nov 22 |
nicklas |
42 |
import net.sf.basedb.reggie.dao.Subtype; |
6870 |
16 Nov 22 |
nicklas |
43 |
import net.sf.basedb.util.Values; |
6870 |
16 Nov 22 |
nicklas |
44 |
|
6870 |
16 Nov 22 |
nicklas |
45 |
/** |
6870 |
16 Nov 22 |
nicklas |
Helper class for creating items needed for generating Mathylation beta analysis |
6870 |
16 Nov 22 |
nicklas |
script and send it to the cluster for execution. |
6870 |
16 Nov 22 |
nicklas |
48 |
|
6870 |
16 Nov 22 |
nicklas |
@author nicklas |
6870 |
16 Nov 22 |
nicklas |
@since 4.41 |
6870 |
16 Nov 22 |
nicklas |
51 |
*/ |
6870 |
16 Nov 22 |
nicklas |
52 |
public class MethylationBetaJobCreator |
6870 |
16 Nov 22 |
nicklas |
53 |
extends AbstractJobCreator |
6870 |
16 Nov 22 |
nicklas |
54 |
{ |
6870 |
16 Nov 22 |
nicklas |
55 |
|
6870 |
16 Nov 22 |
nicklas |
56 |
private Software software; |
6870 |
16 Nov 22 |
nicklas |
57 |
|
6870 |
16 Nov 22 |
nicklas |
58 |
public MethylationBetaJobCreator() |
6870 |
16 Nov 22 |
nicklas |
59 |
{} |
6870 |
16 Nov 22 |
nicklas |
60 |
|
6870 |
16 Nov 22 |
nicklas |
61 |
/** |
6870 |
16 Nov 22 |
nicklas |
Set the software item. |
6870 |
16 Nov 22 |
nicklas |
63 |
*/ |
6870 |
16 Nov 22 |
nicklas |
64 |
public void setSoftware(Software software) |
6870 |
16 Nov 22 |
nicklas |
65 |
{ |
6870 |
16 Nov 22 |
nicklas |
66 |
this.software = software; |
6870 |
16 Nov 22 |
nicklas |
67 |
} |
6870 |
16 Nov 22 |
nicklas |
68 |
|
6870 |
16 Nov 22 |
nicklas |
69 |
/** |
6870 |
16 Nov 22 |
nicklas |
Schedule jobs on the given cluster for running beta-analysis. |
6870 |
16 Nov 22 |
nicklas |
@return A list with the corresponding jobs in BASE |
6870 |
16 Nov 22 |
nicklas |
72 |
*/ |
6870 |
16 Nov 22 |
nicklas |
73 |
public List<JobDefinition> createBetaJobs(DbControl dc, OpenGridCluster cluster, List<Methylation> items) |
6870 |
16 Nov 22 |
nicklas |
74 |
{ |
6870 |
16 Nov 22 |
nicklas |
75 |
SessionControl sc = dc.getSessionControl(); |
6870 |
16 Nov 22 |
nicklas |
76 |
|
6870 |
16 Nov 22 |
nicklas |
77 |
ClusterConfig clusterCfg = cluster.getConfig(); |
6870 |
16 Nov 22 |
nicklas |
78 |
XmlConfig cfg = Reggie.getConfig(cluster.getId()); |
6870 |
16 Nov 22 |
nicklas |
79 |
if (cfg == null) |
6870 |
16 Nov 22 |
nicklas |
80 |
{ |
6870 |
16 Nov 22 |
nicklas |
81 |
throw new ItemNotFoundException("No configuration in reggie-config.xml for cluster: " + cluster.getId()); |
6870 |
16 Nov 22 |
nicklas |
82 |
} |
6870 |
16 Nov 22 |
nicklas |
83 |
String parameterSet = (String)Annotationtype.PARAMETER_SET.getAnnotationValue(dc, software); |
6870 |
16 Nov 22 |
nicklas |
84 |
|
6870 |
16 Nov 22 |
nicklas |
// Get global options |
6870 |
16 Nov 22 |
nicklas |
86 |
String global_env = ScriptUtil.multilineIndent(cfg.getConfig("global-env")); |
6870 |
16 Nov 22 |
nicklas |
87 |
String projectArchive = cfg.getRequiredConfig("project-archive", null); |
6870 |
16 Nov 22 |
nicklas |
88 |
String externalArchive = cfg.getConfig("external-archive", null, projectArchive); |
6870 |
16 Nov 22 |
nicklas |
89 |
|
7372 |
06 Oct 23 |
nicklas |
90 |
String beta_submit = cfg.getConfig("methylation-beta/submit", parameterSet, null); |
7372 |
06 Oct 23 |
nicklas |
91 |
String beta_submit_debug = cfg.getConfig("methylation-beta/submit-debug", parameterSet, null); |
6870 |
16 Nov 22 |
nicklas |
92 |
String beta_env = ScriptUtil.multilineIndent(cfg.getRequiredConfig("methylation-beta/env", parameterSet)); |
6870 |
16 Nov 22 |
nicklas |
93 |
String beta_envdebug = ScriptUtil.multilineIndent(cfg.getConfig("methylation-beta/env-debug", parameterSet, null)); |
6870 |
16 Nov 22 |
nicklas |
94 |
String beta_execute = ScriptUtil.multilineIndent(cfg.getConfig("methylation-beta/execute", parameterSet, "./methylation-beta.sh")); |
6870 |
16 Nov 22 |
nicklas |
95 |
|
6870 |
16 Nov 22 |
nicklas |
// Selected items must be removed from this list |
6870 |
16 Nov 22 |
nicklas |
97 |
ItemList methylationPipeline = BiomaterialList.METHYLATION_PIPELINE.load(dc); |
6870 |
16 Nov 22 |
nicklas |
98 |
|
6870 |
16 Nov 22 |
nicklas |
// Options common for all jobs |
6870 |
16 Nov 22 |
nicklas |
100 |
JobConfig jobConfig = new JobConfig(); |
6870 |
16 Nov 22 |
nicklas |
101 |
if (priority != null) jobConfig.setPriority(priority); |
7372 |
06 Oct 23 |
nicklas |
102 |
if (partition != null) jobConfig.setSbatchOption("partition", ScriptUtil.checkValidScriptParameter(partition)); |
7372 |
06 Oct 23 |
nicklas |
103 |
jobConfig.convertOptionsTo(clusterCfg.getType()); |
7372 |
06 Oct 23 |
nicklas |
104 |
if (submitOptionsOverride != null) |
7372 |
06 Oct 23 |
nicklas |
105 |
{ |
7372 |
06 Oct 23 |
nicklas |
106 |
ScriptUtil.addSubmitOptions(jobConfig, submitOptionsOverride, clusterCfg.getType()); |
7372 |
06 Oct 23 |
nicklas |
107 |
} |
7372 |
06 Oct 23 |
nicklas |
108 |
else |
7372 |
06 Oct 23 |
nicklas |
109 |
{ |
7372 |
06 Oct 23 |
nicklas |
110 |
ScriptUtil.addSubmitOptions(jobConfig, beta_submit, clusterCfg.getType()); |
7372 |
06 Oct 23 |
nicklas |
111 |
if (debug) ScriptUtil.addSubmitOptions(jobConfig, beta_submit_debug, clusterCfg.getType()); |
7372 |
06 Oct 23 |
nicklas |
112 |
} |
6884 |
24 Nov 22 |
nicklas |
113 |
jobConfig.getBatchConfig().setDelayInterval(5); |
6870 |
16 Nov 22 |
nicklas |
114 |
|
6870 |
16 Nov 22 |
nicklas |
// We submit one job for each raw bioassay to the cluster |
6870 |
16 Nov 22 |
nicklas |
116 |
List<JobDefinition> jobDefs = new ArrayList<JobDefinition>(items.size()); |
6870 |
16 Nov 22 |
nicklas |
117 |
|
6870 |
16 Nov 22 |
nicklas |
118 |
for (Methylation m : items) |
6870 |
16 Nov 22 |
nicklas |
119 |
{ |
6870 |
16 Nov 22 |
nicklas |
120 |
m = Methylation.getById(dc, m.getId()); // Ensure item is loaded in this transaction |
6870 |
16 Nov 22 |
nicklas |
121 |
|
6870 |
16 Nov 22 |
nicklas |
// Get some information about the aligned data that we need |
6870 |
16 Nov 22 |
nicklas |
123 |
DerivedBioAssay meth = m.getDerivedBioAssay(); |
6870 |
16 Nov 22 |
nicklas |
124 |
methylationPipeline.removeItem(meth); |
6870 |
16 Nov 22 |
nicklas |
125 |
|
6870 |
16 Nov 22 |
nicklas |
126 |
Dna dna = m.getDnaAliquot(dc); |
6870 |
16 Nov 22 |
nicklas |
127 |
Scan scan = m.getScan(dc); |
6870 |
16 Nov 22 |
nicklas |
128 |
BeadChip chip = m.getBeadChip(dc); |
6870 |
16 Nov 22 |
nicklas |
129 |
Sample specimen = (Sample)dna.findSingleParent(dc, Subtype.SPECIMEN); |
6870 |
16 Nov 22 |
nicklas |
130 |
|
6871 |
16 Nov 22 |
nicklas |
131 |
String methylationName = ScriptUtil.checkValidScriptParameter(meth.getName()); |
6871 |
16 Nov 22 |
nicklas |
132 |
boolean isExternal = Reggie.isExternalItem(methylationName); |
6870 |
16 Nov 22 |
nicklas |
133 |
String archiveFolder = isExternal ? externalArchive : projectArchive; |
6870 |
16 Nov 22 |
nicklas |
134 |
String rootName = isExternal ? dna.getTopExtractOrSample(dc).getName() : null; |
6870 |
16 Nov 22 |
nicklas |
135 |
|
6871 |
16 Nov 22 |
nicklas |
136 |
String idatFolder = ScriptUtil.checkValidPath(MergedSequences.generateDataFilesFolderForProjectArchive(methylationName, rootName, debug), true, true); |
6870 |
16 Nov 22 |
nicklas |
137 |
Annotationtype.DATA_FILES_FOLDER.setAnnotationValue(dc, meth, idatFolder); |
6870 |
16 Nov 22 |
nicklas |
138 |
|
6870 |
16 Nov 22 |
nicklas |
139 |
String scanFolder = (String)Annotationtype.DATA_FILES_FOLDER.getAnnotationValue(dc, scan.getItem()); |
6870 |
16 Nov 22 |
nicklas |
140 |
String beadChipId = (String)Annotationtype.BEADCHIP_ID.getAnnotationValue(dc, chip.getItem()); |
6870 |
16 Nov 22 |
nicklas |
141 |
String beadChipPosition = (String)Annotationtype.BEADCHIP_POSITION.getAnnotationValue(dc, dna.getItem()); |
6870 |
16 Nov 22 |
nicklas |
142 |
ScriptUtil.checkValidPath(scanFolder, true, true); |
6870 |
16 Nov 22 |
nicklas |
143 |
ScriptUtil.checkValidScriptParameter(beadChipId); |
6870 |
16 Nov 22 |
nicklas |
144 |
ScriptUtil.checkValidScriptParameter(beadChipPosition); |
6870 |
16 Nov 22 |
nicklas |
145 |
|
6871 |
16 Nov 22 |
nicklas |
146 |
String externalMethylationName = methylationName; |
6870 |
16 Nov 22 |
nicklas |
147 |
if (specimen != null && specimen.getExternalId() != null) |
6870 |
16 Nov 22 |
nicklas |
148 |
{ |
6870 |
16 Nov 22 |
nicklas |
// Replace SCANB-ID with Sample.externalId |
6870 |
16 Nov 22 |
nicklas |
150 |
externalMethylationName = externalMethylationName.replace(specimen.getName(), specimen.getExternalId()); |
6870 |
16 Nov 22 |
nicklas |
151 |
} |
6870 |
16 Nov 22 |
nicklas |
152 |
|
6870 |
16 Nov 22 |
nicklas |
// Create job |
6870 |
16 Nov 22 |
nicklas |
154 |
Job betaJob = Job.getNew(dc, null, null, null); |
6870 |
16 Nov 22 |
nicklas |
155 |
betaJob.setItemSubtype(Subtype.METHYLATION_BETA_JOB.get(dc)); |
6870 |
16 Nov 22 |
nicklas |
156 |
betaJob.setPluginVersion("reggie-"+Reggie.VERSION); |
6870 |
16 Nov 22 |
nicklas |
157 |
betaJob.setSendMessage(Values.getBoolean(sc.getUserClientSetting("plugins.sendmessage"), false)); |
6871 |
16 Nov 22 |
nicklas |
158 |
betaJob.setName("Calculate beta values for " + methylationName); |
6870 |
16 Nov 22 |
nicklas |
159 |
|
6870 |
16 Nov 22 |
nicklas |
160 |
if (debug) betaJob.setName(betaJob.getName() + " (debug)"); |
6981 |
17 Jan 23 |
nicklas |
161 |
if (partition != null) betaJob.setParameterValue("partition", new StringParameterType(), partition); |
7372 |
06 Oct 23 |
nicklas |
162 |
if (submitOptionsOverride != null) betaJob.setParameterValue("jobOptions", new StringParameterType(), submitOptionsOverride); |
6870 |
16 Nov 22 |
nicklas |
// Register a handler for auto-confirmation (BetaAutoConfirmer) |
6881 |
22 Nov 22 |
nicklas |
164 |
dc.saveItem(betaJob); |
6881 |
22 Nov 22 |
nicklas |
165 |
meth.setJob(betaJob); |
6881 |
22 Nov 22 |
nicklas |
166 |
meth.setSoftware(software); |
6870 |
16 Nov 22 |
nicklas |
167 |
if (autoConfirm) |
6870 |
16 Nov 22 |
nicklas |
168 |
{ |
6881 |
22 Nov 22 |
nicklas |
169 |
Annotationtype.AUTO_PROCESSING.setAnnotationValue(dc, meth, "AutoConfirm"); |
6870 |
16 Nov 22 |
nicklas |
170 |
} |
6870 |
16 Nov 22 |
nicklas |
171 |
|
6870 |
16 Nov 22 |
nicklas |
172 |
ScriptBuilder script = new ScriptBuilder(); |
6870 |
16 Nov 22 |
nicklas |
173 |
script.cmd(debug ? "set -ex" : "set -e"); |
6870 |
16 Nov 22 |
nicklas |
// Set file permissions based on consent or external group! |
6871 |
16 Nov 22 |
nicklas |
175 |
String externalGroup = isExternal ? Reggie.getExternalGroup(methylationName) : null; |
6870 |
16 Nov 22 |
nicklas |
176 |
ScriptUtil.setUmaskForItem(dc, dna, externalGroup, script); |
6870 |
16 Nov 22 |
nicklas |
177 |
script.newLine(); |
6870 |
16 Nov 22 |
nicklas |
178 |
script.cmd(global_env); |
6870 |
16 Nov 22 |
nicklas |
179 |
script.export("ArchiveFolder", archiveFolder); |
6870 |
16 Nov 22 |
nicklas |
180 |
script.export("IdatFolder", "${ArchiveFolder}"+idatFolder); |
6870 |
16 Nov 22 |
nicklas |
181 |
script.export("BeadChipId", beadChipId); |
6870 |
16 Nov 22 |
nicklas |
182 |
script.export("BeadChipPosition", beadChipPosition); |
6871 |
16 Nov 22 |
nicklas |
183 |
script.export("MethylationName", methylationName); |
6870 |
16 Nov 22 |
nicklas |
184 |
script.export("ExternalMethylationName", externalMethylationName); |
6870 |
16 Nov 22 |
nicklas |
185 |
script.newLine(); |
6870 |
16 Nov 22 |
nicklas |
186 |
script.cmd(beta_env); |
6870 |
16 Nov 22 |
nicklas |
187 |
if (debug) script.cmd(beta_envdebug); |
6870 |
16 Nov 22 |
nicklas |
188 |
script.export("ScanFolder", "${MethylationArchive}"+scanFolder); |
6870 |
16 Nov 22 |
nicklas |
189 |
script.newLine(); |
6870 |
16 Nov 22 |
nicklas |
190 |
script.cmd(beta_execute); |
6870 |
16 Nov 22 |
nicklas |
191 |
if (externalGroup != null) |
6870 |
16 Nov 22 |
nicklas |
192 |
{ |
6871 |
16 Nov 22 |
nicklas |
193 |
ScriptUtil.addChgrp(externalGroup, "${IdatFolder}", methylationName, null, script); |
6870 |
16 Nov 22 |
nicklas |
194 |
} |
6870 |
16 Nov 22 |
nicklas |
195 |
|
6871 |
16 Nov 22 |
nicklas |
196 |
JobDefinition jobDef = new JobDefinition("BetaAnalysis", jobConfig, batchConfig, betaJob); |
6871 |
16 Nov 22 |
nicklas |
197 |
jobDef.addFile(ScriptUtil.upload("methylation-beta.sh")); |
6873 |
17 Nov 22 |
nicklas |
198 |
jobDef.addFile(ScriptUtil.upload("beta_values.R")); |
6870 |
16 Nov 22 |
nicklas |
199 |
jobDef.addFile(ScriptUtil.upload("reggie-utils.sh")); |
6873 |
17 Nov 22 |
nicklas |
200 |
jobDef.addFile(ScriptUtil.upload("stderrwrap.sh")); |
6870 |
16 Nov 22 |
nicklas |
201 |
jobDef.setDebug(debug); |
6870 |
16 Nov 22 |
nicklas |
202 |
jobDef.setCmd(script.toString()); |
6870 |
16 Nov 22 |
nicklas |
203 |
jobDefs.add(jobDef); |
6870 |
16 Nov 22 |
nicklas |
204 |
} |
6870 |
16 Nov 22 |
nicklas |
205 |
|
6870 |
16 Nov 22 |
nicklas |
206 |
return jobDefs; |
6870 |
16 Nov 22 |
nicklas |
207 |
} |
6870 |
16 Nov 22 |
nicklas |
208 |
|
6870 |
16 Nov 22 |
nicklas |
209 |
|
6870 |
16 Nov 22 |
nicklas |
210 |
/** |
6870 |
16 Nov 22 |
nicklas |
Job completion handler for beta-analysis jobs. The handler downloads the |
6870 |
16 Nov 22 |
nicklas |
'files.out' file, create links to the files and import some annotations. |
6870 |
16 Nov 22 |
nicklas |
213 |
*/ |
6870 |
16 Nov 22 |
nicklas |
214 |
public static class BetaJobCompletionHandler |
6870 |
16 Nov 22 |
nicklas |
215 |
implements JobCompletionHandler |
6870 |
16 Nov 22 |
nicklas |
216 |
{ |
6870 |
16 Nov 22 |
nicklas |
217 |
|
6870 |
16 Nov 22 |
nicklas |
218 |
public BetaJobCompletionHandler() |
6870 |
16 Nov 22 |
nicklas |
219 |
{} |
6870 |
16 Nov 22 |
nicklas |
220 |
|
6870 |
16 Nov 22 |
nicklas |
221 |
@Override |
6870 |
16 Nov 22 |
nicklas |
222 |
public String jobCompleted(SessionControl sc, OpenGridSession session, Job job, JobStatus status) |
6870 |
16 Nov 22 |
nicklas |
223 |
{ |
6870 |
16 Nov 22 |
nicklas |
224 |
String jobName = status.getName(); |
6870 |
16 Nov 22 |
nicklas |
225 |
String files = session.getJobFileAsString(jobName, "files.out", "UTF-8"); |
6876 |
18 Nov 22 |
nicklas |
226 |
String stats = session.getJobFileAsString(jobName, "stats.out", "UTF-8"); |
6876 |
18 Nov 22 |
nicklas |
227 |
String msg = parseFiles(sc, job, files, stats); |
6870 |
16 Nov 22 |
nicklas |
228 |
return "Beta-analysis completed. " + msg; |
6870 |
16 Nov 22 |
nicklas |
229 |
} |
6870 |
16 Nov 22 |
nicklas |
230 |
|
6876 |
18 Nov 22 |
nicklas |
231 |
private String parseFiles(SessionControl sc, Job job, String filesOut, String statsOut) |
6870 |
16 Nov 22 |
nicklas |
232 |
{ |
6870 |
16 Nov 22 |
nicklas |
233 |
|
6870 |
16 Nov 22 |
nicklas |
234 |
DbControl dc = null; |
6870 |
16 Nov 22 |
nicklas |
235 |
String msg = null; |
6870 |
16 Nov 22 |
nicklas |
236 |
try |
6870 |
16 Nov 22 |
nicklas |
237 |
{ |
6870 |
16 Nov 22 |
nicklas |
238 |
dc = sc.newDbControl("Reggie: beta-analysis completed handler"); |
6870 |
16 Nov 22 |
nicklas |
239 |
|
6870 |
16 Nov 22 |
nicklas |
240 |
Methylation m = Methylation.getByJob(dc, job); |
6870 |
16 Nov 22 |
nicklas |
241 |
DerivedBioAssay meth = m.getItem(); |
6870 |
16 Nov 22 |
nicklas |
242 |
|
6870 |
16 Nov 22 |
nicklas |
// Create file links |
6870 |
16 Nov 22 |
nicklas |
244 |
boolean useExternalProjectArchive = Reggie.isExternalItem(m.getName()); |
6870 |
16 Nov 22 |
nicklas |
245 |
FileServer fileArchive = useExternalProjectArchive ? Fileserver.EXTERNAL_ARCHIVE.load(dc) : Fileserver.PROJECT_ARCHIVE.load(dc); |
6870 |
16 Nov 22 |
nicklas |
246 |
String analysisDir = useExternalProjectArchive ? Reggie.EXTERNAL_ANALYSIS_DIR : Reggie.SECONDARY_ANALYSIS_DIR; |
6870 |
16 Nov 22 |
nicklas |
247 |
|
6870 |
16 Nov 22 |
nicklas |
248 |
String dataFilesFolder = (String)Annotationtype.DATA_FILES_FOLDER.getAnnotationValue(dc, meth); |
6870 |
16 Nov 22 |
nicklas |
249 |
String baseFolder = Reggie.convertDataFilesFolderToBaseFolder(dataFilesFolder); |
6870 |
16 Nov 22 |
nicklas |
250 |
Directory localDataDir = Directory.getNew(dc, new Path(analysisDir+baseFolder, Path.Type.DIRECTORY)); |
6870 |
16 Nov 22 |
nicklas |
251 |
ItemSubtype idatType = Subtype.IDAT.load(dc); |
6870 |
16 Nov 22 |
nicklas |
252 |
DataFileType idatData = Datafiletype.IDAT.load(dc); |
6870 |
16 Nov 22 |
nicklas |
253 |
|
6870 |
16 Nov 22 |
nicklas |
254 |
int lineNo = 0; |
6870 |
16 Nov 22 |
nicklas |
255 |
for (String line : filesOut.split("\n")) |
6870 |
16 Nov 22 |
nicklas |
256 |
{ |
6870 |
16 Nov 22 |
nicklas |
257 |
lineNo++; |
6870 |
16 Nov 22 |
nicklas |
258 |
|
6870 |
16 Nov 22 |
nicklas |
259 |
File f = File.getFile(dc, localDataDir, line.substring(line.lastIndexOf("/")+1), true); |
6870 |
16 Nov 22 |
nicklas |
260 |
f.setFileServer(fileArchive); |
6876 |
18 Nov 22 |
nicklas |
261 |
String fileName = f.getName(); |
6876 |
18 Nov 22 |
nicklas |
262 |
String fileUrl = "sftp://" + fileArchive.getHost() + dataFilesFolder + "/" + fileName; |
6870 |
16 Nov 22 |
nicklas |
263 |
try |
6870 |
16 Nov 22 |
nicklas |
264 |
{ |
6870 |
16 Nov 22 |
nicklas |
265 |
f.setUrl(fileUrl, true); |
6870 |
16 Nov 22 |
nicklas |
266 |
} |
6870 |
16 Nov 22 |
nicklas |
267 |
catch (RuntimeException ex) |
6870 |
16 Nov 22 |
nicklas |
268 |
{ |
6870 |
16 Nov 22 |
nicklas |
269 |
f.setUrl(fileUrl, false); |
6870 |
16 Nov 22 |
nicklas |
270 |
} |
6870 |
16 Nov 22 |
nicklas |
271 |
|
6876 |
18 Nov 22 |
nicklas |
272 |
if (!f.isInDatabase()) dc.saveItem(f); |
6876 |
18 Nov 22 |
nicklas |
273 |
if (fileName.startsWith("beta_normalized")) f.setDescription("Beta-values after NOOB normalization"); |
6876 |
18 Nov 22 |
nicklas |
274 |
if (fileName.startsWith("beta_adjusted")) f.setDescription("Beta-values after adjustment"); |
6876 |
18 Nov 22 |
nicklas |
275 |
if (fileName.startsWith("adjustmentPlots")) f.setDescription("Density plots before/after adjustment"); |
6870 |
16 Nov 22 |
nicklas |
276 |
|
6876 |
18 Nov 22 |
nicklas |
277 |
if (fileName.endsWith(".idat")) |
6870 |
16 Nov 22 |
nicklas |
278 |
{ |
6870 |
16 Nov 22 |
nicklas |
//f.setDescription(...); |
6870 |
16 Nov 22 |
nicklas |
280 |
f.setItemSubtype(idatType); |
6870 |
16 Nov 22 |
nicklas |
281 |
FileSetMember member = meth.getFileSet().addMember(f, idatData); |
6876 |
18 Nov 22 |
nicklas |
282 |
member.setValid(true, null); |
6870 |
16 Nov 22 |
nicklas |
283 |
} |
6870 |
16 Nov 22 |
nicklas |
284 |
else |
6870 |
16 Nov 22 |
nicklas |
285 |
{ |
6876 |
18 Nov 22 |
nicklas |
286 |
AnyToAny link = AnyToAny.getNewOrExisting(dc, meth, fileName, f, true); |
6870 |
16 Nov 22 |
nicklas |
287 |
if (!link.isInDatabase()) dc.saveItem(link); |
6876 |
18 Nov 22 |
nicklas |
288 |
link.setDescription(f.getDescription()); |
6870 |
16 Nov 22 |
nicklas |
289 |
} |
6876 |
18 Nov 22 |
nicklas |
290 |
|
6870 |
16 Nov 22 |
nicklas |
291 |
} |
6870 |
16 Nov 22 |
nicklas |
292 |
|
6876 |
18 Nov 22 |
nicklas |
293 |
Stats stat = Stats.parse(statsOut); |
6876 |
18 Nov 22 |
nicklas |
294 |
Annotationtype.NUM_PROBES.setAnnotationValue(dc, meth, stat.probesRaw); |
6876 |
18 Nov 22 |
nicklas |
295 |
Annotationtype.NUM_PROBES_BAD_PVAL.setAnnotationValue(dc, meth, stat.probesBad); |
6876 |
18 Nov 22 |
nicklas |
296 |
if (stat.probesRaw != null && stat.probesBad != null && stat.probesRaw > 0) |
6876 |
18 Nov 22 |
nicklas |
297 |
{ |
6876 |
18 Nov 22 |
nicklas |
298 |
Annotationtype.PROBES_RATE.setAnnotationValue(dc, meth, 1f-(float)stat.probesBad/(float)stat.probesRaw); |
6876 |
18 Nov 22 |
nicklas |
299 |
} |
6876 |
18 Nov 22 |
nicklas |
300 |
Annotationtype.NUM_PROBES_I.setAnnotationValue(dc, meth, stat.probesI); |
6876 |
18 Nov 22 |
nicklas |
301 |
Annotationtype.NUM_PROBES_II.setAnnotationValue(dc, meth, stat.probesII); |
6876 |
18 Nov 22 |
nicklas |
302 |
Annotationtype.MEDIAN_METH.setAnnotationValue(dc, meth, stat.medianMeth); |
6876 |
18 Nov 22 |
nicklas |
303 |
Annotationtype.MEDIAN_UNMETH.setAnnotationValue(dc, meth, stat.medianUnmeth); |
6876 |
18 Nov 22 |
nicklas |
304 |
|
6876 |
18 Nov 22 |
nicklas |
305 |
Annotationtype.PEAK_METH_I.setAnnotationValue(dc, meth, stat.peakMethI); |
6876 |
18 Nov 22 |
nicklas |
306 |
Annotationtype.PEAK_UNMETH_I.setAnnotationValue(dc, meth, stat.peakUnmethI); |
6876 |
18 Nov 22 |
nicklas |
307 |
Annotationtype.PEAK_METH_II.setAnnotationValue(dc, meth, stat.peakMethII); |
6876 |
18 Nov 22 |
nicklas |
308 |
Annotationtype.PEAK_UNMETH_II.setAnnotationValue(dc, meth, stat.peakUnmethII); |
6876 |
18 Nov 22 |
nicklas |
309 |
|
6878 |
18 Nov 22 |
nicklas |
310 |
Annotationtype.ANALYSIS_FLAG.setAnnotationValue(dc, meth, stat.flag); |
6878 |
18 Nov 22 |
nicklas |
311 |
|
6878 |
18 Nov 22 |
nicklas |
312 |
if (stat.flag != null) |
6878 |
18 Nov 22 |
nicklas |
313 |
{ |
6878 |
18 Nov 22 |
nicklas |
314 |
msg = "Flagged: " + stat.flag; |
6878 |
18 Nov 22 |
nicklas |
315 |
} |
6878 |
18 Nov 22 |
nicklas |
316 |
|
6870 |
16 Nov 22 |
nicklas |
317 |
dc.commit(); |
6870 |
16 Nov 22 |
nicklas |
318 |
} |
6870 |
16 Nov 22 |
nicklas |
319 |
finally |
6870 |
16 Nov 22 |
nicklas |
320 |
{ |
6870 |
16 Nov 22 |
nicklas |
321 |
if (dc != null) dc.close(); |
6870 |
16 Nov 22 |
nicklas |
322 |
} |
6870 |
16 Nov 22 |
nicklas |
323 |
|
6870 |
16 Nov 22 |
nicklas |
324 |
return msg == null ? "" : msg; |
6870 |
16 Nov 22 |
nicklas |
325 |
} |
6870 |
16 Nov 22 |
nicklas |
326 |
|
6870 |
16 Nov 22 |
nicklas |
327 |
} |
6876 |
18 Nov 22 |
nicklas |
328 |
|
6876 |
18 Nov 22 |
nicklas |
329 |
/** |
6876 |
18 Nov 22 |
nicklas |
Statistics from the beta analysis. Parsed from stats.out. |
6876 |
18 Nov 22 |
nicklas |
331 |
*/ |
6876 |
18 Nov 22 |
nicklas |
332 |
static class Stats |
6876 |
18 Nov 22 |
nicklas |
333 |
{ |
6876 |
18 Nov 22 |
nicklas |
334 |
Integer probesRaw = null; |
6876 |
18 Nov 22 |
nicklas |
335 |
Integer probesBad = null; |
6876 |
18 Nov 22 |
nicklas |
336 |
Integer probesI = null; |
6876 |
18 Nov 22 |
nicklas |
337 |
Integer probesII = null; |
6876 |
18 Nov 22 |
nicklas |
338 |
Float medianMeth = null; |
6876 |
18 Nov 22 |
nicklas |
339 |
Float medianUnmeth = null; |
6876 |
18 Nov 22 |
nicklas |
340 |
Float peakMethI = null; |
6876 |
18 Nov 22 |
nicklas |
341 |
Float peakUnmethI = null; |
6876 |
18 Nov 22 |
nicklas |
342 |
Float peakMethII = null; |
6876 |
18 Nov 22 |
nicklas |
343 |
Float peakUnmethII = null; |
6878 |
18 Nov 22 |
nicklas |
344 |
String flag = null; |
6876 |
18 Nov 22 |
nicklas |
345 |
|
6876 |
18 Nov 22 |
nicklas |
346 |
static Stats parse(String statsOut) |
6876 |
18 Nov 22 |
nicklas |
347 |
{ |
6876 |
18 Nov 22 |
nicklas |
348 |
Stats s = new Stats(); |
6876 |
18 Nov 22 |
nicklas |
349 |
for (String line : statsOut.split("\n")) |
6876 |
18 Nov 22 |
nicklas |
350 |
{ |
6876 |
18 Nov 22 |
nicklas |
351 |
String[] stat = line.split("\\s", 2); |
6876 |
18 Nov 22 |
nicklas |
352 |
String key = stat[0].strip(); |
6876 |
18 Nov 22 |
nicklas |
353 |
String val = stat[1].strip(); |
6876 |
18 Nov 22 |
nicklas |
354 |
if ("MedianMeth".equals(key)) |
6876 |
18 Nov 22 |
nicklas |
355 |
{ |
6876 |
18 Nov 22 |
nicklas |
356 |
s.medianMeth = Float.parseFloat(val); |
6876 |
18 Nov 22 |
nicklas |
357 |
} |
6876 |
18 Nov 22 |
nicklas |
358 |
else if ("MedianUnmeth".equals(key)) |
6876 |
18 Nov 22 |
nicklas |
359 |
{ |
6876 |
18 Nov 22 |
nicklas |
360 |
s.medianUnmeth = Float.parseFloat(val); |
6876 |
18 Nov 22 |
nicklas |
361 |
} |
6876 |
18 Nov 22 |
nicklas |
362 |
else if ("ProbesRaw".equals(key)) |
6876 |
18 Nov 22 |
nicklas |
363 |
{ |
6876 |
18 Nov 22 |
nicklas |
364 |
s.probesRaw = Integer.parseInt(val); |
6876 |
18 Nov 22 |
nicklas |
365 |
} |
6876 |
18 Nov 22 |
nicklas |
366 |
else if ("ProbesBad".equals(key)) |
6876 |
18 Nov 22 |
nicklas |
367 |
{ |
6876 |
18 Nov 22 |
nicklas |
368 |
s.probesBad = Integer.parseInt(val); |
6876 |
18 Nov 22 |
nicklas |
369 |
} |
6876 |
18 Nov 22 |
nicklas |
370 |
else if ("ProbesI".equals(key)) |
6876 |
18 Nov 22 |
nicklas |
371 |
{ |
6876 |
18 Nov 22 |
nicklas |
372 |
s.probesI = Integer.parseInt(val); |
6876 |
18 Nov 22 |
nicklas |
373 |
} |
6876 |
18 Nov 22 |
nicklas |
374 |
else if ("ProbesII".equals(key)) |
6876 |
18 Nov 22 |
nicklas |
375 |
{ |
6876 |
18 Nov 22 |
nicklas |
376 |
s.probesII = Integer.parseInt(val); |
6876 |
18 Nov 22 |
nicklas |
377 |
} |
6876 |
18 Nov 22 |
nicklas |
378 |
else if ("PeakUnmethI".equals(key)) |
6876 |
18 Nov 22 |
nicklas |
379 |
{ |
6876 |
18 Nov 22 |
nicklas |
380 |
s.peakUnmethI = Float.parseFloat(val); |
6876 |
18 Nov 22 |
nicklas |
381 |
} |
6876 |
18 Nov 22 |
nicklas |
382 |
else if ("PeakMethI".equals(key)) |
6876 |
18 Nov 22 |
nicklas |
383 |
{ |
6876 |
18 Nov 22 |
nicklas |
384 |
s.peakMethI = Float.parseFloat(val); |
6876 |
18 Nov 22 |
nicklas |
385 |
} |
6876 |
18 Nov 22 |
nicklas |
386 |
else if ("PeakUnmethII".equals(key)) |
6876 |
18 Nov 22 |
nicklas |
387 |
{ |
6876 |
18 Nov 22 |
nicklas |
388 |
s.peakUnmethII = Float.parseFloat(val); |
6876 |
18 Nov 22 |
nicklas |
389 |
} |
6876 |
18 Nov 22 |
nicklas |
390 |
else if ("PeakMethII".equals(key)) |
6876 |
18 Nov 22 |
nicklas |
391 |
{ |
6876 |
18 Nov 22 |
nicklas |
392 |
s.peakMethII = Float.parseFloat(val); |
6876 |
18 Nov 22 |
nicklas |
393 |
} |
6878 |
18 Nov 22 |
nicklas |
394 |
else if ("Flag".equals(key)) |
6878 |
18 Nov 22 |
nicklas |
395 |
{ |
6878 |
18 Nov 22 |
nicklas |
396 |
s.flag = val; |
6878 |
18 Nov 22 |
nicklas |
397 |
} |
6876 |
18 Nov 22 |
nicklas |
398 |
} |
6876 |
18 Nov 22 |
nicklas |
399 |
return s; |
6876 |
18 Nov 22 |
nicklas |
400 |
} |
6876 |
18 Nov 22 |
nicklas |
401 |
|
6876 |
18 Nov 22 |
nicklas |
402 |
} |
6876 |
18 Nov 22 |
nicklas |
403 |
|
6870 |
16 Nov 22 |
nicklas |
404 |
} |