22
33import java .util .HashMap ;
44import java .util .Map ;
5- import java .util .function .BiPredicate ;
65import java .util .function .Supplier ;
76
87import 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}
0 commit comments