a
    5ghò9  ã                
   @   sÞ   d Z ddlmZmZ ddlZddlZddlmZm	Z	m
Z
 ddlmZ z0ddlmZmZmZ ddlmZ dd	lmZ W n4 ey¨ Z ze jd
7  _‚ W Y dZ[n
dZ[0 0 de	e
d eee	f eedœdd„Zedd„ ƒZdS )z)Interactive fitting widget using PySide6.é   )Ú_widget_guess_initial_stepÚ_make_finiteé    N)ÚDictÚAnyÚCallable)Úcontextmanager)ÚQtCoreÚQtGuiÚ	QtWidgets)ÚFigureCanvasQTAgg)Úpyplotz\

Please install PySide6, and matplotlib to enable interactive outside of Jupyter notebooks.T).N)ÚminuitÚplotÚkwargsÚraise_on_exceptionÚrun_event_loopc                    s–   ˆj dd… ‰ˆjdd… ‰G ‡fdd„dtjƒ‰ G ‡ ‡‡‡‡‡‡fdd„dtjƒ}|rŒtj ¡ }|du rtt g ¡}|ƒ }| ¡  | ¡  n|ƒ S dS )z Make interactive fitting widget.Nc                       sn   e Zd Z‡ fdd„Zdd„ Zdd„ Z‡fdd„Z‡fd	d
„Z‡fdd„Z‡fdd„Z	dd„ Z
ddd„Z‡  ZS )zmake_widget.<locals>.Parameterc                    s‚  t ƒ  d¡ || _|| _t | ¡}t |¡}| d¡ t ¡ | _t 	t
jjj¡| _| j d¡ | j tdƒ¡ t ¡ | _|j| \}}| j t|ƒttjƒ¡ t ¡ | _| j ttj ƒt|ƒ¡ t d¡| _| j d¡ | j |j| ¡ t d¡| _| j d¡ | j d¡ t  ¡ }| !|¡ | "|¡ | "| j¡ | "| j¡ | "| j¡ t  ¡ }	| !|	¡ |	 "| j¡ |	 "| j¡ |	 "| j¡ | j#|j$| |j| d	 d
| j%| j&  }
t'tt (|
¡ ƒd dƒ}| j )|
¡ | j *|¡ | j )|
¡ | j *|¡ | j t|j| d ƒ¡ | j t|j| d ƒ¡ | jj+ ,| j-¡ | jj. ,| j/¡ | jj+ ,| j0¡ | jj+ ,| j1¡ | jj. ,| j2¡ d S )NÚ é(   r   ç    „×—AZFixTÚFitF)Úlimitsgš™™™™™¹?é   r   )3ÚsuperÚ__init__ÚparÚcallbackr   ÚQVBoxLayoutZQLabelZsetMinimumWidthÚvalue_labelZQSliderr	   ZQtZOrientationZ
HorizontalÚsliderZ
setMinimumZ
setMaximumÚintZQDoubleSpinBoxÚtminr   ZsetRanger   ÚnpÚinfÚtmaxÚQPushButtonÚfixÚsetCheckableÚ
setCheckedÚfixedÚfitÚQHBoxLayoutÚ	addLayoutÚ	addWidgetÚresetÚvaluesÚvmaxÚvminÚmaxÚlog10ZsetSingleStepZsetDecimalsZvalueChangedÚconnectÚon_val_changedÚclickedÚon_fix_toggledÚon_min_changedÚon_max_changedÚon_fit_toggled)Úselfr   r   r   ZvlayoutÚlabelr1   r0   Zhlayout1Zhlayout2Z	step_sizeZdecimals©Ú	__class__© ú`/mounts/lovelace/software/anaconda3/envs/metaDMG/lib/python3.9/site-packages/iminuit/qtwidget.pyr   !   s\    








z'make_widget.<locals>.Parameter.__init__c                 S   s   | j |d | j| j    S ©Nr   )r1   r0   ©r;   Úvaluer?   r?   r@   Ú_int_to_floatV   s    z,make_widget.<locals>.Parameter._int_to_floatc                 S   s   t || j | j| j  d ƒS rA   )r    r1   r0   rB   r?   r?   r@   Ú_float_to_intY   s    z,make_widget.<locals>.Parameter._float_to_intc                    s2   |   |¡}| j |d›¡ |ˆ j| j< |  ¡  d S )Nú.3g)rD   r   ÚsetTextr/   r   r   )r;   Úval©r   r?   r@   r5   \   s    
z-make_widget.<locals>.Parameter.on_val_changedc                    sü   | j  ¡ }|| jkrPt| j ƒ | j  | j¡ W d   ƒ n1 sB0    Y  d S || _t| jƒh || jkr¦|| _|ˆ j| j	< | j d¡ | j
 | jd›¡ |  ¡  n| j |  | j¡¡ W d   ƒ n1 sÎ0    Y  ˆ j| j	 }||d fˆ j| j	< d S )Nr   rF   r   )r!   rC   r0   Ú_block_signalsÚsetValuer1   r   rH   r/   r   r   rG   r   rE   r   )r;   r!   ÚlimrI   r?   r@   r8   b   s     

,

2z-make_widget.<locals>.Parameter.on_min_changedc                    s  | j  ¡ }|| j ¡ krTt| j ƒ | j  | j¡ W d   ƒ n1 sF0    Y  d S || _t| jƒl || jk r®|| _|ˆ j| j	< | j t
dƒ¡ | j | jd›¡ |  ¡  n| j |  | j¡¡ W d   ƒ n1 sÖ0    Y  ˆ j| j	 }|d |fˆ j| j	< d S )Nr   rF   r   )r$   rC   r!   rJ   rK   r0   r   rH   r/   r   r    r   rG   r   rE   r   )r;   r$   rL   rI   r?   r@   r9   u   s     
,

2z-make_widget.<locals>.Parameter.on_max_changedc                    s,   | j  ¡ ˆ j| j< | j  ¡ r(| j d¡ d S ©NF)r&   Ú	isCheckedr)   r   r*   r(   ©r;   rI   r?   r@   r7   ˆ   s    
z-make_widget.<locals>.Parameter.on_fix_toggledc                 S   s6   | j  | j ¡  ¡ | j ¡ r*| j d¡ |  ¡  d S rM   )r   Z
setEnabledr*   rN   r&   r(   r   rO   r?   r?   r@   r:      s    
z-make_widget.<locals>.Parameter.on_fit_toggledNc                 S   s˜  |d urž|\}}t |||ƒ}t |¡r*|n
|d|  | _t |¡rF|n
|d|  | _t| j| jƒ, | j | j¡ | j | j¡ W d   ƒ n1 s”0    Y  || _	| j	| jk rò| j	| _t| jƒ | j | j¡ W d   ƒ n1 sæ0    Y  nP| j	| jkrB| j	| _t| jƒ | j | j¡ W d   ƒ n1 s80    Y  t| j
ƒ$ | j
 |  | j	¡¡ W d   ƒ n1 sx0    Y  | j | j	d›¡ d S )Néd   rF   )r   r"   Úisfiniter1   r0   rJ   r!   r$   rK   rH   r   rE   r   rG   )r;   rH   r   r1   r0   Ústepr?   r?   r@   r.   “   s(    ,..4z$make_widget.<locals>.Parameter.reset)N)Ú__name__Ú
__module__Ú__qualname__r   rD   rE   r5   r8   r9   r7   r:   r.   Ú__classcell__r?   rI   r=   r@   Ú	Parameter    s   5rW   c                       sŒ   e Zd Z‡ fdd„Zdd„ Zdd„ Z‡‡fdd„Z‡‡‡‡fd	d
„Z‡fdd„Zd‡fdd„	Z	d‡fdd„	Z
dd„ Z‡‡‡fdd„Z‡  ZS )zmake_widget.<locals>.Widgetc                    sò   t ƒ  ¡  t ¡ }| d¡ |  |¡ |  d¡ t | ¡}|  	¡ }|  
¡ }|  ¡ }tj| d| _| j d¡ | j tjjjtjjj¡ | j d¡ t ¡ }| |¡ | | j¡ t ¡ }| |¡ | |¡ | |¡ | |¡ | jddd d S )Né   Ziminuit©ÚparentTé–   F©Úfrom_fitÚreport_success)r   r   r
   ZQFontZsetPointSizeZsetFontZsetWindowTitler   r+   Úmake_plot_groupÚmake_button_groupÚmake_parameter_scroll_areaZ	QTextEditÚresults_textÚsetReadOnlyÚsetSizePolicyÚQSizePolicyÚPolicyÚMinimumExpandingZsetMaximumHeightr   r-   r,   Úplot_with_frame)r;   ZfontZhlayoutÚ
plot_groupÚbutton_groupZparameter_scroll_areaZvlayout_leftZvlayout_rightr=   r?   r@   r   ¬   s2    




þ




z$make_widget.<locals>.Widget.__init__c                 S   sb   t jd| d}| t jjjt jjj¡ t  |¡}t ¡ }t 	¡ }t
|ƒ| _|| j_| | j¡ |S )Nr   rY   )r   Ú	QGroupBoxrd   re   rf   rg   r   ÚpltZfigureZget_current_fig_managerr   ÚcanvasÚmanagerr-   )r;   ri   Zplot_layoutZfigrn   r?   r?   r@   r_   Î   s    þ

z+make_widget.<locals>.Widget.make_plot_groupc                    s4  t jdˆ d}| t jjjt jjj¡ t  |¡}t jd|dˆ _	ˆ j	 
d¡ ˆ j	j ‡ fdd„¡ | ˆ j	¡ t jd|dˆ _ˆ j d¡ ˆ j d¡ ˆ jj ˆ j¡ | ˆ j¡ t jd	|dˆ _ˆ j 
d
¡ ˆ jj ˆ j¡ | ˆ j¡ t j|dˆ _ˆ j d¡ ˆ j ¡  d¡ ˆ j g d¢¡ | ˆ j¡ |S )Nr   rY   r   z'background-color: #2196F3; color: whitec                      s   ˆ j ddS )NT©r   )Údo_fitr?   rO   r?   r@   Ú<lambda>å   ó    z?make_widget.<locals>.Widget.make_button_group.<locals>.<lambda>Z
ContinuousTZResetz'background-color: #F44336; color: white)ÚMigradÚScipyÚSimplex)r   rk   rd   re   rf   ÚMinimumZFixedr+   r%   Z
fit_buttonZsetStyleSheetr6   r4   r-   Úupdate_buttonr'   r(   Úon_update_button_clickedZreset_buttonÚon_reset_button_clickedZ	QComboBoxÚalgo_choiceZsetEditableZlineEditrc   ZaddItems)r;   rj   Zbutton_layoutr?   rO   r@   r`   Ü   s6    þ
ÿz-make_widget.<locals>.Widget.make_button_groupc                    s¼   t j| d}| dddd¡ | t jj¡ | d¡ | t jj	j
t jj	j
¡ t  |¡}t  |¡}| dddd¡ | |¡ g | _ˆjD ](}ˆ ˆ|| jƒ}| j |¡ | |¡ q†| ¡  |S )NrY   r   T)r   ZQScrollAreaZsetContentsMarginsZsetFrameShapeZQFrameZNoFrameZsetWidgetResizablerd   re   rf   rv   ÚQWidgetr   Z	setWidgetÚ
parametersÚon_parameter_changeÚappendr-   Z
addStretch)r;   Zpar_scroll_areaZscroll_area_contentsZparameter_layoutr   Z	parameter)rW   r   r?   r@   ra   ù   s&    
þ



