3028 |
11 Dec 14 |
olle |
1 |
package net.sf.basedb.meludi.dao; |
3028 |
11 Dec 14 |
olle |
2 |
|
3028 |
11 Dec 14 |
olle |
3 |
import java.util.ArrayList; |
3028 |
11 Dec 14 |
olle |
4 |
import java.util.Collection; |
3028 |
11 Dec 14 |
olle |
5 |
import java.util.List; |
3028 |
11 Dec 14 |
olle |
6 |
|
3028 |
11 Dec 14 |
olle |
7 |
import org.json.simple.JSONObject; |
3028 |
11 Dec 14 |
olle |
8 |
|
5115 |
20 Nov 18 |
olle |
9 |
import net.sf.basedb.core.AnnotationSimpleRestriction; |
5115 |
20 Nov 18 |
olle |
10 |
import net.sf.basedb.core.AnnotationType; |
3028 |
11 Dec 14 |
olle |
11 |
import net.sf.basedb.core.DbControl; |
3028 |
11 Dec 14 |
olle |
12 |
import net.sf.basedb.core.Extract; |
3180 |
17 Mar 15 |
olle |
13 |
import net.sf.basedb.core.Include; |
3180 |
17 Mar 15 |
olle |
14 |
import net.sf.basedb.core.InvalidDataException; |
3028 |
11 Dec 14 |
olle |
15 |
import net.sf.basedb.core.ItemQuery; |
5115 |
20 Nov 18 |
olle |
16 |
import net.sf.basedb.core.Operator; |
5115 |
20 Nov 18 |
olle |
17 |
import net.sf.basedb.core.Sample; |
3028 |
11 Dec 14 |
olle |
18 |
import net.sf.basedb.core.Type; |
3028 |
11 Dec 14 |
olle |
19 |
import net.sf.basedb.core.query.Expressions; |
3028 |
11 Dec 14 |
olle |
20 |
import net.sf.basedb.core.query.Hql; |
3176 |
06 Mar 15 |
olle |
21 |
import net.sf.basedb.core.query.Orders; |
3028 |
11 Dec 14 |
olle |
22 |
import net.sf.basedb.core.query.Restrictions; |
3028 |
11 Dec 14 |
olle |
23 |
import net.sf.basedb.meludi.JsonUtil; |
3176 |
06 Mar 15 |
olle |
24 |
import net.sf.basedb.meludi.Meludi; |
3028 |
11 Dec 14 |
olle |
25 |
|
3028 |
11 Dec 14 |
olle |
26 |
/** |
3028 |
11 Dec 14 |
olle |
Class for loading information that is related to DNA extracts. |
3028 |
11 Dec 14 |
olle |
28 |
|
3028 |
11 Dec 14 |
olle |
@author nicklas |
3028 |
11 Dec 14 |
olle |
@since 2.13 |
3028 |
11 Dec 14 |
olle |
31 |
*/ |
3028 |
11 Dec 14 |
olle |
32 |
public class Dna |
3028 |
11 Dec 14 |
olle |
33 |
extends MeludiItem<Extract> |
3028 |
11 Dec 14 |
olle |
34 |
{ |
3028 |
11 Dec 14 |
olle |
35 |
|
3028 |
11 Dec 14 |
olle |
36 |
|
3028 |
11 Dec 14 |
olle |
37 |
/** |
3028 |
11 Dec 14 |
olle |
Find all DNA items by case name. This method will check for {@link Subtype#DNA} |
3028 |
11 Dec 14 |
olle |
extracts with a name matching the case name (eg. xxx.d). |
3028 |
11 Dec 14 |
olle |
40 |
*/ |
3028 |
11 Dec 14 |
olle |
41 |
public static List<Dna> findByCaseName(DbControl dc, String name) |
3028 |
11 Dec 14 |
olle |
42 |
{ |
3423 |
24 Jun 15 |
olle |
// Remove suffix starting with dot "." |
3423 |
24 Jun 15 |
olle |
44 |
int firstDotIndex = name.indexOf("."); |
3423 |
24 Jun 15 |
olle |
45 |
if (firstDotIndex >= 0) |
3423 |
24 Jun 15 |
olle |
46 |
{ |
3423 |
24 Jun 15 |
olle |
47 |
name = name.substring(0, firstDotIndex); |
3423 |
24 Jun 15 |
olle |
48 |
} |
5115 |
20 Nov 18 |
olle |
49 |
|
3028 |
11 Dec 14 |
olle |
// Look for a dna with the given name |
3028 |
11 Dec 14 |
olle |
51 |
ItemQuery<Extract> dnaQuery = Extract.getQuery(); |
3028 |
11 Dec 14 |
olle |
52 |
Subtype.DNA.addFilter(dc, dnaQuery); |
3028 |
11 Dec 14 |
olle |
53 |
dnaQuery.restrict(Restrictions.like(Hql.property("name"), Expressions.parameter("name", name+".%", Type.STRING))); |
3028 |
11 Dec 14 |
olle |
54 |
|
3028 |
11 Dec 14 |
olle |
55 |
List<Extract> tmp = dnaQuery.list(dc); |
3028 |
11 Dec 14 |
olle |
56 |
List<Dna> dna = new ArrayList<Dna>(tmp.size()); |
3028 |
11 Dec 14 |
olle |
57 |
for (Extract e : tmp) |
3028 |
11 Dec 14 |
olle |
58 |
{ |
3028 |
11 Dec 14 |
olle |
59 |
dna.add(new Dna(e)); |
3028 |
11 Dec 14 |
olle |
60 |
} |
5115 |
20 Nov 18 |
olle |
61 |
|
5115 |
20 Nov 18 |
olle |
62 |
if (dna.size() == 0) |
5115 |
20 Nov 18 |
olle |
63 |
{ |
5115 |
20 Nov 18 |
olle |
// Try to use specimen name as input |
5115 |
20 Nov 18 |
olle |
65 |
ItemQuery<Sample> specimenQuery = Sample.getQuery(); |
5115 |
20 Nov 18 |
olle |
66 |
String caseId = name; |
5115 |
20 Nov 18 |
olle |
67 |
AnnotationType caseIdType = Annotationtype.CASE_ID.load(dc); |
5115 |
20 Nov 18 |
olle |
68 |
specimenQuery = Sample.getQuery(); |
5115 |
20 Nov 18 |
olle |
69 |
Subtype.SPECIMEN.addFilter(dc, specimenQuery); |
5115 |
20 Nov 18 |
olle |
70 |
specimenQuery.restrict(new AnnotationSimpleRestriction(null, caseIdType, Operator.EQ, caseId, true, false)); |
5115 |
20 Nov 18 |
olle |
71 |
specimenQuery.setIncludes(Meludi.INCLUDE_IN_CURRENT_PROJECT); |
5115 |
20 Nov 18 |
olle |
72 |
specimenQuery.order(Orders.asc(Hql.property("name"))); |
5115 |
20 Nov 18 |
olle |
73 |
|
5115 |
20 Nov 18 |
olle |
// Look for a dna with the given name |
5115 |
20 Nov 18 |
olle |
75 |
dnaQuery = Extract.getQuery(); |
5115 |
20 Nov 18 |
olle |
76 |
|
5115 |
20 Nov 18 |
olle |
77 |
for (Sample s : specimenQuery.list(dc)) |
5115 |
20 Nov 18 |
olle |
78 |
{ |
5115 |
20 Nov 18 |
olle |
79 |
String specName = s.getName(); |
5115 |
20 Nov 18 |
olle |
80 |
dnaQuery.reset(); |
5115 |
20 Nov 18 |
olle |
81 |
Subtype.DNA.addFilter(dc, dnaQuery); |
5115 |
20 Nov 18 |
olle |
82 |
dnaQuery.restrict(Restrictions.like(Hql.property("name"), Expressions.parameter("name", specName+".%", Type.STRING))); |
5115 |
20 Nov 18 |
olle |
83 |
|
5115 |
20 Nov 18 |
olle |
84 |
tmp = dnaQuery.list(dc); |
5115 |
20 Nov 18 |
olle |
85 |
for (Extract e : tmp) |
5115 |
20 Nov 18 |
olle |
86 |
{ |
5115 |
20 Nov 18 |
olle |
87 |
dna.add(new Dna(e)); |
5115 |
20 Nov 18 |
olle |
88 |
} |
5115 |
20 Nov 18 |
olle |
89 |
} |
5115 |
20 Nov 18 |
olle |
90 |
} |
3028 |
11 Dec 14 |
olle |
91 |
return dna; |
3028 |
11 Dec 14 |
olle |
92 |
} |
3180 |
17 Mar 15 |
olle |
93 |
|
3180 |
17 Mar 15 |
olle |
94 |
/** |
3180 |
17 Mar 15 |
olle |
Find a DNA item with the given name. |
3180 |
17 Mar 15 |
olle |
@return A DNA item, or null if not found. |
3180 |
17 Mar 15 |
olle |
97 |
*/ |
3180 |
17 Mar 15 |
olle |
98 |
public static Dna findByName(DbControl dc, String name) |
3180 |
17 Mar 15 |
olle |
99 |
{ |
3180 |
17 Mar 15 |
olle |
100 |
Dna dna = null; |
3028 |
11 Dec 14 |
olle |
101 |
|
3180 |
17 Mar 15 |
olle |
102 |
ItemQuery<Extract> dnaQuery = Extract.getQuery(); |
3180 |
17 Mar 15 |
olle |
103 |
Subtype.DNA.addFilter(dc, dnaQuery); |
3180 |
17 Mar 15 |
olle |
104 |
dnaQuery.restrict(Restrictions.like(Hql.property("name"), Expressions.string(name))); |
3180 |
17 Mar 15 |
olle |
105 |
dnaQuery.order(Orders.desc(Hql.property("name"))); |
3180 |
17 Mar 15 |
olle |
106 |
dnaQuery.include(Include.ALL); |
3028 |
11 Dec 14 |
olle |
107 |
|
3180 |
17 Mar 15 |
olle |
108 |
List<Extract> tmp = dnaQuery.list(dc); |
3180 |
17 Mar 15 |
olle |
109 |
if (tmp.size() > 1) |
3180 |
17 Mar 15 |
olle |
110 |
{ |
3343 |
19 May 15 |
olle |
111 |
String extractIds = ""; |
3343 |
19 May 15 |
olle |
112 |
for (int i = 0; i < tmp.size(); i++) |
3343 |
19 May 15 |
olle |
113 |
{ |
3343 |
19 May 15 |
olle |
114 |
Dna tmpDna = new Dna(tmp.get(i)); |
3343 |
19 May 15 |
olle |
115 |
int id = tmpDna.getItem().getId(); |
3343 |
19 May 15 |
olle |
116 |
if (!extractIds.equals("")) |
3343 |
19 May 15 |
olle |
117 |
{ |
3343 |
19 May 15 |
olle |
118 |
extractIds += ", "; |
3343 |
19 May 15 |
olle |
119 |
} |
3343 |
19 May 15 |
olle |
120 |
extractIds += id; |
3343 |
19 May 15 |
olle |
121 |
} |
3180 |
17 Mar 15 |
olle |
122 |
throw new InvalidDataException( |
3180 |
17 Mar 15 |
olle |
123 |
"More than one DNA item with the name " + name + " was found. " + |
3343 |
19 May 15 |
olle |
124 |
" The ID values are " + extractIds + ". " + |
3180 |
17 Mar 15 |
olle |
125 |
"This wizard can't be used until that is corrected."); |
3180 |
17 Mar 15 |
olle |
126 |
} |
3180 |
17 Mar 15 |
olle |
127 |
if (tmp.size() == 1) |
3180 |
17 Mar 15 |
olle |
128 |
{ |
3180 |
17 Mar 15 |
olle |
129 |
dna = new Dna(tmp.get(0)); |
3180 |
17 Mar 15 |
olle |
130 |
} |
3180 |
17 Mar 15 |
olle |
131 |
return dna; |
3180 |
17 Mar 15 |
olle |
132 |
} |
3180 |
17 Mar 15 |
olle |
133 |
|
3028 |
11 Dec 14 |
olle |
134 |
/** |
3176 |
06 Mar 15 |
olle |
Find unquantified DNA. An DNA item that has not been quantified |
3176 |
06 Mar 15 |
olle |
has a 'null' {@link MeasuredBioMaterial#getOriginalQuantity()} |
3176 |
06 Mar 15 |
olle |
and has no extracts. |
3176 |
06 Mar 15 |
olle |
@since 1.2 |
3176 |
06 Mar 15 |
olle |
139 |
*/ |
3176 |
06 Mar 15 |
olle |
140 |
public static List<Dna> findUnquantifiedDna(DbControl dc) |
3176 |
06 Mar 15 |
olle |
141 |
{ |
3176 |
06 Mar 15 |
olle |
142 |
List<Dna> unQuantifiedDna = new ArrayList<Dna>(); |
3176 |
06 Mar 15 |
olle |
143 |
|
3176 |
06 Mar 15 |
olle |
144 |
ItemQuery<Extract> extractQuery = Extract.getQuery(); |
3176 |
06 Mar 15 |
olle |
145 |
Subtype.DNA.addFilter(dc, extractQuery); |
3176 |
06 Mar 15 |
olle |
146 |
extractQuery.restrict(Restrictions.eq(Hql.property("originalQuantity"), null)); |
3176 |
06 Mar 15 |
olle |
147 |
extractQuery.order(Orders.asc(Hql.property("id"))); |
3176 |
06 Mar 15 |
olle |
148 |
extractQuery.setIncludes(Meludi.INCLUDE_IN_CURRENT_PROJECT); |
3176 |
06 Mar 15 |
olle |
149 |
List<Extract> extracts = extractQuery.list(dc); |
3176 |
06 Mar 15 |
olle |
150 |
for (Extract extract : extracts) |
3176 |
06 Mar 15 |
olle |
151 |
{ |
3176 |
06 Mar 15 |
olle |
152 |
if (extract.countExtracts() == 0) |
3176 |
06 Mar 15 |
olle |
153 |
{ |
3176 |
06 Mar 15 |
olle |
154 |
unQuantifiedDna.add(new Dna(extract)); |
3176 |
06 Mar 15 |
olle |
155 |
} |
3176 |
06 Mar 15 |
olle |
156 |
} |
3176 |
06 Mar 15 |
olle |
157 |
return unQuantifiedDna; |
3176 |
06 Mar 15 |
olle |
158 |
} |
3176 |
06 Mar 15 |
olle |
159 |
|
3176 |
06 Mar 15 |
olle |
160 |
/** |
3028 |
11 Dec 14 |
olle |
Get a DNA extract when the id is known. |
3028 |
11 Dec 14 |
olle |
162 |
*/ |
3028 |
11 Dec 14 |
olle |
163 |
public static Dna getById(DbControl dc, int id) |
3028 |
11 Dec 14 |
olle |
164 |
{ |
3028 |
11 Dec 14 |
olle |
165 |
return new Dna(Extract.getById(dc, id)); |
3028 |
11 Dec 14 |
olle |
166 |
} |
3028 |
11 Dec 14 |
olle |
167 |
|
3028 |
11 Dec 14 |
olle |
168 |
public static Dna get(Extract extract) |
3028 |
11 Dec 14 |
olle |
169 |
{ |
3028 |
11 Dec 14 |
olle |
170 |
return new Dna(extract); |
3028 |
11 Dec 14 |
olle |
171 |
} |
3028 |
11 Dec 14 |
olle |
172 |
|
3449 |
28 Jul 15 |
olle |
173 |
public static List<Dna> toList(Collection<Extract> extracts) |
3449 |
28 Jul 15 |
olle |
174 |
{ |
3449 |
28 Jul 15 |
olle |
175 |
List<Dna> dna = new ArrayList<Dna>(extracts.size()); |
3449 |
28 Jul 15 |
olle |
176 |
for (Extract e : extracts) |
3449 |
28 Jul 15 |
olle |
177 |
{ |
3449 |
28 Jul 15 |
olle |
178 |
dna.add(new Dna(e)); |
3449 |
28 Jul 15 |
olle |
179 |
} |
3449 |
28 Jul 15 |
olle |
180 |
return dna; |
3449 |
28 Jul 15 |
olle |
181 |
} |
3449 |
28 Jul 15 |
olle |
182 |
|
3028 |
11 Dec 14 |
olle |
183 |
public static List<Dna> toDna(Collection<Extract> extracts) |
3028 |
11 Dec 14 |
olle |
184 |
{ |
3028 |
11 Dec 14 |
olle |
185 |
List<Dna> dna = new ArrayList<Dna>(extracts.size()); |
3028 |
11 Dec 14 |
olle |
186 |
for (Extract e : extracts) |
3028 |
11 Dec 14 |
olle |
187 |
{ |
3028 |
11 Dec 14 |
olle |
188 |
dna.add(new Dna(e)); |
3028 |
11 Dec 14 |
olle |
189 |
} |
3028 |
11 Dec 14 |
olle |
190 |
return dna; |
3028 |
11 Dec 14 |
olle |
191 |
} |
3028 |
11 Dec 14 |
olle |
192 |
|
3028 |
11 Dec 14 |
olle |
193 |
private JSONObject jsonWell; |
3028 |
11 Dec 14 |
olle |
194 |
|
3028 |
11 Dec 14 |
olle |
195 |
private Dna(Extract extract) |
3028 |
11 Dec 14 |
olle |
196 |
{ |
3028 |
11 Dec 14 |
olle |
197 |
super(extract); |
3028 |
11 Dec 14 |
olle |
198 |
} |
3028 |
11 Dec 14 |
olle |
199 |
|
3028 |
11 Dec 14 |
olle |
200 |
|
3028 |
11 Dec 14 |
olle |
201 |
/** |
3028 |
11 Dec 14 |
olle |
Get the real extract that represents this DNA in BASE. |
3028 |
11 Dec 14 |
olle |
203 |
*/ |
3028 |
11 Dec 14 |
olle |
204 |
public Extract getExtract() |
3028 |
11 Dec 14 |
olle |
205 |
{ |
3028 |
11 Dec 14 |
olle |
206 |
return getItem(); |
3028 |
11 Dec 14 |
olle |
207 |
} |
3028 |
11 Dec 14 |
olle |
208 |
|
3028 |
11 Dec 14 |
olle |
209 |
@SuppressWarnings("unchecked") |
3028 |
11 Dec 14 |
olle |
210 |
@Override |
3028 |
11 Dec 14 |
olle |
211 |
protected void initJSON(JSONObject json) |
3028 |
11 Dec 14 |
olle |
212 |
{ |
3028 |
11 Dec 14 |
olle |
213 |
super.initJSON(json); |
3028 |
11 Dec 14 |
olle |
214 |
if (jsonWell != null) json.put("bioWell", jsonWell); |
3028 |
11 Dec 14 |
olle |
215 |
|
3028 |
11 Dec 14 |
olle |
216 |
} |
3028 |
11 Dec 14 |
olle |
217 |
|
3028 |
11 Dec 14 |
olle |
218 |
/** |
3028 |
11 Dec 14 |
olle |
Load information about the plate and location the current FlowThrough |
3028 |
11 Dec 14 |
olle |
is located on. |
3028 |
11 Dec 14 |
olle |
221 |
*/ |
3028 |
11 Dec 14 |
olle |
222 |
public JSONObject loadBioPlateLocation() |
3028 |
11 Dec 14 |
olle |
223 |
{ |
3028 |
11 Dec 14 |
olle |
224 |
if (jsonWell == null) |
3028 |
11 Dec 14 |
olle |
225 |
{ |
3028 |
11 Dec 14 |
olle |
226 |
jsonWell = JsonUtil.getBioWellAsJSON(getItem().getBioWell(), true); |
3028 |
11 Dec 14 |
olle |
227 |
} |
3028 |
11 Dec 14 |
olle |
228 |
return jsonWell; |
3028 |
11 Dec 14 |
olle |
229 |
} |
3028 |
11 Dec 14 |
olle |
230 |
|
3028 |
11 Dec 14 |
olle |
231 |
} |