@@ -617,6 +617,31 @@ def model(x, A, sig1, sig2):
617
617
defaultPars = {"A" :1 , "sig1" :3 , "sig2" :5 }
618
618
sharedPars = ["sig1" , "sig2" ]
619
619
620
+ elif modelFlag == "Gaussian3D" :
621
+ def model (x , A , sig_x , sig_y , sig_z ):
622
+
623
+ y = x [:, np .newaxis , np .newaxis ]
624
+ n_steps = 50 # Low number of integration steps because otherwise too slow
625
+ theta = np .linspace (0 , np .pi / 2 , n_steps )[np .newaxis , :, np .newaxis ]
626
+ phi = np .linspace (0 , np .pi / 2 , n_steps )[np .newaxis , np .newaxis , :]
627
+
628
+
629
+ S2_inv = np .sin (theta )** 2 * np .cos (phi )** 2 / sig_x ** 2 \
630
+ + np .sin (theta )** 2 * np .sin (phi )** 2 / sig_y ** 2 \
631
+ + np .cos (theta )** 2 / sig_z ** 2
632
+
633
+ J = np .sin (theta ) / S2_inv * np .exp (- y ** 2 / 2 * S2_inv )
634
+
635
+ J = np .trapz (J , x = phi , axis = 2 )[:, :, np .newaxis ] # Keep shape
636
+ J = np .trapz (J , x = theta , axis = 1 )
637
+
638
+ J *= A * 2 / np .pi * 1 / np .sqrt (2 * np .pi ) * 1 / (sig_x * sig_y * sig_z ) # Normalisation
639
+ J = J .squeeze ()
640
+ return J
641
+
642
+ defaultPars = {"A" : 1 , "sig_x" : 5 , "sig_y" : 5 , "sig_z" : 5 }
643
+ sharedPars = ["sig_x" , "sig_y" , "sig_z" ]
644
+
620
645
else :
621
646
raise ValueError ("Fitting Model not recognized, available options: 'SINGLE_GAUSSIAN', 'GC_C4_C6', 'GC_C4'" )
622
647
@@ -1018,7 +1043,7 @@ def fitProfileMantidFit(yFitIC, wsYSpaceSym, wsRes):
1018
1043
*(1.+c6/384*(64*((x-x0)/sqrt(2)/sigma1)^6 - 480*((x-x0)/sqrt(2)/sigma1)^4 + 720*((x-x0)/sqrt(2)/sigma1)^2 - 120)),
1019
1044
y0=0, A=1,x0=0,sigma1=4.0,c6=0.0,ties=()
1020
1045
"""
1021
- elif (yFitIC .fitModel == "DOUBLE_WELL" ) | (yFitIC .fitModel == "ANSIO_GAUSSIAN" ):
1046
+ elif (yFitIC .fitModel == "DOUBLE_WELL" ) | (yFitIC .fitModel == "ANSIO_GAUSSIAN" ) | ( yFitIC . fitModel == "Gaussian3D" ) :
1022
1047
return
1023
1048
else :
1024
1049
raise ValueError ("fitmodel not recognized." )
0 commit comments