@@ -46,31 +46,18 @@ public abstract class AbstractFitRAI<I extends RealType<I>, K extends RealType<K
4646 @ OpDependency (name = "filter.convolve" )
4747 private Functions .Arity3 <RandomAccessibleInterval <I >, RandomAccessibleInterval <K >, I , RandomAccessibleInterval <I >> convolveOp ;
4848
49- private RandomAccessibleInterval <K > kernel ;
50-
51- private RealMask roi ;
52-
53- private FitWorker <I > fitWorker ;
54-
55- private int lifetimeAxis ;
56-
57- private ParamEstimator <I > est ;
58-
59- private List <int []> roiPos ;
60-
61- private FitParams <I > params ;
62-
63- private FitResults rslts ;
64-
65- public void assertConformity (final FitParams <I > in ) {
49+ private void assertConformity ( //
50+ final FitParams <I > in , //
51+ final RealMask roi , //
52+ final RandomAccessibleInterval <K > kernel //
53+ ) {
6654 // requires a 3D image
6755 if (in .transMap .numDimensions () != 3 ) {
6856 throw new IllegalArgumentException (
6957 "Fitting requires 3-dimensional input" );
7058 }
7159 // lifetime axis must be valid
72- lifetimeAxis = in .ltAxis ;
73- if (lifetimeAxis < 0 || lifetimeAxis >= in .transMap .numDimensions ()) {
60+ if (in .ltAxis < 0 || in .ltAxis >= in .transMap .numDimensions ()) {
7461 throw new IllegalArgumentException ("Lifetime axis must be 0, 1, or 2" );
7562 }
7663
@@ -85,70 +72,69 @@ public void assertConformity(final FitParams<I> in) {
8572 }
8673 }
8774
88- public void initialize (FitParams <I > in ) {
89-
90- // dimension doesn't really matter
91- if (roi == null ) {
92- roi = Masks .allRealMask (0 );
93- }
94-
95- // So that we bin the correct axis
96- if (kernel != null ) {
97- kernel = Views .permute (kernel , 2 , lifetimeAxis );
98- }
99-
100- params = in .copy ();
101- initParam ();
102- rslts = new FitResults ();
103- fitWorker = createWorker (params , rslts );
104- initRslt ();
105- }
106-
10775 /**
10876 * @param params the {@link FitParams} used for fitting
10977 * @param mask a {@link RealMask} defining the areas to fit
11078 * @param kernel kernel used in an optional convolution preprocessing step
111- * @param handler
79+ * @param handler a {@link FitWorker.FitEventHandler} allowing for callback
80+ * once computation has completed
11281 * @return the results of fitting
11382 */
11483 @ Override
115- public FitResults apply (FitParams <I > params , @ Nullable RealMask mask ,
116- @ Nullable RandomAccessibleInterval <K > kernel ,
117- @ Nullable FitWorker .FitEventHandler <I > handler )
118- {
119- this .kernel = kernel ;
120- this .roi = mask ;
121- assertConformity (params );
122- initialize (params );
123- fitWorker .fitBatch (roiPos , handler );
124- return rslts ;
125- }
126-
127- /**
128- * Generates a worker for the actual fit.
129- *
130- * @return A {@link FitWorker}.
131- */
132- public abstract FitWorker <I > createWorker (FitParams <I > params ,
133- FitResults results );
84+ public FitResults apply ( //
85+ FitParams <I > params , //
86+ @ Nullable RealMask mask , //
87+ @ Nullable RandomAccessibleInterval <K > kernel , //
88+ @ Nullable FitWorker .FitEventHandler <I > handler //
89+ ) {
90+ assertConformity (params , mask , kernel );
91+
92+ // Assign reasonable defaults for nullable params
93+ if (mask == null ) {
94+ mask = Masks .allRealMask (0 );
95+ }
96+ if (kernel != null ) {
97+ kernel = Views .permute (kernel , 2 , params .ltAxis );
98+ }
13499
135- private void initParam () {
100+ // -- Initialize -- //
101+ params = params .copy (); // TODO: Is this necessary
136102 // convolve the image if necessary
137103 if (kernel != null ) {
138104 params .transMap = convolveOp .apply ( //
139105 params .transMap , //
140106 kernel , //
141107 Util .getTypeFromInterval (params .transMap ));
142108 }
109+ List <int []> roiPos = getRoiPositions (mask , params .ltAxis , params .transMap );
143110
144- roiPos = getRoiPositions (params .transMap );
145-
146- est = new ParamEstimator <>(params , roiPos );
111+ ParamEstimator <I > est = new ParamEstimator <>(params , roiPos );
147112 est .estimateStartEnd ();
148113 est .estimateIThreshold ();
114+ FitResults rslts = new FitResults ();
115+ FitWorker <I > fitWorker = createWorker (params , rslts );
116+ initRslt (params , fitWorker , est , rslts );
117+
118+ // -- Run -- //
119+ fitWorker .fitBatch (roiPos , handler );
120+ return rslts ;
149121 }
150122
151- private void initRslt () {
123+ /**
124+ * Generates a worker for the actual fit.
125+ *
126+ * @return A {@link FitWorker}.
127+ */
128+ public abstract FitWorker <I > createWorker (FitParams <I > params ,
129+ FitResults results );
130+
131+ private void initRslt ( //
132+ FitParams <I > params , //
133+ FitWorker <I > fitWorker , //
134+ ParamEstimator <I > est , //
135+ FitResults rslts //
136+ ) {
137+ int lifetimeAxis = params .ltAxis ;
152138 // get dimensions and replace time axis with decay parameters
153139 long [] dimFit = new long [params .transMap .numDimensions ()];
154140 params .transMap .dimensions (dimFit );
@@ -177,7 +163,9 @@ private void initRslt() {
177163 rslts .intensityMap = est .getIntensityMap ();
178164 }
179165
180- private List <int []> getRoiPositions (RandomAccessibleInterval <I > trans ) {
166+ private List <int []> getRoiPositions (RealMask roi , int lifetimeAxis ,
167+ RandomAccessibleInterval <I > trans )
168+ {
181169 final List <int []> interested = new ArrayList <>();
182170 final IntervalView <I > xyPlane = Views .hyperSlice (trans , lifetimeAxis , 0 );
183171 final Cursor <I > xyCursor = xyPlane .localizingCursor ();
0 commit comments