5628 |
24 Sep 19 |
nicklas |
1 |
package net.sf.basedb.reggie.ssp; |
5628 |
24 Sep 19 |
nicklas |
2 |
|
5628 |
24 Sep 19 |
nicklas |
3 |
import java.util.ArrayList; |
5628 |
24 Sep 19 |
nicklas |
4 |
import java.util.Arrays; |
5962 |
03 Jun 20 |
nicklas |
5 |
import java.util.Collection; |
5628 |
24 Sep 19 |
nicklas |
6 |
import java.util.Collections; |
5929 |
05 May 20 |
nicklas |
7 |
import java.util.HashMap; |
5628 |
24 Sep 19 |
nicklas |
8 |
import java.util.HashSet; |
5628 |
24 Sep 19 |
nicklas |
9 |
import java.util.List; |
5929 |
05 May 20 |
nicklas |
10 |
import java.util.Map; |
5628 |
24 Sep 19 |
nicklas |
11 |
import java.util.Set; |
5937 |
15 May 20 |
nicklas |
12 |
import java.util.regex.Matcher; |
5937 |
15 May 20 |
nicklas |
13 |
import java.util.regex.Pattern; |
5628 |
24 Sep 19 |
nicklas |
14 |
|
5628 |
24 Sep 19 |
nicklas |
15 |
import net.sf.basedb.core.AnnotationBatcher; |
5628 |
24 Sep 19 |
nicklas |
16 |
import net.sf.basedb.core.AnnotationBatcher.Change; |
5628 |
24 Sep 19 |
nicklas |
17 |
import net.sf.basedb.core.AnnotationType; |
5922 |
27 Apr 20 |
nicklas |
18 |
import net.sf.basedb.core.AnyToAny; |
5628 |
24 Sep 19 |
nicklas |
19 |
import net.sf.basedb.core.BaseException; |
5628 |
24 Sep 19 |
nicklas |
20 |
import net.sf.basedb.core.BooleanParameterType; |
5628 |
24 Sep 19 |
nicklas |
21 |
import net.sf.basedb.core.DbControl; |
5628 |
24 Sep 19 |
nicklas |
22 |
import net.sf.basedb.core.Item; |
5628 |
24 Sep 19 |
nicklas |
23 |
import net.sf.basedb.core.ItemContext; |
5922 |
27 Apr 20 |
nicklas |
24 |
import net.sf.basedb.core.ItemList; |
5628 |
24 Sep 19 |
nicklas |
25 |
import net.sf.basedb.core.ItemParameterType; |
5628 |
24 Sep 19 |
nicklas |
26 |
import net.sf.basedb.core.ItemQuery; |
5922 |
27 Apr 20 |
nicklas |
27 |
import net.sf.basedb.core.Job; |
5922 |
27 Apr 20 |
nicklas |
28 |
import net.sf.basedb.core.PluginDefinition; |
5628 |
24 Sep 19 |
nicklas |
29 |
import net.sf.basedb.core.PluginParameter; |
5628 |
24 Sep 19 |
nicklas |
30 |
import net.sf.basedb.core.ProgressReporter; |
5628 |
24 Sep 19 |
nicklas |
31 |
import net.sf.basedb.core.RawBioAssay; |
5628 |
24 Sep 19 |
nicklas |
32 |
import net.sf.basedb.core.RequestInformation; |
5922 |
27 Apr 20 |
nicklas |
33 |
import net.sf.basedb.core.SessionControl; |
5628 |
24 Sep 19 |
nicklas |
34 |
import net.sf.basedb.core.Type; |
5628 |
24 Sep 19 |
nicklas |
35 |
import net.sf.basedb.core.Job.ExecutionTime; |
5628 |
24 Sep 19 |
nicklas |
36 |
import net.sf.basedb.core.StringParameterType; |
5628 |
24 Sep 19 |
nicklas |
37 |
import net.sf.basedb.core.plugin.AbstractPlugin; |
5628 |
24 Sep 19 |
nicklas |
38 |
import net.sf.basedb.core.plugin.GuiContext; |
5628 |
24 Sep 19 |
nicklas |
39 |
import net.sf.basedb.core.plugin.InteractivePlugin; |
5628 |
24 Sep 19 |
nicklas |
40 |
import net.sf.basedb.core.plugin.Request; |
5628 |
24 Sep 19 |
nicklas |
41 |
import net.sf.basedb.core.plugin.Response; |
5962 |
03 Jun 20 |
nicklas |
42 |
import net.sf.basedb.core.query.Annotations; |
5628 |
24 Sep 19 |
nicklas |
43 |
import net.sf.basedb.core.query.Expressions; |
5628 |
24 Sep 19 |
nicklas |
44 |
import net.sf.basedb.core.query.Hql; |
5628 |
24 Sep 19 |
nicklas |
45 |
import net.sf.basedb.core.query.Restrictions; |
5628 |
24 Sep 19 |
nicklas |
46 |
import net.sf.basedb.core.signal.SignalHandler; |
5628 |
24 Sep 19 |
nicklas |
47 |
import net.sf.basedb.core.signal.SignalTarget; |
5628 |
24 Sep 19 |
nicklas |
48 |
import net.sf.basedb.core.signal.ThreadSignalHandler; |
5628 |
24 Sep 19 |
nicklas |
49 |
import net.sf.basedb.plugins.util.Parameters; |
5628 |
24 Sep 19 |
nicklas |
50 |
import net.sf.basedb.reggie.Reggie; |
6186 |
26 Mar 21 |
nicklas |
51 |
import net.sf.basedb.reggie.autoconfirm.AutoConfirmService; |
6186 |
26 Mar 21 |
nicklas |
52 |
import net.sf.basedb.reggie.counter.CounterService; |
5922 |
27 Apr 20 |
nicklas |
53 |
import net.sf.basedb.reggie.dao.Annotationtype; |
5922 |
27 Apr 20 |
nicklas |
54 |
import net.sf.basedb.reggie.dao.BiomaterialList; |
5628 |
24 Sep 19 |
nicklas |
55 |
import net.sf.basedb.reggie.dao.Rawbioassay; |
5628 |
24 Sep 19 |
nicklas |
56 |
import net.sf.basedb.reggie.dao.Rawdatatype; |
5922 |
27 Apr 20 |
nicklas |
57 |
import net.sf.basedb.reggie.dao.Subtype; |
5628 |
24 Sep 19 |
nicklas |
58 |
import net.sf.basedb.util.Enumeration; |
5628 |
24 Sep 19 |
nicklas |
59 |
import net.sf.basedb.util.Values; |
5628 |
24 Sep 19 |
nicklas |
60 |
|
5628 |
24 Sep 19 |
nicklas |
61 |
public class SspPlugin |
5628 |
24 Sep 19 |
nicklas |
62 |
extends AbstractPlugin |
5628 |
24 Sep 19 |
nicklas |
63 |
implements InteractivePlugin, SignalTarget |
5628 |
24 Sep 19 |
nicklas |
64 |
{ |
5628 |
24 Sep 19 |
nicklas |
65 |
|
5922 |
27 Apr 20 |
nicklas |
66 |
/** |
5922 |
27 Apr 20 |
nicklas |
Utility function for creating a BASE job that runs this plugin. |
5922 |
27 Apr 20 |
nicklas |
for a given list of raw bioassays and models. |
5922 |
27 Apr 20 |
nicklas |
69 |
|
5922 |
27 Apr 20 |
nicklas |
Other pararameter are using default values from configuration file. |
5922 |
27 Apr 20 |
nicklas |
@since 4.27 |
5922 |
27 Apr 20 |
nicklas |
72 |
*/ |
6025 |
26 Oct 20 |
nicklas |
73 |
public static Job createAnalysisJob(DbControl dc, List<RawBioAssay> rawBioAssays, List<String> models, boolean autoConfirm) |
5922 |
27 Apr 20 |
nicklas |
74 |
{ |
5922 |
27 Apr 20 |
nicklas |
75 |
SessionControl sc = dc.getSessionControl(); |
5922 |
27 Apr 20 |
nicklas |
76 |
|
5922 |
27 Apr 20 |
nicklas |
// Create the job |
5922 |
27 Apr 20 |
nicklas |
78 |
PluginDefinition sspPlugin = PluginDefinition.getByClassName(dc, SspPlugin.class.getName()); |
5922 |
27 Apr 20 |
nicklas |
79 |
Job sspJob = Job.getNew(dc, sspPlugin, null, null); |
5922 |
27 Apr 20 |
nicklas |
80 |
dc.saveItem(sspJob); |
5922 |
27 Apr 20 |
nicklas |
81 |
|
5922 |
27 Apr 20 |
nicklas |
82 |
sspJob.setItemSubtype(Subtype.SSP_JOB.get(dc)); |
5922 |
27 Apr 20 |
nicklas |
83 |
sspJob.setSendMessage(Values.getBoolean(sc.getUserClientSetting("plugins.sendmessage"), false)); |
5962 |
03 Jun 20 |
nicklas |
84 |
if (rawBioAssays.size() == 0) |
5922 |
27 Apr 20 |
nicklas |
85 |
{ |
5962 |
03 Jun 20 |
nicklas |
// Find rawbioassays with missing SSP annotation |
5962 |
03 Jun 20 |
nicklas |
87 |
Set<RawBioAssay> toUpdate = new HashSet<>(); |
5962 |
03 Jun 20 |
nicklas |
88 |
for (String m : models) |
5962 |
03 Jun 20 |
nicklas |
89 |
{ |
5962 |
03 Jun 20 |
nicklas |
90 |
SspModel model = SspModel.getModelByName(m); |
5962 |
03 Jun 20 |
nicklas |
91 |
ItemQuery<RawBioAssay> query = RawBioAssay.getQuery(); |
5962 |
03 Jun 20 |
nicklas |
92 |
query.setIncludes(Reggie.INCLUDE_IN_CURRENT_PROJECT); |
5962 |
03 Jun 20 |
nicklas |
93 |
Rawdatatype.STRINGTIE.addFilter(dc, query); |
5962 |
03 Jun 20 |
nicklas |
// Only load rawbioassays with missing value |
5962 |
03 Jun 20 |
nicklas |
95 |
query.join(Annotations.leftJoin(model.getAnnotationType(dc), "ssp")); |
5962 |
03 Jun 20 |
nicklas |
96 |
query.restrict(Restrictions.eq(Hql.alias("ssp"), null)); |
5962 |
03 Jun 20 |
nicklas |
97 |
toUpdate.addAll(query.list(dc)); |
5962 |
03 Jun 20 |
nicklas |
98 |
} |
5962 |
03 Jun 20 |
nicklas |
99 |
rawBioAssays.addAll(toUpdate); |
5962 |
03 Jun 20 |
nicklas |
100 |
sspJob.setName("Single Sample Predictor for " + models.size() + " models (" + rawBioAssays.size() + " raw bioassys with missing value)"); |
5922 |
27 Apr 20 |
nicklas |
101 |
} |
5962 |
03 Jun 20 |
nicklas |
102 |
else |
5922 |
27 Apr 20 |
nicklas |
103 |
{ |
5962 |
03 Jun 20 |
nicklas |
104 |
if (rawBioAssays.size() == 1) |
5962 |
03 Jun 20 |
nicklas |
105 |
{ |
5962 |
03 Jun 20 |
nicklas |
106 |
sspJob.setName("Single Sample Predictor for " + rawBioAssays.get(0).getName() + " (" + models.size() + " models)"); |
5962 |
03 Jun 20 |
nicklas |
107 |
} |
5962 |
03 Jun 20 |
nicklas |
108 |
else |
5962 |
03 Jun 20 |
nicklas |
109 |
{ |
5962 |
03 Jun 20 |
nicklas |
110 |
sspJob.setName("Single Sample Predictor for " + rawBioAssays.size() + " raw bioassays (" + models.size() + " models)"); |
5962 |
03 Jun 20 |
nicklas |
111 |
} |
5922 |
27 Apr 20 |
nicklas |
112 |
} |
6025 |
26 Oct 20 |
nicklas |
113 |
sspJob.setParameterValues("rawBioAssays", |
6025 |
26 Oct 20 |
nicklas |
114 |
new ItemParameterType<RawBioAssay>(RawBioAssay.class, null, true, 0, null), rawBioAssays); |
5922 |
27 Apr 20 |
nicklas |
115 |
sspJob.setParameterValues("models", new StringParameterType(255, null, true, 0, 0, 0), models); |
6025 |
26 Oct 20 |
nicklas |
116 |
if (autoConfirm) |
6025 |
26 Oct 20 |
nicklas |
117 |
{ |
6025 |
26 Oct 20 |
nicklas |
118 |
sspJob.setParameterValue("AutoConfirmHandler", new StringParameterType(), "SspAutoConfirmer"); |
6025 |
26 Oct 20 |
nicklas |
119 |
} |
5922 |
27 Apr 20 |
nicklas |
120 |
sspJob.setScheduled(null, null); |
5628 |
24 Sep 19 |
nicklas |
121 |
|
5922 |
27 Apr 20 |
nicklas |
122 |
ItemList sspPipeline = BiomaterialList.SSP_PIPELINE.get(dc); |
5922 |
27 Apr 20 |
nicklas |
123 |
for (RawBioAssay raw : rawBioAssays) |
5922 |
27 Apr 20 |
nicklas |
124 |
{ |
5922 |
27 Apr 20 |
nicklas |
// Reset AutoProcessing annotation and remove from item list |
5922 |
27 Apr 20 |
nicklas |
126 |
Annotationtype.AUTO_PROCESSING.setAnnotationValue(dc, raw, null); |
5922 |
27 Apr 20 |
nicklas |
127 |
sspPipeline.removeItem(raw); |
5922 |
27 Apr 20 |
nicklas |
128 |
|
5922 |
27 Apr 20 |
nicklas |
// Link to the job for bookkeeping |
5922 |
27 Apr 20 |
nicklas |
130 |
AnyToAny link = AnyToAny.getNewOrExisting(dc, raw, "SSPJob", sspJob, false); |
5922 |
27 Apr 20 |
nicklas |
131 |
if (!link.isInDatabase()) dc.saveItem(link); |
5922 |
27 Apr 20 |
nicklas |
132 |
} |
5922 |
27 Apr 20 |
nicklas |
133 |
|
5922 |
27 Apr 20 |
nicklas |
134 |
return sspJob; |
5922 |
27 Apr 20 |
nicklas |
135 |
} |
5922 |
27 Apr 20 |
nicklas |
136 |
|
5628 |
24 Sep 19 |
nicklas |
137 |
private ThreadSignalHandler signalHandler; |
5628 |
24 Sep 19 |
nicklas |
138 |
|
5628 |
24 Sep 19 |
nicklas |
139 |
public SspPlugin() |
5920 |
27 Apr 20 |
nicklas |
140 |
{} |
5628 |
24 Sep 19 |
nicklas |
141 |
|
5628 |
24 Sep 19 |
nicklas |
142 |
/* |
5628 |
24 Sep 19 |
nicklas |
From the Plugin interface |
5628 |
24 Sep 19 |
nicklas |
144 |
-------------------------------- |
5628 |
24 Sep 19 |
nicklas |
145 |
*/ |
5628 |
24 Sep 19 |
nicklas |
146 |
@Override |
5628 |
24 Sep 19 |
nicklas |
147 |
public MainType getMainType() |
5628 |
24 Sep 19 |
nicklas |
148 |
{ |
5628 |
24 Sep 19 |
nicklas |
149 |
return MainType.OTHER; |
5628 |
24 Sep 19 |
nicklas |
150 |
} |
5628 |
24 Sep 19 |
nicklas |
151 |
|
5628 |
24 Sep 19 |
nicklas |
152 |
@Override |
5628 |
24 Sep 19 |
nicklas |
153 |
public boolean supportsConfigurations() |
5628 |
24 Sep 19 |
nicklas |
154 |
{ |
5628 |
24 Sep 19 |
nicklas |
155 |
return true; |
5628 |
24 Sep 19 |
nicklas |
156 |
} |
5628 |
24 Sep 19 |
nicklas |
157 |
|
5628 |
24 Sep 19 |
nicklas |
158 |
@Override |
5628 |
24 Sep 19 |
nicklas |
159 |
public boolean requiresConfiguration() |
5628 |
24 Sep 19 |
nicklas |
160 |
{ |
5628 |
24 Sep 19 |
nicklas |
161 |
return false; |
5628 |
24 Sep 19 |
nicklas |
162 |
} |
5628 |
24 Sep 19 |
nicklas |
163 |
|
5628 |
24 Sep 19 |
nicklas |
164 |
@Override |
5628 |
24 Sep 19 |
nicklas |
165 |
public void run(Request request, Response response, ProgressReporter progress) |
5628 |
24 Sep 19 |
nicklas |
166 |
{ |
5628 |
24 Sep 19 |
nicklas |
167 |
if (signalHandler != null) signalHandler.setWorkerThread(null); |
5628 |
24 Sep 19 |
nicklas |
168 |
|
5628 |
24 Sep 19 |
nicklas |
169 |
DbControl dc = null; |
5628 |
24 Sep 19 |
nicklas |
170 |
SspAnalysis ssp = null; |
5925 |
29 Apr 20 |
nicklas |
171 |
Throwable lastException = null; |
5628 |
24 Sep 19 |
nicklas |
172 |
try |
5628 |
24 Sep 19 |
nicklas |
173 |
{ |
5628 |
24 Sep 19 |
nicklas |
174 |
String logFile = (String)job.getValue(Parameters.LOGFILE_PARAMETER); |
5628 |
24 Sep 19 |
nicklas |
175 |
createLogFile(logFile); |
5628 |
24 Sep 19 |
nicklas |
176 |
|
5628 |
24 Sep 19 |
nicklas |
177 |
dc = sc.newDbControl(); |
5628 |
24 Sep 19 |
nicklas |
178 |
boolean debugMode = Boolean.TRUE.equals(job.getValue("debugMode")); |
6186 |
26 Mar 21 |
nicklas |
179 |
boolean autoConfirm = job.getValue("AutoConfirmHandler") != null; |
5628 |
24 Sep 19 |
nicklas |
180 |
List<RawBioAssay> rawBioAssays = job.getValues("rawBioAssays"); |
5628 |
24 Sep 19 |
nicklas |
181 |
List<String> modelNames = job.getValues("models"); |
5922 |
27 Apr 20 |
nicklas |
182 |
if (modelNames == null || modelNames.isEmpty()) |
5922 |
27 Apr 20 |
nicklas |
183 |
{ |
5922 |
27 Apr 20 |
nicklas |
184 |
modelNames = SspModel.getModelNames(); |
5922 |
27 Apr 20 |
nicklas |
185 |
} |
5962 |
03 Jun 20 |
nicklas |
186 |
|
5628 |
24 Sep 19 |
nicklas |
187 |
AnnotationBatcher batcher = new AnnotationBatcher(dc, Item.RAWBIOASSAY); |
5628 |
24 Sep 19 |
nicklas |
188 |
List<SspModel> models = new ArrayList<>(); |
5628 |
24 Sep 19 |
nicklas |
189 |
StringBuilder logMsg = new StringBuilder(); |
5628 |
24 Sep 19 |
nicklas |
190 |
logMsg.append("RawBioAssay"); |
5628 |
24 Sep 19 |
nicklas |
191 |
for (String name : modelNames) |
5628 |
24 Sep 19 |
nicklas |
192 |
{ |
5628 |
24 Sep 19 |
nicklas |
193 |
SspModel model = SspModel.getModelByName(name); |
5628 |
24 Sep 19 |
nicklas |
194 |
AnnotationType at = model.getAnnotationType(dc); |
5628 |
24 Sep 19 |
nicklas |
195 |
if (at != null) |
5628 |
24 Sep 19 |
nicklas |
196 |
{ |
5628 |
24 Sep 19 |
nicklas |
197 |
models.add(model); |
5628 |
24 Sep 19 |
nicklas |
198 |
batcher.addAnnotationTypes(Collections.singleton(at)); |
5628 |
24 Sep 19 |
nicklas |
199 |
logMsg.append("\t").append(name); |
5937 |
15 May 20 |
nicklas |
200 |
|
5937 |
15 May 20 |
nicklas |
201 |
AnnotationType scores = model.getAnnotationTypeScores(dc); |
5937 |
15 May 20 |
nicklas |
202 |
if (scores != null) |
5937 |
15 May 20 |
nicklas |
203 |
{ |
5937 |
15 May 20 |
nicklas |
204 |
batcher.addAnnotationTypes(Collections.singleton(scores)); |
5937 |
15 May 20 |
nicklas |
205 |
logMsg.append("\t").append(name).append("_Scores"); |
5937 |
15 May 20 |
nicklas |
206 |
} |
5628 |
24 Sep 19 |
nicklas |
207 |
} |
5628 |
24 Sep 19 |
nicklas |
208 |
} |
5628 |
24 Sep 19 |
nicklas |
209 |
log(logMsg.toString()); |
5628 |
24 Sep 19 |
nicklas |
210 |
|
5962 |
03 Jun 20 |
nicklas |
211 |
Collection<Integer> idList = null; // ID of all RBA we need to run |
5962 |
03 Jun 20 |
nicklas |
212 |
|
5962 |
03 Jun 20 |
nicklas |
// Maps SSPModel -> List of RBA id that is missing a value for the model |
5962 |
03 Jun 20 |
nicklas |
214 |
Map<SspModel, Set<Integer>> modelsToUpdate = null; |
5962 |
03 Jun 20 |
nicklas |
215 |
|
5962 |
03 Jun 20 |
nicklas |
216 |
if (rawBioAssays == null || rawBioAssays.isEmpty()) |
5962 |
03 Jun 20 |
nicklas |
217 |
{ |
5962 |
03 Jun 20 |
nicklas |
// Find raw bioassays that is missing SSP annotations for each model |
5962 |
03 Jun 20 |
nicklas |
219 |
idList = new HashSet<>(); |
5962 |
03 Jun 20 |
nicklas |
220 |
modelsToUpdate = new HashMap<>(); |
5962 |
03 Jun 20 |
nicklas |
221 |
for (SspModel m : models) |
5962 |
03 Jun 20 |
nicklas |
222 |
{ |
5962 |
03 Jun 20 |
nicklas |
223 |
ItemQuery<RawBioAssay> query = RawBioAssay.getQuery(); |
5962 |
03 Jun 20 |
nicklas |
224 |
query.setIncludes(Reggie.INCLUDE_IN_CURRENT_PROJECT); |
5962 |
03 Jun 20 |
nicklas |
225 |
Rawdatatype.STRINGTIE.addFilter(dc, query); |
5962 |
03 Jun 20 |
nicklas |
// Only load rawbioassays with missing value |
5962 |
03 Jun 20 |
nicklas |
227 |
query.join(Annotations.leftJoin(m.getAnnotationType(dc), "ssp")); |
5962 |
03 Jun 20 |
nicklas |
228 |
query.restrict(Restrictions.eq(Hql.alias("ssp"), null)); |
5962 |
03 Jun 20 |
nicklas |
229 |
|
5962 |
03 Jun 20 |
nicklas |
230 |
Set<Integer> tmp = new HashSet<>(query.idList(dc)); |
5962 |
03 Jun 20 |
nicklas |
231 |
modelsToUpdate.put(m, tmp); |
5962 |
03 Jun 20 |
nicklas |
232 |
idList.addAll(tmp); |
5962 |
03 Jun 20 |
nicklas |
233 |
} |
5962 |
03 Jun 20 |
nicklas |
234 |
} |
5962 |
03 Jun 20 |
nicklas |
235 |
else |
5962 |
03 Jun 20 |
nicklas |
236 |
{ |
5962 |
03 Jun 20 |
nicklas |
237 |
idList = new ArrayList<>(); |
5962 |
03 Jun 20 |
nicklas |
238 |
for (RawBioAssay rba : rawBioAssays) |
5962 |
03 Jun 20 |
nicklas |
239 |
{ |
5962 |
03 Jun 20 |
nicklas |
240 |
idList.add(rba.getId()); |
5962 |
03 Jun 20 |
nicklas |
241 |
} |
5962 |
03 Jun 20 |
nicklas |
242 |
} |
5962 |
03 Jun 20 |
nicklas |
243 |
|
5962 |
03 Jun 20 |
nicklas |
244 |
int totalCount = idList.size(); |
5628 |
24 Sep 19 |
nicklas |
245 |
int count = 0; |
5628 |
24 Sep 19 |
nicklas |
246 |
int numCompleted = 0; |
5628 |
24 Sep 19 |
nicklas |
247 |
int numFailures = 0; |
5628 |
24 Sep 19 |
nicklas |
248 |
int numAnnotations = 0; |
5628 |
24 Sep 19 |
nicklas |
249 |
Set<String> failedModels = new HashSet<>(); |
5628 |
24 Sep 19 |
nicklas |
250 |
|
5628 |
24 Sep 19 |
nicklas |
251 |
ssp = new SspAnalysis(); |
5962 |
03 Jun 20 |
nicklas |
252 |
for (int rbaId : idList) |
5628 |
24 Sep 19 |
nicklas |
253 |
{ |
5628 |
24 Sep 19 |
nicklas |
254 |
ThreadSignalHandler.checkInterrupted(); |
5628 |
24 Sep 19 |
nicklas |
255 |
count++; |
5962 |
03 Jun 20 |
nicklas |
256 |
logMsg = new StringBuilder(); |
5962 |
03 Jun 20 |
nicklas |
257 |
Rawbioassay rba = Rawbioassay.getById(dc, rbaId); |
5628 |
24 Sep 19 |
nicklas |
258 |
if (progress != null) |
5628 |
24 Sep 19 |
nicklas |
259 |
{ |
5962 |
03 Jun 20 |
nicklas |
260 |
progress.display((90*count)/totalCount, rba.getName() + " (" + count + " of " + totalCount + (numFailures > 0 ? "; " + numFailures + " failed" : "") + ")"); |
5628 |
24 Sep 19 |
nicklas |
261 |
} |
5628 |
24 Sep 19 |
nicklas |
262 |
batcher.setCurrentItem(rba.getItem()); |
5628 |
24 Sep 19 |
nicklas |
263 |
logMsg.append(rba.getName()); |
5628 |
24 Sep 19 |
nicklas |
264 |
boolean hasFailure = false; |
5628 |
24 Sep 19 |
nicklas |
265 |
|
5628 |
24 Sep 19 |
nicklas |
266 |
SspAnalysis.Result result = ssp.run(dc, rba, models); |
5628 |
24 Sep 19 |
nicklas |
267 |
if (result.getExitStatus() == 0) |
5628 |
24 Sep 19 |
nicklas |
268 |
{ |
5668 |
15 Oct 19 |
nicklas |
269 |
for (SspModelResult modelResult : result.getModelResults()) |
5628 |
24 Sep 19 |
nicklas |
270 |
{ |
5668 |
15 Oct 19 |
nicklas |
271 |
SspModel model = modelResult.getModel(); |
5962 |
03 Jun 20 |
nicklas |
272 |
boolean update = modelsToUpdate == null || modelsToUpdate.get(model).contains(rbaId); |
5937 |
15 May 20 |
nicklas |
273 |
AnnotationType at = model.getAnnotationType(dc); |
5937 |
15 May 20 |
nicklas |
274 |
AnnotationType scores = model.getAnnotationTypeScores(dc); |
5962 |
03 Jun 20 |
nicklas |
275 |
if (update) |
5628 |
24 Sep 19 |
nicklas |
276 |
{ |
5962 |
03 Jun 20 |
nicklas |
277 |
try |
5937 |
15 May 20 |
nicklas |
278 |
{ |
5962 |
03 Jun 20 |
nicklas |
279 |
String resultClass = translate(modelResult.getResultClass()); |
5962 |
03 Jun 20 |
nicklas |
280 |
Object value = at.getValueType().parseString(resultClass); |
5962 |
03 Jun 20 |
nicklas |
281 |
Change change = batcher.setValue(at, value, null, false); |
5937 |
15 May 20 |
nicklas |
282 |
if (change != Change.NO_CHANGE) numAnnotations++; |
5962 |
03 Jun 20 |
nicklas |
283 |
logMsg.append("\t").append(value); |
5962 |
03 Jun 20 |
nicklas |
284 |
|
5962 |
03 Jun 20 |
nicklas |
285 |
if (scores != null) |
5962 |
03 Jun 20 |
nicklas |
286 |
{ |
5962 |
03 Jun 20 |
nicklas |
287 |
String resultScores = translateScores(modelResult.getAllScores()); |
5962 |
03 Jun 20 |
nicklas |
288 |
change = batcher.setValue(scores, resultScores, null, false); |
5962 |
03 Jun 20 |
nicklas |
289 |
if (change != Change.NO_CHANGE) numAnnotations++; |
5962 |
03 Jun 20 |
nicklas |
290 |
logMsg.append("\t").append(resultScores); |
5962 |
03 Jun 20 |
nicklas |
291 |
} |
5937 |
15 May 20 |
nicklas |
292 |
} |
5962 |
03 Jun 20 |
nicklas |
293 |
catch (RuntimeException ex) |
5962 |
03 Jun 20 |
nicklas |
294 |
{ |
5962 |
03 Jun 20 |
nicklas |
295 |
lastException = ex; |
5962 |
03 Jun 20 |
nicklas |
296 |
logMsg.append("\t").append(ex.getMessage()); |
5962 |
03 Jun 20 |
nicklas |
297 |
hasFailure = true; |
5962 |
03 Jun 20 |
nicklas |
298 |
failedModels.add(model.getName()); |
5962 |
03 Jun 20 |
nicklas |
299 |
} |
5628 |
24 Sep 19 |
nicklas |
300 |
} |
5962 |
03 Jun 20 |
nicklas |
301 |
else |
5628 |
24 Sep 19 |
nicklas |
302 |
{ |
5962 |
03 Jun 20 |
nicklas |
303 |
logMsg.append("\t"); |
5962 |
03 Jun 20 |
nicklas |
304 |
if (scores != null) logMsg.append("\t"); |
5628 |
24 Sep 19 |
nicklas |
305 |
} |
5628 |
24 Sep 19 |
nicklas |
306 |
} |
5628 |
24 Sep 19 |
nicklas |
307 |
if (hasFailure) |
5628 |
24 Sep 19 |
nicklas |
308 |
{ |
5628 |
24 Sep 19 |
nicklas |
309 |
numFailures++; |
5628 |
24 Sep 19 |
nicklas |
310 |
} |
5628 |
24 Sep 19 |
nicklas |
311 |
else |
5628 |
24 Sep 19 |
nicklas |
312 |
{ |
5628 |
24 Sep 19 |
nicklas |
313 |
numCompleted++; |
5628 |
24 Sep 19 |
nicklas |
314 |
} |
5628 |
24 Sep 19 |
nicklas |
315 |
} |
5628 |
24 Sep 19 |
nicklas |
316 |
else |
5628 |
24 Sep 19 |
nicklas |
317 |
{ |
5925 |
29 Apr 20 |
nicklas |
318 |
lastException = result.getException(); |
5628 |
24 Sep 19 |
nicklas |
319 |
logMsg.append(result.getStderr()); |
5628 |
24 Sep 19 |
nicklas |
320 |
numFailures++; |
5628 |
24 Sep 19 |
nicklas |
321 |
} |
5628 |
24 Sep 19 |
nicklas |
322 |
log(logMsg.toString()); |
5962 |
03 Jun 20 |
nicklas |
323 |
if (numFailures > 10) break; // Break if we get too many errors |
5628 |
24 Sep 19 |
nicklas |
324 |
} |
5628 |
24 Sep 19 |
nicklas |
325 |
batcher.flush(); |
5628 |
24 Sep 19 |
nicklas |
326 |
|
5628 |
24 Sep 19 |
nicklas |
327 |
StringBuilder msg = new StringBuilder(); |
5628 |
24 Sep 19 |
nicklas |
328 |
if (numFailures == 0) |
5628 |
24 Sep 19 |
nicklas |
329 |
{ |
5628 |
24 Sep 19 |
nicklas |
330 |
if (!job.getJob().isDryRun()) |
5628 |
24 Sep 19 |
nicklas |
331 |
{ |
5628 |
24 Sep 19 |
nicklas |
332 |
if (progress != null) |
5628 |
24 Sep 19 |
nicklas |
333 |
{ |
5628 |
24 Sep 19 |
nicklas |
334 |
progress.display(95, "Saving " + numAnnotations + " annotations to database."); |
5628 |
24 Sep 19 |
nicklas |
335 |
} |
5628 |
24 Sep 19 |
nicklas |
336 |
dc.commit(); |
5628 |
24 Sep 19 |
nicklas |
337 |
} |
5628 |
24 Sep 19 |
nicklas |
338 |
msg.append("Completed for " + numCompleted + " raw bioassays. " + numAnnotations + " annotations updated or created. "); |
5628 |
24 Sep 19 |
nicklas |
339 |
} |
5628 |
24 Sep 19 |
nicklas |
340 |
else |
5628 |
24 Sep 19 |
nicklas |
341 |
{ |
5925 |
29 Apr 20 |
nicklas |
342 |
if (lastException != null && lastException.getMessage() != null) |
5925 |
29 Apr 20 |
nicklas |
343 |
{ |
5925 |
29 Apr 20 |
nicklas |
344 |
msg.append(lastException.getMessage() + ". "); |
5925 |
29 Apr 20 |
nicklas |
345 |
} |
5925 |
29 Apr 20 |
nicklas |
346 |
if (numCompleted > 0) msg.append("Completed for " + numCompleted + " raw bioassays. "); |
5628 |
24 Sep 19 |
nicklas |
347 |
msg.append("Failed for " + numFailures + " raw bioassays. "); |
5628 |
24 Sep 19 |
nicklas |
348 |
if (failedModels.size() > 0) |
5628 |
24 Sep 19 |
nicklas |
349 |
{ |
5628 |
24 Sep 19 |
nicklas |
350 |
msg.append("Failed models: "); |
5628 |
24 Sep 19 |
nicklas |
351 |
msg.append(Values.getString(failedModels, ", ", true)); |
5628 |
24 Sep 19 |
nicklas |
352 |
msg.append(". "); |
5628 |
24 Sep 19 |
nicklas |
353 |
} |
5628 |
24 Sep 19 |
nicklas |
354 |
if (logFile != null) |
5628 |
24 Sep 19 |
nicklas |
355 |
{ |
5628 |
24 Sep 19 |
nicklas |
356 |
msg.append("Check the log file for more information."); |
5628 |
24 Sep 19 |
nicklas |
357 |
} |
5628 |
24 Sep 19 |
nicklas |
358 |
else |
5628 |
24 Sep 19 |
nicklas |
359 |
{ |
5628 |
24 Sep 19 |
nicklas |
360 |
msg.append("Use a log file to get more information."); |
5628 |
24 Sep 19 |
nicklas |
361 |
} |
5925 |
29 Apr 20 |
nicklas |
362 |
throw new RuntimeException(msg.toString(), lastException); |
5628 |
24 Sep 19 |
nicklas |
363 |
} |
5628 |
24 Sep 19 |
nicklas |
364 |
|
5628 |
24 Sep 19 |
nicklas |
365 |
if (debugMode) |
5628 |
24 Sep 19 |
nicklas |
366 |
{ |
5628 |
24 Sep 19 |
nicklas |
// DEBUG!! will make it easier to re-run a job with same settings |
5628 |
24 Sep 19 |
nicklas |
368 |
response.setError("[DEBUG] "+msg, null); |
5628 |
24 Sep 19 |
nicklas |
369 |
} |
5628 |
24 Sep 19 |
nicklas |
370 |
else |
5628 |
24 Sep 19 |
nicklas |
371 |
{ |
5628 |
24 Sep 19 |
nicklas |
372 |
response.setDone(msg.toString()); |
5628 |
24 Sep 19 |
nicklas |
373 |
} |
6186 |
26 Mar 21 |
nicklas |
374 |
CounterService.getInstance().setForceCount(); |
6186 |
26 Mar 21 |
nicklas |
375 |
if (autoConfirm) AutoConfirmService.getInstance().setForceCheck(15); |
6186 |
26 Mar 21 |
nicklas |
376 |
|
5628 |
24 Sep 19 |
nicklas |
377 |
} |
5628 |
24 Sep 19 |
nicklas |
378 |
catch (Throwable t) |
5628 |
24 Sep 19 |
nicklas |
379 |
{ |
5628 |
24 Sep 19 |
nicklas |
380 |
response.setError(t.getMessage(), Arrays.asList(new Throwable[] { t })); |
5628 |
24 Sep 19 |
nicklas |
381 |
} |
5628 |
24 Sep 19 |
nicklas |
382 |
finally |
5628 |
24 Sep 19 |
nicklas |
383 |
{ |
5628 |
24 Sep 19 |
nicklas |
384 |
if (dc != null) dc.close(); |
5628 |
24 Sep 19 |
nicklas |
385 |
if (ssp != null) ssp.removeWorkDir(); |
5628 |
24 Sep 19 |
nicklas |
386 |
closeLogFile(); |
5628 |
24 Sep 19 |
nicklas |
387 |
} |
5628 |
24 Sep 19 |
nicklas |
388 |
|
5628 |
24 Sep 19 |
nicklas |
389 |
} |
5929 |
05 May 20 |
nicklas |
390 |
|
5929 |
05 May 20 |
nicklas |
391 |
private Map<String, String> translations; |
5937 |
15 May 20 |
nicklas |
// Translate some swedish to english |
5929 |
05 May 20 |
nicklas |
393 |
private String translate(String word) |
5929 |
05 May 20 |
nicklas |
394 |
{ |
5929 |
05 May 20 |
nicklas |
395 |
if (word == null) return null; |
5962 |
03 Jun 20 |
nicklas |
396 |
if (translations == null) translations = SspModel.getTranslations(); |
5929 |
05 May 20 |
nicklas |
397 |
String translatedWord = translations.get(word.toLowerCase()); |
5929 |
05 May 20 |
nicklas |
398 |
return translatedWord == null ? word : translatedWord; |
5929 |
05 May 20 |
nicklas |
399 |
} |
5628 |
24 Sep 19 |
nicklas |
400 |
|
5937 |
15 May 20 |
nicklas |
401 |
private Pattern translatePattern; |
5937 |
15 May 20 |
nicklas |
// Translate each class in the scores list |
5937 |
15 May 20 |
nicklas |
403 |
private String translateScores(String scores) |
5937 |
15 May 20 |
nicklas |
404 |
{ |
5937 |
15 May 20 |
nicklas |
405 |
if (translatePattern == null) |
5937 |
15 May 20 |
nicklas |
406 |
{ |
5937 |
15 May 20 |
nicklas |
// Pattern to match ClassA=ScoreA; ClassB=ScoreB; ...ClassN=ScoreN |
5937 |
15 May 20 |
nicklas |
// We catch 'Class' in $1 and rest in $2 |
5962 |
03 Jun 20 |
nicklas |
// Note: there can be spaces classes, for example: 'Class A' |
5962 |
03 Jun 20 |
nicklas |
410 |
translatePattern = Pattern.compile("(\\w+[\\s\\w]*)(=.+?(;|$))"); |
5937 |
15 May 20 |
nicklas |
411 |
} |
5937 |
15 May 20 |
nicklas |
412 |
Matcher m = translatePattern.matcher(scores); |
5937 |
15 May 20 |
nicklas |
413 |
return m.replaceAll(mr -> translate(mr.group(1))+mr.group(2)); |
5937 |
15 May 20 |
nicklas |
414 |
} |
5937 |
15 May 20 |
nicklas |
415 |
|
5628 |
24 Sep 19 |
nicklas |
416 |
// ------------------------------------- |
5628 |
24 Sep 19 |
nicklas |
417 |
/* |
5628 |
24 Sep 19 |
nicklas |
From the InteractivePlugin interface |
5628 |
24 Sep 19 |
nicklas |
419 |
------------------------------------------- |
5628 |
24 Sep 19 |
nicklas |
420 |
*/ |
5628 |
24 Sep 19 |
nicklas |
421 |
/** |
5628 |
24 Sep 19 |
nicklas |
The plug-in will appear on the single-item and list page for raw bioassays. |
5628 |
24 Sep 19 |
nicklas |
423 |
*/ |
5628 |
24 Sep 19 |
nicklas |
424 |
@Override |
5628 |
24 Sep 19 |
nicklas |
425 |
public Set<GuiContext> getGuiContexts() |
5628 |
24 Sep 19 |
nicklas |
426 |
{ |
5628 |
24 Sep 19 |
nicklas |
427 |
Set<GuiContext> ctx = new HashSet<GuiContext>(); |
5628 |
24 Sep 19 |
nicklas |
428 |
ctx.add(GuiContext.item(Item.RAWBIOASSAY)); |
5628 |
24 Sep 19 |
nicklas |
429 |
ctx.add(GuiContext.list(Item.RAWBIOASSAY)); |
5628 |
24 Sep 19 |
nicklas |
430 |
return Collections.unmodifiableSet(ctx); |
5628 |
24 Sep 19 |
nicklas |
431 |
} |
5628 |
24 Sep 19 |
nicklas |
432 |
/** |
5628 |
24 Sep 19 |
nicklas |
We accept all StringTie raw bioassays. |
5628 |
24 Sep 19 |
nicklas |
434 |
*/ |
5628 |
24 Sep 19 |
nicklas |
435 |
@Override |
5628 |
24 Sep 19 |
nicklas |
436 |
public String isInContext(GuiContext context, Object item) |
5628 |
24 Sep 19 |
nicklas |
437 |
{ |
5628 |
24 Sep 19 |
nicklas |
438 |
String message = null; |
5628 |
24 Sep 19 |
nicklas |
439 |
if (context.getType() == GuiContext.Type.ITEM) |
5628 |
24 Sep 19 |
nicklas |
440 |
{ |
5628 |
24 Sep 19 |
nicklas |
441 |
if (item == null) |
5628 |
24 Sep 19 |
nicklas |
442 |
{ |
5628 |
24 Sep 19 |
nicklas |
443 |
message = "The object is null"; |
5628 |
24 Sep 19 |
nicklas |
444 |
} |
5628 |
24 Sep 19 |
nicklas |
445 |
else if (!(item instanceof RawBioAssay)) |
5628 |
24 Sep 19 |
nicklas |
446 |
{ |
5628 |
24 Sep 19 |
nicklas |
447 |
message = "The object is not a raw bioassay: " + item; |
5628 |
24 Sep 19 |
nicklas |
448 |
} |
5628 |
24 Sep 19 |
nicklas |
449 |
else |
5628 |
24 Sep 19 |
nicklas |
450 |
{ |
5628 |
24 Sep 19 |
nicklas |
451 |
RawBioAssay pba = (RawBioAssay)item; |
5628 |
24 Sep 19 |
nicklas |
452 |
if (!pba.getRawDataType().equals(Rawdatatype.STRINGTIE.getRawDataType())) |
5628 |
24 Sep 19 |
nicklas |
453 |
{ |
5628 |
24 Sep 19 |
nicklas |
454 |
message = "The rawbioassay doesn't contain StringTie data."; |
5628 |
24 Sep 19 |
nicklas |
455 |
} |
5628 |
24 Sep 19 |
nicklas |
456 |
} |
5628 |
24 Sep 19 |
nicklas |
457 |
} |
5628 |
24 Sep 19 |
nicklas |
458 |
return message; |
5628 |
24 Sep 19 |
nicklas |
459 |
} |
5628 |
24 Sep 19 |
nicklas |
460 |
|
5628 |
24 Sep 19 |
nicklas |
461 |
@Override |
5628 |
24 Sep 19 |
nicklas |
462 |
public RequestInformation getRequestInformation(GuiContext context, String command) |
5628 |
24 Sep 19 |
nicklas |
463 |
throws BaseException |
5628 |
24 Sep 19 |
nicklas |
464 |
{ |
5628 |
24 Sep 19 |
nicklas |
465 |
RequestInformation requestInformation = null; |
5628 |
24 Sep 19 |
nicklas |
466 |
if (Request.COMMAND_CONFIGURE_PLUGIN.equals(command)) |
5628 |
24 Sep 19 |
nicklas |
467 |
{ |
5628 |
24 Sep 19 |
nicklas |
468 |
requestInformation = getConfigurePluginParameters(); |
5628 |
24 Sep 19 |
nicklas |
469 |
} |
5628 |
24 Sep 19 |
nicklas |
470 |
else if (Request.COMMAND_CONFIGURE_JOB.equals(command)) |
5628 |
24 Sep 19 |
nicklas |
471 |
{ |
5628 |
24 Sep 19 |
nicklas |
472 |
requestInformation = getConfigureJobParameters(context, null); |
5628 |
24 Sep 19 |
nicklas |
473 |
} |
5628 |
24 Sep 19 |
nicklas |
474 |
return requestInformation; |
5628 |
24 Sep 19 |
nicklas |
475 |
} |
5628 |
24 Sep 19 |
nicklas |
476 |
|
5628 |
24 Sep 19 |
nicklas |
477 |
@SuppressWarnings("unchecked") |
5628 |
24 Sep 19 |
nicklas |
478 |
@Override |
5628 |
24 Sep 19 |
nicklas |
479 |
public void configure(GuiContext context, Request request, Response response) |
5628 |
24 Sep 19 |
nicklas |
480 |
{ |
5628 |
24 Sep 19 |
nicklas |
481 |
String command = request.getCommand(); |
5628 |
24 Sep 19 |
nicklas |
482 |
DbControl dc = null; |
5628 |
24 Sep 19 |
nicklas |
483 |
try |
5628 |
24 Sep 19 |
nicklas |
484 |
{ |
5628 |
24 Sep 19 |
nicklas |
485 |
if (command.equals(Request.COMMAND_CONFIGURE_PLUGIN)) |
5628 |
24 Sep 19 |
nicklas |
486 |
{ |
5628 |
24 Sep 19 |
nicklas |
487 |
RequestInformation ri = getConfigurePluginParameters(); |
5628 |
24 Sep 19 |
nicklas |
488 |
List<Throwable> errors = validateRequestParameters(ri.getParameters(), request); |
5628 |
24 Sep 19 |
nicklas |
489 |
if (errors != null) |
5628 |
24 Sep 19 |
nicklas |
490 |
{ |
5628 |
24 Sep 19 |
nicklas |
491 |
response.setError(errors.size() + " invalid parameters were found in the request",errors); |
5628 |
24 Sep 19 |
nicklas |
492 |
return; |
5628 |
24 Sep 19 |
nicklas |
493 |
} |
5628 |
24 Sep 19 |
nicklas |
494 |
storeValues(configuration, request, ri.getParameter("models")); |
5628 |
24 Sep 19 |
nicklas |
495 |
response.setDone("Configuration complete"); |
5628 |
24 Sep 19 |
nicklas |
496 |
} |
5628 |
24 Sep 19 |
nicklas |
497 |
else if (command.equals(Request.COMMAND_CONFIGURE_JOB)) |
5628 |
24 Sep 19 |
nicklas |
498 |
{ |
5628 |
24 Sep 19 |
nicklas |
499 |
RequestInformation ri = getConfigureJobParameters(context, !request.isAllowedImmediateExecution()); |
5628 |
24 Sep 19 |
nicklas |
500 |
List<Throwable> errors = validateRequestParameters(ri.getParameters(), request); |
5628 |
24 Sep 19 |
nicklas |
501 |
if (errors != null) |
5628 |
24 Sep 19 |
nicklas |
502 |
{ |
5628 |
24 Sep 19 |
nicklas |
503 |
response.setError(errors.size() + " invalid parameters were found in the request",errors); |
5628 |
24 Sep 19 |
nicklas |
504 |
return; |
5628 |
24 Sep 19 |
nicklas |
505 |
} |
5628 |
24 Sep 19 |
nicklas |
506 |
|
5628 |
24 Sep 19 |
nicklas |
507 |
storeValues(job, request, ri.getParameter("models")); |
5628 |
24 Sep 19 |
nicklas |
508 |
|
5628 |
24 Sep 19 |
nicklas |
// Error handling and debugging parameters |
5628 |
24 Sep 19 |
nicklas |
510 |
storeValue(job, request, ri.getParameter(Parameters.LOGFILE_PARAMETER)); |
5628 |
24 Sep 19 |
nicklas |
511 |
storeValue(job, request, ri.getParameter(Parameters.DRY_RUN_PARAMETER)); |
5628 |
24 Sep 19 |
nicklas |
512 |
storeValue(job, request, ri.getParameter("debugMode")); |
5628 |
24 Sep 19 |
nicklas |
513 |
response.setDryRun(Boolean.TRUE.equals(request.getParameterValue(Parameters.DRY_RUN_PARAMETER))); |
5628 |
24 Sep 19 |
nicklas |
514 |
|
5628 |
24 Sep 19 |
nicklas |
515 |
if (context.getType() == GuiContext.Type.ITEM) |
5628 |
24 Sep 19 |
nicklas |
516 |
{ |
5628 |
24 Sep 19 |
nicklas |
517 |
storeValue(job, request, ri.getParameter("rawBioAssays")); |
5628 |
24 Sep 19 |
nicklas |
518 |
RawBioAssay rba = (RawBioAssay)job.getValue("rawBioAssays"); |
5628 |
24 Sep 19 |
nicklas |
519 |
response.setSuggestedJobName("Run single-sample predictor: " + rba.getName()); |
5628 |
24 Sep 19 |
nicklas |
520 |
response.setDone("The job configuration is complete", ExecutionTime.SHORTEST); |
5628 |
24 Sep 19 |
nicklas |
521 |
} |
5628 |
24 Sep 19 |
nicklas |
522 |
else |
5628 |
24 Sep 19 |
nicklas |
523 |
{ |
5628 |
24 Sep 19 |
nicklas |
524 |
List<RawBioAssay> rawBioAssays = job.getValues("rawBioAssays"); |
5628 |
24 Sep 19 |
nicklas |
525 |
if (rawBioAssays == null) |
5628 |
24 Sep 19 |
nicklas |
526 |
{ |
5628 |
24 Sep 19 |
nicklas |
527 |
String whichItems = (String)request.getParameterValue("whichItems"); |
5628 |
24 Sep 19 |
nicklas |
528 |
|
5628 |
24 Sep 19 |
nicklas |
529 |
ItemContext cc = sc.getCurrentContext(context.getItem(), context.getSubContext()); |
5628 |
24 Sep 19 |
nicklas |
530 |
ItemQuery<RawBioAssay> query = (ItemQuery<RawBioAssay>)cc.getQuery(); |
5628 |
24 Sep 19 |
nicklas |
531 |
Rawdatatype.STRINGTIE.addFilter(dc, query); |
5628 |
24 Sep 19 |
nicklas |
532 |
if ("all".equals(whichItems)) |
5628 |
24 Sep 19 |
nicklas |
533 |
{ |
5628 |
24 Sep 19 |
nicklas |
534 |
query.setFirstResult(0); |
5628 |
24 Sep 19 |
nicklas |
535 |
query.setMaxResults(0); |
5628 |
24 Sep 19 |
nicklas |
536 |
} |
5628 |
24 Sep 19 |
nicklas |
537 |
else if ("selected".equals(whichItems)) |
5628 |
24 Sep 19 |
nicklas |
538 |
{ |
5628 |
24 Sep 19 |
nicklas |
539 |
query.setFirstResult(0); |
5628 |
24 Sep 19 |
nicklas |
540 |
query.setMaxResults(0); |
5628 |
24 Sep 19 |
nicklas |
541 |
query.restrict( |
5628 |
24 Sep 19 |
nicklas |
542 |
Restrictions.in( |
5628 |
24 Sep 19 |
nicklas |
543 |
Hql.property("id"), |
5628 |
24 Sep 19 |
nicklas |
544 |
Expressions.parameter("_selected_", cc.getSelected(), Type.INT) |
5628 |
24 Sep 19 |
nicklas |
545 |
) |
5628 |
24 Sep 19 |
nicklas |
546 |
); |
5628 |
24 Sep 19 |
nicklas |
547 |
} |
5628 |
24 Sep 19 |
nicklas |
548 |
|
5628 |
24 Sep 19 |
nicklas |
549 |
dc = sc.newDbControl(); |
5628 |
24 Sep 19 |
nicklas |
550 |
rawBioAssays = query.list(dc); |
5921 |
27 Apr 20 |
nicklas |
551 |
if (rawBioAssays.size() > 0) |
5921 |
27 Apr 20 |
nicklas |
552 |
{ |
5921 |
27 Apr 20 |
nicklas |
553 |
job.setValues("rawBioAssays", new ItemParameterType<RawBioAssay>(RawBioAssay.class, null, true, 0, null), rawBioAssays); |
5921 |
27 Apr 20 |
nicklas |
554 |
} |
5628 |
24 Sep 19 |
nicklas |
555 |
} |
5628 |
24 Sep 19 |
nicklas |
556 |
if (rawBioAssays.size() == 0) |
5628 |
24 Sep 19 |
nicklas |
557 |
{ |
5921 |
27 Apr 20 |
nicklas |
558 |
response.setError("None of the selected raw bioassays have StringTie data.", null); |
5628 |
24 Sep 19 |
nicklas |
559 |
return; |
5628 |
24 Sep 19 |
nicklas |
560 |
} |
5628 |
24 Sep 19 |
nicklas |
561 |
else |
5628 |
24 Sep 19 |
nicklas |
562 |
{ |
5628 |
24 Sep 19 |
nicklas |
563 |
List<String> models = job.getValues("models"); |
5628 |
24 Sep 19 |
nicklas |
564 |
response.setSuggestedJobName("Run single-sample predictor for " + rawBioAssays.size() + |
5628 |
24 Sep 19 |
nicklas |
565 |
" raw bioassays. Models: " + Values.getString(models, ", ", true)); |
5628 |
24 Sep 19 |
nicklas |
566 |
} |
5628 |
24 Sep 19 |
nicklas |
567 |
response.setDone("The job configuration is complete", ExecutionTime.SHORTEST); |
5628 |
24 Sep 19 |
nicklas |
568 |
} |
5628 |
24 Sep 19 |
nicklas |
569 |
} |
5628 |
24 Sep 19 |
nicklas |
570 |
} |
5628 |
24 Sep 19 |
nicklas |
571 |
catch(Throwable ex) |
5628 |
24 Sep 19 |
nicklas |
572 |
{ |
5628 |
24 Sep 19 |
nicklas |
573 |
response.setError(ex.getMessage(), Arrays.asList(ex)); |
5628 |
24 Sep 19 |
nicklas |
574 |
} |
5628 |
24 Sep 19 |
nicklas |
575 |
finally |
5628 |
24 Sep 19 |
nicklas |
576 |
{ |
5628 |
24 Sep 19 |
nicklas |
577 |
if (dc != null) dc.close(); |
5628 |
24 Sep 19 |
nicklas |
578 |
} |
5628 |
24 Sep 19 |
nicklas |
579 |
} |
5628 |
24 Sep 19 |
nicklas |
580 |
// ------------------------------------------------ |
5628 |
24 Sep 19 |
nicklas |
581 |
|
5941 |
18 May 20 |
nicklas |
582 |
private PluginParameter<String> getSspModelsParameter(DbControl dc) |
5628 |
24 Sep 19 |
nicklas |
583 |
{ |
5628 |
24 Sep 19 |
nicklas |
584 |
Enumeration<String, String> reportOptions = new Enumeration<String, String>(); |
5942 |
18 May 20 |
nicklas |
585 |
List<SspModel> models = SspModel.getValidModels(dc); |
5941 |
18 May 20 |
nicklas |
//Collections.sort(models); |
5628 |
24 Sep 19 |
nicklas |
587 |
for (SspModel model : models) |
5628 |
24 Sep 19 |
nicklas |
588 |
{ |
5942 |
18 May 20 |
nicklas |
589 |
String name = model.getName(); |
5942 |
18 May 20 |
nicklas |
590 |
reportOptions.add(name, name); |
5628 |
24 Sep 19 |
nicklas |
591 |
} |
5628 |
24 Sep 19 |
nicklas |
592 |
|
5628 |
24 Sep 19 |
nicklas |
593 |
return new PluginParameter<String>( |
5628 |
24 Sep 19 |
nicklas |
594 |
"models", "Models", "Select the models to use with this configuration.", null, |
5926 |
29 Apr 20 |
nicklas |
595 |
new StringParameterType(255, null, true, 0, 0, 0, reportOptions) |
5628 |
24 Sep 19 |
nicklas |
596 |
); |
5628 |
24 Sep 19 |
nicklas |
597 |
} |
5628 |
24 Sep 19 |
nicklas |
598 |
|
5628 |
24 Sep 19 |
nicklas |
599 |
private RequestInformation getConfigurePluginParameters() |
5941 |
18 May 20 |
nicklas |
600 |
{ |
5628 |
24 Sep 19 |
nicklas |
601 |
List<PluginParameter<?>> parameters = new ArrayList<PluginParameter<?>>(); |
5941 |
18 May 20 |
nicklas |
602 |
DbControl dc = null; |
5941 |
18 May 20 |
nicklas |
603 |
try |
5941 |
18 May 20 |
nicklas |
604 |
{ |
5941 |
18 May 20 |
nicklas |
605 |
dc = sc.newDbControl(); |
5941 |
18 May 20 |
nicklas |
606 |
parameters.add(getSspModelsParameter(dc)); |
5941 |
18 May 20 |
nicklas |
607 |
} |
5941 |
18 May 20 |
nicklas |
608 |
finally |
5941 |
18 May 20 |
nicklas |
609 |
{ |
5941 |
18 May 20 |
nicklas |
610 |
if (dc != null) dc.close(); |
5941 |
18 May 20 |
nicklas |
611 |
} |
5628 |
24 Sep 19 |
nicklas |
612 |
|
5628 |
24 Sep 19 |
nicklas |
613 |
RequestInformation configurePlugin = new RequestInformation |
5628 |
24 Sep 19 |
nicklas |
614 |
( |
5628 |
24 Sep 19 |
nicklas |
615 |
Request.COMMAND_CONFIGURE_PLUGIN, |
5628 |
24 Sep 19 |
nicklas |
616 |
"Model options", |
5628 |
24 Sep 19 |
nicklas |
617 |
"Select models to use with this configuration.", |
5628 |
24 Sep 19 |
nicklas |
618 |
parameters |
5628 |
24 Sep 19 |
nicklas |
619 |
); |
5628 |
24 Sep 19 |
nicklas |
620 |
return configurePlugin; |
5628 |
24 Sep 19 |
nicklas |
621 |
} |
5628 |
24 Sep 19 |
nicklas |
622 |
|
5628 |
24 Sep 19 |
nicklas |
623 |
private RequestInformation getConfigureJobParameters(GuiContext context, Boolean requireFile) |
5628 |
24 Sep 19 |
nicklas |
624 |
{ |
5628 |
24 Sep 19 |
nicklas |
625 |
RequestInformation configureJob = null; |
5628 |
24 Sep 19 |
nicklas |
626 |
|
5628 |
24 Sep 19 |
nicklas |
627 |
List<PluginParameter<?>> parameters = new ArrayList<PluginParameter<?>>(); |
5628 |
24 Sep 19 |
nicklas |
628 |
DbControl dc = null; |
5628 |
24 Sep 19 |
nicklas |
629 |
try |
5628 |
24 Sep 19 |
nicklas |
630 |
{ |
5628 |
24 Sep 19 |
nicklas |
631 |
ItemContext cc = sc.getCurrentContext(context.getItem(), context.getSubContext()); |
5628 |
24 Sep 19 |
nicklas |
632 |
dc = sc.newDbControl(); |
5628 |
24 Sep 19 |
nicklas |
633 |
if (context.getType() == GuiContext.Type.ITEM) |
5628 |
24 Sep 19 |
nicklas |
634 |
{ |
5628 |
24 Sep 19 |
nicklas |
635 |
parameters.add(new PluginParameter<RawBioAssay>( |
5628 |
24 Sep 19 |
nicklas |
636 |
"rawBioAssays", "Raw bioassay", "Select the rawbioassay", |
5628 |
24 Sep 19 |
nicklas |
637 |
new ItemParameterType<RawBioAssay>(RawBioAssay.class, null, true, 1, null) |
5628 |
24 Sep 19 |
nicklas |
638 |
)); |
5628 |
24 Sep 19 |
nicklas |
639 |
} |
5628 |
24 Sep 19 |
nicklas |
640 |
else |
5628 |
24 Sep 19 |
nicklas |
641 |
{ |
5628 |
24 Sep 19 |
nicklas |
642 |
if (job.getValues("rawBioAssays") == null) |
5628 |
24 Sep 19 |
nicklas |
643 |
{ |
5628 |
24 Sep 19 |
nicklas |
644 |
String defaultWhich = "all"; |
5628 |
24 Sep 19 |
nicklas |
645 |
Enumeration<String, String> options = new Enumeration<String, String>(); |
5628 |
24 Sep 19 |
nicklas |
646 |
if (cc.getSelected().size() > 0) |
5628 |
24 Sep 19 |
nicklas |
647 |
{ |
5628 |
24 Sep 19 |
nicklas |
648 |
options.add("selected", "Selected items"); |
5628 |
24 Sep 19 |
nicklas |
649 |
defaultWhich = "selected"; |
5628 |
24 Sep 19 |
nicklas |
650 |
} |
5628 |
24 Sep 19 |
nicklas |
651 |
options.add("all", "All items"); |
5628 |
24 Sep 19 |
nicklas |
652 |
parameters.add(new PluginParameter<String> |
5628 |
24 Sep 19 |
nicklas |
653 |
( |
5921 |
27 Apr 20 |
nicklas |
654 |
"whichItems", "Which raw bioassays", |
5921 |
27 Apr 20 |
nicklas |
655 |
"Select the <b>StringTie</b> raw bioassays to analyze with the Single Sample Predictor. ", |
5921 |
27 Apr 20 |
nicklas |
656 |
defaultWhich, new StringParameterType(255, defaultWhich, true, 1, 0, 0, options) |
5628 |
24 Sep 19 |
nicklas |
657 |
)); |
5628 |
24 Sep 19 |
nicklas |
658 |
} |
5628 |
24 Sep 19 |
nicklas |
659 |
} |
5941 |
18 May 20 |
nicklas |
660 |
parameters.add(getSspModelsParameter(dc)); |
5628 |
24 Sep 19 |
nicklas |
661 |
|
5628 |
24 Sep 19 |
nicklas |
662 |
parameters.add(Parameters.errorSection(null, null)); |
5628 |
24 Sep 19 |
nicklas |
663 |
parameters.add(Parameters.logFileParameter(null, null, null)); |
5628 |
24 Sep 19 |
nicklas |
664 |
parameters.add(Parameters.dryRunParameter(null, null, null)); |
5628 |
24 Sep 19 |
nicklas |
665 |
|
5628 |
24 Sep 19 |
nicklas |
// If <developer-mode>1</developer-mode> is in reggie-config.xml we allow debug via parameter |
5628 |
24 Sep 19 |
nicklas |
667 |
if (Values.getBoolean(Reggie.getConfig().getConfig("developer-mode"))) |
5628 |
24 Sep 19 |
nicklas |
668 |
{ |
5628 |
24 Sep 19 |
nicklas |
669 |
parameters.add(new PluginParameter<Boolean>( |
5628 |
24 Sep 19 |
nicklas |
670 |
"debugMode", "Debug mode", "Runs the plug-in in debug mode. Major difference is " |
5628 |
24 Sep 19 |
nicklas |
671 |
+ "that it will always report an error making it easier to re-start the " |
5628 |
24 Sep 19 |
nicklas |
672 |
+ "plug-in with the same parameters.", |
5628 |
24 Sep 19 |
nicklas |
673 |
new BooleanParameterType(null, false) |
5628 |
24 Sep 19 |
nicklas |
674 |
)); |
5628 |
24 Sep 19 |
nicklas |
675 |
} |
5628 |
24 Sep 19 |
nicklas |
676 |
|
5628 |
24 Sep 19 |
nicklas |
677 |
configureJob = new RequestInformation |
5628 |
24 Sep 19 |
nicklas |
678 |
( |
5628 |
24 Sep 19 |
nicklas |
679 |
Request.COMMAND_CONFIGURE_JOB, |
5921 |
27 Apr 20 |
nicklas |
680 |
"Singe Sample Predictor options", |
5921 |
27 Apr 20 |
nicklas |
681 |
"Select which models to use and which raw bioassays to analyze.", |
5628 |
24 Sep 19 |
nicklas |
682 |
parameters |
5628 |
24 Sep 19 |
nicklas |
683 |
); |
5628 |
24 Sep 19 |
nicklas |
684 |
dc.close(); |
5628 |
24 Sep 19 |
nicklas |
685 |
} |
5628 |
24 Sep 19 |
nicklas |
686 |
finally |
5628 |
24 Sep 19 |
nicklas |
687 |
{ |
5628 |
24 Sep 19 |
nicklas |
688 |
if (dc != null) dc.close(); |
5628 |
24 Sep 19 |
nicklas |
689 |
} |
5628 |
24 Sep 19 |
nicklas |
690 |
|
5628 |
24 Sep 19 |
nicklas |
691 |
return configureJob; |
5628 |
24 Sep 19 |
nicklas |
692 |
} |
5628 |
24 Sep 19 |
nicklas |
693 |
/* |
5628 |
24 Sep 19 |
nicklas |
From the SignalTarget interface |
5628 |
24 Sep 19 |
nicklas |
695 |
------------------------------------------- |
5628 |
24 Sep 19 |
nicklas |
696 |
*/ |
5628 |
24 Sep 19 |
nicklas |
697 |
@Override |
5628 |
24 Sep 19 |
nicklas |
698 |
public SignalHandler getSignalHandler() |
5628 |
24 Sep 19 |
nicklas |
699 |
{ |
5628 |
24 Sep 19 |
nicklas |
700 |
signalHandler = new ThreadSignalHandler(); |
5628 |
24 Sep 19 |
nicklas |
701 |
return signalHandler; |
5628 |
24 Sep 19 |
nicklas |
702 |
} |
5628 |
24 Sep 19 |
nicklas |
703 |
// ------------------------------------------- |
5628 |
24 Sep 19 |
nicklas |
704 |
|
5628 |
24 Sep 19 |
nicklas |
705 |
|
5628 |
24 Sep 19 |
nicklas |
706 |
|
5628 |
24 Sep 19 |
nicklas |
707 |
} |