Skip to content

Commit bee5187

Browse files
manually merged changed to Affinefusion from 4f9b33f
1 parent 7a3d060 commit bee5187

1 file changed

Lines changed: 75 additions & 2 deletions

File tree

src/main/java/net/preibisch/bigstitcher/spark/SparkAffineFusion.java

Lines changed: 75 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import java.util.Date;
2929
import java.util.HashMap;
3030
import java.util.List;
31+
import java.util.Map;
3132
import java.util.Set;
3233
import java.util.concurrent.Callable;
3334
import java.util.concurrent.ExecutorService;
@@ -77,6 +78,8 @@
7778
import net.preibisch.mvrecon.fiji.spimdata.SpimData2;
7879
import net.preibisch.mvrecon.fiji.spimdata.boundingbox.BoundingBox;
7980
import net.preibisch.mvrecon.process.fusion.blk.BlkAffineFusion;
81+
import net.preibisch.mvrecon.process.fusion.intensity.Coefficients;
82+
import net.preibisch.mvrecon.process.fusion.intensity.IntensityCorrection;
8083
import net.preibisch.mvrecon.process.fusion.transformed.TransformVirtual;
8184
import net.preibisch.mvrecon.process.interestpointregistration.pairwise.constellation.grouping.Group;
8285
import net.preibisch.mvrecon.process.n5api.N5ApiTools;
@@ -146,12 +149,28 @@ public static enum DataTypeFusion
146149
@Option(names = { "--prefetch" }, description = "prefetch all blocks required for fusion in each Spark job using unlimited threads, useful in cloud environments (default: false)")
147150
protected boolean prefetch = false;
148151

152+
153+
// TODO: add support for loading coefficients during fusion
154+
@CommandLine.Option(names = { "--intensityN5Path" }, description = "N5/ZARR/HDF5 base path for loading coefficients (e.g. s3://myBucket/coefficients.n5)")
155+
private String intensityN5PathURIString = null;
156+
157+
@CommandLine.Option(names = { "--intensityN5Storage" }, description = "output storage type, can be used to override guessed format (default: guess from n5Path file/directory-ending)")
158+
private StorageFormat intensityN5StorageType = null;
159+
160+
@CommandLine.Option(names = { "--intensityN5Group" }, description = "group under which coefficient datasets are stored (default: \"\")")
161+
private String intensityN5Group = "";
162+
163+
@CommandLine.Option(names = { "--intensityN5Dataset" }, description = "dataset name for each coefficient dataset (default: \"intensity\"). The coefficients for view(s,t) are stored in dataset \"{-n5Group}/setup{s}/timepoint{t}/{n5Dataset}\"")
164+
private String intensityN5Dataset = "intensity";
165+
149166
URI outPathURI = null;
150167
/**
151168
* Prefetching now works with a Executors.newCachedThreadPool();
152169
*/
153170
//static final int N_PREFETCH_THREADS = 72;
154171

172+
URI intensityN5PathURI = null;
173+
155174
@Override
156175
public Void call() throws Exception
157176
{
@@ -336,10 +355,44 @@ else if ( dataType == DataType.UINT16 )
336355
else
337356
System.out.println( "Fusing to FLOAT32" );
338357

358+
//
359+
// intensity correction coefficients dataset
360+
//
361+
if ( intensityN5PathURIString != null )
362+
{
363+
intensityN5PathURI = URITools.toURI( intensityN5PathURIString );
364+
System.out.println( "Intensity coefficients: " + outPathURI );
365+
366+
if ( intensityN5StorageType == null )
367+
{
368+
if ( intensityN5PathURIString.toLowerCase().endsWith( ".zarr" ) )
369+
intensityN5StorageType = StorageFormat.ZARR;
370+
else if ( intensityN5PathURIString.toLowerCase().endsWith( ".n5" ) )
371+
intensityN5StorageType = StorageFormat.N5;
372+
else if ( intensityN5PathURIString.toLowerCase().endsWith( ".h5" ) || intensityN5PathURI.toString().toLowerCase().endsWith( ".hdf5" ) )
373+
intensityN5StorageType = StorageFormat.HDF5;
374+
else
375+
{
376+
System.out.println( "Unable to guess format from URI '" + intensityN5PathURI + "', please specify using '-s'");
377+
return null;
378+
}
379+
380+
System.out.println( "Guessed format " + intensityN5StorageType + " will be used to open URI '" + intensityN5PathURI + "', you can override it using '-s'");
381+
}
382+
else
383+
{
384+
System.out.println( "Format " + intensityN5StorageType + " will be used to open " + intensityN5PathURI );
385+
}
386+
}
387+
339388
//
340389
// final variables for Spark
341390
//
342391
final long[] dimensions = boundingBox.dimensionsAsLongArray();
392+
final StorageFormat intensityN5StorageType = this.intensityN5StorageType;
393+
final URI intensityN5PathURI = this.intensityN5PathURI;
394+
final String intensityN5Group = this.intensityN5Group;
395+
final String intensityN5Dataset = this.intensityN5Dataset;
343396

344397
// TODO: do we still need this?
345398
try
@@ -487,6 +540,25 @@ else if ( dataType == DataType.UINT16 )
487540
if ( overlappingViews.size() == 0 )
488541
return gridBlock;
489542

543+
// load intensity correction coefficients for all overlapping views
544+
545+
546+
final Map< ViewId, Coefficients > coefficients;
547+
548+
549+
if ( intensityN5PathURI != null )
550+
{
551+
coefficients = new HashMap<>();
552+
try ( N5Reader intensityN5Reader = URITools.instantiateN5Reader( intensityN5StorageType, intensityN5PathURI ) )
553+
{
554+
overlappingViews.forEach( v -> {
555+
coefficients.put( v, IntensityCorrection.readCoefficients( intensityN5Reader, intensityN5Group, intensityN5Dataset, v ) );
556+
} );
557+
}
558+
} else {
559+
coefficients = null;
560+
}
561+
490562
//final RandomAccessibleInterval img;
491563
final BlockSupplier blockSupplier;
492564
final FinalInterval interval = new FinalInterval( bbMin, bbMax );
@@ -536,15 +608,16 @@ else if ( firstTileWinsInverse )
536608
fusionType = FusionType.AVG_BLEND;
537609

538610
// returns a zero-min interval
539-
blockSupplier = BlkAffineFusion.init(
611+
//blockSupplier = BlkAffineFusion.init(
612+
blockSupplier = BlkAffineFusion.initWithIntensityCoefficients(
540613
conv,
541614
dataLocal.getSequenceDescription().getImgLoader(),
542615
viewIds,
543616
registrations,
544617
dataLocal.getSequenceDescription().getViewDescriptions(),
545618
fusionType,//fusion.getFusionType(),
546619
1, // linear interpolation
547-
null, // intensity correction
620+
coefficients, // intensity correction
548621
new BoundingBox( interval ),
549622
(RealType & NativeType)type,
550623
blockSize );

0 commit comments

Comments
 (0)