Skip to content

Commit 96429dc

Browse files
committed
additional test for comparing data currently in the filestore (before it was updated with the correct RGB10px)
1 parent 53ab567 commit 96429dc

5 files changed

+193
-18
lines changed

colormipsearch-api/src/test/java/org/janelia/colormipsearch/cds/PixelMatchColorDepthSearchAlgorithmTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,12 @@ class TestData {
7676
439,
7777
false
7878
),
79+
new TestData(
80+
"src/test/resources/colormipsearch/api/cdsearch/ems/12191_JRC2018U.tif",
81+
"src/test/resources/colormipsearch/api/cdsearch/lms/BJD_127B01_AE_01-20171124_64_H6-40x-Brain-JRC2018_Unisex_20x_HR-2483089192251293794-CH2-01_CDM.tif",
82+
414,
83+
false
84+
),
7985
new TestData(
8086
"src/test/resources/colormipsearch/api/cdsearch/ems/12191_JRC2018U_FL.tif",
8187
"src/test/resources/colormipsearch/api/cdsearch/lms/VT033614_127B01_AE_01-20171124_64_H6-f-CH2_01.tif",

colormipsearch-api/src/test/java/org/janelia/colormipsearch/cds/Shape2DMatchColorDepthSearchAlgorithmTest.java

Lines changed: 187 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import java.util.HashMap;
44
import java.util.Map;
5-
import java.util.function.BiPredicate;
65
import java.util.function.Supplier;
76

87
import ij.ImagePlus;
@@ -61,7 +60,7 @@ public void overExpressesMaskExpression() {
6160
}
6261

6362
@Test
64-
public void computeShapeScore() {
63+
public void computeShapeScoreUsingAlgorithmProvider() {
6564
class TestData {
6665
final String emCDM;
6766
final String lmCDM;
@@ -89,37 +88,46 @@ class TestData {
8988
"src/test/resources/colormipsearch/api/cdsearch/ems/12191_JRC2018U.tif",
9089
"src/test/resources/colormipsearch/api/cdsearch/lms/VT033614_127B01_AE_01-20171124_64_H6-f-CH2_01.tif",
9190
"src/test/resources/colormipsearch/api/cdsearch/grad/VT033614_127B01_AE_01-20171124_64_H6-f-CH2_01.png",
92-
21365L,
93-
731L,
94-
21608L,
95-
false
91+
/*expectedGaps*/21365L,
92+
/*expectedHighExpression*/731L,
93+
/*expectedScore*/21608L,
94+
/*expectedMirrored*/false
9695
),
96+
new TestData(
97+
"src/test/resources/colormipsearch/api/cdsearch/ems/12191_JRC2018U.tif",
98+
"src/test/resources/colormipsearch/api/cdsearch/lms/BJD_127B01_AE_01-20171124_64_H6-40x-Brain-JRC2018_Unisex_20x_HR-2483089192251293794-CH2-01_CDM.tif",
99+
"src/test/resources/colormipsearch/api/cdsearch/grad/BJD_127B01_AE_01-20171124_64_H6-40x-Brain-JRC2018_Unisex_20x_HR-2483089192251293794-CH2-01_CDM.png",
100+
/*expectedGaps*/23359L,
101+
/*expectedHighExpression*/523L,
102+
/*expectedScore*/23533L,
103+
/*expectedMirrored*/false
104+
),
97105
new TestData(
98106
"src/test/resources/colormipsearch/api/cdsearch/ems/12191_JRC2018U.tif",
99107
"src/test/resources/colormipsearch/api/cdsearch/lms/VT016795_115C08_AE_01-20200221_61_I2-m-CH1_01.tif",
100108
"src/test/resources/colormipsearch/api/cdsearch/grad/VT016795_115C08_AE_01-20200221_61_I2-m-CH1_01.png",
101-
40696L,
102-
17253L,
103-
46447L,
104-
true
109+
/*expectedGaps*/40696L,
110+
/*expectedHighExpression*/17253L,
111+
/*expectedScore*/46447L,
112+
/*expectedMirrored*/true
105113
),
106114
new TestData(
107115
"src/test/resources/colormipsearch/api/cdsearch/ems/12191_JRC2018U_FL.tif",
108116
"src/test/resources/colormipsearch/api/cdsearch/lms/VT033614_127B01_AE_01-20171124_64_H6-f-CH2_01.tif",
109117
"src/test/resources/colormipsearch/api/cdsearch/grad/VT033614_127B01_AE_01-20171124_64_H6-f-CH2_01.png",
110-
65381L,
111-
677L,
112-
65606L,
113-
false
118+
/*expectedGaps*/65381L,
119+
/*expectedHighExpression*/677L,
120+
/*expectedScore*/65606L,
121+
/*expectedMirrored*/false
114122
),
115123
new TestData(
116124
"src/test/resources/colormipsearch/api/cdsearch/ems/12191_JRC2018U_FL.tif",
117125
"src/test/resources/colormipsearch/api/cdsearch/lms/VT016795_115C08_AE_01-20200221_61_I2-m-CH1_01.tif",
118126
"src/test/resources/colormipsearch/api/cdsearch/grad/VT016795_115C08_AE_01-20200221_61_I2-m-CH1_01.png",
119-
104449L,
120-
16803L,
121-
110050L,
122-
true
127+
/*expectedGaps*/104449L,
128+
/*expectedHighExpression*/16803L,
129+
/*expectedScore*/110050L,
130+
/*expectedMirrored*/true
123131
),
124132
};
125133
ImageRegionDefinition excludedRegions = ImageTestUtils.getExcludedRegions();
@@ -170,13 +178,165 @@ class TestData {
170178
variantSuppliers
171179
);
172180
long end = System.currentTimeMillis();
181+
182+
LOG.info("Calculated shape score between {} and {} -> {} ({}, {}, {}) in {} secs, score in {} secs, total {} secs - mem used {}M",
183+
td.emCDM,
184+
td.lmCDM,
185+
shapeMatchScore.getScore(),
186+
shapeMatchScore.getGradientAreaGap(),
187+
shapeMatchScore.getHighExpressionArea(),
188+
shapeMatchScore.isMirrored(),
189+
(endInit - start) / 1000.,
190+
(end - endInit) / 1000.,
191+
(end - start) / 1000.,
192+
(Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (1024. * 1024 * 1024));
193+
173194
assertNotNull(td.emCDM + " vs " + td.lmCDM, shapeMatchScore);
174195
assertTrue(td.emCDM + " vs " + td.lmCDM, shapeMatchScore.getGradientAreaGap() != -1);
175196
assertTrue(td.emCDM + " vs " + td.lmCDM, shapeMatchScore.getHighExpressionArea() != -1);
176197
assertEquals(td.emCDM + " vs " + td.lmCDM, td.expectedGaps, shapeMatchScore.getGradientAreaGap());
177198
assertEquals(td.emCDM + " vs " + td.lmCDM, td.expectedHighExpression, shapeMatchScore.getHighExpressionArea());
178199
assertEquals(td.emCDM + " vs " + td.lmCDM, td.expectedScore, shapeMatchScore.getScore());
179200
assertEquals(td.emCDM + " vs " + td.lmCDM, td.mirrored, shapeMatchScore.isMirrored());
201+
}
202+
}
203+
204+
@Test
205+
public void computeShapeScoreUsingDirectAlgorithmConstructor() {
206+
class TestData {
207+
final String emCDM;
208+
final String lmCDM;
209+
final String lmGrad;
210+
final String lmZgap;
211+
final long expectedGaps;
212+
final long expectedHighExpression;
213+
final long expectedScore;
214+
final boolean mirrored; // if true the score comes from the mirrored mask
215+
216+
TestData(String emCDM, String lmCDM, String lmGrad, String lmZGap,
217+
long expectedGaps, long expectedHighExpression,
218+
long expectedScore, boolean mirrored) {
219+
this.emCDM = emCDM;
220+
this.lmCDM = lmCDM;
221+
this.lmGrad = lmGrad;
222+
this.lmZgap = lmZGap;
223+
this.expectedGaps = expectedGaps;
224+
this.expectedHighExpression = expectedHighExpression;
225+
this.expectedScore = expectedScore;
226+
this.mirrored = mirrored;
227+
}
228+
}
229+
230+
TestData[] testData = new TestData[] {
231+
new TestData(
232+
"src/test/resources/colormipsearch/api/cdsearch/ems/12191_JRC2018U.tif",
233+
"src/test/resources/colormipsearch/api/cdsearch/lms/VT033614_127B01_AE_01-20171124_64_H6-f-CH2_01.tif",
234+
"src/test/resources/colormipsearch/api/cdsearch/grad/VT033614_127B01_AE_01-20171124_64_H6-f-CH2_01.png",
235+
null,
236+
/*expectedGaps*/21365L,
237+
/*expectedHighExpression*/731L,
238+
/*expectedScore*/21608L,
239+
/*expectedMirrored*/false
240+
),
241+
new TestData(
242+
"src/test/resources/colormipsearch/api/cdsearch/ems/12191_JRC2018U.tif",
243+
"src/test/resources/colormipsearch/api/cdsearch/lms/BJD_127B01_AE_01-20171124_64_H6-40x-Brain-JRC2018_Unisex_20x_HR-2483089192251293794-CH2-01_CDM.tif",
244+
"src/test/resources/colormipsearch/api/cdsearch/grad/BJD_127B01_AE_01-20171124_64_H6-40x-Brain-JRC2018_Unisex_20x_HR-2483089192251293794-CH2-01_CDM.png",
245+
"src/test/resources/colormipsearch/api/cdsearch/zgap/BJD_127B01_AE_01-20171124_64_H6-40x-Brain-JRC2018_Unisex_20x_HR-2483089192251293794-CH2-01_CDM.tif",
246+
/*expectedGaps*/33884L,
247+
/*expectedHighExpression*/523L,
248+
/*expectedScore*/34058L,
249+
/*expectedMirrored*/false
250+
),
251+
new TestData(
252+
"src/test/resources/colormipsearch/api/cdsearch/ems/12191_JRC2018U.tif",
253+
"src/test/resources/colormipsearch/api/cdsearch/lms/VT016795_115C08_AE_01-20200221_61_I2-m-CH1_01.tif",
254+
"src/test/resources/colormipsearch/api/cdsearch/grad/VT016795_115C08_AE_01-20200221_61_I2-m-CH1_01.png",
255+
null,
256+
/*expectedGaps*/40696L,
257+
/*expectedHighExpression*/17253L,
258+
/*expectedScore*/46447L,
259+
/*expectedMirrored*/true
260+
),
261+
new TestData(
262+
"src/test/resources/colormipsearch/api/cdsearch/ems/12191_JRC2018U_FL.tif",
263+
"src/test/resources/colormipsearch/api/cdsearch/lms/VT033614_127B01_AE_01-20171124_64_H6-f-CH2_01.tif",
264+
"src/test/resources/colormipsearch/api/cdsearch/grad/VT033614_127B01_AE_01-20171124_64_H6-f-CH2_01.png",
265+
null,
266+
/*expectedGaps*/65381L,
267+
/*expectedHighExpression*/677L,
268+
/*expectedScore*/65606L,
269+
/*expectedMirrored*/false
270+
),
271+
new TestData(
272+
"src/test/resources/colormipsearch/api/cdsearch/ems/12191_JRC2018U_FL.tif",
273+
"src/test/resources/colormipsearch/api/cdsearch/lms/VT016795_115C08_AE_01-20200221_61_I2-m-CH1_01.tif",
274+
"src/test/resources/colormipsearch/api/cdsearch/grad/VT016795_115C08_AE_01-20200221_61_I2-m-CH1_01.png",
275+
null,
276+
/*expectedGaps*/104449L,
277+
/*expectedHighExpression*/16803L,
278+
/*expectedScore*/110050L,
279+
/*expectedMirrored*/true
280+
),
281+
};
282+
ImageRegionDefinition excludedRegions = ImageTestUtils.getExcludedRegions();
283+
int testQueryThreshold = 20;
284+
for (TestData td : testData) {
285+
long start = System.currentTimeMillis();
286+
ImagePlus emQueryImage = new Opener().openTiff(td.emCDM, 1);
287+
ImageArray<?> queryImageArray = ImageArrayUtils.fromImagePlus(emQueryImage);
288+
ImageTransformation clearIgnoredRegions = ImageTransformation.clearRegion(excludedRegions.getRegion(queryImageArray));
289+
LImage queryImage = LImageUtils.create(queryImageArray, 0, 0, 0, 0).mapi(clearIgnoredRegions);
290+
LImage maskForRegionsWithTooMuchExpression = LImageUtils.combine2(
291+
queryImage.mapi(ImageTransformation.unsafeMaxFilter(60)),
292+
queryImage.mapi(ImageTransformation.unsafeMaxFilter(20)),
293+
(p1, p2) -> (p2 & 0xFFFFFF) != 0 ? 0xFF000000 : p1 // mask pixels from the 60x image if they are present in the 20x image
294+
).map(ColorTransformation.toGray16WithNoGammaCorrection()).map(ColorTransformation.gray8Or16ToSignal(0)).reduce();
295+
296+
LImage queryMask = queryImage.map(ColorTransformation.toGray16WithNoGammaCorrection()).map(ColorTransformation.gray8Or16ToSignal(2)).reduce();
297+
298+
ColorDepthSearchAlgorithm<ShapeMatchScore> shape2DScoreAlgorithm = new Shape2DMatchColorDepthSearchAlgorithm(
299+
queryImage,
300+
queryMask,
301+
maskForRegionsWithTooMuchExpression,
302+
null,
303+
testQueryThreshold,
304+
true,
305+
clearIgnoredRegions
306+
);
307+
308+
ImagePlus lmTargetImage = new Opener().openTiff(td.lmCDM, 1);
309+
ImagePlus lmTargetGradImage = new Opener().openImage(td.lmGrad);
310+
311+
ImageArray<?> targetImageArray = ImageArrayUtils.fromImagePlus(lmTargetImage);
312+
ImageArray<?> targetGradImageArray = ImageArrayUtils.fromImagePlus(lmTargetGradImage);
313+
314+
long endInit = System.currentTimeMillis();
315+
LOG.info("Initialized shape score between {} and {} in {} secs - mem used {}M",
316+
td.emCDM,
317+
td.lmCDM,
318+
(endInit - start) / 1000.,
319+
(Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (1024. * 1024 * 1024));
320+
321+
Map<ComputeFileType, Supplier<ImageArray<?>>> variantSuppliers = new HashMap<ComputeFileType, Supplier<ImageArray<?>>>() {{
322+
put(ComputeFileType.GradientImage, () -> targetGradImageArray);
323+
put(ComputeFileType.ZGapImage, () -> {
324+
if (td.lmZgap != null) {
325+
ImagePlus zgapImage = new Opener().openTiff(td.lmZgap, 1);
326+
return ImageArrayUtils.fromImagePlus(zgapImage);
327+
} else {
328+
return ImageProcessing.create(clearIgnoredRegions)
329+
.applyColorTransformation(ColorTransformation.mask(testQueryThreshold))
330+
.unsafeMaxFilter(10)
331+
.applyTo(LImageUtils.create(targetImageArray)).toImageArray();
332+
}
333+
});
334+
}};
335+
ShapeMatchScore shapeMatchScore = shape2DScoreAlgorithm.calculateMatchingScore(
336+
targetImageArray,
337+
variantSuppliers
338+
);
339+
long end = System.currentTimeMillis();
180340

181341
LOG.info("Calculated shape score between {} and {} -> {} ({}, {}, {}) in {} secs, score in {} secs, total {} secs - mem used {}M",
182342
td.emCDM,
@@ -189,6 +349,15 @@ class TestData {
189349
(end - endInit) / 1000.,
190350
(end - start) / 1000.,
191351
(Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (1024. * 1024 * 1024));
352+
353+
assertNotNull(td.emCDM + " vs " + td.lmCDM, shapeMatchScore);
354+
assertTrue(td.emCDM + " vs " + td.lmCDM, shapeMatchScore.getGradientAreaGap() != -1);
355+
assertTrue(td.emCDM + " vs " + td.lmCDM, shapeMatchScore.getHighExpressionArea() != -1);
356+
assertEquals(td.emCDM + " vs " + td.lmCDM, td.expectedGaps, shapeMatchScore.getGradientAreaGap());
357+
assertEquals(td.emCDM + " vs " + td.lmCDM, td.expectedHighExpression, shapeMatchScore.getHighExpressionArea());
358+
assertEquals(td.emCDM + " vs " + td.lmCDM, td.expectedScore, shapeMatchScore.getScore());
359+
assertEquals(td.emCDM + " vs " + td.lmCDM, td.mirrored, shapeMatchScore.isMirrored());
192360
}
193361
}
362+
194363
}
Loading

0 commit comments

Comments
 (0)