z6make_widget.<locals>.Widget.make_parameter_scroll_areac                    s"  t  ¡ j}zXt ¡ < t  ¡  ¡ }ˆjˆfi ˆ ¤Ž t  ¡  |¡ W d   ƒ n1 sV0    Y  W nJ t	y¬   ˆrv‚ dd l
}t jdd|jdddddœdd	d
dd Y d S 0 |rºˆjjn
ˆ ˆj¡}t jddd|d›|dd |r|r| j ¡  | j dˆj ¡ › d¡ n
| j ¡  d S )Nr   g      à?éÿÿÿÿ)ÚlimitZ	monospacezx-small)ÚfamilyÚsizeÚcenterÚrÚwT)ZfontdictÚvaÚcolorZbackgroundcolorÚwrapgš™™™™™©?gÍÌÌÌÌÌð?zFCN = z.3fzx-large)Z	transformZfontsizez!<div style='text-align: center;'>z</div>)rl   ZgcaZ	transAxesÚwarningsÚcatch_warningsZgcfZget_size_inchesZ	visualizeZset_size_inchesÚ	ExceptionÚ	tracebackZfigtextÚ
format_excZfminÚfvalZ_fcnr/   Útextrb   ÚclearZsetHtmlZ_repr_html_)r;   r]   r^   ZtransZfig_sizerŒ   rŽ   )r   r   r   r   r?   r@   rh     sF    

