6170 |
17 Mar 21 |
nicklas |
1 |
package net.sf.basedb.varsearch.servlet; |
6170 |
17 Mar 21 |
nicklas |
2 |
|
6170 |
17 Mar 21 |
nicklas |
3 |
import java.io.IOException; |
6170 |
17 Mar 21 |
nicklas |
4 |
import java.util.Arrays; |
6553 |
27 Jan 22 |
nicklas |
5 |
import java.util.List; |
6170 |
17 Mar 21 |
nicklas |
6 |
import java.util.Set; |
6170 |
17 Mar 21 |
nicklas |
7 |
|
6170 |
17 Mar 21 |
nicklas |
8 |
import javax.servlet.ServletException; |
6170 |
17 Mar 21 |
nicklas |
9 |
import javax.servlet.http.HttpServlet; |
6170 |
17 Mar 21 |
nicklas |
10 |
import javax.servlet.http.HttpServletRequest; |
6170 |
17 Mar 21 |
nicklas |
11 |
import javax.servlet.http.HttpServletResponse; |
6170 |
17 Mar 21 |
nicklas |
12 |
|
6170 |
17 Mar 21 |
nicklas |
13 |
import org.json.simple.JSONObject; |
6170 |
17 Mar 21 |
nicklas |
14 |
|
6170 |
17 Mar 21 |
nicklas |
15 |
import net.sf.basedb.core.DbControl; |
6170 |
17 Mar 21 |
nicklas |
16 |
import net.sf.basedb.core.File; |
6170 |
17 Mar 21 |
nicklas |
17 |
import net.sf.basedb.core.InvalidDataException; |
6551 |
26 Jan 22 |
nicklas |
18 |
import net.sf.basedb.core.Nameable; |
6170 |
17 Mar 21 |
nicklas |
19 |
import net.sf.basedb.core.RawBioAssay; |
6170 |
17 Mar 21 |
nicklas |
20 |
import net.sf.basedb.core.SessionControl; |
6170 |
17 Mar 21 |
nicklas |
21 |
import net.sf.basedb.util.Values; |
6170 |
17 Mar 21 |
nicklas |
22 |
import net.sf.basedb.util.error.ThrowableUtil; |
6170 |
17 Mar 21 |
nicklas |
23 |
import net.sf.basedb.varsearch.JsonUtil; |
6522 |
20 Dec 21 |
nicklas |
24 |
import net.sf.basedb.varsearch.LuceneColumnFactory; |
6170 |
17 Mar 21 |
nicklas |
25 |
import net.sf.basedb.varsearch.VarSearch; |
6522 |
20 Dec 21 |
nicklas |
26 |
import net.sf.basedb.varsearch.LuceneColumnFactory.LuceneColumnAction; |
6522 |
20 Dec 21 |
nicklas |
27 |
import net.sf.basedb.varsearch.LuceneColumnFactory.SubColumn; |
6170 |
17 Mar 21 |
nicklas |
28 |
import net.sf.basedb.varsearch.analyze.AminoAcidTranslator; |
6173 |
18 Mar 21 |
nicklas |
29 |
import net.sf.basedb.varsearch.index.LuceneIndex; |
6553 |
27 Jan 22 |
nicklas |
30 |
import net.sf.basedb.varsearch.index.VcfFile; |
6522 |
20 Dec 21 |
nicklas |
31 |
import net.sf.basedb.varsearch.query.AutoPrefixer; |
6522 |
20 Dec 21 |
nicklas |
32 |
import net.sf.basedb.varsearch.query.LuceneQueryFactory.LuceneFilterAction; |
6173 |
18 Mar 21 |
nicklas |
33 |
import net.sf.basedb.varsearch.service.VarSearchService; |
6170 |
17 Mar 21 |
nicklas |
34 |
import net.sf.basedb.varsearch.util.NullSafeJSONObject; |
6170 |
17 Mar 21 |
nicklas |
35 |
import net.sf.basedb.varsearch.util.NullSafeLinkedSet; |
6170 |
17 Mar 21 |
nicklas |
36 |
import net.sf.basedb.varsearch.util.NullSafeTreeSet; |
6170 |
17 Mar 21 |
nicklas |
37 |
import net.sf.basedb.varsearch.vcf.VcfParser; |
6551 |
26 Jan 22 |
nicklas |
38 |
import net.sf.basedb.varsearch.vcf.VcfParser.IdFilter; |
6551 |
26 Jan 22 |
nicklas |
39 |
import net.sf.basedb.varsearch.vcf.VcfParser.LineNoFilter; |
6170 |
17 Mar 21 |
nicklas |
40 |
import net.sf.basedb.varsearch.vcf.VcfParser.VcfHeader; |
6170 |
17 Mar 21 |
nicklas |
41 |
import net.sf.basedb.varsearch.vcf.VcfParser.VcfLine; |
6170 |
17 Mar 21 |
nicklas |
42 |
|
6170 |
17 Mar 21 |
nicklas |
43 |
/** |
6170 |
17 Mar 21 |
nicklas |
Get information about the current session. |
6170 |
17 Mar 21 |
nicklas |
45 |
|
6170 |
17 Mar 21 |
nicklas |
46 |
*/ |
6170 |
17 Mar 21 |
nicklas |
47 |
public class HitServlet |
6170 |
17 Mar 21 |
nicklas |
48 |
extends HttpServlet |
6170 |
17 Mar 21 |
nicklas |
49 |
{ |
6170 |
17 Mar 21 |
nicklas |
50 |
|
6170 |
17 Mar 21 |
nicklas |
51 |
private static final long serialVersionUID = -3842354795495914729L; |
6170 |
17 Mar 21 |
nicklas |
52 |
|
6170 |
17 Mar 21 |
nicklas |
53 |
public HitServlet() |
6170 |
17 Mar 21 |
nicklas |
54 |
{} |
6170 |
17 Mar 21 |
nicklas |
55 |
|
6170 |
17 Mar 21 |
nicklas |
56 |
@Override |
6170 |
17 Mar 21 |
nicklas |
57 |
protected void doGet(HttpServletRequest req, HttpServletResponse resp) |
6170 |
17 Mar 21 |
nicklas |
58 |
throws ServletException, IOException |
6170 |
17 Mar 21 |
nicklas |
59 |
{ |
6170 |
17 Mar 21 |
nicklas |
60 |
String cmd = req.getParameter("cmd"); |
6170 |
17 Mar 21 |
nicklas |
61 |
JsonUtil.setJsonResponseHeaders(resp); |
6170 |
17 Mar 21 |
nicklas |
62 |
|
6170 |
17 Mar 21 |
nicklas |
63 |
JSONObject json = new JSONObject(); |
6170 |
17 Mar 21 |
nicklas |
64 |
json.put("status", "ok"); |
6170 |
17 Mar 21 |
nicklas |
65 |
|
6170 |
17 Mar 21 |
nicklas |
66 |
SessionControl sc = null; |
6170 |
17 Mar 21 |
nicklas |
67 |
DbControl dc = null; |
6170 |
17 Mar 21 |
nicklas |
68 |
try |
6170 |
17 Mar 21 |
nicklas |
69 |
{ |
6170 |
17 Mar 21 |
nicklas |
70 |
if ("GetDetails".equals(cmd)) |
6170 |
17 Mar 21 |
nicklas |
71 |
{ |
6551 |
26 Jan 22 |
nicklas |
72 |
/* |
6551 |
26 Jan 22 |
nicklas |
We can load details from 1 or 2 files. The 2-file case is only |
6551 |
26 Jan 22 |
nicklas |
used for the OncoArray where 'fileId' is the reference VCf file |
6551 |
26 Jan 22 |
nicklas |
attached to the array design, and 'file2Id' is the VCF data file |
6551 |
26 Jan 22 |
nicklas |
for the raw bioassay. |
6551 |
26 Jan 22 |
nicklas |
77 |
*/ |
6170 |
17 Mar 21 |
nicklas |
78 |
int rbaId = Values.getInt(req.getParameter("rbaId")); |
6170 |
17 Mar 21 |
nicklas |
79 |
int fileId = Values.getInt(req.getParameter("fileId")); |
6170 |
17 Mar 21 |
nicklas |
80 |
int lineNo = Values.getInt(req.getParameter("lineNo")); |
6551 |
26 Jan 22 |
nicklas |
81 |
String snpId = Values.getStringOrNull(req.getParameter("snpId")); |
6173 |
18 Mar 21 |
nicklas |
82 |
LuceneIndex idx = VarSearchService.getInstance().getIndexById(Values.getStringOrNull(req.getParameter("idx"))); |
6170 |
17 Mar 21 |
nicklas |
83 |
|
6170 |
17 Mar 21 |
nicklas |
84 |
sc = VarSearch.getSessionControl(req); |
6604 |
23 Feb 22 |
nicklas |
85 |
dc = sc.newDbControl("Variant search: View hit details"); |
6170 |
17 Mar 21 |
nicklas |
86 |
|
6170 |
17 Mar 21 |
nicklas |
87 |
RawBioAssay rba = RawBioAssay.getById(dc, rbaId); |
6170 |
17 Mar 21 |
nicklas |
88 |
File vcfFile = File.getById(dc, fileId); |
6551 |
26 Jan 22 |
nicklas |
89 |
json.put("rba", toJSON(rba)); |
6551 |
26 Jan 22 |
nicklas |
90 |
json.put("file", toJSON(vcfFile)); |
6551 |
26 Jan 22 |
nicklas |
91 |
|
6551 |
26 Jan 22 |
nicklas |
92 |
JSONObject jsonHit = new NullSafeJSONObject(); |
6551 |
26 Jan 22 |
nicklas |
93 |
try (VcfParser parser = new VcfParser(vcfFile)) |
6170 |
17 Mar 21 |
nicklas |
94 |
{ |
6551 |
26 Jan 22 |
nicklas |
95 |
VcfHeader header = parser.parseHeaders(); |
6551 |
26 Jan 22 |
nicklas |
96 |
if (header == null) |
6551 |
26 Jan 22 |
nicklas |
97 |
{ |
6551 |
26 Jan 22 |
nicklas |
98 |
throw new InvalidDataException("Could not find header line in VCF file: " + vcfFile.getName()); |
6551 |
26 Jan 22 |
nicklas |
99 |
} |
6551 |
26 Jan 22 |
nicklas |
100 |
VcfLine line = parser.parseToLine(new LineNoFilter(lineNo)); |
6551 |
26 Jan 22 |
nicklas |
101 |
if (line == null) |
6551 |
26 Jan 22 |
nicklas |
102 |
{ |
6551 |
26 Jan 22 |
nicklas |
103 |
throw new InvalidDataException("Could not find line #" + lineNo + ": " + vcfFile.getName()); |
6551 |
26 Jan 22 |
nicklas |
104 |
} |
6551 |
26 Jan 22 |
nicklas |
105 |
json.put("raw", line.line()); |
6551 |
26 Jan 22 |
nicklas |
106 |
VcfHit hit = new VcfHit(header, line); |
6551 |
26 Jan 22 |
nicklas |
107 |
|
6551 |
26 Jan 22 |
nicklas |
108 |
hit.exportColumns(jsonHit, "#CHROM", "POS", "REF", "ALT"); |
6551 |
26 Jan 22 |
nicklas |
109 |
hit.exportInfo(jsonHit, "TYPE", "cosmic_ID", "cosmic_WES_BRCA_MF", "dbsnp_ID", "scanb_MF_NR", "scanb_CNT_NR"); |
6551 |
26 Jan 22 |
nicklas |
110 |
hit.exportFormat(jsonHit, "GT", "AD", "DP", "AF", "VD"); |
6551 |
26 Jan 22 |
nicklas |
111 |
|
6551 |
26 Jan 22 |
nicklas |
112 |
int annCol = header.annIndexOf("Annotation"); |
6551 |
26 Jan 22 |
nicklas |
113 |
String effect = line.ann(annCol); |
6551 |
26 Jan 22 |
nicklas |
114 |
if (effect != null) jsonHit.put("effect", effect.replace("&", ", ")); |
6551 |
26 Jan 22 |
nicklas |
115 |
|
6551 |
26 Jan 22 |
nicklas |
116 |
int geneCol = header.annIndexOf("Gene_Name"); |
6551 |
26 Jan 22 |
nicklas |
117 |
Set<String> genes = new NullSafeTreeSet<>(); |
6551 |
26 Jan 22 |
nicklas |
118 |
genes.add(line.ann(geneCol)); |
6551 |
26 Jan 22 |
nicklas |
119 |
String ncbiRefSeq = line.info("ncbiRefSeq"); |
6551 |
26 Jan 22 |
nicklas |
120 |
if (ncbiRefSeq != null) genes.addAll(Arrays.asList(ncbiRefSeq.split(","))); |
6551 |
26 Jan 22 |
nicklas |
121 |
jsonHit.put("genes", Values.getString(genes, ", ", true)); |
6551 |
26 Jan 22 |
nicklas |
122 |
|
6551 |
26 Jan 22 |
nicklas |
123 |
int hgvsCCol = header.annIndexOf("HGVS.c"); |
6551 |
26 Jan 22 |
nicklas |
124 |
Set<String> hgvsc = new NullSafeLinkedSet<>(); |
6551 |
26 Jan 22 |
nicklas |
125 |
hgvsc.add(line.ann(hgvsCCol)); |
6551 |
26 Jan 22 |
nicklas |
126 |
String cosmicCDS = line.info("cosmic_CDS"); |
6551 |
26 Jan 22 |
nicklas |
127 |
if (cosmicCDS != null) hgvsc.addAll(Arrays.asList(cosmicCDS.split(","))); |
6551 |
26 Jan 22 |
nicklas |
128 |
jsonHit.put("hgvsc", Values.getString(hgvsc, ", ", true)); |
6551 |
26 Jan 22 |
nicklas |
129 |
|
6551 |
26 Jan 22 |
nicklas |
130 |
int hgvsPCol = header.annIndexOf("HGVS.p"); |
6551 |
26 Jan 22 |
nicklas |
131 |
Set<String> hgvsp = new NullSafeLinkedSet<>(); |
6551 |
26 Jan 22 |
nicklas |
132 |
hgvsp.add(AminoAcidTranslator.INSTANCE.translate(line.ann(hgvsPCol))); |
6551 |
26 Jan 22 |
nicklas |
133 |
String cosmicAA = line.info("cosmic_AA"); |
6551 |
26 Jan 22 |
nicklas |
134 |
if (cosmicAA != null) hgvsp.addAll(Arrays.asList(cosmicAA.split(","))); |
6551 |
26 Jan 22 |
nicklas |
135 |
hgvsp.remove("p.?"); |
6551 |
26 Jan 22 |
nicklas |
136 |
jsonHit.put("hgvsp", Values.getString(hgvsp, ", ", true)); |
6551 |
26 Jan 22 |
nicklas |
137 |
|
6551 |
26 Jan 22 |
nicklas |
138 |
if (idx != null) |
6551 |
26 Jan 22 |
nicklas |
139 |
{ |
6551 |
26 Jan 22 |
nicklas |
140 |
Set<Integer> allRba = hit.getAllRawBioAssays(idx); |
6551 |
26 Jan 22 |
nicklas |
141 |
allRba.remove(rbaId); |
6551 |
26 Jan 22 |
nicklas |
142 |
jsonHit.put("numOther", allRba.size()); |
6551 |
26 Jan 22 |
nicklas |
143 |
} |
6170 |
17 Mar 21 |
nicklas |
144 |
} |
6551 |
26 Jan 22 |
nicklas |
145 |
|
6553 |
27 Jan 22 |
nicklas |
146 |
if ("oncoarray-500K".equals(idx.getId())) |
6170 |
17 Mar 21 |
nicklas |
147 |
{ |
6553 |
27 Jan 22 |
nicklas |
148 |
List<VcfFile> moreFiles = idx.getVcfFileLocator().getVcfFiles(dc, rba); |
6553 |
27 Jan 22 |
nicklas |
149 |
if (moreFiles.size() > 0) |
6551 |
26 Jan 22 |
nicklas |
150 |
{ |
6553 |
27 Jan 22 |
nicklas |
151 |
File vcfFile2 = moreFiles.get(0).getFile(); |
6553 |
27 Jan 22 |
nicklas |
152 |
json.put("file2", toJSON(vcfFile2)); |
6553 |
27 Jan 22 |
nicklas |
153 |
try (VcfParser parser = new VcfParser(vcfFile2)) |
6551 |
26 Jan 22 |
nicklas |
154 |
{ |
6553 |
27 Jan 22 |
nicklas |
155 |
VcfHeader header = parser.parseHeaders(); |
6553 |
27 Jan 22 |
nicklas |
156 |
VcfLine line = parser.parseToLine(new IdFilter(snpId, header.indexOf("ID"))); |
6553 |
27 Jan 22 |
nicklas |
157 |
if (line == null) |
6553 |
27 Jan 22 |
nicklas |
158 |
{ |
6553 |
27 Jan 22 |
nicklas |
159 |
throw new InvalidDataException("Could not find line with ID=" + snpId + ": " + vcfFile2.getName()); |
6553 |
27 Jan 22 |
nicklas |
160 |
} |
6553 |
27 Jan 22 |
nicklas |
161 |
json.put("raw2", line.line()); |
6553 |
27 Jan 22 |
nicklas |
162 |
VcfHit hit2 = new VcfHit(header, line); |
6553 |
27 Jan 22 |
nicklas |
163 |
hit2.exportFormat(jsonHit, "GT", "BAF", "GQ", "LRR"); |
6551 |
26 Jan 22 |
nicklas |
164 |
} |
6551 |
26 Jan 22 |
nicklas |
165 |
} |
6173 |
18 Mar 21 |
nicklas |
166 |
} |
6173 |
18 Mar 21 |
nicklas |
167 |
|
6170 |
17 Mar 21 |
nicklas |
168 |
json.put("hit", jsonHit); |
6170 |
17 Mar 21 |
nicklas |
169 |
} |
6522 |
20 Dec 21 |
nicklas |
170 |
else if ("GetAllRbaHits".equals(cmd)) |
6522 |
20 Dec 21 |
nicklas |
171 |
{ |
6522 |
20 Dec 21 |
nicklas |
172 |
sc = VarSearch.getSessionControl(req); |
6604 |
23 Feb 22 |
nicklas |
173 |
dc = sc.newDbControl("Variant search: View hit details"); |
6522 |
20 Dec 21 |
nicklas |
174 |
|
6522 |
20 Dec 21 |
nicklas |
175 |
int rbaId = Values.getInt(req.getParameter("rbaId")); |
6526 |
20 Dec 21 |
nicklas |
176 |
int fileId = Values.getInt(req.getParameter("fileId")); |
6522 |
20 Dec 21 |
nicklas |
177 |
RawBioAssay rba = RawBioAssay.getById(dc, rbaId); |
6522 |
20 Dec 21 |
nicklas |
178 |
|
6522 |
20 Dec 21 |
nicklas |
179 |
LuceneIndex idx = VarSearchService.getInstance().getIndexById(Values.getStringOrNull(req.getParameter("idx"))); |
6522 |
20 Dec 21 |
nicklas |
180 |
|
6522 |
20 Dec 21 |
nicklas |
181 |
json.put("indexName", idx.getName()); |
6522 |
20 Dec 21 |
nicklas |
182 |
json.put("rbaName", rba.getName()); |
6526 |
20 Dec 21 |
nicklas |
183 |
if (fileId > 0) |
6526 |
20 Dec 21 |
nicklas |
184 |
{ |
6526 |
20 Dec 21 |
nicklas |
185 |
File f = File.getById(dc, fileId); |
6526 |
20 Dec 21 |
nicklas |
186 |
json.put("fileName", f.getName()); |
6526 |
20 Dec 21 |
nicklas |
187 |
} |
6522 |
20 Dec 21 |
nicklas |
188 |
|
6522 |
20 Dec 21 |
nicklas |
189 |
String visibleColumns = Values.getString(sc.getUserClientSetting("net.sf.basedb.varsearch.visible-columns."+idx.getId()), |
6522 |
20 Dec 21 |
nicklas |
190 |
"GENE,POS,REF_ALT,TYPE,HGVSC,HGVSP,LINKS"); |
6522 |
20 Dec 21 |
nicklas |
191 |
SubColumn[] columns = SubColumn.getByName(visibleColumns.split(",")); |
6522 |
20 Dec 21 |
nicklas |
192 |
StringBuilder gridTemplate = new StringBuilder(); |
6522 |
20 Dec 21 |
nicklas |
193 |
gridTemplate.append("1.6rem "); |
6522 |
20 Dec 21 |
nicklas |
194 |
for (int colNo = 0; colNo < columns.length; colNo++) |
6522 |
20 Dec 21 |
nicklas |
195 |
{ |
6522 |
20 Dec 21 |
nicklas |
196 |
gridTemplate.append(columns[colNo].getWidth()).append(" "); |
6522 |
20 Dec 21 |
nicklas |
197 |
} |
6522 |
20 Dec 21 |
nicklas |
198 |
gridTemplate.append("18px 18px"); |
6522 |
20 Dec 21 |
nicklas |
199 |
|
6522 |
20 Dec 21 |
nicklas |
200 |
StringBuilder sb = new StringBuilder(); |
6522 |
20 Dec 21 |
nicklas |
201 |
sb.append("<div id=\"varsearch-header."+idx.getId()+"\" class=\"varsearch-grid\" style=\"grid-template-columns: "+gridTemplate+";\">"); |
6522 |
20 Dec 21 |
nicklas |
202 |
int colNo = 0; |
6522 |
20 Dec 21 |
nicklas |
203 |
boolean enableHideColumn = columns.length > 1; |
6522 |
20 Dec 21 |
nicklas |
204 |
sb.append("<div class=\"varsearch-hitno\">#</div>"); |
6522 |
20 Dec 21 |
nicklas |
205 |
for (SubColumn col : columns) |
6522 |
20 Dec 21 |
nicklas |
206 |
{ |
6522 |
20 Dec 21 |
nicklas |
207 |
sb.append("<div title=\"").append(col.getTooltip()).append("\""); |
6522 |
20 Dec 21 |
nicklas |
208 |
sb.append(" class=\"gridcol-"+colNo+"\""); |
6522 |
20 Dec 21 |
nicklas |
209 |
sb.append(" data-index-id=\""+idx.getId()+"\" data-col=\""+col.name()+"\" data-col-no=\""+colNo+"\""); |
6522 |
20 Dec 21 |
nicklas |
210 |
if (enableHideColumn) sb.append(" draggable=\"true\""); |
6522 |
20 Dec 21 |
nicklas |
211 |
sb.append(">"); |
6522 |
20 Dec 21 |
nicklas |
212 |
if (enableHideColumn) |
6522 |
20 Dec 21 |
nicklas |
213 |
{ |
6522 |
20 Dec 21 |
nicklas |
214 |
sb.append("<span class=\"hide-col auto-init\" data-auto-init=\"varsearch-hide-col\" title=\"Hide this column\"></span>"); |
6522 |
20 Dec 21 |
nicklas |
215 |
} |
6522 |
20 Dec 21 |
nicklas |
216 |
sb.append(col.getTitle()).append("</div>"); |
6522 |
20 Dec 21 |
nicklas |
217 |
colNo++; |
6522 |
20 Dec 21 |
nicklas |
218 |
} |
6522 |
20 Dec 21 |
nicklas |
219 |
sb.append("<div style=\"border-left-width: 0; padding: 1px; grid-column: span 2;\">"); |
6522 |
20 Dec 21 |
nicklas |
220 |
sb.append("<span class=\"varsearch-help link no-print auto-init\" data-auto-init=\"varsearch-options\" data-index-id=\""+idx.getId()+"\" title=\"Configuration options\"><img src=\"./images/gear.svg\"></span>"); |
6522 |
20 Dec 21 |
nicklas |
221 |
sb.append("</div>"); |
6522 |
20 Dec 21 |
nicklas |
222 |
sb.append("</div>"); |
6522 |
20 Dec 21 |
nicklas |
223 |
json.put("header", sb.toString()); |
6522 |
20 Dec 21 |
nicklas |
224 |
|
6551 |
26 Jan 22 |
nicklas |
225 |
LuceneFilterAction<?> filter = idx.createFilterAction(null); |
6526 |
20 Dec 21 |
nicklas |
226 |
if (fileId > 0) |
6526 |
20 Dec 21 |
nicklas |
227 |
{ |
6526 |
20 Dec 21 |
nicklas |
228 |
filter.addQuery("file:"+fileId); |
6526 |
20 Dec 21 |
nicklas |
229 |
} |
6526 |
20 Dec 21 |
nicklas |
230 |
else |
6526 |
20 Dec 21 |
nicklas |
231 |
{ |
6526 |
20 Dec 21 |
nicklas |
232 |
filter.addQuery(AutoPrefixer.INSTANCE.autoPrefix("0/1 OR 1/0 OR 1/1")); |
6526 |
20 Dec 21 |
nicklas |
233 |
} |
6522 |
20 Dec 21 |
nicklas |
234 |
|
6552 |
26 Jan 22 |
nicklas |
235 |
LuceneColumnAction<?, ?> action = idx.createColumnAction(filter); //new LuceneColumnAction(idx, filter, columns); |
6552 |
26 Jan 22 |
nicklas |
236 |
action.setColumns(columns); |
6522 |
20 Dec 21 |
nicklas |
237 |
action.setMaxHitsPerRba(LuceneColumnFactory.MAX_HITS_PER_TABLE); |
6522 |
20 Dec 21 |
nicklas |
238 |
json.put("results", action.getValue(dc, rba)); |
6522 |
20 Dec 21 |
nicklas |
239 |
} |
6170 |
17 Mar 21 |
nicklas |
240 |
} |
6170 |
17 Mar 21 |
nicklas |
241 |
catch (Throwable t) |
6170 |
17 Mar 21 |
nicklas |
242 |
{ |
6170 |
17 Mar 21 |
nicklas |
243 |
t.printStackTrace(); |
6170 |
17 Mar 21 |
nicklas |
244 |
json.clear(); |
6170 |
17 Mar 21 |
nicklas |
245 |
json.put("status", "error"); |
6170 |
17 Mar 21 |
nicklas |
246 |
json.put("message", t.getMessage()); |
6170 |
17 Mar 21 |
nicklas |
247 |
json.put("stacktrace", ThrowableUtil.stackTraceToString(t)); |
6170 |
17 Mar 21 |
nicklas |
248 |
} |
6170 |
17 Mar 21 |
nicklas |
249 |
finally |
6170 |
17 Mar 21 |
nicklas |
250 |
{ |
6170 |
17 Mar 21 |
nicklas |
251 |
if (dc != null) dc.close(); |
6170 |
17 Mar 21 |
nicklas |
252 |
json.writeJSONString(resp.getWriter()); |
6170 |
17 Mar 21 |
nicklas |
253 |
} |
6170 |
17 Mar 21 |
nicklas |
254 |
|
6170 |
17 Mar 21 |
nicklas |
255 |
} |
6170 |
17 Mar 21 |
nicklas |
256 |
|
6551 |
26 Jan 22 |
nicklas |
257 |
JSONObject toJSON(Nameable item) |
6551 |
26 Jan 22 |
nicklas |
258 |
{ |
6551 |
26 Jan 22 |
nicklas |
259 |
JSONObject json = new JSONObject(); |
6551 |
26 Jan 22 |
nicklas |
260 |
json.put("id", item.getId()); |
6551 |
26 Jan 22 |
nicklas |
261 |
json.put("name", item.getName()); |
6554 |
27 Jan 22 |
nicklas |
262 |
if (item instanceof RawBioAssay) |
6554 |
27 Jan 22 |
nicklas |
263 |
{ |
6554 |
27 Jan 22 |
nicklas |
264 |
json.put("type", ((RawBioAssay)item).getRawDataType().getName()); |
6554 |
27 Jan 22 |
nicklas |
265 |
} |
6551 |
26 Jan 22 |
nicklas |
266 |
return json; |
6551 |
26 Jan 22 |
nicklas |
267 |
} |
6551 |
26 Jan 22 |
nicklas |
268 |
|
6173 |
18 Mar 21 |
nicklas |
269 |
/** |
6173 |
18 Mar 21 |
nicklas |
A single line from the VCF with header information. |
6173 |
18 Mar 21 |
nicklas |
271 |
*/ |
6170 |
17 Mar 21 |
nicklas |
272 |
static class VcfHit |
6170 |
17 Mar 21 |
nicklas |
273 |
{ |
6551 |
26 Jan 22 |
nicklas |
274 |
public final VcfHeader header; |
6551 |
26 Jan 22 |
nicklas |
275 |
public final VcfLine line; |
6170 |
17 Mar 21 |
nicklas |
276 |
|
6170 |
17 Mar 21 |
nicklas |
277 |
VcfHit(VcfHeader header, VcfLine line) |
6170 |
17 Mar 21 |
nicklas |
278 |
{ |
6170 |
17 Mar 21 |
nicklas |
279 |
this.header = header; |
6170 |
17 Mar 21 |
nicklas |
280 |
this.line = line; |
6170 |
17 Mar 21 |
nicklas |
281 |
} |
6170 |
17 Mar 21 |
nicklas |
282 |
|
6173 |
18 Mar 21 |
nicklas |
283 |
Set<Integer> getAllRawBioAssays(LuceneIndex idx) |
6173 |
18 Mar 21 |
nicklas |
284 |
throws IOException |
6173 |
18 Mar 21 |
nicklas |
285 |
{ |
6173 |
18 Mar 21 |
nicklas |
286 |
String chr = line.col(header.indexOf("#CHROM")); |
6173 |
18 Mar 21 |
nicklas |
287 |
long pos = line.longValue(header.indexOf("POS")); |
6173 |
18 Mar 21 |
nicklas |
288 |
String ref = line.col(header.indexOf("REF")); |
6173 |
18 Mar 21 |
nicklas |
289 |
String alt = line.col(header.indexOf("ALT")); |
6551 |
26 Jan 22 |
nicklas |
290 |
String snpId = line.col(header.indexOf("ID")); |
6551 |
26 Jan 22 |
nicklas |
291 |
return idx.getRawBioAssaysWithVariant(chr, pos, ref, alt, snpId); |
6173 |
18 Mar 21 |
nicklas |
292 |
} |
6173 |
18 Mar 21 |
nicklas |
293 |
|
6170 |
17 Mar 21 |
nicklas |
294 |
void exportColumns(JSONObject json, String... cols) |
6170 |
17 Mar 21 |
nicklas |
295 |
{ |
6170 |
17 Mar 21 |
nicklas |
296 |
for (String c : cols) |
6170 |
17 Mar 21 |
nicklas |
297 |
{ |
6170 |
17 Mar 21 |
nicklas |
298 |
json.put(c, line.col(header.indexOf(c))); |
6170 |
17 Mar 21 |
nicklas |
299 |
} |
6170 |
17 Mar 21 |
nicklas |
300 |
} |
6170 |
17 Mar 21 |
nicklas |
301 |
|
6170 |
17 Mar 21 |
nicklas |
302 |
void exportAnn(JSONObject json, String... cols) |
6170 |
17 Mar 21 |
nicklas |
303 |
{ |
6170 |
17 Mar 21 |
nicklas |
304 |
for (String c : cols) |
6170 |
17 Mar 21 |
nicklas |
305 |
{ |
6170 |
17 Mar 21 |
nicklas |
306 |
json.put(c, line.ann(header.annIndexOf(c))); |
6170 |
17 Mar 21 |
nicklas |
307 |
} |
6170 |
17 Mar 21 |
nicklas |
308 |
} |
6170 |
17 Mar 21 |
nicklas |
309 |
|
6170 |
17 Mar 21 |
nicklas |
310 |
void exportInfo(JSONObject json, String... cols) |
6170 |
17 Mar 21 |
nicklas |
311 |
{ |
6170 |
17 Mar 21 |
nicklas |
312 |
for (String c : cols) |
6170 |
17 Mar 21 |
nicklas |
313 |
{ |
6170 |
17 Mar 21 |
nicklas |
314 |
json.put(c, line.info(c)); |
6170 |
17 Mar 21 |
nicklas |
315 |
} |
6170 |
17 Mar 21 |
nicklas |
316 |
} |
6170 |
17 Mar 21 |
nicklas |
317 |
|
6170 |
17 Mar 21 |
nicklas |
318 |
void exportFormat(JSONObject json, String... cols) |
6170 |
17 Mar 21 |
nicklas |
319 |
{ |
6170 |
17 Mar 21 |
nicklas |
320 |
for (String c : cols) |
6170 |
17 Mar 21 |
nicklas |
321 |
{ |
6170 |
17 Mar 21 |
nicklas |
322 |
json.put(c, line.format(c)); |
6170 |
17 Mar 21 |
nicklas |
323 |
} |
6170 |
17 Mar 21 |
nicklas |
324 |
} |
6170 |
17 Mar 21 |
nicklas |
325 |
|
6170 |
17 Mar 21 |
nicklas |
326 |
} |
6170 |
17 Mar 21 |
nicklas |
327 |
} |