mxlib
c++ tools for analyzing astronomical data and other tasks by Jared R. Males. [git repo]
fitMoffat.hpp
Go to the documentation of this file.
1 /** \file fitMoffat.hpp
2  * \author Jared R. Males
3  * \brief Tools for fitting Moffat functions to data.
4  * \ingroup fitting_files
5  *
6  */
7 
8 //***********************************************************************//
9 // Copyright 2015, 2016, 2017 Jared R. Males (jaredmales@gmail.com)
10 //
11 // This file is part of mxlib.
12 //
13 // mxlib is free software: you can redistribute it and/or modify
14 // it under the terms of the GNU General Public License as published by
15 // the Free Software Foundation, either version 3 of the License, or
16 // (at your option) any later version.
17 //
18 // mxlib is distributed in the hope that it will be useful,
19 // but WITHOUT ANY WARRANTY; without even the implied warranty of
20 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 // GNU General Public License for more details.
22 //
23 // You should have received a copy of the GNU General Public License
24 // along with mxlib. If not, see <http://www.gnu.org/licenses/>.
25 //***********************************************************************//
26 
27 #ifndef fitMoffat_hpp
28 #define fitMoffat_hpp
29 
30 #include "levmarInterface.hpp"
31 #include "../func/moffat.hpp"
32 
33 #include "../../improc/eigenImage.hpp"
34 
35 namespace mx
36 {
37 namespace math
38 {
39 namespace fit
40 {
41 
42 ///Wrapper for a native array to pass to \ref levmarInterface, with Moffat details.
43 /** \ingroup moffat_peak_fit
44  */
45 template<typename realT>
47 {
48  realT * data {nullptr}; ///< Pointer to the array of y values
49  realT * coords {nullptr}; ///< Pointer to the array of x values (optional)
50  size_t nx {0}; ///< X dimension of the array
51 
52  realT m_I0 {0};
53  realT m_I {0};
54  realT m_x0 {0};
55  realT m_alpha {0};
56  realT m_beta {0};
57 
58  int m_I0_idx {0};
59  int m_I_idx {1};
60  int m_x0_idx {2};
61  int m_alpha_idx {4};
62  int m_beta_idx {5};
63 
64  int m_nparams = 5;
65 
66  /// Set whether each parameter is fixed.
67  /** Sets the parameter indices appropriately.
68  */
69  void setFixed( bool I0,
70  bool I,
71  bool x0,
72  bool alpha,
73  bool beta
74  )
75  {
76  int idx = 0;
77 
78  if(I0) m_I0_idx = -1;
79  else m_I0_idx = idx++;
80 
81  if(I) m_I_idx = -1;
82  else m_I_idx = idx++;
83 
84  if(x0) m_x0_idx = -1;
85  else m_x0_idx = idx++;
86 
87  if(alpha) m_alpha_idx = -1;
88  else m_alpha_idx = idx++;
89 
90  if(beta) m_beta_idx = -1;
91  else m_beta_idx = idx++;
92 
93  m_nparams = idx;
94  }
95 
96  realT I0( realT * p )
97  {
98  if( m_I0_idx < 0 )
99  {
100  return m_I0;
101  }
102  else
103  {
104  return p[m_I0_idx];
105  }
106  }
107 
108  void I0( realT * p,
109  realT nI0
110  )
111  {
112  if( m_I0_idx < 0 )
113  {
114  m_I0 = nI0;
115  }
116  else
117  {
118  p[m_I0_idx]=nI0;
119  }
120  }
121 
122  realT I( realT * p )
123  {
124  if( m_I_idx < 0 )
125  {
126  return m_I;
127  }
128  else
129  {
130  return p[m_I_idx];
131  }
132  }
133 
134  void I( realT * p,
135  realT nI
136  )
137  {
138  if( m_I_idx < 0 )
139  {
140  m_I = nI;
141  }
142  else
143  {
144  p[m_I_idx] = nI;
145  }
146  }
147 
148  realT x0( realT * p )
149  {
150  if( m_x0_idx < 0 )
151  {
152  return m_x0;
153  }
154  else
155  {
156  return p[m_x0_idx];
157  }
158  }
159 
160  void x0( realT * p,
161  realT nx0
162  )
163  {
164  if( m_x0_idx < 0 )
165  {
166  m_x0 = nx0;
167  }
168  else
169  {
170  p[m_x0_idx] = nx0;
171  }
172  }
173 
174  realT alpha( realT * p )
175  {
176  if( m_alpha_idx < 0 )
177  {
178  return m_alpha;
179  }
180  else
181  {
182  return p[m_alpha_idx];
183  }
184  }
185 
186  void alpha( realT * p,
187  realT nalpha
188  )
189  {
190  if( m_alpha_idx < 0 )
191  {
192  m_alpha = nalpha;
193  }
194  else
195  {
196  p[m_alpha_idx] = nalpha;
197  }
198  }
199 
200 
201  realT beta( realT * p )
202  {
203  if( m_beta_idx < 0 )
204  {
205  return m_beta;
206  }
207  else
208  {
209  return p[m_beta_idx];
210  }
211  }
212 
213  void beta( realT * p,
214  realT nbeta
215  )
216  {
217  if( m_beta_idx < 0 )
218  {
219  m_beta = nbeta;
220  }
221  else
222  {
223  p[m_beta_idx] = nbeta;
224  }
225  }
226 
227  int nparams()
228  {
229  return m_nparams;
230  }
231 
232 
233 };
234 
235 /** \defgroup moffat_peak_fit Moffat Functions
236  * \brief Fitting Moffat functions to data.
237  *
238  * The Moffat Function\cite moffat_1969, a.k.a. the Moffat Profile, a.k.a. the Moffat Distribution, has the form
239  * \f[
240  I(x) = I_{pk}\left[ 1 + \frac{x^2}{\alpha^2}\right]^{-\beta}
241  * \f]
242  * With \f$\beta=1\f$ it is the
243  * Lorentzian or Cauchy distribution. See also https://en.wikipedia.org/wiki/Moffat_distribution and
244  * https://en.wikipedia.org/wiki/Cauchy_distribution.
245  *
246  * For utilities for working with Moffat functions see \ref gen_math_moffats.
247  *
248  * \ingroup peak_fit
249  */
250 
251 ///\ref levmarInterface fitter structure for the 1D Moffat.
252 /** \ingroup moffat_peak_fit
253  *
254  */
255 template<typename _realT>
257 {
258  typedef _realT realT;
259 
260  static const int nparams = 6;
261 
262  static void func(realT *p, realT *hx, int m, int n, void *adata)
263  {
265 
266  size_t idx_mat, idx_dat;
267 
268  idx_dat = 0;
269 
270  realT I0 = arr->I0(p);
271  realT I = arr->I(p);
272  realT x0 = arr->x0(p);
273  realT alpha = arr->alpha(p);
274  realT beta = arr->beta(p);
275 
276  if(arr->coords)
277  {
278  for(int i=0; i<arr->nx; ++i)
279  {
280  hx[i] = func::moffat<realT>(arr->coords[i],I0,I, x0, alpha, beta) - arr->data[i];
281  }
282  }
283  else
284  {
285  for(int i=0; i<arr->nx; ++i)
286  {
287  hx[i] = func::moffat<realT>(i,I0,I, x0, alpha, beta) - arr->data[i];
288  }
289  }
290  }
291 };
292 
293 ///Class to manage fitting a 1D Moffat to data via the \ref levmarInterface
294 /** Fits \ref gen_math_moffats to a 1-dimensional array of data.
295  *
296  * This class allows for treating any of the parameters as fixed.
297  *
298  * \tparam fitterT a type meeting the requirements specified in \ref levmarInterface.
299  *
300  * \ingroup moffat_peak_fit
301  *
302  */
303 template<typename _realT>
304 class fitMoffat1D : public levmarInterface<moffat1D_fitter<_realT>>
305 {
306 
307 public:
308 
309  typedef _realT realT;
311 
312 protected:
313 
315 
316  void initialize()
317  {
318  this->allocate_params(arr.nparams());
319  this->adata = &arr;
320  }
321 
322 public:
323 
324  fitMoffat1D()
325  {
326  initialize();
327  }
328 
329  ~fitMoffat1D()
330  {
331  }
332 
333  /// Set whether each parameter is fixed.
334  /** Sets the parameter indices appropriately.
335  */
336  void setFixed( bool I0, ///< [in] if true, then I0 will be not be part of the fit
337  bool I, ///< [in] if true, then I will be not be part of the fit
338  bool x0, ///< [in] if true, then x0 will be not be part of the fit
339  bool alpha, ///< [in] if true, then alpha will be not be part of the fit
340  bool beta ///< [in] if true, then beta will be not be part of the fit
341  )
342  {
343  arr.setFixed(I0, I, x0, alpha, beta);
344  this->allocate_params(arr.nparams());
345  }
346 
347  ///Set the initial guess for a symmetric Moffat.
348  void setGuess( realT I0, ///< [in] the constant background level
349  realT I, ///< [in] the peak scaling
350  realT x0, ///< [in] the center x-coordinate
351  realT alpha, ///< [in] the width parameter
352  realT beta ///< [in] the shape parameter
353  )
354  {
355  arr.I0(this->p,I0);
356  arr.I(this->p,I);
357  arr.x0(this->p,x0);
358  arr.alpha(this->p,alpha);
359  arr.beta(this->p,beta);
360  }
361 
362  ///Set the data aray.
363  void setArray( realT *data, ///< [in] pointer to an nx sized array of the y-values to be fit
364  int nx ///< [in] the number of pixels in the x direction of the data array
365  )
366  {
367  arr.data = data;
368  arr.nx = nx;
369 
370  this->n = nx;
371 
372  }
373 
374  ///Set the data aray and the coordinates.
375  void setArray( realT *data, ///< [in] pointer to an nx sized array of the y-values to be fit
376  realT * coords, ///< [in] point to an nx sized array of the x-values of the data
377  int nx ///< [in] the number of pixels in the x direction of the data array
378  )
379  {
380  arr.data = data;
381  arr.coords = coords;
382  arr.nx = nx;
383 
384  this->n = nx;
385 
386  }
387 
388  ///Get the current value of I0, the constant.
389  /**
390  * \returns the current value of I0
391  */
392  realT I0()
393  {
394  return arr.I0( this->p );
395  }
396 
397  ///Get the current value of I, the peak scaling.
398  /**
399  * \returns the current value of I
400  */
401  realT I()
402  {
403  return arr.I( this->p );
404  }
405 
406  ///Get the center x-
407  /**
408  * \returns the current value of x0
409  */
410  realT x0()
411  {
412  return arr.x0( this->p );
413  }
414 
415  ///Return the width parameter
416  /**
417  * \returns the current value of alpha
418  */
419  realT alpha()
420  {
421  return arr.alpha( this->p );
422  }
423 
424  /// Return the shape parameter
425  /**
426  * \returns the current value of beta
427  */
428  realT beta()
429  {
430  return arr.beta( this->p );
431  }
432 
433  ///Return the full-width at half maximum
434  /**
435  * \returns the FWHM calculated from alpha and beta
436  */
437  realT fwhm()
438  {
439  return func::moffatFWHM(alpha(), beta());
440  }
441 };
442 
443 
444 //forward
445 template<typename realT>
446 struct array2FitMoffat;
447 
448 //forward
449 template<typename _realT>
450 struct moffat2D_sym_fitter;
451 
452 ///Class to manage fitting a 2D Moffat to data via the \ref levmarInterface
453 /** Fits \ref gen_math_moffats to a 2-dimensional array of data.
454  *
455  * This class allows for treating any of the parameters as fixed.
456  *
457  * \tparam fitterT a type meeting the requirements specified in \ref levmarInterface.
458  *
459  * \ingroup moffat_peak_fit
460  *
461  */
462 template<typename fitterT>
463 class fitMoffat2D : public levmarInterface<fitterT>
464 {
465 
466 public:
467 
468  typedef typename fitterT::realT realT;
469 
470 protected:
471 
473 
474  void initialize()
475  {
476  this->allocate_params(arr.nparams());
477  this->adata = &arr;
478  }
479 
480 public:
481 
482  fitMoffat2D()
483  {
484  initialize();
485  }
486 
487  ~fitMoffat2D()
488  {
489  }
490 
491  /// Set whether each parameter is fixed.
492  /** Sets the parameter indices appropriately.
493  */
494  void setFixed( bool I0, ///< [in] if true, then I0 will be not be part of the fit
495  bool I, ///< [in] if true, then I will be not be part of the fit
496  bool x0, ///< [in] if true, then x0 will be not be part of the fit
497  bool y0, ///< [in] if true, then y0 will be not be part of the fit
498  bool alpha, ///< [in] if true, then alpha will be not be part of the fit
499  bool beta ///< [in] if true, then beta will be not be part of the fit
500  )
501  {
502  arr.setFixed(I0, I, x0, y0, alpha, beta);
503  this->allocate_params(arr.nparams());
504  }
505 
506  ///Set the initial guess for a symmetric Moffat.
507  void setGuess( realT I0, ///< [in] the constant background level
508  realT I, ///< [in] the peak scaling
509  realT x0, ///< [in] the center x-coordinate
510  realT y0, ///< [in] the center y-coordinate
511  realT alpha, ///< [in] the width parameter
512  realT beta ///< [in] the shape parameter
513  )
514  {
515  arr.I0(this->p,I0);
516  arr.I(this->p,I);
517  arr.x0(this->p,x0);
518  arr.y0(this->p,y0);
519  arr.alpha(this->p,alpha);
520  arr.beta(this->p,beta);
521  }
522 
523  ///Set the data aray.
524  void setArray( realT *data, ///< [in] pointer to an nx X ny array of data to be fit
525  int nx, ///< [in] the number of pixels in the x direction of the data array
526  int ny ///< [in] the number of pixels in the y direction of the data array
527  )
528  {
529  arr.data = data;
530  arr.nx = nx;
531  arr.ny = ny;
532 
533  this->n = nx*ny;
534 
535  }
536 
537  ///Get the current value of I0, the constant.
538  /**
539  * \returns the current value of I0
540  */
541  realT I0()
542  {
543  return arr.I0( this->p );
544  }
545 
546  ///Get the current value of I, the peak scaling.
547  /**
548  * \returns the current value of I
549  */
550  realT I()
551  {
552  return arr.I( this->p );
553  }
554 
555  ///Get the center x-
556  /**
557  * \returns the current value of x0
558  */
559  realT x0()
560  {
561  return arr.x0( this->p );
562  }
563 
564  ///Get the center y-coordinate
565  /**
566  * \returns the current value of y0
567  */
568  realT y0()
569  {
570  return arr.y0( this->p );
571  }
572 
573  ///Return the width parameter
574  /**
575  * \returns the current value of alpha
576  */
577  realT alpha()
578  {
579  return arr.alpha( this->p );
580  }
581 
582  /// Return the shape parameter
583  /**
584  * \returns the current value of beta
585  */
586  realT beta()
587  {
588  return arr.beta( this->p );
589  }
590 
591  ///Return the full-width at half maximum
592  /**
593  * \returns the FWHM calculated from alpha and beta
594  */
595  realT fwhm()
596  {
597  return func::moffatFWHM(alpha(), beta());
598  }
599 
600 
601 
602 };
603 
604 ///Wrapper for a native array to pass to \ref levmarInterface, with Moffat details.
605 /** \ingroup moffat_peak_fit
606  */
607 template<typename realT>
609 {
610  realT * data {nullptr}; ///< Pointer to the array
611  size_t nx {0}; ///< X dimension of the array
612  size_t ny {0}; ///< Y dimension of the array
613 
614  realT m_I0 {0};
615  realT m_I {0};
616  realT m_x0 {0};
617  realT m_y0 {0};
618  realT m_alpha {0};
619  realT m_beta {0};
620 
621  int m_I0_idx {0};
622  int m_I_idx {1};
623  int m_x0_idx {2};
624  int m_y0_idx {3};
625  int m_alpha_idx {4};
626  int m_beta_idx {5};
627 
628  int m_nparams = 6;
629 
630  /// Set whether each parameter is fixed.
631  /** Sets the parameter indices appropriately.
632  */
633  void setFixed( bool I0,
634  bool I,
635  bool x0,
636  bool y0,
637  bool alpha,
638  bool beta
639  )
640  {
641  int idx = 0;
642 
643  if(I0) m_I0_idx = -1;
644  else m_I0_idx = idx++;
645 
646  if(I) m_I_idx = -1;
647  else m_I_idx = idx++;
648 
649  if(x0) m_x0_idx = -1;
650  else m_x0_idx = idx++;
651 
652  if(y0) m_y0_idx = -1;
653  else m_y0_idx = idx++;
654 
655  if(alpha) m_alpha_idx = -1;
656  else m_alpha_idx = idx++;
657 
658  if(beta) m_beta_idx = -1;
659  else m_beta_idx = idx++;
660 
661  m_nparams = idx;
662  }
663 
664  realT I0( realT * p )
665  {
666  if( m_I0_idx < 0 )
667  {
668  return m_I0;
669  }
670  else
671  {
672  return p[m_I0_idx];
673  }
674  }
675 
676  void I0( realT * p,
677  realT nI0
678  )
679  {
680  if( m_I0_idx < 0 )
681  {
682  m_I0 = nI0;
683  }
684  else
685  {
686  p[m_I0_idx]=nI0;
687  }
688  }
689 
690  realT I( realT * p )
691  {
692  if( m_I_idx < 0 )
693  {
694  return m_I;
695  }
696  else
697  {
698  return p[m_I_idx];
699  }
700  }
701 
702  void I( realT * p,
703  realT nI
704  )
705  {
706  if( m_I_idx < 0 )
707  {
708  m_I = nI;
709  }
710  else
711  {
712  p[m_I_idx] = nI;
713  }
714  }
715 
716  realT x0( realT * p )
717  {
718  if( m_x0_idx < 0 )
719  {
720  return m_x0;
721  }
722  else
723  {
724  return p[m_x0_idx];
725  }
726  }
727 
728  void x0( realT * p,
729  realT nx0
730  )
731  {
732  if( m_x0_idx < 0 )
733  {
734  m_x0 = nx0;
735  }
736  else
737  {
738  p[m_x0_idx] = nx0;
739  }
740  }
741 
742  realT y0( realT * p )
743  {
744  if( m_y0_idx < 0 )
745  {
746  return m_y0;
747  }
748  else
749  {
750  return p[m_y0_idx];
751  }
752  }
753 
754  void y0( realT * p,
755  realT ny0
756  )
757  {
758  if( m_y0_idx < 0 )
759  {
760  m_y0 = ny0;
761  }
762  else
763  {
764  p[m_y0_idx] = ny0;
765  }
766  }
767 
768 
769  realT alpha( realT * p )
770  {
771  if( m_alpha_idx < 0 )
772  {
773  return m_alpha;
774  }
775  else
776  {
777  return p[m_alpha_idx];
778  }
779  }
780 
781  void alpha( realT * p,
782  realT nalpha
783  )
784  {
785  if( m_alpha_idx < 0 )
786  {
787  m_alpha = nalpha;
788  }
789  else
790  {
791  p[m_alpha_idx] = nalpha;
792  }
793  }
794 
795 
796  realT beta( realT * p )
797  {
798  if( m_beta_idx < 0 )
799  {
800  return m_beta;
801  }
802  else
803  {
804  return p[m_beta_idx];
805  }
806  }
807 
808  void beta( realT * p,
809  realT nbeta
810  )
811  {
812  if( m_beta_idx < 0 )
813  {
814  m_beta = nbeta;
815  }
816  else
817  {
818  p[m_beta_idx] = nbeta;
819  }
820  }
821 
822  int nparams()
823  {
824  return m_nparams;
825  }
826 
827 
828 };
829 
830 ///\ref levmarInterface fitter structure for the symmetric Moffat.
831 /** \ingroup moffat_peak_fit
832  *
833  */
834 template<typename _realT>
836 {
837  typedef _realT realT;
838 
839  static const int nparams = 6;
840 
841  static void func(realT *p, realT *hx, int m, int n, void *adata)
842  {
844 
845  size_t idx_mat, idx_dat;
846 
847  idx_dat = 0;
848 
849  realT I0 = arr->I0(p);
850  realT I = arr->I(p);
851  realT x0 = arr->x0(p);
852  realT y0 = arr->y0(p);
853  realT alpha = arr->alpha(p);
854  realT beta = arr->beta(p);
855 
856  for(int i=0; i<arr->nx; ++i)
857  {
858  for(int j=0; j<arr->ny; ++j)
859  {
860  idx_mat = i+j*arr->nx;
861 
862  hx[idx_dat] = func::moffat2D<realT>(i,j,I0,I, x0, y0, alpha, beta) - arr->data[idx_mat];
863 
864  ++idx_dat;
865  }
866  }
867  }
868 };
869 
870 
871 ///Alias for the fitMoffat2D type fitting the symmetric Moffat profile.
872 /** \ingroup moffat_peak_fit
873  */
874 template<typename realT>
876 
877 
878 } //namespace fit
879 } //namespace math
880 
881 } //namespace mx
882 
883 #endif //fitMoffat_hpp
884 
Class to manage fitting a 1D Moffat to data via the levmarInterface.
Definition: fitMoffat.hpp:305
realT beta()
Return the shape parameter.
Definition: fitMoffat.hpp:428
void setGuess(realT I0, realT I, realT x0, realT alpha, realT beta)
Set the initial guess for a symmetric Moffat.
Definition: fitMoffat.hpp:348
void setArray(realT *data, realT *coords, int nx)
Set the data aray and the coordinates.
Definition: fitMoffat.hpp:375
void setArray(realT *data, int nx)
Set the data aray.
Definition: fitMoffat.hpp:363
realT x0()
Get the center x-.
Definition: fitMoffat.hpp:410
realT alpha()
Return the width parameter.
Definition: fitMoffat.hpp:419
realT I0()
Get the current value of I0, the constant.
Definition: fitMoffat.hpp:392
realT fwhm()
Return the full-width at half maximum.
Definition: fitMoffat.hpp:437
realT I()
Get the current value of I, the peak scaling.
Definition: fitMoffat.hpp:401
void setFixed(bool I0, bool I, bool x0, bool alpha, bool beta)
Set whether each parameter is fixed.
Definition: fitMoffat.hpp:336
Class to manage fitting a 2D Moffat to data via the levmarInterface.
Definition: fitMoffat.hpp:464
realT y0()
Get the center y-coordinate.
Definition: fitMoffat.hpp:568
void setFixed(bool I0, bool I, bool x0, bool y0, bool alpha, bool beta)
Set whether each parameter is fixed.
Definition: fitMoffat.hpp:494
void setArray(realT *data, int nx, int ny)
Set the data aray.
Definition: fitMoffat.hpp:524
realT I()
Get the current value of I, the peak scaling.
Definition: fitMoffat.hpp:550
realT I0()
Get the current value of I0, the constant.
Definition: fitMoffat.hpp:541
realT beta()
Return the shape parameter.
Definition: fitMoffat.hpp:586
realT x0()
Get the center x-.
Definition: fitMoffat.hpp:559
void setGuess(realT I0, realT I, realT x0, realT y0, realT alpha, realT beta)
Set the initial guess for a symmetric Moffat.
Definition: fitMoffat.hpp:507
realT fwhm()
Return the full-width at half maximum.
Definition: fitMoffat.hpp:595
realT alpha()
Return the width parameter.
Definition: fitMoffat.hpp:577
A templatized interface to the levmar package.
void allocate_params()
Allocate parameters array based on previous call to nParams.
void * adata
Pointer to possibly additional data, passed uninterpreted to func & jacf.
realT moffatFWHM(realT alpha, realT beta)
Compute the full-width at half-maximum of a Moffat profile.
Definition: moffat.hpp:161
A c++ interface to the templatized levmar minimization routines..
The mxlib c++ namespace.
Definition: mxError.hpp:107
Wrapper for a native array to pass to levmarInterface, with Moffat details.
Definition: fitMoffat.hpp:47
realT * data
Pointer to the array of y values.
Definition: fitMoffat.hpp:48
void setFixed(bool I0, bool I, bool x0, bool alpha, bool beta)
Set whether each parameter is fixed.
Definition: fitMoffat.hpp:69
size_t nx
X dimension of the array.
Definition: fitMoffat.hpp:50
realT * coords
Pointer to the array of x values (optional)
Definition: fitMoffat.hpp:49
Wrapper for a native array to pass to levmarInterface, with Moffat details.
Definition: fitMoffat.hpp:609
void setFixed(bool I0, bool I, bool x0, bool y0, bool alpha, bool beta)
Set whether each parameter is fixed.
Definition: fitMoffat.hpp:633
size_t nx
X dimension of the array.
Definition: fitMoffat.hpp:611
size_t ny
Y dimension of the array.
Definition: fitMoffat.hpp:612
realT * data
Pointer to the array.
Definition: fitMoffat.hpp:610
levmarInterface fitter structure for the 1D Moffat.
Definition: fitMoffat.hpp:257
levmarInterface fitter structure for the symmetric Moffat.
Definition: fitMoffat.hpp:836