0
ø

û
ÿz+make_widget.<locals>.Widget.plot_with_framec                    sT   | j  ¡ dkrˆ  ¡  n8| j  ¡ dkr0ˆ  ¡  n | j  ¡ dkrHˆ  ¡  ndsPJ ‚dS )Nrs   rt   ru   FT)rz   ZcurrentTextZmigradZscipyZsimplexrO   rI   r?   r@   r*   7  s    


zmake_widget.<locals>.Widget.fitFc                    s€   t dd„ | jD ƒƒr^ˆ jd d … }t| jƒD ]\}}|j ¡  ˆ j|< q,d}| jdd}|ˆ _t ¡  |  	||¡ | j
 ¡  d S )Nc                 s   s   | ]}|j  ¡ V  qd S ©N)r*   rN   )Ú.0Úxr?   r?   r@   Ú	<genexpr>C  rr   zBmake_widget.<locals>.Widget.on_parameter_change.<locals>.<genexpr>TFro   )Úanyr|   r)   Ú	enumerater*   rN   rp   rl   Zclfrh   rm   Z	draw_idle)r;   r]   r^   ZsavedÚir“   rI   r?   r@   r}   B  s    z/make_widget.<locals>.Widget.on_parameter_changeTc                    sH   |   ¡ }t| jƒD ]\}}|jˆ j| d q|s6|S | jd|d d S )N)rH   Tr\   )r*   r–   r|   r.   r/   r}   )r;   r   r^   r—   r“   rI   r?   r@   rp   O  s    z"make_widget.<locals>.Widget.do_fitc                 S   s"   | j D ]}|j | j ¡ ¡ qd S r‘   )r|   r   ZsetTrackingrw   rN   )r;   r“   r?   r?   r@   rx   W  s    
z4make_widget.<locals>.Widget.on_update_button_clickedc                    sL   ˆ   ¡  ˆˆ _ˆˆ _t| jƒD ] \}}|j ˆ j| ˆ| d q|  ¡  d S )N)rH   r   )r.   r/   r   r–   r|   r}   )r;   r—   r“   )r   Úoriginal_limitsÚoriginal_valuesr?   r@   ry   [  s    z3make_widget.<locals>.Widget.on_reset_button_clicked)FF)T)rS   rT   rU   r   r_   r`   ra   rh   r*   r}   rp   rx   ry   rV   r?   ©rW   r   r   r˜   r™   r   r   r=   r@   ÚWidget«   s   ")r›   )	r/   r   r   rk   r{   ZQApplicationÚinstanceÚshowÚexec)r   r   r   r   r   r›   ZappZwidgetr?   rš   r@   Úmake_widget   s     " 9


rŸ   c               
   g   sN   | D ]}|  d¡ qzd V  W | D ]}|  d¡ q"n| D ]}|  d¡ q80 d S )NTF)ZblockSignals)Zwidgetsr…   r?   r?   r@   rJ   o  s    ÿrJ   )T)Ú__doc__Úutilr   r   r‰   Únumpyr"   Útypingr   r   r   Ú
contextlibr   ZPySide6r	   r
   r   Z"matplotlib.backends.backend_qt5aggr   Z
matplotlibr   rl   ÚModuleNotFoundErrorÚeÚmsgÚstrÚboolrŸ   rJ   r?   r?   r?   r@   Ú<module>   s4   ÿ û
û  \