a
    öÁÉgÒ 
 ã                   @   s>  d Z ddlZddlmZmZmamZmZmam	Z	m
Z
mZ ddlZddlZddlZddlZddlZddlZddlZddlmZ ddlmZ ddlmZ ddlZddlZddlZ ddl!Z!ddl"m#Z# ddl$m%Z% ddl&m'Z' dd	l(m)Z) dd
l*m+Z+ ddl,m-Z- ddl.Z.dúdd„Z/dûdd„Z0düdd„Z1dýdd„Z2dd„ Z3dd „ Z4dþd!d"„Z5dÿd#d$„Z6d%d&„ Z7d'd(„ Z8d)d*„ Z9d+d,„ Z:d-d.„ Z;d/d0„ Z<d1d2„ Z=d3d4„ Z>d5d6„ Z?d7d8„ Z@d9d:„ ZAd;d<„ ZBd=d>„ ZCd?d@„ ZDdAdB„ ZEdCdD„ ZFdEdF„ ZGdGdH„ ZHdIdJ„ ZId dKdL„ZJddMdN„ZKdOdP„ ZLdQdR„ ZMdSdT„ ZNdUdV„ ZOdWdX„ ZPdYdZ„ ZQd[d\„ ZRd]d^„ ZSd_d`„ ZTdadb„ ZUdcdd„ ZVdedf„ ZWdgdh„ ZXdidj„ ZYdkdl„ ZZdmdn„ Z[dodp„ Z\dqdr„ Z]dsdt„ Z^dudv„ Z_dwdx„ Z`dydz„ Zadd}d~„Zbdd€d„Zcd‚dƒ„ Zdd„d…„ Zed†d‡„ Zfdˆd‰„ ZgdŠd‹„ ZhdŒd„ ZidŽd„ Zjdd‘„ Zkd’d“„ Zld”d•„ Zmd–d—„ Znd˜d™„ Zodšd›„ Zpdœd„ ZqdždŸ„ Zrd d¡„ Zsd¢d£„ Ztd¤d¥„ Zud¦d§„ Zvd¨d©„ Zwdªd©„ Zwdd«d¬„Zxd­d®„ Zyd¯d°„ Zzd±d²„ Z{dd´dµ„Z|dd¶d·„Z}d¸d¹„ Z~ddºd»„Zd¼d½„ Z€d¾d¿„ ZddÂdÃ„Z‚dÄdÅ„ Zƒd	dÆdÇ„Z„dÈdÉ„ Z…dÊdË„ Z†dÌdÍ„ Z‡dÎdÏ„ ZˆdÐdÑ„ Z‰dÒdÓ„ ZŠdÔdÕ„ Z‹dÖd×„ ZŒdØdÙ„ ZdÚdÛ„ ZŽdÜdÝ„ ZdÞdß„ Zd
dàdá„Z‘dâdã„ Z’dädå„ Z“dædç„ Z”dèdé„ Z•dêdë„ Z–dìdí„ Z—dîdï„ Z˜e ™dð¡Zšdñdò„ e›dóƒD ƒZœdôdò„ e›dódõƒD ƒZeœe aže Ÿedö¡PZ e¡d÷kre ¡ Z¢e˜ƒ  ej£ ¤dø¡ e¥dùe ¡ e¢  ƒ e ¦¡  W d  ƒ n1 s00    Y  dS (  a‡
  
Created on Thu Aug 26 01:27:03 2021

Initial analysis of Negar's data

NEXT STEPS


              
              
to do:
    IMPORTANT
    - Do 50% variance PCA?
        * Get a value for each mouse! For example, the average number of dimensions to get 50% (scatterplot of this stuff)
    - Get average and normalized errors of prediction (normalized as in "aligned/within session" and "misaligned/within session")
    - Asymmetrical analysis!!!
        * Re-create full trajectory by analyzing each independently?
    - Analysis in CCA space
    - Correlation across dimensions (see gallego paper). Is the correlation worse for the failed ones? How does it compare to non-aligned correlations?
    - Average PCA trajectories by distance (so every mouse gets a single trajectory)
        * Compare non-CCA with CCA aligned trajectories. Draw arrows rather than color-coded distances
    - Train predictor in CCA space   
    - Error by distance avearging full belt sections
    - Past neural activity analysis
    - Check that one session with fucked up results
    - Quantifications like in the paper

    LESS IMPORTANT
    - Progressive comparisons from day 1 onwards
        * Take into account actual between-session time! Some are a few hours, others are days
    - Across mouse comparison, same session
    - PPT math of CCA?
    - CCA rotation quantification
        *Check paper! They use correlations for each dimension (non-CCA vs CCA)
    - Add shuffle to CCA stuff above?



For weekend
- Error by position - average across rats
- Error by number of folds
- Best % components for Kalman & others
- VERY COOL IDEA: predict Airpuff using the same predictor code (so putting the airpuff vector instead of distance). Better for V-D?
- Do PCA with different rat with more trials
- LFADS
- Check out what CCA is, how to apply it
- Improve transfer code


- Test shit. Why is my PCA performance different? Which condition is better?
- LFADS on smoothed trials
- Cut short running periods from analysis (exlcude those from the "running" bool)
- Use cross validation based on trials
- Turn position to periodic measure
- Individual trajectory analysis. Why is the distance fucked up sometimes when I apply time bins?
- More efficient way of painting line trajectories, this sucks
- Fourier analysis. What is the gaussian filter doing?
- Pre-select neurons
- Will LFADS work now?
- Does distance coincide with AP as expected?
- Reproduce full figure S8
- rastermap (hhmi janelia campus, check for GUI) - Carsen Stinger
- Paint every rat point different for S8. Seems like the same animal is always performing better/worse
- Change the way "processing_functions" is imported. Maybe as "pf"?

é    N)	ÚFAT_CLUSTER_PATHÚCLUSTERID_PATHÚRESULTS_PATHÚOUTPUT_PATHÚTRACKED_FIBERS_PATHÚSESSION_NAMESÚSESSION_TIMESÚSESSION_REPEATSÚMAX_POS)Ú	Rectangle©ÚLine2D)Údecomposition)Úf1_score)ÚCCA©ÚLinearDiscriminantAnalysis)Ú
linregress)ÚpartialéÜ  Tc           ;   
   C   sz  d}d}d}d}	t  ¡ jd }
d}d}d}dd	g}d
}d}ttj||d}|jd |jd  }}t ||¡}|}|d|… }|d|… }||g}| |g}|}|dkrútj	| |||d|dd\}}}tj	||||d|dd\}}}t 
||g||g¡\}} nt 
||g| |g¡\}} | \}!}"|\}#}$|d }#|d }$|	r^t |¡}%t |¡}&|d }'|d }(n |d }%|d }&| d }'| d }(t |#|$|%|&|¡\})}*}+},t |%|&¡}-t |)|*¡}.t |%|+¡}/tj |,t |¡ d¡}0|%|&|+|'|(|#|$|-|.|/g|0dœ	}1|dkrdtt|ƒƒD ]œ}2||2 }3||2 dd…dd…f }4||4|3||
dd\}5}
|5jd|2d  |d d |2dkr~||4|3||
dd\}6}
n$||4|3||6dd |6jd|d d q||)dd…dd…f |'||
ddd\}5}
||*dd…dd…f |(||5ddd |5jd|d d ||+dd…dd…f |'||
ddd\}5}
||%dd…dd…f |'||5ddd |5jd|d d |
}7|
d }
t j|d|7d\}8}9|8 d| ¡ |9d  d¡ |9d   d!¡ t |¡D ]j}:|9|: j|d |:dd…f |d d"d d# |9|: j|d |:dd…f |d d"d  d# |9|:  ¡  q¶|9d  ¡  |8 ¡  |dkr|
}7|
d }
t j|d|7d\}8}9|8 d$| ¡ |9d  d¡ |9d  d!¡ t |¡D ]j}:|9|: j|d |:dd…f |d d"d d# |9|: j|d |:dd…f |d d"d  d# |9|:  ¡  q”|9d  ¡  |8 ¡  |
}7|
d }
t j|d|7d\}8}9|8 d%| ¡ |9d  d¡ |9d  d!¡ t |¡D ]b}:|9|: j|%|:dd…f |d d"d d# |9|: j|+|:dd…f |d d"d  d# |9|:  ¡  qh|9d  ¡  |8 ¡  |
}7|
d }
t jdd|7d\}8}9|8 d&¡ |9d  d¡ |9d  d!¡ |9d  d'¡ |9d j|d ddd…f |d d"d d# |9d j|d ddd…f |d d"d  d# |9d  d(¡ |9d j|d ddd…f |d d"d d# |9d j|d ddd…f |d d"d  d# |9d   d)¡ |9d  j|%ddd…f |d d"d d# |9d  j|+ddd…f |d d"d  d# |9d  ¡  |8 ¡  td*|||f ƒ |1S )+z2 Simplified pair CCA function. Aligns 2 against 1 Té–   Úpositioné   ©é	   é   é   r   Ú	royalblueÚ	indianredé<   é   ©ÚangleÚpca_distance_bin_sizer   NÚ	averaging©Úmax_posÚwarp_sampling_typeÚwarp_based_onÚreturn_flattenedÚfro)	Úpca1Úpca2Úprojection_to_1Úposition_test1Úposition_test2Ú
pca1_trainÚ
pca2_trainÚ
cca_arraysÚmatrix_distanceF©ÚcbarzPCA dataset %dé   ©ÚfontsizeúBoth PCAs together, unaligned©r5   r   ú#Spikes projected to canonical spaceú#Spikes projected to session 1 space©r   é   ©ÚfigsizeÚnumúKTemporal evolution of PCA components 1-%d, after cutting data and z-scoringú	PCA Unitsé   ÚTimeú
Dataset %d©ÚcolorÚlabelúFTemporal evolution of PCA components 1-%d after temporal normalizationú9Temporal evolution of PCA components 1-%d after alignmentú#PCA dimension 1 at different stagesÚOriginalúTemporal normalizationúCCA alignedú2PCA dimension is %d out of %d, CCA dimension is %d)ÚpltÚgcfÚnumberr   ÚpfÚplot_pca_and_averageÚshapeÚnpÚminimumÚwarpingÚ$trim_temporal_data_and_position_pairÚcopyÚperform_cca_projectionÚget_pearson_correlationÚlinalgÚnormÚeyeÚrangeÚlenÚsuptitleÚsubplotsÚ
set_ylabelÚ
set_xlabelÚarangeÚplotÚset_axis_offÚlegendÚtight_layoutÚ	set_titleÚprint);Ú	position1Ú	pca_data1Ú	position2Ú	pca_data2r&   rh   Úpre_train_warpingÚwarping_bin_numberr(   Úalign_unwarped_dataÚfig_numÚpca_figsizeÚfsÚtemporal_plot_num_subplotsÚtemporal_plot_color_listÚpca_view_angleÚpca_pos_bin_sizerU   Úneurons1Úneurons2Úmin_num_neuronsÚpca_dimÚinitial_pca_data_listÚinitial_position_listÚcca_dimÚposition1_warpedÚpca_data1_warpedÚsampling_warped1Úposition2_warpedÚpca_data2_warpedÚsampling_warped2Úcca_train_data_listÚcca_train_position_listÚcca_train_position1Úcca_train_position2Ú
cca_train1Ú
cca_train2Ú	cca_test1Ú	cca_test2Úcca_test_position1Úcca_test_position2Úcca_projection1Úcca_projection2Úcca_projection_to_1Úbackprojection_matrixÚcorr_unalignedÚcorr_canonicalÚcorr_alignedr3   Úcca_output_dictÚidxr   Úspikes_projectedÚfigÚfig_pca_jointÚtemporal_plot_fignumÚtemporal_plot_figÚtemporal_plot_axsÚdim© r£   úPD:\MPI_Brain\Codes\aversive_scripts_2025\aversive_scripts_2025\main_functions.pyÚcompute_pair_ccao   sî    ÿÿ



ý

($($,,
,,((
,,,,((r¥   r6   ÚWienerÚssec	           #   	   C   sÞ  d}	d}
t | ||||dd}ttj|d|	||
|d}|d }|d }|durÚ|durÚ|||ƒ\}}}tj|| dd|	|dd	\}}}||||d
\}}}||||d
\}}}|| }|| }|| }||d< ||d< ||d< |dkrÎt ¡ jd }d}d}d}tjdd||d\}}|d }t 	|j
¡} |d }!|!j| |ddd |!j| |dddd |!jd|d d|d  |
 }"|!jd|| |f |" |d |!jd|d |!jd |d | ¡  |d }!|!j| |ddd |!j| |dddd d|d  |
 }"|!jd!||f |" |d |!jd|d |!jd |d | ¡  |d" }!t 	t|ƒ¡} |!j| |ddd |!j| |dddd |!jd#|d d|d  |
 }"|!jd$||f |" |d |!jd|d |!jd |d | ¡  t|||ƒ |S )%zB Compute cca between a pca pair and do various measurements on it TF)r&   rh   )Ún_splitsÚshuffleÚperiodicÚpredictor_nameÚcrosscorr_alignÚcrosscorr_errorr-   r/   Nr   ©r¨   r©   rª   r«   Úpredictor_default)r¯   Ú
error_selfÚerror_unalignedÚerror_alignedr   r   é   ©r   r   r   r?   é   ç333333ã?©ÚsÚalphar   ©rH   r¹   r¸   úPosition (mm)r7   ú [optimal delay of %d]Ú
best_delayz#Self-prediction. Error is %.2f (%s)Úx©ÚaxisÚ	labelsizeÚyz(Unaligned prediction. Error is %.2f (%s)rD   ú"Time step (running, discontinuous)z&Aligned prediction. Error is %.2f (%s))r¥   r   rT   Úpredict_distance_CVrQ   rR   rS   rd   rW   rg   ÚsizeÚscatterre   rl   Útick_paramsrk   rb   rf   rm   )#rn   ro   rp   rq   Úcv_foldsr«   Ú
error_typer&   rh   rª   r¬   rš   Úpredict_distance_partialr•   Úposition2_projectedÚposition_predict_selfÚerror_dict_selfÚ_Úpredictor_self1Úposition_predict_unalignedÚerror_dict_unalignedÚposition_predict_alignedÚerror_dict_alignedr°   r±   r²   ru   rw   Úfs_ticksr@   r   ÚaxsÚ
time_stepsÚaxÚcrosscorr_align_messager£   r£   r¤   Ú!compute_pair_cca_and_measurements0  sr    ÿÿ
rÙ   úscaled spikesr   Fr   c           t      C   s2  d}| |g}t  | d |d ¡}| d }| d }|d }|d }d}d}d}d}d	d
g}d}d}ttj||d}g } g }!t|ƒD ].\}"}#t |#|¡\}$}%}&|  |$¡ |! |%¡ q€g }'|dkrÒtj| |!|d\} }!}(g })d}*t||f||fgƒD ]j\}"\}+},| |" }$|$j	d }-t
j|-d}.|. |$j¡ |.j}/t  |/¡}0t  |0dk¡}1|) |.¡ t  |*|1¡}*qît|ƒtt jfv rt|}2n:t|ƒtt jfv r–t|| ƒ}2n|dkr¦|*}2ntdƒ‚|2}3t  |2d|¡}2t  |3d|2¡}3|2}3td|2|3ƒ t||f||fgƒD ]„\}"\}+},| |" }$|)|" }.tj|$|.dd}4tj|$|.|2d}5t |5¡\}5}6}6|dkrjtj|!|" |5|d\}%}5}6|%|!|"< |' |5¡ qò|dkr´tj|'d |!d |'d |!d d|d|d\}7}8}9nt |'|!¡\}8}9|dkrt  |'d ¡t  |'d ¡g}:t  |!d ¡t  |!d ¡g};n8t  |8d ¡t  |8d ¡g}:t  |9d ¡t  |9d ¡g};|du rx|8d }<|8d }=t  |:d ¡}>t  |:d ¡}?n˜|8d }<|8d }=t  |:d ¡}>t  |:d ¡}?|\}@}A|9d }Bt   |@|Bk |B|Ak ¡}Ct  |<¡dd…|Cf }<|9d }Dt   |@|Dk |D|Ak ¡}Ct  |=¡dd…|Cf }=t !|<|=|>|?|3¡\}E}F}G}Ht "|>|?¡}It "|E|F¡}Jt "|>|G¡}Kt j# $|Ht  %|3¡ d¡}Lg }Mt&t'|:ƒƒD ]j}"|:|" }N|;|" }%tj(|N|%|d||d||
d	\}O}P}6|M |O¡ |"dkrvtj(|N|%dd||dd\}Q}6}Rqv|;d |;d  }B}D|R}S|:d }Ttj(|T|D|d|||S||
d	\}U}V}6|G}Wtj(|W|D|d|||S||
d	\}X}Y}S|V|
 }Z|Y|
 }[|P|
 }\|:d dd…dd…f }]|;d }^|:d dd…dd…f }_|;d }`|Gdd…dd…f }a|^| }^|`| }`tj)|]|^|_|`|d\}b}6}6}c}dtj)|]|^|a|`|d\}b}6}6}e}f|P|V|Yg|I|J|Kg|>|?|G|B|D|L|c|d|e|fdœ}g|dkrút&t'|:ƒƒD ]ø}"|:|" }N|;|" }%|M|" }O|Ndd…dd…f }4||g|" },||4|%||	|d\}h}	|hj*d |"d  |d! d" |"dkrÐ||4|%||	dd\}i}	n$||4|%||i|d |ij*d#|d! d" d$}d}t+j,|	|d%}h|	d7 }	t  -|%j.¡}jt+ /¡ }k|kj0|j|%d&d'd( |kj0|j|Od
dd&d) |kj1d*|d" |kj2d+|d" |kj3d,t4|, |+|P|
 |
f |d" |h 5¡  |"dkræ|	}l|	d }	t+j6|d-|ld.\}m}n|m *d/| ¡ |nd  1d0¡ |nd  2d1¡ t  -|¡D ]2}o|n|o j7|4|odd…f ||" d2|"d  d3 qð|nd  8¡  |m 5¡  q@||Edd…dd…f |B||	ddd4\}h}	||Fdd…dd…f |D||h|dd4 |hj*d5|d! d" ||Gdd…dd…f |D||	ddd4\}h}	||>dd…dd…f |B||h|dd4 |hj*d6|d! d" d}d7}pd8}t+j6dd||	d.\}h}q|	d }	t  -|Dj.¡}j|qd }k|Md }r|kj0|j|Dd&d'd( |kj0|j|rd
dd&d) |kj1d*|d" d9|Pd:  | }s|kj3d;t4|, |+|P|
 |
f |s |d" |kj9d<|pd= |kj9d>|pd= |h 5¡  |qd }k|kj0|j|Dd&d'd( |kj0|j|Ud
dd&d) d9|Vd:  | }s|kj3d?t4|, |+t4| |Z|
f |s |d" |kj9d<|pd= |kj9d>|pd= |h 5¡  |qd }k|kj0|j|%d&d'd( |kj0|j|Xd
dd&d) |kj2d+|d" d9|Yd:  | }s|kj3d@t4|, |+t4| |[|
f |s |d" |kj9d<|pd= |kj9d>|pd= |h 5¡  |	}l|	d }	t+j6|d-|ld.\}m}n|m *dA| ¡ |nd  1d0¡ |nd  2d1¡ t  -|¡D ]j}o|n|o j7|'d |odd…f |d d2d d3 |n|o j7|'d |odd…f |d d2d d3 |n|o  :¡  qB|nd  8¡  |m 5¡  |dkr |	}l|	d }	t+j6|d-|ld.\}m}n|m *dB| ¡ |nd  1d0¡ |nd  2d1¡ t  -|¡D ]j}o|n|o j7|8d |odd…f |d d2d d3 |n|o j7|8d |odd…f |d d2d d3 |n|o  :¡  q |nd  8¡  |m 5¡  |	}l|	d }	t+j6|d-|ld.\}m}n|m *dC| ¡ |nd  1d0¡ |nd  2d1¡ t  -|¡D ]b}o|n|o j7|>|odd…f |d d2d d3 |n|o j7|G|odd…f |d d2d d3 |n|o  :¡  qô|nd  8¡  |m 5¡  |dkrú|	}l|	d }	t+j6dd-|ld.\}m}n|m *dD¡ |nd  1d0¡ |nd  2d1¡ |nd  3dE¡ |nd j7|'d ddd…f |d d2d d3 |nd j7|'d ddd…f |d d2d d3 |nd  3dF¡ |nd j7|8d ddd…f |d d2d d3 |nd j7|8d ddd…f |d d2d d3 |nd  3dG¡ |nd j7|>ddd…f |d d2d d3 |nd j7|Gddd…f |d d2d d3 |nd  8¡  |m 5¡  tdH|2||3f ƒ tdI|t4| |t4| |\|[|Zf ƒ |gS )Jaœ   Perform CCA comparison analysis between analysis 1 and 2 (each data_dict)
        trim_data: if "True", the dataset with most timepoints is cut down so it's equal to the other one
        n_comp: if "int", the PCA projection will take that number of dimensions for the PCA projection
                if "float", the PCA projection will take that *proportion* of dimensions for the session that has the least.
                    e.g.: n_comp=0.5, num_neurons1 = 50, num_neurons2 = 40 -- The PCA dimension will be set to 20
        error_type: string for the "error_dict" dictionary
        temporal_normalization: if True, the data is normalized wrt to the distance, such that at every time distance both datasets are roughly at the same position. Neuronal data is stretched/compressed accordingly.
        predict_on_normalized_data: if False, distance prediction is done on the data transformed for CCA (which has been trimmed and, if specified, temporally normalized)
        cca_distance_limits: if not None, must be a two element array with the lowest and highest distance values to consider when aligning through CCA
                            used to break periodicity
        crosscorr_align: if True, the error for the unaligned and aligned predictors is calculated after rotating the 
                        prediction until optimal error is achieved
        pos_max: maximum value of distance (assumes it is periodic)
    TÚnum_neuronsÚ	mouse_numÚsession_numr   r   Fr   r   r   r   r    r!   ©Úpos_maxr   ©Ún_componentsç      à?ÚhalfzInvalid 'n_comp' typerD   Údims©Úpca_instanceÚnum_componentsr   )Úspline_orderrß   rh   Úbasic_normalizationNr*   ©r¨   r©   rª   r«   r¯   r¬   r­   r®   ©r{   )Úerror_dictsr2   r+   r,   r-   Ú	distance1Ú	distance2r3   ÚPCA_distance_unalignedÚPCA_distance_unaligned_avgÚPCA_distance_alignedÚPCA_distance_aligned_avgr4   zPCA session %dr6   r7   r9   é   ©r@   rµ   r¶   r·   rº   r»   rÃ   ú9Session %s, Mouse %d, self-prediction. Error is %.1f (%s)r=   r?   z)Temporal evolution of PCA components 1-%drC   rE   rF   rG   r:   r;   r<   r³   r´   r¼   r½   z9Session %s, Mouse %d, self-prediction. Error is %.2f (%s)r¾   r¿   rÂ   z?Session %s, Mouse %d, raw predictor from %s. Error is %.2f (%s)zESession %s, Mouse %d, predictor from %s after CCA. Error is %.2f (%s)rB   rJ   rK   rL   rM   rN   rO   rP   zeAligning (M%d, S%s) with (M%d, %s) // self error = %.2f, aligned error = %.2f, unaligned error = %.2f);rW   rX   r   rT   rU   Ú	enumerateÚget_data_from_datadictÚappendÚtrim_data_by_roundsrV   r   ÚPCAÚfitÚTÚexplained_variance_ratio_ÚcumsumÚargmaxÚmaximumÚtypeÚintÚint32ÚfloatÚfloat64Ú
ValueErrorÚcliprm   Úproject_spikes_PCAÚnormalize_dataÚ$compute_velocity_and_eliminate_zerosÚtemporal_data_normalizationÚ$trim_temporal_data_and_distance_pairr[   Úbitwise_andr\   r]   r^   r_   r`   ra   rb   rÄ   Ú$compute_pca_distance_after_averagingrc   rQ   Úfigurerg   rÅ   ÚgcarÆ   re   rf   rl   r   rk   rd   rh   rj   rÇ   ri   )tÚ
data_dict1Ú
data_dict2Ú	data_usedÚn_comprÈ   r«   Ú	trim_dataÚeliminate_zero_vrh   ru   rÉ   Útemporal_normalizationré   Úpredict_on_original_dataÚcca_distance_limitsr¬   rß   rª   Údata_dict_listr~   Ú
mouse_num1Úsession_num1Ú
mouse_num2Úsession_num2r@   rw   Úpca_cbarrx   ry   rz   r{   rU   Úpca_input_listÚdistance_listr›   Ú	data_dictÚpca_input_dataÚdistanceÚtimesÚpca_output_data_listÚoverround_listÚpca_object_listÚdim_for_50_maxrÜ   rÝ   rÛ   ÚpcaÚvariance_explainedÚvariance_explained_cumÚ
dim_for_50r   r‚   rœ   Úpca_output_datarÎ   Útimes_equidistantr‰   Úcca_train_distance_listÚpredictor_input_data_listÚpredictor_distance_listr   rŽ   r   r   ÚdminÚdmaxrí   Ú	dlim_boolrî   r“   r”   r•   r–   r—   r˜   r™   r3   Údistance_pred_self_listÚpredictor_input_dataÚdistance_predrÍ   Údistance_pred_fullÚpredictor_self_1Ú	predictorÚpredictor_input_unaligned_dataÚdistance_pred_transfer_rawÚerror_dict_rawÚpredictor_input_aligned_dataÚdistance_pred_transferÚerror_dict_ccaÚ	error_rawÚ	error_ccar°   r+   rn   r,   rp   Úpca2_projectionÚposition_binsÚunaligned_diffÚunaligned_diff_avgÚaligned_diffÚaligned_diff_avgrš   r   rž   rÖ   r×   rŸ   r    r¡   r¢   rÔ   rÕ   Údistance2_pred_selfrØ   r£   r£   r¤   Úperform_cca_analysis”  s
   
# 



 

ý

þ

ÿýý  ú	

"
0($($&((,,
,,((

,,,,((-"rK  c                 C   s€   g }t | |f||fgƒD ]2\}\}}tjt||||||d|d	}| |¡ qt|d |d |||	|
||||||||||d}|S )z± Convenience function with a lot on ugly amount of parameters
        Idea is that you give it a mouse pair, a session pair, and all the parameters and you do the CCA thing
    T)Útrim_data_selectionÚonly_runningÚeliminate_v_zerosr   r   ©r  r  rÈ   r«   r  r  rh   ru   rÉ   r  ré   r  r  r¬   )rö   rT   Úread_and_preprocess_dataÚfat_clusterrø   rK  )Úm1Ús1Úm2Ús2Úgaussian_sizeÚtime_bin_sizeÚdistance_bin_sizer  r  Úcross_validation_foldsr«   rL  r  r  rh   ru   rÉ   r  ré   r  r  r¬   r  r›   rÜ   rÝ   r"  Úoutputr£   r£   r¤   Úperform_single_CCA_comparisonº  s    	 ÿýr[  c                  C   s†   d} | }d}d}d}d}d}d}d}d}	d	}
d
}d}d}d}d}d}d}d}d}t | |||||||
|||	||d|||||||d}dS )u…   We predict position in session_num2 from session_num1 by converting the session2 neuronal data to the space of session1 through CCA
        Note: M4, s1-s2 has very few PCA differences
              M5, s2-s3 has basically a 180Âº rotated PCA
              M2, s1-s2 ends in a "rotated" shape that fails to get distance differences
              M2, s2-s3 "replay" with kalman filter (probably not real)
              
              M6, s2-s3 has a good CCA rotation thing (also weird r2 values, use as example)
              
              ### CCA error fixes ###
              M4, s2-3 improves
              M5, s1-2 slightly improves... but unaligned prediction worsens massively!!!! WTF is going on here??
              
              ### Temporal normalization ###
              M7, s2-7 is the worst
              M7, S0-4 gives a strange, awful result
              
              

    
    r6   rD   r   r   é   FTr¦   Ú
amplitudesr§   N©
r  r  rh   ru   rÉ   r  ré   r  r  r¬   )r[  )r  r  r  r  rW  rX  rV  r  r  r«   r  rÉ   r  ré   r  r¬   r  rY  r  ru   rZ  r£   r£   r¤   ÚCCA_analysis_singleÒ  s4    
ür_  c                 C   s$   ||  ||   }|||  | }|S )z£ Maps number "num" from [amin, amax] to [bmin, bmax]. Note that "a" can be outside this interval
        All must be ints except "num_a", which could be array
    r£   )ÚaminÚamaxÚbminÚbmaxÚnum_aÚnum_normÚnum_br£   r£   r¤   Ú	map_range  s    rg  c                 C   s\  t t | ¡ƒ}| D ]:}|t ¡ v r||ft| v sB||ft| v r| |¡ q|} t| ƒ}t d|f¡}t| ƒD ]æ\}}| }}t	|||||||||||	d|
|||||||d}|d \}}}||
 }||
 }||
 }||d|f< ||d|f< ||d|f< t
||dd|ƒ}t |dtj¡}||d|f< || |d	|f< || |d
|f< || |d|f< qp|S ©a8   Convenience function with an ugly amount of parameters.
        Given a pair of sessions, perform CCA prediction on the second wrt to the first one, and return errors
        
        error_type: string for the error_dict dictionary, see "predict_distance_CV" for the options
        
        Returns error array, which has shape 5 X num_animals. 
        First three rows are the average error of the prediction, rest are added measures
              0: prediction on s2 PCA directly using s1 predictor
              1: prediction on s2 backtransformed PCA through CCA, using s1 predictor
              2: prediction on s2 from itself (using cross-validation)
              3: normalized CCA error compared to self (lower limit) and raw (upper limit). 0 is same error as self, 1 same error as raw, >1 bigger than raw (magnitude relative to raw-self diff)
              4: difference between CCA error and raw error (if positive, CCA error > Raw)
              5: e_raw normalized by e_self (so e_raw/e_self)
              6: e_cca normalized by e_self (so e_cca/e_self)
        é   F©	rh   rÉ   r  r  r  ré   r  r  r¬   rì   r   r   rD   r   rµ   r6   r>   )ÚlistrW   r[   r	   ÚkeysÚremoverb   Úemptyrö   r[  rg  r  Úinf)Ú
mouse_listrS  rU  rV  rW  rX  r  r  rY  r«   rÉ   r  r  r  ré   r  r  r¬   Úmouse_list_copyÚmnumÚmouse_totalÚerror_arrayr›   rÜ   r  r  rZ  Úe_selfÚe_rawÚe_ccaÚerror_diff_normr£   r£   r¤   Ú*perform_CCA_mouse_average_for_session_pair  s8     
üry  c                 C   s
  t | ƒ}t d|f¡}t| ƒD ]æ\}}| }}t|||||||||||	d|
|||||||d}|d \}}}||
 }||
 }||
 }||d|f< ||d|f< ||d|f< t||dd|ƒ}t |dtj¡}||d|f< || |d	|f< || |d
|f< || |d|f< q|S rh  )rb   rW   rn  rö   r[  rg  r  ro  )Úsession_listrR  rT  rV  rW  rX  r  r  rY  r«   rÉ   r  r  r  ré   r  r  r¬   Úsession_totalrt  r›   rÝ   Úsnum1Úsnum2rZ  ru  rv  rw  rx  r£   r£   r¤   Ú(perform_CCA_mouse_average_for_mouse_pair`  s,    
ür~  c            C         s¢  ddg‰
t  d¡‰
g d¢} d}d}d}d}d}d}d	}d
‰d}d}	d}
d}d}d}d}g d¢}d}d‰d‰dddddœ‰g d¢‰g d¢‰d}d}|dkr¸ddg‰ddg‰‡‡fdd„}n$|dkrÜddg‰d d!g‰‡
fd"d„}t  d#¡}‡‡‡‡‡‡‡fd$d%„}| D ]H}|\}}tˆ
|||||||||ˆ||||	|
||d&}t  ||f¡}q|||||ƒˆ| ƒ\}}t |¡ |d7 }t ¡ }d}t  d't j	|dd…dd…f dd(d ¡}t j
|dd…dd…f dd(d }t  ||t|| d) ƒ¡}t  |||¡}g d*¢}g d+¢}d'} tdƒD ]D}!||! }"|j|"|d,||! ||! dd-\}#}$}%t  t  
|#¡| ¡} q| d }&tdƒD ]H}!||! }"tjt  |"¡|&t  |"¡t  t|"ƒ¡ d.dddd)||! d/	 qhd0D ]¨}!||! }'|d }(tjj|'|(ddd1d2\})}*tt  |*¡|ƒ}+t  |'¡},t  |(¡}-|&d, |!d)  }.|.}/|j|,|-g|.|.gd3d)d4d5 |j|-|, d) d |.d6 |+ˆd7d8 q¶|jˆd9 | d'|&d g¡ |jd:d;d9 |jd<d;d9 |jd=d>ˆd? |j t! "| t#¡ˆd d9 t $¡  t |¡}0|d7 }t ¡ }d}t  d't j	|dd@…dd…f dd(d ¡}t j
|dd@…dd…f dd(d }t  ||d¡}|j|d |d,dAddd- |j|d |d,dBddd- | ¡  |jd:ˆd9 |jdCˆd9 |jd=d>ˆd? |j t! "| t#¡ˆd d9 t $¡  tj|ˆdD}0|d7 }t ¡ }|ddd…f }1|ddd…f }2t j%|1t j& t j&dE}1t j%|2t j& t j&dE}2|1|2k  't¡}3ddg‰ dFdGg‰	‡ fdHdI„|3D ƒ}4‡	fdJdI„|3D ƒ}5|j(|1|2dK|4|5dL |jdMd;d9 |jdNd;d9 |jd=d>ˆd? |j t! "| t#¡ˆd d9 | )d't  
|1¡d g¡ | *¡ \}6}7| +¡ \}8}&t  ,|6|8¡}9t  |7|&¡}:t  |9|:¡};|j|;|;dOdPd4ddQ t  |9|:¡}<|j|<dgt|<ƒ dOdRd4ddQ t  |9|:¡}=|jdgt|=ƒ |=dOdRd4ddQ t $¡  dS )VzË We predict position in session_num2 from session_num1 by converting the session2 neuronal data to the space of session1 through CCA
        For the same session pair, compare error across mice
    
    r   r>   é   ©©r   rD   ©rD   r   )r   r>   ©r>   ri  )rD   ri  r\  FTÚKalmanr]  r§   Nr6   r   ©çš™™™™™©?g{®Gázt?çü©ñÒMb@?©r>   r>   r   ú
abs. errorÚSSEústd of errorÚR2©Údiff_avgr§   Údiff_stdÚr2©ÚRawr   Úself©ÚgreenÚ
lightgreenÚmediumspringgreenúanimal typeÚimprovementr   r   ÚImprovedÚWorsenedc                    sJ   ˆdkr(‡‡ fdd„t ˆ jd ƒD ƒ}n‡‡ fdd„t ˆ jd ƒD ƒ}|S )Nr  c                    s.   g | ]&}ˆ ˆd |f ˆd|f k  t¡ ‘qS ©r   r   ©Úastyper  ©Ú.0Úcol©Úcolor_legendrt  r£   r¤   Ú
<listcomp>ß  ó    úWCCA_analysis_session_pair_average.<locals>.get_color_list_by_column.<locals>.<listcomp>r   c                    s.   g | ]&}ˆ ˆd |f ˆd|f k   t¡ ‘qS rœ  r  rŸ  r¢  r£   r¤   r¤  á  r¥  ©ra   rV   ©rt  Úcolor_list_by_column©r£  rÉ   ©rt  r¤   Úget_color_list_by_columnÝ  s     zCCCA_analysis_session_pair_average.<locals>.get_color_list_by_columnúV-DúD-Dc                    s    ‡ fdd„t | jd ƒD ƒ}|S )Nc                    s    g | ]}t ˆ |tˆ ƒ   ‘qS r£   ©Úmouse_colorsrb   rŸ  ©rp  r£   r¤   r¤  ê  r¥  r¦  r   r§  r¨  r±  r£   r¤   r¬  è  s    ©ri  r   c              
      sB  t j|ˆd |d7 }t  ¡ }|jt |t¡ˆd |jdˆˆ  ˆd |jdˆd t	 
d¡}ˆ}| |¡ |j|ˆd tˆƒD ]b\}}	| | }
t	 |
¡}t	 |
¡}|}|j|||ddˆ| dd	 |j|gt|
ƒ |
d
ddd q†d}t| jd ƒD ]*}|j|| dd…|f d|| |dd qütdgdgtdƒd|dtdgdgtdƒd|dg}| |ˆ ¡ dD ]Ê}d}t  |¡ |d7 }t  ¡ }| |dd…f }t j|gt|ƒ |ddd|d t	 |¡}d}t	 || || ¡}|j||gt|ƒ ddddd | d|d g¡ | ¡ \}}t	 ||¡}|dkr<d}n|dkrJd}|j||gt|ƒ ddddd |dkr„|jdˆd n|jdˆd |jd d!ˆd" | g ¡ |jt |t¡ˆd tdgdgtdƒd|dtdgdgtdƒd|dg}tdgdgd#|d d$d%tdgdgd#|d d$d%g}| |ˆ ¡ ql||fS )&á¦   Makes a barplot of a given error array
            General plot so it can be used on either single session data or multiple session one
        
            error_array: at least 3 rows, and N columns
            color_list_by_column: must be precalculated, array of size N with the colors for each error_array_column
            color_labels: array of size 2, must have the two types of colors used
            
        rô   r   r7   úAvg. %s (cm)ÚSessionr   çffffffæ?Únone©ÚyerrÚwidthÚzorderrH   Ú	edgecoloré   rD   Údimgray©r¸   r»  rH   ç333333ë?NÚ-©rH   r¹   Úlwr   ç333333Ó?rµ   ©rH   rÃ  r¹   ©r   rµ   é7   ç®Gáz®ï?Úblack©r¸   r¹   r¼  rH   çš™™™™™¹?ú--ÚgrayúNormalized error difference úError difference ÚbothÚmajor©rÀ   ÚwhichrÁ   Úoé
   ©ÚmarkerrH   Ú
markersize)rQ   r  r  rl   rT   Ú%create_cumulative_session_pair_stringr   re   rf   rW   rg   Ú
set_xticksÚset_xticklabelsrö   ÚmeanÚstdÚbarrÆ   rb   ra   rV   rh   r   Úcmaprj   ÚlinspaceÚset_xlimÚget_xlimrÇ   ©rt  ru   r©  r£  Úsession_pair_listÚax1Úbar_positionsÚ
tick_namesÚcondition_idxÚcondÚe_listÚe_avgÚe_stdÚposr¹   r›   Úcustom_linesÚerror_array_rowr×   rx  Úavgrº  Úavgl_xÚxminÚxmaxÚ	oneline_xÚline_atÚcustom_dots)Úcolor_labelsÚcondition_colorsÚcondition_namesÚerror_names_dictrÉ   r@   rw   r£   r¤   Úbarplot_error_arrayî  sn    




 (ÿ
 
 

 

ÿÿz>CCA_analysis_session_pair_average.<locals>.barplot_error_array)r  r  r  ré   r  r  r¬   r   ©rÀ   rD   ©Ú
MisalignedÚAlignedÚSelf©r   r   Úforestgreenrâ   ©Úbinsr¹   rI   rH   ÚdensityrÔ  ©ÚxerrÚfmtrØ  ÚmarkeredgewidthÚ
elinewidthr»  rH   ©r   rD   ú	two-sided©Ú	equal_varÚpermutationsÚalternativeÚkr¶  ©rÃ  r¹   çš™™™™™É?Úitalic©r8   Ústyler7   ÚCountr    ú
Error (cm)rÐ  rÑ  rÒ  ri  rþ  rÿ  úNormalized errorrô   ©Úa_minÚa_maxúCCA worsensúCCA improvesc                    s   g | ]}ˆ | ‘qS r£   r£   ©r   Úb©Úcolor_bool_listr£   r¤   r¤  °  r¥  z5CCA_analysis_session_pair_average.<locals>.<listcomp>c                    s   g | ]}ˆ | ‘qS r£   r£   r  ©Úlabels_bool_listr£   r¤   r¤  ±  r¥  rÇ  ©r¸   rH   rI   ú&Misaligned normalized prediction errorú#Aligned normalized prediction errorrÌ  rÉ  rÂ  rÍ  rÕ  úCount (norm)ú+Misaligned normalized prediction error (cm)).rW   rg   Úzerosry  ÚhstackrQ   r  r  r   ÚminÚmaxrà  r  ra   ÚhistÚerrorbarÚaveragerÝ  Úsqrtrb   ÚscipyÚstatsÚ	ttest_indÚget_significance_labelÚabsrh   Útextrj   Úset_ylimre   rf   rÇ   rl   rT   rÙ  r   rk   r  ro  rž  rÆ   rá  râ  Úget_ylimrX   Úinvert)Crä  rW  rX  rV  r  r  r«   r  r  ré   r  r¬   r  rY  r  Úpval_thresholdsru   Úcolor_code_byr¬  Úerror_array_cumrû  Úsession_pairr  r  rt  r×   Únum_binsÚbin_minÚbin_maxÚbin_listÚ
cca_labelsÚ
cca_colorsÚhistmaxÚiÚsamplesÚnr  rÎ   ÚymaxrS  rU  ÚtstatÚpvalÚ
pval_labelÚx0Úx1Úy0Úy1r   r¾   rÂ   Ú
color_boolrH   rI   rò  ró  ÚyminÚlminÚlmaxÚonelinerô  Ú	oneline_yÚmisaligned_eÚ	aligned_eÚimproved_boolÚmisaligned_e_improvedÚmisaligned_e_worsenedr£   )r"  r÷  r£  rø  rù  rú  rÉ   r@   rw   r$  rp  r¤   Ú!CCA_analysis_session_pair_averagež  s   	

_û*"$>(*"                   r\  c            ^         s”	  g d¢‰
g d¢‰
dd„ t dƒD ƒ‰
t d¡‰tˆ
ƒ‰tˆƒ‰d} d}d}d	}d
}d}d}d}d‰d}d}	d}
d
}d}d}d}d}d	}t| | ƒ‰tj||| d\}}t |¡}t |¡| }t |¡| }t|ƒ‰g d¢}d}d‰d‰dddddœ‰g d¢‰g d¢‰d}d}|dkr6dd g‰d!d"g‰‡‡fd#d$„}n&|dkr\dd g‰d%d&g‰‡fd'd$„}t 	d(¡}t 	ˆˆdˆf¡‰t
ˆ
ƒD ]\}}|\}}tˆƒ‰t d)ˆf¡}t
ˆƒD ]Ä\}}| } }!t|| ||!|||||||d
ˆ||||	|
||d*}"|"d+ \}#}$}%|#ˆ }#|$ˆ }$|%ˆ }%|$|d,|f< |%|d|f< |#|d-|f< t|#|$d,d|%ƒ}&t |&d,tj¡}&|&|d|f< |%|$ |d|f< |$|# |d|f< |%|# |d.|f< |"d/ dd…dd…f }'|"d0 dd…dd…f }(|"d1 })|"d2 dd…dd…f }*|"d3 }+tj|'|)|| d
d4\},}-|-ˆ||d,dd…f< tj|*|+|| d
d4\},}-|-ˆ||ddd…f< tj|(|+|| d
d4\},}-|-ˆ||d-dd…f< q°t ||f¡}q€g d5¢}.g d6¢}/tjd7d8 |d7 }t ¡ }0‡‡‡‡fd9d„t dƒD ƒ}1tj|1|||0d
|.|/d:}0t ˆd¡}2t ˆ
¡}3|0jd;| |2 d< |3 d=d> |0jd?d> ‡‡‡‡‡‡‡‡
fd@dA„}4|4||||ƒˆˆ
ƒ\}}0t |¡ |d7 }t ¡ }0d}5t d,tj|dd…dd…f ddBd ¡}6tj|dd…dd…f ddBd }7t |6|7t|7|6 d- ƒ¡}8t |6|7|5¡}8g d¢}9g d6¢}:d,};t dƒD ]D}<||< }=|0j|=|8dC|9|< |:|< d
dD\}>}?}@t t |>¡|;¡};q
|;d }At dƒD ]H}<||< }=tj t !|=¡|At "|=¡t #t|=ƒ¡ dEd.ddd-|:|< dF	 q`dGD ]¨}<||< }B|d }Ct$j%j&|B|CdddHdI\}D}Et't (|E¡|ƒ}Ft !|B¡}Gt !|C¡}H|AdC |<d-  }I|I}J|0j)|G|Hg|I|IgdJd-dKdL |0j*|H|G d- d |IdM |FˆdNdO q®|0jˆd> |0 +d,|Ad g¡ |0j,dPdQd> |0j-dRdQd> |0j.dSdTˆdU |0jt ˆ
¡ˆd d> t /¡  t |¡}K|d7 }t ¡ }0d}5t d,tj|dd)…dd…f ddBd ¡}6tj|dd)…dd…f ddBd }7t |6|7d	¡}8|0j|d |8dCdVdd
dD |0j|d. |8dCdWd d
dD |0 ¡  |0j,dPˆd> |0j-dXˆd> |0j.dSdTˆdU |0jt ˆ
¡ˆd d> t /¡  tj|ˆd8}K|d7 }t ¡ }0|ddd…f }L|d.dd…f }Mtj|Ltj tjdY}Ltj|Mtj tjdY}M|L|Mk  0t¡}Ndd g‰ dZd[g‰	‡ fd\d„|ND ƒ}O‡	fd]d„|ND ƒ}P|0j1|L|Md^|O|Pd_ |0j-d`dQd> |0j,dadQd> |0j.dSdTˆdU |0jt ˆ
¡ˆd d> |0 2d,t |L¡d g¡ |0 3¡ \}Q}R|0 4¡ \}S}At 5|Q|S¡}Tt |R|A¡}Ut |T|U¡}V|0j)|V|VdbdcdKddd t |T|U¡}W|0j)|Wdgt|Wƒ dbdedKddd t |T|U¡}X|0j)dgt|Xƒ |XdbdedKddd t /¡  dS )iz$ CCA analysis comparing across mice ))r   rµ   )r   r6   )rD   r>   )r   ri  ))rµ   r   )r6   r   )r>   rD   )ri  r   c                 S   s$   g | ]}t d dƒD ]}||f‘qqS )rµ   r  ©ra   )r   rR  rT  r£   r£   r¤   r¤  ë  r¥  z2CCA_analysis_across_mice_pairs.<locals>.<listcomp>rµ   r   r   r   r\  FTr„  r]  r§   Nr6   éÈ   ©r&   r…  rˆ  r   r‰  rŠ  r‹  rŒ  r  rý  r”  r˜  r™  r   r   rš  r›  c                    sJ   ˆdkr(‡‡ fdd„t ˆ jd ƒD ƒ}n‡‡ fdd„t ˆ jd ƒD ƒ}|S )Nr  c                    s.   g | ]&}ˆ ˆd |f ˆd|f k  t¡ ‘qS rœ  r  rŸ  r¢  r£   r¤   r¤  +  r¥  úTCCA_analysis_across_mice_pairs.<locals>.get_color_list_by_column.<locals>.<listcomp>r   c                    s.   g | ]&}ˆ ˆd |f ˆd|f k   t¡ ‘qS rœ  r  rŸ  r¢  r£   r¤   r¤  -  r¥  r§  r¨  rª  r«  r¤   r¬  )  s     z@CCA_analysis_across_mice_pairs.<locals>.get_color_list_by_columnr­  r®  c                    s    ‡ fdd„t | jd ƒD ƒ}|S )Nc                    s    g | ]}t ˆ |tˆ ƒ   ‘qS r£   r¯  rŸ  ©rz  r£   r¤   r¤  6  r¥  r`  r   r§  r¨  ra  r£   r¤   r¬  4  s    r²  ri  rj  rì   r   rD   r>   r+   r-   rí   r,   rî   ©r&   Ú
is_average)zMouse AzMouse BzProjected Mouse Br  ©é   ri  rô   c                    s0   g | ](}ˆd d …d d …|f   ˆ ˆ ˆf¡‘qS ©N©Úreshape©r   rF  )Úmouse_pair_totalÚnum_segmentsÚsegment_length_arrayr{  r£   r¤   r¤  „  r¥  ©ru   r×   Úplot_samplesÚ
label_listÚ
color_listú%d mm length, ú, ró   r7   r½  c              
      s0  t j|ˆd |d7 }t  ¡ }|jt ˆ¡ˆd |jdˆˆ  ˆd t d¡}ˆ}| 	|¡ |j
|ˆd tˆƒD ]b\}}	| | }
t |
¡}t |
¡}|}|j|||ddˆ| dd |j|gt|
ƒ |
d	d
dd qvd}t| jd ƒD ]*}|j|| dd…|f d|| |d
d qìtdgdgtdƒd|dtdgdgtdƒd|dg}| |ˆ ¡ dD ]È}d}t  |¡ |d7 }t  ¡ }| |dd…f }t j|gt|ƒ |ddd|d t |¡}d}t || || ¡}|j||gt|ƒ dddd
d | d|d g¡ | ¡ \}}t ||¡}|dkr,d}n|dkr:d}|j||gt|ƒ ddddd |dkrt|jdˆd n|jdˆd |jdd ˆd! | 	g ¡ |jt ˆ¡ˆd tdgdgtdƒd|dtdgdgtdƒd|dg}tdgdgd"|d d#d$tdgdgd"|d d#d$g}| |ˆ ¡ q\||fS )%r³  rô   r   r7   r´  r   r¶  r·  r¸  r½  rD   r¾  r¿  rÀ  NrÁ  rÂ  r   rÄ  rµ   rÅ  rÆ  rÇ  rÈ  rÉ  rÊ  rË  rÌ  rÍ  rÎ  rÏ  rÐ  rÑ  rÒ  rÔ  rÕ  rÖ  )rQ   r  r  rl   rT   Ú#create_cumulative_mouse_pair_stringre   rW   rg   rÚ  rÛ  rö   rÜ  rÝ  rÞ  rÆ   rb   ra   rV   rh   r   rß  rj   rà  rá  râ  rÇ   rã  )r÷  rø  rù  rú  rÉ   r@   rw   Úmouse_pair_listr£   r¤   rû  Ž  sl    




 (ÿ
 
 

 

ÿÿz;CCA_analysis_across_mice_pairs.<locals>.barplot_error_arrayrü  râ   r  rÔ  r  r  r  r  r  r¶  r  r  r  r  r  r    r  rÐ  rÑ  rÒ  rþ  rÿ  r  r  r  r  c                    s   g | ]}ˆ | ‘qS r£   r£   r  r!  r£   r¤   r¤  >  r¥  c                    s   g | ]}ˆ | ‘qS r£   r£   r  r#  r£   r¤   r¤  ?  r¥  rÇ  r%  r&  r'  rÌ  rÉ  rÂ  rÍ  rÕ  r(  r)  )7ra   rW   rg   rb   r  rT   Úcreate_segment_listÚargsortÚarrayr*  rö   rn  r[  rg  r  ro  Ú(get_position_segment_distance_proportionr+  rQ   rd   r  Úplot_segment_lengthÚ generate_title_sessions_and_micers  rl   rj   r  r   r,  r-  rà  r.  r/  r0  rÝ  r1  r2  r3  r4  r5  r6  rh   r7  r8  re   rf   rÇ   rk   rž  rÆ   rá  râ  r9  rX   r:  )^r&   rW  rX  rV  r  r  r«   r  r  ré   r  r¬   r  rY  r  Úsegment_lengthÚsegment_intervalÚsegment_listÚsegment_centersÚidxsr;  ru   r<  r¬  r=  Ú	mpair_idxÚmpairÚmnum1Úmnum2rt  ÚsidxrÝ   r|  r}  rZ  ru  rv  rw  rx  r+   Úpca_alignedrn   r,   rp   Úd_listÚr_listÚsegment_list_labelsÚsegment_list_colorsr×   Úsegment_prop_listÚsample_titleÚmouse_pair_titlerû  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  r  rÎ   rI  rS  rU  rJ  rK  rL  rM  rN  rO  rP  r   r¾   rÂ   rQ  rH   rI   rò  ró  rR  rS  rT  rU  rô  rV  rW  rX  rY  rZ  r[  r£   )r"  r÷  r£  rø  rù  rú  rÉ   r@   rw   r$  rt  rj  rk  rl  rz  r{  r¤   ÚCCA_analysis_across_mice_pairsã  st   





ü	
_*"$>(*"                   r  c            '      C   s¢  ddg} t  d¡} dg} t| ƒ}dg}d}d}d}d}d}d}d}	d	}
d}d}d
}d}d}d}|dkrpd}d}nd}d}t  ddd¡ t¡}t  dt|ƒd ¡}t |¡ |d7 }t ¡ }t  	t|ƒ¡}t  	t|ƒ¡}t
|ƒD ]Ì\}}|D ]¾}|\}}t| ||||||||||	|
|d}|| }||dd…f }t| ƒ}|j|g| |ddddd„ | D ƒd t  |¡t|ƒ } d}!t  ||! ||! ¡}"|j|"| gt|"ƒ ddddd qêqÞ| d|d g¡ | ¡ \}#}$t  |#|$¡}%|j|%|gt|%ƒ ddddd |jd|d  |dkr<| dt  | ¡ d d¡g¡ |jd!|d  n|jd"|d  |jd#d$|d% t  |¡d& }&| |¡ |j|&|d  |jt |t¡|d  t ¡  dS )'z[ Get normalized error differences between RAW and CCA plotted against number of components r   r6   r  r‚  r\  Tr„  r]  Frˆ  r   r§   r   rµ   r   ©Úed_keyNrÇ  rÈ  rÉ  c                 S   s   g | ]}t | ‘qS r£   ©r°  ©r   Úmr£   r£   r¤   r¤  ¸  r¥  z=CCA_analysis_effect_of_pca_dimensionality.<locals>.<listcomp>rÊ  ç      Ð?rÁ  rD   rÂ  rÌ  rÍ  r¶  z% of componentsr7   rÎ  zError difference (cm)rÐ  rÑ  rÒ  éd   )rW   rg   rb   rà  rž  r  rQ   r  r  r*  rö   ry  rÆ   Úsumrh   rá  râ  rf   r8  r   r9  re   rÇ   rw  rÚ  rÛ  rl   rT   rÙ  r   rk   )'rp  rs  rä  rW  rX  rV  rª   r«   r  r  r  rY  ru   r@   rw   r  Ú	norm_boolrï  rõ  Ún_comp_listÚpos_listr×   Úerror_sum_by_ncompÚerror_count_by_ncompr›   r  r>  r  r  rt  rí  rx  Úerror_avg_by_ncomprº  rñ  rò  ró  rô  rç  r£   r£   r¤   Ú)CCA_analysis_effect_of_pca_dimensionalityp  sz    

ý&$ 

rœ  c                     sÆ  ddg} dg} t | ƒ}g d¢}dg}d‰d‰ d‰d}d}d}d}d}d	}d
}	d}
d}d}d}‡ ‡‡fdd„}g }g }|D ]f}|\}}t| ||ˆˆˆ ||	|||||d}| |d
dd…f ¡ | D ]}t |||ƒƒ}| |¡ qÀqxtj|
|d}|
d7 }
t ¡ }|jt 	|¡ 
t¡|dd |jd|d |jd|d |jt |t¡|d | dt | ¡ d d¡g¡ | dt |¡d g¡ | ¡ \}}t ||¡}|j|dgt |ƒ dddd
d t ¡  dS )úD Is number of rounds in training session affecting CCA performance? r   r6   r€  r‚  r\  Tr„  r]  Fr   rˆ  r   r§   c                    s    t  t| |ˆˆˆ ¡}|d }|S )z= returns number of rounds for a particular mouse and session Ú	overround)rT   rP  rQ  )rr  Úsnumr"  rž  ©rX  rV  rW  r£   r¤   Úget_overround  s    z6CCA_analysis_effect_of_roundnum.<locals>.get_overroundrŽ  Nrô   rÇ  ©r¸   zNumber of roundsr7   úNorm. error differencer   çš™™™™™ñ?rÌ  rÍ  r¶  rÂ  )rb   ry  Úextendrø   rQ   r  r  rÆ   rW   rw  rž  r  rf   re   rl   rT   rÙ  r   r8  r   r9  rá  r-  râ  rà  rh   rk   )rp  rs  rä  rª   r«   r  rY  r  r  r  ru   r@   rw   r  r¡  Ú
error_listÚ
round_listr>  r  r  rt  rr  Ú	round_numÚfig1r×   rò  ró  rô  r£   r   r¤   ÚCCA_analysis_effect_of_roundnumÛ  sZ    
ý rª  c            2         sÔ  t  d¡} t| ƒ}g d¢}d}d}d}d}d}d}d}	d}
d}d	d
g}d}d}d}d}d}d}d}|dkrtd}d}nd}d	}t  d¡}|D ]<}|\}}t| |||||||||||	||
ƒ}t  ||f¡}qŠtj||d}|d7 }t ¡ }t  	t  
|ddd…f |d	dd…f  ¡¡}|| }|j||dd |jd|d |jt |t¡|d |dkrŠ|jd|d | d	t  | ¡ d d¡g¡ d}n|jd|d d	}| d	t  |¡d g¡ | ¡ \}}t  ||¡} |j| |gt| ƒ ddddd tj||d}|d7 }t ¡ }|ddd…f }|d dd…f }||k  t¡}!d!d"g‰ d#d$g‰‡ fd%d&„|!D ƒ}"‡fd'd&„|!D ƒ}#|j||d|"|#d( |jd)|d |jd*|d |jt |t¡|d | d	t  |¡d g¡ | ¡ \}}| ¡ \}$}%t  ||$¡}&t  ||%¡}'t  |&|'¡}(|j|(|(dd+ddd t  |&|'¡} |j| dgt| ƒ ddddd t  |&|'¡})|jdgt|)ƒ |)ddddd tj||d}|d7 }t ¡ }|ddd…f }|ddd…f }d	|k  t¡}!d!d"g‰ d#d$g‰‡ fd,d&„|!D ƒ}"‡fd-d&„|!D ƒ}#|j||d|"|#d( |jd)|d |jd.|d |jt |t¡|d | d	t  |¡d g¡ | ¡ \}}| ¡ \}$}%t  ||$¡}&t  ||%¡}'t  |&|'¡}(|j|(d	gt|(ƒ dd+ddd |ddd…f }*|d dd…f }+|*|+k},|*|, }-|*t  |,¡ }.tj||d}|d7 }t ¡ }d/}/t  |/d ¡t  |*¡|/  }/d}0t  |-¡t|-ƒ }1|j|-|/d0d1d!|1d2 t  |.¡t|.ƒ }1|j|.|/d0d3d"|1d2 |  ¡  |jd4|d |jd5|d |j!d6d7|d8 |jt |t¡|d t "¡  dS )9r  r  r€  r   r\  Tr„  r]  Nr   éô  r6   r   rˆ  r   r§   Frµ   r²  rô   rD   rÇ  r¢  z,Error diff. between misaligned and self (cm)r7   r£  r¤  z)Error diff. misaligned minus aligned (cm)rÌ  rÍ  r¶  rÂ  r>   r   r   r  r  c                    s   g | ]}ˆ | ‘qS r£   r£   r  r!  r£   r¤   r¤  ¤  r¥  z>CCA_analysis_effect_of_raw_self_difference.<locals>.<listcomp>c                    s   g | ]}ˆ | ‘qS r£   r£   r  r#  r£   r¤   r¤  ¥  r¥  r%  r&  r'  rÉ  c                    s   g | ]}ˆ | ‘qS r£   r£   r  r!  r£   r¤   r¤  ½  r¥  c                    s   g | ]}ˆ | ‘qS r£   r£   r  r#  r£   r¤   r¤  ¾  r¥  zMisaligned minus aligned errorrÕ  râ   rš  )r  r¹   rI   rH   Úweightsr›  r(  r)  rÐ  rÑ  rÒ  )#rW   rg   rb   r*  ry  r+  rQ   r  r  rw  r6  rÆ   rf   rl   rT   rÙ  r   re   r8  r   r9  rá  r-  râ  rà  rh   rž  r  rX   r:  Ú	ones_liker.  rj   rÇ   rk   )2rp  rs  rä  rW  rX  rV  rª   r«   r  r  r¬   r  rY  r  ru   r@   rw   rÉ   r–  rï  rõ  r=  r>  r  r  rt  r©  r×   r¾   rÂ   rò  ró  rô  rQ  rH   rI   rR  rI  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r  Ú	normalizer¬  r£   )r"  r$  r¤   Ú*CCA_analysis_effect_of_raw_self_difference?  sÔ    

ý4
      r¯  c            -      C   sL  t  d¡} t| ƒ}g d¢}d}d}d}d}d}d}d}	d}
d	}d}d
}d}d}|D ]ò}|\}}t| ||||||||
||	|d}ddddœ}g d¢}g d¢}tj||d}|d7 }t ¡ }|jdt| t| f |d |j	d||  |d |j
d|d t  d	¡}|}| |¡ |j||d t|ƒD ]d\}}|| }t  |¡}t  |¡}|} |j| ||dd|| dd |j| gt|ƒ |dddd q*d }!t| ƒD ]0\}"}#|j||d!d	…|"f d"t|# |!dd# qœtd$gd$gtd%ƒd&|!d'td$gd$gtdƒd&|!d'g}$| |$d(d)g¡ d} t |¡ |d7 }t ¡ }%|d	d!d!…f }&tj| g| |&d*d+d,d-d.„ | D ƒd/ t  |&¡}'d0}(t  | |( | |( ¡})|%j|)|'gt|)ƒ d"d,d+dd# |% d$t  |% ¡ d d¡g¡ |% d$| d g¡ |% ¡ \}*}+t  |*|+¡},|%j|,dgt|,ƒ d1d2dd	d# |%j	d3|d |%jd4d5|d6 t  d	¡}|}|% g ¡ qRd!S )7zö We predict position in session_num2 from session_num1 by converting the session2 neuronal data to the space of session1 through CCA
        For the same session pair, compare error across mice

        INCOMPLETE! STILL TO WORK ON!!!!

    
    r  r€  r   r\  Tr„  rÚ   r6   r   rˆ  r   r§   rŽ  r‰  rŠ  r‹  )rŽ  r§   r  r‘  r”  rô   zPredicting session %s from %sr7   r´  rµ  r¶  r·  r¸  r½  rD   r¾  r¿  rÀ  NrÁ  rÂ  r   rÄ  rµ   rÅ  r­  r®  rÇ  rÈ  rÉ  c                 S   s   g | ]}t | ‘qS r£   r  r‘  r£   r£   r¤   r¤  S	  r¥  z2CCA_analysis_mice_pair_average.<locals>.<listcomp>rÊ  rË  rÌ  rÍ  rÎ  rÐ  rÑ  rÒ  )rW   rg   rb   ry  rQ   r  r  rl   r   re   rf   rÚ  rÛ  rö   rÜ  rÝ  rÞ  rÆ   rh   r°  r   rß  rj   rà  r8  r   r9  rá  râ  rÇ   )-rp  rs  rä  rW  rX  rV  rª   r«   r  r  rY  r  ru   r@   rw   r  r>  r  r  rt  rú  rù  rø  r©  rå  ræ  rç  rè  ré  rê  rë  rì  rí  r¹   r›   r’  rî  r×   rx  rð  rº  rñ  rò  ró  rô  r£   r£   r¤   ÚCCA_analysis_mice_pair_averageê  sˆ    

ý



"*ÿ&
  
r°  c                     s@  ddg} t  d¡} g d¢‰	d}d}d}d}d}d}d	}d	}d	}	d	}
d
}d}d}d}d‰d‰g d¢‰g d¢‰g ‰g ‰g ‰| D ]r}ˆ	D ]h\}}t|||||||||||d	d||||	||
d}|d }ˆ |d ¡ ˆ |d ¡ ˆ |d ¡ q‚qzˆˆˆg‰tˆd d jd d ƒ‰ ‡ ‡‡‡‡‡‡‡‡‡	f
dd„}||ddƒ}d
S )aF   This function simply calculates the raw correlation of neuronal activities between a specified pair of sessions,
    before and after applying CCA 
    
    ASSUMES THAT THE OUTPUT IS THE CROSS CORRELATION ARRAY, AND THAT THERE ARE ONLY 3 CCA DIMENSIONS!!
    
    Why is there one case with perfect correlations? What??
    r   r6   r  r€  r\  r¦   rÚ   r§   FNr   rˆ  r   )Ú	UnalignedÚ	Canonicalrÿ  r”  ©rh   ru   rÉ   r  ré   r  r  r¬   r2   r   rD   c                    sj  t j| ˆd | d7 } t  ¡ }ddg}||ˆ k }||ˆ k }d||ˆ  d ||ˆ  d f }|t ˆ	t¡ }|j|ˆd |jdˆd |jdˆd t	 
d	¡}	ˆ}
| |	¡ |j|
ˆd tˆd
 ƒ}tˆƒD ]´\}}ˆ| }g }t|ƒD ]@}|| }|||f }|dkr$td|||f ƒ qî| |¡ qît	 |¡}t	 |¡}|}|j|||ddd	d	dˆ| d	 |j|gt|ƒ |dd	dd qÒd
}d
}t|ƒD ]¤}ˆ| ||f }ˆ| ||f }ˆ| ||f }|||g}||krîd}|d7 }nd}||kr|d7 }|d
 dkr"td||ƒ q˜|j|	|d|dddd q˜t|d||   ƒ t|d||   ƒ | S )zc Convenience function, plots the values from the correlation matrices at the specified row and col rô   r   ÚXÚYzC(%s%d, %s%d) r7   úPearson correlationrµ  r   r   rÈ  z*Correlation outlier , %s , sample %d, %.3frÎ   r    rD   ©r  rØ  r	  r
  r»  rH   r½  rÍ  r¿  r   r   zcorrelation outlier rÁ  râ   )rH   r¹   rÃ  r»  z %.2f improved in canonical spacez%.2f improved after alignment)rQ   r  r  rT   rÙ  r   rl   re   rf   rW   rg   rÚ  rÛ  rb   rö   ra   rm   rø   rÜ  rÝ  r/  rÆ   rh   )ru   ÚrowidxÚcolidxrå  Ú
dim_labelsÚfirst_dim_labelÚsecond_dim_labelÚcorr_strÚ	title_strræ  rç  Únum_samplesrè  ré  Úcorr_array_listÚ	corr_listÚ
sample_idxÚ
corr_arrayÚcorrÚc_avgÚc_stdrí  Úsuccess_counterÚsuccess_counter_canonicalr›   r—   r˜   r™   Úcorrs_across_conditionsrH   ©
Úccadimsrø  rù  Úcorr_array_storageÚcorr_list_alignedÚcorr_list_canonicalÚcorr_list_unalignedr@   rw   rä  r£   r¤   Úplot_correlations_from_matrixÂ	  sd     




  



z?CCA_analysis_correlation.<locals>.plot_correlations_from_matrix)rW   rg   r[  rø   r  rV   )rp  rW  rX  rV  r«   r  rÉ   r  ré   r  r¬   r  rY  r  ru   rr  rS  rU  rZ  ÚcorrelationsrÐ  r£   rÊ  r¤   ÚCCA_analysis_correlationq	  sN    

ý
^rÒ  c            3      C   sV  ddg} t  d¡} t| ƒ}dg}t  d¡}t|ƒ}d}d}d}d}d}d	}	d}
d
}d}d}d}|d |d f}d}d}d}d}d}tj||d||ddid\}}|d }| d¡ |dkrø|d |d f}tj||d||d\}}|d }t  ||f¡}t| ƒD ]0\}}t|ƒD ]\}}tj	t
||||||
d}t ||	¡\} }!}"| jd }#tj|#d}$|$ | j¡ tj| |$|#d}%|dkr˜tj|!|%dd\}!}%}&|%dd…dd…f }'tj|'|!|d\}(})}&|||f }*|dkrî|*jdt|  |d  |t| ƒd kr|t|ƒd krd}+d},nd}+d},d}+tj|)|(|*||+d||,d!}*|* ¡  |dkrtj|'|!|d||d||d"	\}-}.}/|.| }0|0|||f< |||f }1|dkr¶|1jdt|  |d  t  t|!ƒ¡}"|1j|"|!d#d$d% |1j|"|-d&d$d% |1 ¡  td'd(d)d*d+}2|1j|"tt|"ƒd* ƒ d,d-|0 d.d.d/|2d0 qq t|ƒ tt  |¡ƒ | ¡  dS )1z3 Plots the average PCA of all animals and sessions r   r6   r  rD   r   r\  Tr„  r]  r§   Frµ   r   é(   r   Ú
projectionÚ3d©ÚnrowsÚncolsÚsqueezer@   rA   Ú
subplot_kwzDistance-averaged PCA plotsr>   ©r×  rØ  rÙ  r@   rA   ©rM  r   rà   rå   r   rÞ   Nr   ©Úposition_bin_sizeú
Session %sr7   )rw   r5   rÆ   r"   Úshow_axis_labelsrê   r   râ   ©rH   r¸   r   ÚroundÚwú0.5çÍÌÌÌÌÌì?)ÚboxstyleÚfcÚecr¹   éè  z%.2fÚcenterr    )ÚhaÚvarÅ   Úbbox) rW   rg   rb   rQ   rd   rc   rn  rö   rT   rP  rQ  r÷   rV   r   rú   rû   rü   r  r
  Ú compute_average_data_by_positionrl   r   Úplot_pca_with_positionri   rÄ   rÆ   Údictr7  r  rm   rÜ  rk   )3rp  Úmouse_total_numrz  Úsession_total_numrW  rX  rV  rª   r«   r  ÚrunningrÉ   r¬   rY  ru   r@   rw   r#   rz   rN  Úplot_distanceÚfig_pcas_avgÚaxs_pcas_avgÚfigsize_distÚfig_distÚaxs_distÚprediction_error_arrayÚmidxrr  r„  rŸ  r"  r#  r$  r%  rÛ   r*  Úpca_datarÎ   rœ   Údistance_uniqueÚpca_averageÚax_avgr5   Úaxis_labelsr8  rÍ   r;  Úerrorr×   Ú
bbox_propsr£   r£   r¤   ÚPCA_plot_all#
  s¢    



ÿ


ÿ



$ÿ
þ
$ÿr  c            P         sf  dg} t | ƒ}d}ttddƒƒ}t |ƒ}dd„ |D ƒ}dd„ |D ƒ}d |¡}t |ƒ}d}d}	d	}
d
}d}d}d}d
}d}d
}d}d }d}d}d}d}d‰ d}d}d}d}d}d}dd„ |D ƒ}g d¢‰tj||d}|d7 }t ¡ }|jdt| ƒ ˆ d d |j	dˆ d g d¢} g g g g}!tj||d}"|d7 }t ¡ }#|#jdt| ƒ ˆ d d |#j	d| ˆ d g d¢}$g g g g}%tj||d}&|d7 }t ¡ }'|'jd t| ƒ ˆ d d |'j	d!ˆ d d"g}(g g})t
 ||¡‰tj||d}*|d7 }t ¡ }+|+jd#t| ƒ ˆ d d |+j	d$ˆ d d%d"g},t
 d&||f¡}-g g g}.t| ƒD ]¶\}/}0tj||d}1|d7 }|1jd'd(}2|2 d)|0t| |f ¡ g }3g }4g }5t|ƒD ]ì\}6}7t|0||0|7|
||	||||d|||||||d*}8|8d+ }9|5 |9¡ |!d  |9d ||f ¡ |!d  |9d ||f ¡ |!d&  |9d& ||f ¡ |6dkr^|4 |8d, ¡ |3 |8d- ¡ |4 |8d. ¡ |3 |8d/ ¡ |8d0 \}:};}<|:| }:|;| };|<| }<|%d  |;¡ |%d  |<¡ |%d&  |:¡ |8d1 }=|)d  |=¡ |8d, }>|8d- }?|8d2 }@|8d/ }A|8d. }B|?d3 }?|Ad3 }Atj|>|?|@|A|d4\}C}D}D}E}Ftj|>|?|B|A|d4\}C}D}D}G}H|.d  |F¡ |.d  |H¡ |8d5 }F|8d6 }Htd7|F|Hƒ q tt |4ƒƒD ]`}I|4|I }J|3|I }Ktj|J|K|d8\}L}M}D|Idk}Ntj|M|L|2d9ˆ |Nd|dd:	}2|2 ¡  |1 ¡  qœqH‡ ‡‡fd;d<„}O|O|!| |ƒ}| ¡  |O|%|$|#ƒ}#|" ¡  |O|)|(|'ƒ}'|& ¡  |O|.|,|+ƒ}+|* ¡  d S )=Nr   r   r   r  c                 S   s   g | ]}t | ‘qS r£   ©r   ©r   rŸ  r£   r£   r¤   r¤  ·
  r¥  z(align_with_session_1.<locals>.<listcomp>c                 S   s   g | ]}t |ƒ‘qS r£   ©Ústr)r   Útupr£   r£   r¤   r¤  ¸
  r¥  Ú r\  Tr¦   r]  r§   Fr6   é   r   )ri  rµ   r=   r    r   c                 S   s   g | ]}t | ‘qS r£   r  r  r£   r£   r¤   r¤  Ù
  r¥  )r   r  r   ©rA   r@   zCorrelations, M%sr7   r¶  )Ú	unalignedÚalignedÚ	canonicalzErrors, M%szError %s (cm))r  r  r“  zMatrix Distance, M%sz Matrix Distance (Frobenius norm)r  zPCA distance, M%szPCA dist avg (UA)r  rD   rÕ  ©rÔ  ú$Aligned average PCAs, M%d, SR%s, S%sr³  r2   r+   rí   r-   rî   rì   r3   r,   r   rë   rð   rò   zPCA distances: rÝ  Úhsv©Ú	cmap_namerw   r5   rÆ   r"   r   c                    sÀ   t t| ƒƒD ]ˆ}| | }|| }tˆ|ƒ\}}}}	}
t ˆ¡}t ˆ¡}t ||¡}|j||| | ˆ| d |d|  }|jˆ|dˆ| |d q| ¡  |j	dˆ d |j
ddˆ d	 |S )
zš Given X value types, "value_total" is a list containing X arrays with the value results.
            "value_labels" is list of strings of size X
        ©rH   z, slope=%.5frÔ  rG   zTime (h)r7   rÐ  rÑ  rÒ  )ra   rb   r   rW   r,  r-  rà  rh   rj   rf   rÇ   )Úvalue_totalÚvalue_labelsr×   rF  ÚvaluesÚlbÚslopeÚ	interceptÚr_valueÚp_valueÚstd_errrò  ró  Úxx©rw   Ú	times_repÚvalue_colorsr£   r¤   Ú plot_output_value_and_regressionF  s    z>align_with_session_1.<locals>.plot_output_value_and_regression)rb   rk  ra   ÚjoinrQ   r  r  rl   r  re   rW   Úrepeatr*  rö   Úadd_subplotr   r[  rø   rT   r  rm   rî  rï  ri   rk   )Prp  rs  Úsession_referencerz  r{  Úsession_names_localÚsession_names_local_strrò  rW  rÞ  rV  rª   r«   r  rÉ   r  ré   r  r¬   Úcca_position_limitsrY  r  ru   Úfigsize_corrÚfigsize_pcar{   rz   Úcorr_rowÚcorr_colÚsession_times_localÚfig_corrÚax_corrrC  Ú
corr_totalÚfig_errÚax_errÚerror_labelsÚerror_totalÚfig_mdÚax_mdÚmatrix_distance_labelsÚmatrix_distance_totalrø  Úax_distÚdist_labelsÚ
dist_arrayÚ
dist_totalrû  rr  Úfig_pca_stackedÚax_pca_stackedÚposition_listÚpca_listÚcorrelation_array_listr„  rŸ  rZ  rÑ  ru  rv  rw  r3   r+   rn   r,   rp   rD  rE  rÎ   rF  rG  rH  rI  Úpca_idxr*  r   Úposition_binrþ  r5   r"  r£   r  r¤   Úalign_with_session_1§
  sì    


ý

ÿrE  c               	   C   s@  d} d}d}d}d}d}d}d}d}t jt| ||||dd}	t  |	|¡\}
}}t  |
||¡\}}}d}t |¡ |d7 }t |
|d	d	…f ¡ t |¡ |d7 }t |¡ t |¡ |d7 }tj||| d
d| d tj||| ||  || ||  ddd t 	¡ }|j
d|d |jd|d |jdd|d |jdt|  |d | ¡  t ¡  g d¢}g d¢}t |¡ |d7 }t|ƒD ]Z\}}tj||| d
d| || d tj||| ||  || ||  || dd q†t 	¡ }|j
d|d |jd|d |jdd|d |jdt|  |d | ¡  t ¡  d	S )z3 Nice plots showing behavior of individual neurons ri  r   r\  rÚ   rÓ  r³   TrÜ  Nr   zN%d)rÃ  rI   r   râ   ©rH   r¹   zFiring rater7   zDistance (mm)rÐ  rÑ  rÒ  rß  )r   r   r>   ri  )r   r   r  Ú
darkorange)rÃ  rI   rH   )rT   rP  rQ  r÷   rî  rQ   r  rh   Úfill_betweenr  re   rf   rÇ   rl   r   rj   rk   rö   )rÜ   rÝ   rW  rX  rV  r  ru   Úplot_distance_bin_sizerw   r"  Úneuronal_datar$  r%  rý  Údata_avgÚdata_stdÚneuronr×   Úneuron_listÚcolors_neuron_listr›   r£   r£   r¤   Úplot_individual_neuronsj  sX    
ÿ ÿ
rP  c                  C   sl  t  d¡} t  dd¡}d}d}d}d}dd„ | D ƒ}t| ƒD ] \}}g }	g }
t|ƒD ]F\}}tjt|||||dd	}t ||¡\}}}|
 |¡ |	 |¡ qVtt	|ƒƒD ]²}|| }|
| }|	| }t|d t	|ƒƒD ]‚}|| }|
| }|	| }t  
||¡}t  
||¡}|dkrØt|||f||ƒ t| }t| }||  t|ƒd
 t|ƒ d 7  < qØqªq<t|ƒ dS )z9 Go session by session and check which ones are repetead r  é   r   r\  rÚ   c                 S   s   g | ]}d | ‘qS )zM%d: r£   r‘  r£   r£   r¤   r¤  ²  r¥  z+check_repeated_sessions.<locals>.<listcomp>TrÜ  r	  z // N)rW   rg   rö   rT   rP  rQ  r÷   rø   ra   rb   Úarray_equalrm   r   r  )rp  rz  rW  rX  rV  r  Úrepeatsrû  rÜ   r!  Ú	data_listr„  rÝ   r"  rJ  r$  r%  Úsidx1r  Údata1rí   Úsidx2r  Údata2rî   Ú	equaldataÚ	equaldistÚsession_name1Úsession_name2r£   r£   r¤   Úcheck_repeated_sessions¤  s>    

*r]  c            +      C   sp  d} | }d}d}d}d}d}d}d}d}	d}
d	}d
}d
}d}d}d}d}d}d}d}d}d}d}d}t | |||||||
|||	|||||||||d}t|d ƒ |d }|d }tj|||d\}}}|d }|d }tj|||d\} }!}|d }"tj|"||d\}#}$}tj||d}%|d7 }|%jdd}&tj|||&d|d
d|td	}&tj|!| |&d|dd|td	}&|& 	¡  dS )$z Test PCA distance measures r6   rD   r   r   r\  Fr¦   r]  r§   TNr
  r³   r   r    ©rÕ  rÕ  )	r  r  rh   ru   rÉ   r  r  r  r¬   r3   r+   rí   rÝ  r,   rî   r-   rô   rÕ  r  r  r  r  )rI   r»   úPCA distancer  rë   )r[  rm   rT   rî  rQ   r  r%  rï  r   ri   rV   Úpca_distance_for_average_pcarh   r  rf   re   rj   Ú"pca_distance_by_position_and_round)+r  r  r  r  rW  rX  rV  r  r  r«   r  rÉ   r  r  r¬   r  rY  r  rh   ru   rw   rz   r#   r@   rZ  r+   rn   Úposition1_binsÚpca1_averagerÎ   r,   rp   Úposition2_binsÚpca2_averagerD  Úposition2_bins_projectionÚpca2_average_projectionr   r×   Úaverage_pca_unaligned_diffÚaverage_pca_unaligned_diff_avgÚaverage_pca_aligned_diffÚaverage_pca_aligned_diff_avgr£   r£   r¤   Útest_PCA_distanceÖ  s–    
üÿÿ    ÿ   ÿ                 rl  c            Z      C   sj  t  d¡} g d¢}d}d}d}d}d}d}d}d}	d	}
d}d	}d}d
}d}d}d}d}d}d}d}d}d}t  dt| ƒt|ƒf¡}t  dt| ƒt|ƒf¡}d}t| ƒD ]ä\}}t|ƒD ]Ò\}\}}|dkrØ||fdkrØq¶t||||||||||||||||	|
||||d}|d d |	 |d||f< |d d |	 |d||f< ||d d |	 7 }|d } |d }!| |d||f< |!|d||f< t| |!ƒ q¶q¦| dt| ƒt|ƒ f¡}"| dt| ƒt|ƒ f¡}#|"dd
d
…f dk}$t  |$¡s |"d
d
…|$f }"|#d
d
…|$f }#|"j	d }%||% }|" 
¡ }&|# 
¡ }'ddg}(ddg})t |¡}*|d7 }t ¡ }+t |t¡},|+j|,|d d |+jd|d t  dd¡}-|)}.|+ |-¡ |+j|.|d d D ]f}/|-|/ }0|"|/ }1t  |1¡}2t  |1¡}3tj|0|2|3d!d"ddd|(|/ d#	 tj|0g|% |1d$dd%d
d& q¤d'd(g}4d)d*g}5t|%ƒD ]L}6|"d
d
…|6f }7t|7d |7d kƒ}8tj|-|7d+|4|8 d,dd|5|8 d- q$|+ |-d d. |-d d. g¡ |* ¡  t |¡}*|d7 }t ¡ }+t |t¡},|+j|,|d d |+jd/|d |+jd0|d d'd(g}4g }9t|%ƒD ]0}6|"d
d
…|6f }7|7d |7d  }:|9 |:¡ q t   t  !|9¡¡};t  "t  #|9¡¡}<t j|<|;d1 d1d2}=|+ $|9|=¡ |+ %¡ }>t  &d|>d ¡}?dgt|?ƒ }@tj|@|?d3d4d5 |* ¡  t |¡}*|d7 }t ¡ }+t |t¡},|+j|,|d d |+jd6|d |+jd7|	 |d tdƒD ](}A|+j|"|A |#|A |(|A |)|A d8 qtj'|&|'|+d'd5\}B}+t  &|+ (¡ d |+ (¡ d ¡}C|gt|Cƒ }Dtj|C|Dd3d9d:d8 |+ )¡  |* ¡  t  *t j+|#dd;¡}Et |¡}*|d7 }t ¡ }+t |t¡},|+j|,|d d |+jd<|d |+jd=|	 |d |+ |9|E¡ tj'|9|E|+d'd5\}B}+|+ )¡  d>d?g}Fd'd@g}Gt |¡}H|d7 }t ¡ }It |t¡},|Ij|,|d d |Ijd7|	 |d t |¡}J|d7 }t ¡ }Kt |t¡},|Kj|,|d d |KjdA|d |I|Kg}L||g}MtdƒD ]d}N|M|N }O|L|N }+g g gg g gg}Pt| ƒD ]N\}Q}R|RdBk r4d}Snd}StdƒD ]&}T|P|S |T  ,|O|T|Qd
d
…f ¡ q@qt  -g dC¢¡}Ud,dDg}V|F}.|+ |V¡ |+j|.|d tdƒD ]¢}StdƒD ]’}T|P|S |T }1t  |1¡}2t  |1¡}3d|S |T }W|U|W }X|Sdkrþ|)|T }Ynd
}Y|+j|X|2|3d!d"ddd|(|T |YdE
 |+j|Xgt|1ƒ |1|(|T d5 q²q¦|+ )¡  qî|H ¡  |J ¡  d
S )Fzø Get statistics for the PCA distance measure.
        - Unaligned vs Aligned. Compare with correlation?
        - Aligned D-D vs Aligned V-D
        - PCA distance vs prediction error. do they correlate?
        - PCA distance by belt section.
    r  r€  r   r\  Fr¦   r]  r§   TNr6   r
  r   r³   r   r^  rD   r   r>   r  r^  rì   rð   rò   g¼‰Ø—²Òœ<r   r   r  r  r7   zPCA average distancerœ  rÎ   r    r·  r½  rÍ  )r¸   r»  rH   Ú
edgecolorsr  rG  rš  r›  rÁ  râ   )rH   r¹   rÃ  r»  rI   r  z"PCA avg dist (aligned - unaligned)r  r“  )ÚsteprÌ  rÉ  r  zPCA average distance (AU)z
Error [%s]rG   ÚdarkgrayzAvg self errorrü  zPCA avg dist diff (a - un) (AU)zError diff (a - un) [%s]r­  r®  ÚkhakiúPCA distance average (AU)rµ   ©r   r   r   rµ   ç      @©r  rØ  r	  r
  r»  rH   rI   ).rW   rg   r*  rb   rö   r[  rm   rh  ÚallrV   ÚravelrQ   r  r  rT   rÙ  r   rl   re   rÚ  rÛ  r0  rÝ  r/  rÆ   ra   r  rh   rá  rk   rf   rø   Úceilr-  Úfloorr,  r.  r9  rà  Úadd_linear_regressionrâ  rj   rÙ  Údiffr¥  rw  )Zrp  rä  rW  rX  rV  r  r  r«   r  rÉ   r  ré   r  r¬   r  rY  r  r{   rh   ru   rw   rz   r@   Údistance_avg_arrayrt  Úself_error_avgÚ	mouse_idxrÜ   Úsession_pair_idxr  r  rZ  rG  rI  Údistance_avg_array_flattenedÚerror_array_flattenedÚequal_datasets_boolr¿  Ú distance_avg_array_flattened_allÚerror_array_flattened_allÚccatype_colorsÚccatype_namesr   r×   r¾  Úx_listrç  Ú	conditionrí  Úpointsrð  rÝ  Úline_colorsÚline_labelsÚpair_idxÚpairÚ	color_idxÚ	diff_listrz  rA  r@  rB  ÚylimÚlineyÚlinexÚcidxÚrvalÚselfe_xxÚselfe_yyÚ
error_diffÚmtype_namesÚmtype_colorÚfigeÚaxeÚfigdÚaxdÚax_listrT  Úfig_idxÚdataÚcondition_listsrû  rr  Ú	mtype_idxÚccatype_idxÚdata_xxÚtick_xxÚdata_xx_idxÚxposrI   r£   r£   r¤   ÚPCA_distance_statisticsE  sT   

ü




  &&
(




"&r§  c                  C   s^  d} d}d}d}d}d}d}d}d}d}	d	}
d
}d}d}g d¢}g d¢}g d¢}g d¢}|}t  t| |||||||¡	\}}|dd…dd…f }t j|||
|d\}}}tj||d}|d7 }|jdd}t j|||d|	dd|dd	}| ¡  tj||d}|d7 }|jdd}t j|||d|	dd|dd	}| ¡  t j	|||ddd\}}t
|ƒ t
|ƒ dS )z Function to test the "PCA length" functionally in a single session.
    
        Basic idea is to analyze how much space a belt section takes in PCA space. r6   rD   r   r\  r]  Tr´   r   é   r   Fr   ©)r   r«  )r«  ré  )ré  r   ©)éâ  éú   )r¬  éî  )r­  r«  ©©éx  r”  ©é  iX  ©é„  iL  ©©r   i^  ©iŠ  iR  ©i~  iF  Nr   ©rÞ  r&   rô   rÕ  r  r  r  rb  )rT   Úget_pca_from_clusterrQ  rî  rQ   r  r%  rï  ri   rx  rm   )rr  rŸ  rW  rX  rV  r  ró  ru   r@   rw   r#   rz   rN  r&   Úbelt_segment_list1Úbelt_segment_list2Úbelt_segment_list3Úbelt_segment_list4Úsegrü  r   rœ   rE  rþ  rÎ   r   r×   r†  r‡  r£   r£   r¤   Útest_PCA_lengthb  sJ    ÿÿrÀ  c            3         sŒ  t  d¡} t  d¡}d}d}d}d}d}d}d}d}	d}
d	}d
}g d¢}g d¢}g d¢}g d¢}g d¢}g d¢}g d¢}g d¢}ddg}||||g}||g}|g}g d¢}|D ]Ö}tjddd	||d\}}|d7 }|d }|d }t  t|ƒ¡}dd„ |D ƒ}| |¡ |j||	d |jd|	d |jd|	d t  t|ƒ¡}dd„ |D ƒ} | |¡ |j| |	d |jd |	d |jd!|	d t  	t| ƒt|ƒt|ƒf¡‰ t
| ƒD ]’\}!}"t
|ƒD ]~\}#}$t t|"|$||||||¡	\}%}&|%d"d#…d"d"…f }'tj|'|&|
|d$\}(})}*tj|'|&|d
d	d%\}+},|,ˆ |!|#d"d"…f< q¸q¨t jˆ d&d'}-t j|-d&d'}.t  ‡ fd(d„tt|ƒƒD ƒ¡}/t
|ƒD ]t\}0}1tt|ƒƒD ]6}#|j||# gt| ƒ ˆ d"d"…|#|0f ||0 d) q”|j||-d"d"…|0f t|1ƒ||0 d* q€| ¡  t
|ƒD ]v\}0}1|j||0 gt| ƒ t|ƒ ˆ d"d"…d"d"…|0f  ¡ d+d,d- ||0 }2|j||0 |.|0 |/|0 d.dd#d#|2d/ q| ¡  q®d"S )0zI Statistics of PCA length for mice analyzed on their own across sessions r  r   r\  r]  T©r
  r6   r   r    Fr   r©  rª  r®  rµ  )r¯  r¶  r±  r·  r³  r¸  ©©i  r   ©i,  r«  ©i   ré  ))r°  r   )r²  r«  )r´  ré  )rÃ  )é2   r¬  rÄ  )i&  r­  rÅ  )i  r«  rÄ  rÃ  )r   r   r  rp  Úoranger–  rD   rÛ  ©r   r   rœ  c                 S   s   g | ]}t | ‘qS r£   r  r  r£   r£   r¤   r¤  Ø  r¥  z7PCA_length_statistics_over_sessions.<locals>.<listcomp>r7   úRelative segment proportionrµ  c                 S   s   g | ]}t |ƒ‘qS r£   r  ©r   r¸   r£   r£   r¤   r¤  â  r¥  z!Relative segment proportion (avg)ÚSegmentNr   r¹  rb  r   rü  c                    s,   g | ]$}t  ˆ d d …d d …|f  ¡ ¡‘qS rf  )rW   rÝ  rv  rÊ  ©Úr_arrayr£   r¤   r¤  þ  r¥  r  )rI   rH   rÍ  r¶  rF  rÎ   )r  rØ  r	  r
  rH   )rW   rg   rQ   rd   rb   rÚ  rÛ  re   rf   r*  rö   rT   rº  rQ  rî  rx  r0  rw  ra   rÆ   rh   r  rj   rv  r/  rk   )3rp  rz  rW  rX  rV  r  ró  ru   r@   rw   r#   rN  r&   Ús_list1Ús_list2Ús_list3Ús_list4Ús_list5Ús_list6Ús_list7Ús_list8Ús_list9Ús_list_listÚ
seg_colorsÚs_listr   rÕ   rå  Úax2Ú
session_xxÚsession_labelsÚseg_xxÚ
seg_labelsrû  rr  r„  rŸ  rü  r   rœ   rE  rþ  rÎ   r†  r‡  Úr_array_mavgÚr_array_avgÚr_array_stdÚsegidxr¿  rH   r£   rÌ  r¤   Ú#PCA_length_statistics_over_sessionsŸ  s|    


 

 4*>*rã  c               
   C   sæ  t  d¡} t  d¡}g d¢}d}d}t jtd ddd }d	}d}d
}d}t  d¡} ddg}t|| |||||dd |d7 }t  d¡} ddg}t|| |||||dd |d7 }t  d¡} ddg}t|| |||||dd |d7 }t  d¡} ddg}t|| |||||dd |d7 }t  dd¡} ddg}t|| |||||dd |d7 }t  dd¡} ddg}t|| |||||dd |d7 }t  dd¡} ddg}t|| |||||dd |d7 }t  dd¡} ddg}t|| |||||dd |d7 }dS )zA Same as before but we analyze intervals in a continuous fashion r  ©r   r   rD   r   rÁ  úPCA_dict.npyT©Úallow_pickler£   r   r”  r\  rµ   r   rÕ  F)rn  re  r½  r
  ró   r   rQ  N©r   rµ   r6   r>   ri  )rW   rg   Úloadr   Ú&compute_continuous_PCA_length_and_plot)rp  rz  ru   r@   ÚPCA_dictr&   r{  r|  r£   r£   r¤   Ú PCA_length_statistics_continuous  sŽ    


 
 
 
                                        rì  c            X         sl  t  d¡} t  dd¡} d}d}t jtd ddd }d	}d}d
}d}g d¢}g d¢}d}	d}
t|ƒ}g d¢‰ d}t| ƒ}g d¢g d¢ddgg}g d¢}t |¡ |d7 }t t|ƒd¡\}}| ¡ }| 	ddt|ƒ ¡ g }g }i }t  
t|ƒdf¡}t|ƒD ]\}}t  |¡}||d  }||d d  }t|| ||||||d\}}}}}|dkrn| d¡ | d¡ |t|ƒd krŠ| d¡ | ddg¡ | d¡ i } |j\}}!}"| ||! |"f¡}#|dv r>t|ƒD ]f\}$}%tj|||%|	|dd\}&}'||$ }(|(d kr|&t  |'¡ })n|(d!kr2|&t  |'¡ })|)||$< qÖ|d"v r´t|ƒD ]b\}*}%tj||#|%|
|dd\}+},t  t|ƒ¡D ]"}-|,| |*|-df< |,| |-|*df< q€|,||*|f< qP|d#v rJt|ƒD ]‚\}*}.t|ƒD ]b\}-}/t|ƒ |.¡}0|#d d …|0f }1|1| |*|-df< t|ƒ |/¡}2|#d d …|2f }3|3| |*|-df< qÖ|1||*|f< qÆt  ||f¡}4t|d d$… ƒD ]n\}*}.||*d … D ]V}/t|ƒ |/¡}-|*|-krœq|| |*|-df }1| |*|-df }3t |1|3¡}5|5|4|*|-f< q|qh| |¡ | |¡ t||4ˆ ||ƒ t||||4ˆ ||	|
||d%
 qþt  t|ƒ¡D ]r}$||$df }6||$df }7||$df }8t |1|3¡}5t |6|7¡||$df< t |7|8¡||$df< t |6|8¡||$df< q(t  d&¡}9|9d'ƒ|9d(ƒ|9d)ƒg}:tjd*d+\}};|d7 }d,}d}<t  t|ƒ¡}=d'}>d-}?d-}@t|ƒD ]´\}$}%g }A|=|$ }Bt  d¡D ]Ž}|| }||$ }C|| }tj|||C|<|dd\}&}D|A |D¡ t j!|B|> |B|> t|Dƒd.}E|$dkrŽ|| }Fnd}Ftj"|E|D|:| d/|Fd0 q||$df }G||$df }H||$df }I|Ad d }J|Ad d$ }K|Ad d }L|Ad d$ }M|Ad d }N|Ad d$ }O|B|> d- }P|B|> }Qt  #|G¡|@k rHd1}Rd}Snd2}Rd-}St$t  #|G¡ˆ ƒ}R|;j"|Pd3|?  gd |J|Lgd4dd5d6 |;j%|Pd)|>  |S |L|J d d- |R|d7d8 t  #|H¡|@k rÌd1}Rd}Snd2}Rd-}St$t  #|H¡ˆ ƒ}R|;j"|Pd(|?  gd |L|Ngd4dd5d6 |;j%|Pd)|>  |S |N|L d d- |R|d7d8 t  #|I¡|@k rPd1}Rd}Snd2}Rd-}St$t  #|I¡ˆ ƒ}R|;j"|Q|? gd |K|Ogd4dd5d6 |;j%|Qd9|>  |K|O d d- |R|d7d8 qþ|;j&|=g d:¢|d; |;jd<|d d= |;j'd>|d? | ddg¡ t (t)d@ƒ| ¡}T|;j|d=}UdAdB„ t)tˆ ƒƒD ƒ}V‡ fdCdB„t)tˆ ƒƒD ƒ}W|;j|V|WddDdE |; *|U¡ | +¡  d S )FNrµ   r  r   r   rå  Træ  r£   g     p—@r^  r\  )r   r¬  r«  r­  ré  r«  )r-  r,  r-  r,  r-  r,  r   rÆ  r…  Úextremerä  rè  ri  )ÚbaselineÚaversiveÚproberD   g      .@r>   r   ©r×   r   Ú g      @)rí  úextreme gatherrü  r-  r,  ©Úgatherró  )rê  rí  éÿÿÿÿr_  Úviridisr“  râ   ç      è?)r  r6   rô   r    r†  ©rA   r6   ©rH   rÃ  rI   Ú*Únsç      ø?r  r¶  r  r  r  çffffffÖ?)ÚrewardzBelt 1ÚAPzBelt 2zMark 2zBelt 3©Úlabelsr8   rÉ  r7   rÂ   r¿   r   c              
   S   s4   g | ],}t d gd gdd|d  d|d  dd‘qS ©r   ÚNonez$\ast$r   ri  rÉ  )Ú	linestyler×  rØ  rH   r   ri  r£   r£   r¤   r¤  ¡  r¥  z1PCA_length_significance_tests.<locals>.<listcomp>c                    s   g | ]}d ˆ |  ‘qS ©zp<%gr£   ri  ©r;  r£   r¤   r¤  ¢  r¥  ú
lower left©r8   Úloc),rW   rg   ré  r   rb   rQ   r  rd   rv  Úset_size_inchesr*  rö   r[   rê  re   rj   rf   r8  rl   rV   rh  rT   Úget_sliced_segment_periodicrÿ   Úargminrk  ÚindexÚonesÚget_pval_greater_or_lesserrø   Úplot_significance_tableÚdraw_significance_rectanglesÚget_cmaprà  rh   r6  r5  r7  rÚ  rÇ   rz  ra   Ú
add_artistrk   )Xrp  ru   rw   rë  r&   r{  r|  Úcenters_to_testÚcenters_to_test_extreme_typeÚradius_to_test_extremeÚradius_to_test_gatherÚnum_segments_to_testÚ	sigmethodÚnum_miceÚsession_listsÚsession_lists_labelsr   rÕ   Ú result_array_avg_across_sessionsÚcenters_to_test_across_sessionsÚsamples_across_sessionsÚsignificance_array_acrossÚ	slist_idxrz  Úcenters_to_test_currentÚax_segÚax_sigr~  Úresult_arrayÚresult_array_avgÚresult_array_stdÚ
ax_segmentÚsamples_within_sessionÚnum_sessionsrk  Úresult_array_collapsedr’  rê  Úcenters_in_area_to_testÚavgs_to_testÚextreme_typeÚextreme_centerÚcidx1rÎ   rG  Úcidx2Úcenter1Úcenter2Úsegidx1Úsample1Úsegidx2Úsample2Úsignificance_arrayrK  Úsamples1Úsamples2Úsamples3rß  Úslist_colorsr×   Úradius_to_plot_acrossÚ	plot_xposÚplot_dxÚsigdxÚ	sigthreshÚ	avgs_listr¦  Úcenter_currentÚavgs_to_plotr  rI   Úpval12Úpval23Úpval13Úyl1Úyr1Úyl2Úyr2Úyl3Úyr3ÚxlÚxrrL  Útext_dxr‹  Úleg1Úlegend_elementsÚlegend_labelsr£   r  r¤   ÚPCA_length_significance_tests”  s>   


"
















&,&,",
rU  c                 C   s8   | |d k rdS | |d k r dS | |d k r0dS dS d S )NrD   z***r   z **r   z * rü  r£   )rK  r;  r£   r£   r¤   r5  ©  s    r5  c               	      sP  t  |j¡}t j|dd…< t  |d¡ t j|jtd}d}t| dd… ƒD ]è\}}	| |d… D ]Ò}
t| ƒ 	|
¡}||krzq^|||f }d|dk }t  
|¡}|ˆ d krÂd|||f< d|||f< q^d|dd|    |||f< d|dd|    |||f< d}ˆ dd… D ]}||k r
|d7 }q
||||f< q^qJd	}d
}d}d}t jj|t  |¡d}t |¡ ¡ }|jdd |j||dddd t|jd ƒD ]h}t|jd ƒD ]R}|j|d |d d|||f  dd |j|d |d d|||f  dd q¨q–|jddd |jddd dd„ | D ƒ}t  t|ƒ¡d }|j||dd |j ¡  |j d¡ |j||dd |j ¡  |j d¡ tj ddd d d„ ttˆ ƒƒD ƒ}‡ fd!d„ttˆ ƒƒD ƒ}|j!||dd"d# g d$¢}g d%¢}g d&¢}t"j#j$|t%j&d'd(}|j't"j(j)|t%d)d*d+|d,}|j*}|j||d-d |j dd. | +¡  dS )/zû Somewhat ugly function to hide away code.
        Draws a table with significance scores for elements in "element_array"
        Assumes significance array contains a pval for each element against each other (sign determines which is bigger)
        Nrâ   ©Údtyper“  rö  r   r   rD   ÚPiYGÚcoolÚjetÚcoolwarm)ÚmaskrÍ  r  Úauto)rß  ÚvminÚvmaxÚaspectr  ç333333Ã?rû  r   r7   zSegment center 1zSegment center 2c                 S   s   g | ]}t t|ƒƒ‘qS r£   )r  r  )r   Úcr£   r£   r¤   r¤  ï  r¥  z+plot_significance_table.<locals>.<listcomp>r  ÚtopÚrightF)rc  rd  c              
   S   s4   g | ],}t d gd gdd|d  d|d  dd‘qS r  r   ri  r£   r£   r¤   r¤  û  r¥  c                    s   g | ]}d ˆ |  ‘qS r  r£   ri  r  r£   r¤   r¤  ü  r¥  r  r	  )r   g…ëQ¸Õ?g…ëQ¸å?r   )ra  râ   rÀ  )ÚLesserÚNSÚGreaterrÐ  )r¥  )r_   rß  ÚverticalÚleft)ÚorientationÚlocationr×   r½  )ri  ),rW   r  rV   ÚnanÚfill_diagonalr*  r  rö   rk  r  r6  Úmarw  ÚisnanrQ   r  r[   Úset_badÚimshowra   r7  rf   re   rg   rb   rÚ  ÚxaxisÚtick_topÚset_label_positionÚ
set_yticksÚyaxisÚ
tick_rightrÇ   rj   ÚmplÚcolorsÚBoundaryNormrß  ÚNÚcolorbarÚcmÚScalarMappabler×   rk   ) Úelement_arrayr9  r;  r%  r   Úcolor_arrayÚsignificance_label_arrayÚdist_from_cmap_centerÚeidx1Úe1Úe2Úeidx2rK  ÚsignÚpvalabsrL  Úpvalthrr  Úmasked_arrayÚcurrent_cmaprF  ÚjÚticks_labelsÚ	ticks_posrS  rT  ÚboundsÚcbar_label_posÚcbar_labelsr_   ÚcbÚcaxr£   r  r¤   r  ´  st    

&.

r  c
           -   	      sŽ  t  |jd d¡}
|j|
 ||
< i }t|ƒD ]X\}}g ||< t|ƒD ]>\}}||krVqDt  |||f ¡}||d krD||  |¡ qDq,g }| ¡ D ]|}|g}|| D ]^}t|| ƒdk rÄ| |¡ q¤d}|| D ]}||krÞqÐ||| vrÐd}qÐ|dkr¤| |¡ q¤| |¡ q’dd„ |D ƒ}t	t  
|¡ƒ}d}|rÖd}t|ƒD ]Ž\}}|d| d	… D ]L}| |¡dkrz| |¡ n | |¡dkrZ| |¡ nqZd} q¨qZ|dkr¸ q0|t|ƒd krBd}qBq0d
d„ |D ƒ}| ¡ D ]>}d}|D ]}||v rød}qø|dkrì| t|gƒ¡ qìˆdkr<d‰nˆdkrL|‰nˆdv rZ|‰g d¢}‡ ‡‡fdd„}| ¡ D ]}g }t|ƒD ]\} }||v rŒ| | ¡ qŒ|d }!d}"||!d  }#t	| ƒ |¡}$||$ |"d  }%t|ƒD ]š\}&} ||  }'|!}(|"t|ƒ })|#}*|%|&|)  }+|ˆ |*|+|(|)|'ƒ t t  |g¡d|	¡t  ||¡k rê||	d k rh|*d },n|*d },|ˆ |,|+|(|)|'ƒ qêqzd	S )z Very ugly function to hide away code. Draws rectangles on the segment length continuous with colors showing their significance with each otherr   rö  rD   TFc                 S   s   g | ]}t |ƒ‘qS r£   )Úset©r   Úgr£   r£   r¤   r¤  =  r¥  z0draw_significance_rectangles.<locals>.<listcomp>r   Nc                 S   s   g | ]}t |ƒd kr|‘qS ©r   )rb   r•  r£   r£   r¤   r¤  Z  r¥  rê  r”  rí  rô  )r•  Ú	firebrickÚpurplerÇ  ÚcyanÚperuÚ
aquamarinec              
      s¶   ˆdv rL| j ||d  ˆ ||d  ˆ g||d  ||d  gddd n<ˆdv rˆ| jt ||d  g¡t ||d  g¡dddd tjj||f||dd	d
|d	d}ˆ  |¡ d S )N)rí  rõ  ró  rD   r  ©rÃ  )rê  éK   )rH   r¸   r»  rø  r   rÍ  )r¹   Ú	linewidthr¼  Ú	facecolorr»  )rh   rÆ   rW   rw  rx  Úpatchesr   Ú	add_patch)r×   r¾   rÂ   ÚdxÚdyrH   Úrect©r)  Úradius_to_plotr  r£   r¤   Úplot_sig_rectangleq  s    D4 z8draw_significance_rectangles.<locals>.plot_sig_rectangler  r   )rW   Útril_indicesrV   rü   rö   r6  rø   rl  rb   rk  ÚuniqueÚissubsetrm  r”  r  rT   Úperiodic_subtractionrw  r   )-r~  r'  r  r9  r;  r  r  r  r)  r&   Úi_lowerÚ
group_dictr1  r3  r2  r4  rK  Ú
group_listÚgroupÚns_with_allÚcenter3Ústill_checkingÚrestartÚgidx1Úg1Úg2rê  Úappearsr¸   Úgroup_colorsr¨  Ú
appears_inÚgidxr£  r¤  r¾   râ  rÂ   ÚrepsrH   ÚdxrecÚdyrecÚxrecÚyrecÚxrec_periodicr£   r¦  r¤   r    s¦    









$
r  c           %   	   C   sÎ  d}d}t jtd ddd } t jtd ddd }t|ƒ}t|ƒ}t|| ƒ}tj|||d\}}t  |¡}t  |¡| }t  |¡| }t|ƒ}t  	|||f¡}t
|ƒD ]„\}}t
|ƒD ]r\}}| ||f \}}|||f }t ||¡}|d	d
…d	d	…f }tj||||dd\}}|} | |||d	d	…f< qºqª| || |f¡}!t j|!dd}"t j|!ddt  |!jd ¡ }#|dkr¾tj|!g|||	|
d}	t ||¡}$|	jd| |$ dd |||"|#|	fS |||"|#fS d	S )a'   This function requires the PCA_dict object (from "save_PCA_data" function) to work.
        Segment length is in the same units as "max pos", self-explanatory
        Segment interval is by how much the segment is moved before recalculation
        Example: if length is 200 and interval 20, the plot will be of intervals [0,200], [20, 220], etc. 
        
        Plots data only when plot=True
        if all_data = True, the traces of every session are plotted in gray on top of the average
        can optionally give an already created axis
    rå  r    rå  Træ  r£   úvariance_explained_dict.npyr_  Nr   Frb  r   rü  )ru   r×   rn  rq  r³   r7   )rW   ré  r   rb   r  rT   ru  rv  rw  r*  rö   Údimensions_to_explain_variancerx  rh  r0  rÝ  r1  rV   ry  rz  rl   )%rë  rp  rz  r{  r|  r&   ru   rh   Úall_datar×   rn  Úvariance_to_explainr#   Úvariance_explained_dictÚ	num_mouser+  rk  r}  r~  r  r&  rû  rr  r„  rŸ  r   rü  r+  rç   rœ   r†  r‡  Úresultr,  r'  r(  r‹  r£   r£   r¤   rê  ¢  s>    

rê  c            P         s  d} t  d¡}t  d¡}t|ƒ}t|ƒ}d}d}d}d}d}d}	d}
d}d	}d
}d}d
}d}d}d}d}d}d}d}d}ddg}g }t|ƒD ]¼\}‰ tt  |¡ƒ}ˆ tv rêtˆ  }|D ]0}|\}}||v r¸||v r¸| |¡ td|ƒ q¸t|ƒ}t  	||f¡}t  	||f¡} t  	||f¡}!t  	||f¡}"g }#|D ]*}$t
jtˆ |$|||d|d}%|# |%¡ q2t|ƒD ]þ\}&}'t|ƒD ]ê\}(})|&|(krÆt
jtˆ |'||||d |d}*t
jtˆ |)||||d |d}+n|#|& }*|#|( }+t|*|+||||
|	|||||||||d},|,d }-|,d }.|-||&|(f< |.| |&|(f< |,d d | }/|,d d | }0|/|!|&|(f< |0|"|&|(f< qvqft  t  t|ƒ¡t  t|ƒ¡¡\}1}2d7dd„‰‡ ‡fdd„}3dd„ }4|3||| |1|2|dƒ}g }5g }6g }7g }8t  t j|1jd td ¡}9t  t j|1jd td¡}:||9 }5||: }6| |9 }7| |: }8t |¡};|d7 }t ¡ }<d }=d!ˆ  }>|<j|>|=d d" t  g d#¢¡}?d$d%g}@d&d'g}A|< |@¡ |<j|A|=d" |<jd(|=d" d)d*g}Bd+d,g}C|4|<|?d |5|Bd |Cd ƒ\}<}D}E|4|<|?d |6|Bd |Cd ƒ\}<}F}G|4|<|?d |7d|Cd ƒ\}<}H}I|4|<|?d |8d|Cd ƒ\}<}J}K|< ¡  | |5|6|7|8g¡ qŒt |¡};|d7 }t ¡ }<d }=d-}>|<j|>|=d d" d.d/„ tdt|ƒ ƒD ƒ}?d0d/„ tdt|ƒ ƒD ƒ}@d1d/„ |D ƒ}A|< |@¡ |<j|A|=d" |<jd(|=d" d)d*g}Bd+d,g}Ct|ƒD ]Ž\}‰ |dkr$|Bd }L|Bd }Mnd}Ld}M|| d }N|| d }O|4|<|?|d  |N|L|Cd ƒ\}<}D}E|4|<|?|d d  |O|M|Cd ƒ\}<}F}Gq |< ¡  |<jd2d d" t |¡};|d7 }t ¡ }<d }=d3}>|<j|>|=d d" d4d/„ tdt|ƒ ƒD ƒ}?d5d/„ tdt|ƒ ƒD ƒ}@d6d/„ |D ƒ}A|< |@¡ |<j|A|=d" |<jd(|=d" d)d*g}Bd+d,g}Ct|ƒD ]Ž\}‰ |dkr~|Bd }L|Bd }Mnd}Ld}M|| d }N|| d }O|4|<|?|d  |N|L|Cd ƒ\}<}D}E|4|<|?|d d  |O|M|Cd ƒ\}<}F}GqZ|< ¡  |<jd2d d" dS )8a=   We do the CCA analysis on the same session, comparing one half with the other 
        Statistics: compare the PCA distance within session, with the one taking a single session as reference
        NEXT STEP: do like a matrix session vs session, each element is the distance of one session to another (if )
    
    r   r  r   r   r\  Fr¦   r]  r§   TNr6   r
  r   )r   râ   )râ   r   z	Removing )rL  rN  rO  rð   rò   rì   rD   c                 S   sè   t  t|ƒ¡}dd„ |D ƒ}	| |¡ |j|	dd | |¡ |j|	dd t  t  | ¡d¡}
t  	| ¡}|j
||| dd|
|d}|j|dd | ¡  |d	kr¬|j||d
 tt|ƒƒD ]*}| t|d |d fdddddd¡ q¸d S )Nc                 S   s   g | ]}t | ‘qS r£   r  rÊ  r£   r£   r¤   r¤  q  r¥  zNCCA_analysis_within_session.<locals>.pcolor_session_matrix.<locals>.<listcomp>r   r7   r   ÚGreensr]  )rß  Úshadingr^  r_  Trñ  râ   r   Fr   r   )Úfillr¼  rÃ  )rW   rg   rb   rÚ  rÛ  ru  Úset_yticklabelsrX   r,  r-  Úpcolorrl   rk   r|  ra   r¢  r   )Úsession_matrixÚxgridÚygridrz  r   r×   Útitler|  rÝ  rÞ  ÚzminÚzmaxrb  r„  r£   r£   r¤   Úpcolor_session_matrixn  s    


z:CCA_analysis_within_session.<locals>.pcolor_session_matrixc              
      sÆ   t jdddd| d\}}| d7 } |d }	|d }
ˆ||||||	d| d	ˆ   d
d ˆ||||||
d| d	ˆ   d
d t j| dd}| d7 } t  ¡ }|| }ˆ|||||||d d	ˆ   d
d | S )Nr   rD   F)r   rµ   rÛ  rÈ  rœ  z
Unaligned z, M%dT)r|  zAligned )r6   rµ   rô   z, difference)rQ   rd   r  r  )ru   Úsession_matrix_unalignedÚsession_matrix_alignedrÏ  rÐ  rz  Ú
value_namer   rÕ   rå  rÚ  r×   Úsession_matrix_diff©rr  rÔ  r£   r¤   Ú*pcolor_session_matrix_alignment_comparisonƒ  s     $$$zOCCA_analysis_within_session.<locals>.pcolor_session_matrix_alignment_comparisonc                 S   sV   t  |¡}t  |¡}| j|||ddddd||d
 | j|gt|ƒ ||d | ||fS )NrÎ   r    r   rD   rt  r  )rW   r0  rÝ  r/  rÆ   rb   )r×   r¦  rˆ  rI   rH   rð  rÝ  r£   r£   r¤   Ú,draw_scatterpoints_with_errorbar_at_position•  s
    

zQCCA_analysis_within_session.<locals>.draw_scatterpoints_with_errorbar_at_positionr_  rV  r   z(Across vs within session comparison, M%dr7   rr  râ   rs  r±  rÿ  rq  ÚAcrossÚWithinr  rp  z8Across vs within unaligned comparison for different micec                 S   s    g | ]}|d  d dkr|‘qS ©r   r   r   r£   ri  r£   r£   r¤   r¤  Ý  r¥  z/CCA_analysis_within_session.<locals>.<listcomp>c                 S   s    g | ]}|d  dkr|d ‘qS ©r   r   râ   r£   ri  r£   r£   r¤   r¤  Þ  r¥  c                 S   s   g | ]}t |ƒ‘qS r£   r  ©r   rr  r£   r£   r¤   r¤  ß  r¥  zMouse number (start at 0)z6Across vs within aligned comparison for different micec                 S   s    g | ]}|d  d dkr|‘qS rÞ  r£   ri  r£   r£   r¤   r¤    r¥  c                 S   s    g | ]}|d  dkr|d ‘qS rß  r£   ri  r£   r£   r¤   r¤    r¥  c                 S   s   g | ]}t |ƒ‘qS r£   r  rà  r£   r£   r¤   r¤    r¥  )T)rW   rg   rk  rb   rö   r[   r	   rm  rm   r*  rT   rP  rQ  rø   rK  ÚmeshgridÚwherer`   rV   ÚboolrQ   r  r  rl   rw  rÚ  rÛ  re   rj   ra   rf   )PrÜ   rp  Úsession_list_originalr+  Úsession_ref_numrW  rX  rV  r  r  r«   r  rÉ   r  ré   r  r¬   r  rY  r  rh   ru   r@   Útrim_data_selection_listÚmouse_data_storagerû  rz  Úsession_pairsr>  rS  rU  Ú$pca_distance_unaligned_matrix_resultÚ"pca_distance_aligned_matrix_resultÚerror_unaligned_matrix_resultÚerror_aligned_matrix_resultr  rŸ  r"  rU  r|  rW  r}  r  r  rZ  rG  rI  Úunaligned_errorÚaligned_errorrÏ  rÐ  rÚ  rÛ  Úunaligned_across_listÚunaligned_within_listÚaligned_across_listÚaligned_within_listÚnondiagonal_idxsÚdiagonal_idxsr   r×   rw   r¾  r£  r¤  rç  Ústype_labelsÚstype_colorsÚavguaÚstduaÚavguwÚstduwÚavgaÚstdaÚavgwÚstdwÚlabelacrossÚlabelwithinÚacrossÚwithinr£   rÙ  r¤   ÚCCA_analysis_within_sessionù  s*   	



 ý$


""


"*


"*r  c                  C   sn  d} d}t  d¡}dg}t  d¡}dg}d}d}d}d}d}d}	d}
d	}d
}d}d}|D ]} |D ]}tjt| |||||d}t ||¡\}}}|jd }tj|d}| 	|j
¡ tj|||d}|dkrâtj||dd\}}}|dd…dd…f }tj| |dd t¡}|j}t ||¡\}}}}t |||	¡\}	}t|j|jƒ t|j|jƒ t| |t  |¡ƒ qbqXdS )ú) Initial test of place cell computations r   r  r   rD   r\  r]  TrÁ  r   r    Fr   rÜ  rà   rå   rÞ   Nr   Údombeck©Úcriteria)rW   rg   rT   rP  rQ  r÷   rV   r   rú   rû   rü   r  r
  Úload_place_cell_booleanrž  rã  Úcomponents_Úcalculate_place_cell_weightsÚ plot_cell_weights_single_sessionrm   r•  )rr  rŸ  ÚmlistÚslistrW  rX  rV  r  ró  ru   r@   rw   r#   rN  r&   r"  r#  r   r%  rÛ   r*  rü  rÎ   rœ   Úplace_cell_boolÚpca_compÚplace_cell_weightsÚnplace_cell_weightsÚstacked_cell_weightsÚstacked_mean_cell_weightsr×   r£   r£   r¤   Úplace_cells_single_session%  sF    	




r  c                  C   s$  t  d¡} t  d¡}d}d}d}d}d}d}d}d}	d}
d	}d
}d}t| ƒD ]Ò\}}t jt|ƒdftd}t|ƒD ]¢\}}tjt||||||d}t 	||¡\}}}|j
d }tj|||d t¡}t  |¡}|| }|dkrò|dkròt|||ƒ t  |||g¡ t¡||d d …f< qrt|ƒ qLd S )Nr  r   r\  r]  TrÁ  r   r    Fr   r  r   rV  rÜ  r   r  rµ   r6   )rW   rg   rö   r*  rb   r  rT   rP  rQ  r÷   rV   r  rž  rã  r•  rm   rw  )r  r  rW  rX  rV  r  ró  ru   r@   rw   r#   rN  r&   Úplace_cell_criteriarû  rr  Ústats_arrayr„  rŸ  r"  r#  r   r%  rÛ   r  Úplace_cell_numÚnplace_cell_numr£   r£   r¤   Úplace_cell_statistics_oldi  s6    



$r  c            :      C   sä  t  d¡} t  d¡}d}d}d}d}d}d}d}d}	d}
d	}d
}d}d}t  t| ƒt|ƒdf¡}t  t| ƒt|ƒdf¡}t  t| ƒt|ƒdf¡}t  t| ƒt|ƒdf¡}t j||||fdd}t| ƒD ]ˆ\}}t|ƒD ]t\}}tjt||||||d}t 	||¡\}}}|j
d }tj|d}| |j¡ tj|||d}|dkr^tj||d
d\}}}|dd…dd…f } tj|||d t¡}!|j}"t |"|!¡\}#}$}%}&|dkr²|&}'n|dkrÀ|%}'|'dd…df |||dd…df< |'dd…df |||dd…df< |'dd…df |||dd…df< t j|'dd…dd…f dd|||dd…df< qØqÆ|j
d }(g d¢})ddg}*ddg}+t j|dd},t j|dd}-tjddd|d\}.}/|d7 }|/d  |/d! |/d" |/d# g}0t|(ƒD ]î}1|0|1 }2d$d%g}3|+}4|2 |3¡ |2j|4|	d& tdƒD ]¤}5|3|5 g|,j
d  }6t  |,dd…|5|1f ¡}7t  |,dd…|5|1f ¡}8|*|5 }9|2j|6|,dd…|5|1f |9|+|5 d' |2j|3|5 |7|8d(dddd|9d)	 |2 ddg¡ q
|2  |)|1 ¡ qÒtj!d*| d+ d,d& |. "¡  dS )-r  r  r   r\  r]  TrÁ  r   r    Fr   r  rÜ  rD   rö  rü  rÜ  r   rà   rå   rÞ   Nr   r  Útotal)zPCA 1zPCA 2zPCA 3zPCA 1-3ÚdarkblueÚ	lightblueÚPlaceú	Non-place©r  r  r?   rÈ  rœ  )r   r   )r   r   râ   rs  r7   rG   rÎ   r·  zAcross-session z weight contributionró   )#rW   rg   r*  rb   Ústackrö   rT   rP  rQ  r÷   rV   r   rú   rû   rü   r  r
  r  rž  rã  r	  r
  rÜ  rÝ  rQ   rd   ra   rÚ  rÛ  rÆ   r/  r8  rl   rc   rk   ):r  r  rW  rX  rV  r  ró  ru   r@   rw   r#   rN  r&   r  ÚcontributionÚpca1_contributionÚpca2_contributionÚpca3_contributionÚpca13_contributionÚcontribution_stackrû  rr  r„  rŸ  r"  r#  r   r%  rÛ   r*  rü  rÎ   rœ   r  r  r  r  r  r  ÚresultsÚ	num_plotsÚsubplots_titlesÚ
color_pairÚ
label_pairÚvalue_to_plotÚvalue_to_plot_stdr   rÕ   Úaxs_listÚsubplot_idxr×   r¤  rç  Úcell_type_idxr  rð  rÝ  rH   r£   r£   r¤   Úplace_cells_across_sessions  s†    





   2	

$ r1  c              
   C   s”  t | ƒ}t |ƒ}dd„ |D ƒ}tjt ||f¡| |d}	tjt ||f¡| |d}
t ||f¡}t ||f¡}t| ƒD ]\}}t|ƒD ]ü\}}|||f \}}|||f }|||f }|jd }tj||dd 	t
¡}t |¡}||	j||f< |j| |
j||f< t |¡d }t t |¡¡d }||f||ffD ]L\}}t |ƒ}t|ƒ}|dkrpt||d||d| }nd}||||f< q6qˆqv|||	|
fS )	a4   Function that computes the overall contributions of place and non-place cells to the PCA latent representation
        mouse_list and session_list are lists with mouse and session numbers
        PCA_dict, components_dict, and variance_explained_dict are all outputs from the save_pca_data function
        ctype is input to the "get_PCA_contribution" function ('1', '3', 'w', etc.)
        
        output are contribution arrays for each cell type (size mnum X snum) and a Pandas dataframe with the total number of that type of cell (size mnum X snum)
    
    c                 S   s   g | ]}t | ‘qS r£   r  r  r£   r£   r¤   r¤  (  r¥  z/get_cell_type_contributions.<locals>.<listcomp>)r  Úcolumnsr   r  r  ru  ©ÚPCAdimsÚneuronsÚctype)rb   ÚpdÚ	DataFramerW   r*  rö   rV   rT   r  rž  rã  r•  ÚilocrÅ   râ  r:  rk  Úget_PCA_contribution)rp  rz  rë  Úcomponents_dictrÆ  r6  rÜ   rÝ   Úsession_list_namesÚp_num_tableÚnp_num_tableÚcontribution_array_pÚcontribution_array_nprû  rr  r„  rŸ  r   rü  Ú
componentsr+  rÛ   r  r  Úplace_cell_idxsÚnplace_cell_idxsÚ	cell_idxsÚcontribution_arrayÚcell_numr!  r£   r£   r¤   Úget_cell_type_contributions  s6    	


rG  c              	   C   sœ   d}d}d}d}d}d}d}d}	d}
d}d	}t jt| |||||d
}t  ||¡\}}}t |¡ t j|||
|d\}}t d¡ t ||ddd…f ¡ dS )zG Just plots average place cell firing rates for that mouse and session r   r\  r]  TrÁ  r   r    Fr   rÜ  r¹  rD   r   N)rT   rP  rQ  r÷   rQ   rh   Úbin_data_by_positionr  )rr  rŸ  rW  rX  rV  r  ró  ru   r@   rw   r#   rN  r&   r"  r#  r   r%  rE  Údata_by_position_binsr£   r£   r¤   Úplot_place_cellsR  s"    

rJ  c            H         s&  d} d}t  d¡}t|ƒ}t  d¡}t|ƒ}d}t ||¡}tƒ }g d¢}	t|	ƒ}
d}g d¢}d}t jtd	 d
dd }t jtd d
dd }t jtd d
dd }t||||||ƒ\}}}}|||  }| 	d¡}t  
|
¡}t j
|
td}t|	ƒD ]‚\}}t||||||ƒ\}}}}| ¡ }| ¡ }t  |¡}t  |¡}tjj||d
ddd\}} t | ¡}!|| ||< | |k ||< qôtj|g|	d 	d¡}"d}#tj t|# d ||dœ¡ d||dk< d}$d}%tj|$d\}&}'|d7 }|&j d¡ |' d¡ |' d¡ |'j|j|j|j d d!}(|( !|%¡ |( "dd"¡ |& #¡  t $¡  d}$d}%tj|$d\}&}'|d7 }|&j d¡ |' d¡ |' d¡ |'j|j|j|j d d!}(|( !|%¡ |( "dd"¡ |& #¡  d}$d}%tj|$d\}&}'|d7 }|&j d¡ |' d¡ |' d¡ |'j|j|j|j d d!}(|( !|%¡ |( "dd"¡ |& #¡  d#}%d$}$d%d&g})d'd(g}*tj|$d\}&}'|d7 }|| }+| ¡ }| ¡ }t  |¡},t  %|¡}-t  |¡}.t  %|¡}/ddg}0t||gƒD ]|\}1}2|2 ¡ }3t  |3¡}4t  %|3¡}5|0|1 }6|)|1 }7|*|1 }8|'j&|6gt|3ƒ |3|7d|8d) |'j'|6|4g|5gd*d#d+d+d|7d,	 q¨| ¡ }9| ¡ }:tjj|9|:d
dd-d\}} tj| |d
d.}!|' (¡ d };|;|;d/  }<|0d }=|0d }>|=|;g|=|<g|>|<g|>|;gg}?t)|?Ž \}@}Atj*|@|Ad0d1}B|'j+|>|= d |<|<d/  |!|%d2d3 |' ,ddg¡ |'j-|*|%d4 |'j.d5|%d6 |d } |d }|' /d7d8g¡ |'j0d9|%d4 |& #¡  |'j1|%d4 d#}%d$}$d%d&g})d:d;g}Cd'd(g}*d<d=g}Dtj|$d\}&}'|d7 }|| }+| ¡ }| ¡ }t  |¡},t  %|¡}-t  |¡}.t  %|¡}/g d>¢}0t||gƒD ]Î\}1}2tt  d"¡t  d"d¡gƒD ]¨\}E}F|2|F  ¡ }3t  |3¡}4t  %|3¡}5|0|E|1d+   }6|EdkrP|)|1 }7n|C|1 }7|*|1 d? |D|E  }8|'j&|6gt|3ƒ |3|7d|8d) |'j'|6|4g|5gd*d#d+d+d|7d,	 qqâtt  d"¡t  d"d¡gƒD ]â\}E}F||F  ¡ }9||F  ¡ }:tjj|9|:d
dd-d\}} tj| |gd
d.}!t  2t  3|9¡t  3|:¡¡};|;|;d/  }<|0|E }=|0d+|E  }>|=|;g|=|<g|>|<g|>|;gg}?t)|?Ž \}@}Atj*|@|Ad0d1}B|'j+|>|= d |<|<d/  |!|%d2d3 qÌ|' ,dd@g¡ |'j-|*|%d4 |'j.d5|%d6 |d } |d }|'j0d9|%d4 |'j1|%dA d4 |& #¡  t 4t|# dB ¡ dS )Hz^ 
        - Number and proportion of place cells
        - Weighted PCA contribution
    
    r   r  r   r   )Ú1Ú3Ú50Ú50wrã  Úwrrã  r…  r‡  úpca_components_dict.npyTræ  r£   rÂ  rå  rD   rV  Nr  r  )rŸ  r2  Úplace_cell_pca_contributionsú.mat)Úplace_cellsÚnon_place_cellsr  râ   ©ri  ri  r   rô   FÚoffÚtightrê  )ÚcellTextÚ	colLabelsÚ	rowLabelsr
  rµ   r    )ri  r6   r   r˜  r  r  ©rH   r¹   rI   rÎ   r   r·  Úgreater©Ú
thresholdsÚasteriskr\  r  r  r  r  r7   rÂ   r¿   gš™™™™™É¿ç333333ó?ÚContributionÚlightskyblueÚ
lightcoralúi-Dr®  )r   r   rD   r   rµ   r	  rs  r6   ú.pdfr   r  c                    s   g | ]}ˆ t |ƒ ‘qS r£   ©r  ri  ©Ú	sigcolorsr£   r¤   r¤  j  r¥  z)place_cell_statistics.<locals>.<listcomp>)rX  rY  r
  ÚcellColours)6rW   rg   rb   rT   rz  Úget_PCA_contribution_labelsré  r   rG  râ  r*  rã  rö   rv  r0  r2  r3  r4  r5  r7  r8  ÚioÚsavematr   rQ   rd   ÚpatchÚset_visiblerÀ   Útabler  r2  r  Úset_fontsizeÚscalerk   ÚshowrÝ  rÆ   r/  r9  Úziprh   r7  rÚ  rÛ  rÇ   rá  re   rj   r   r-  Úsavefigrm   )Hrr  rŸ  rp  rÜ   rz  rÝ   ru   r‹  Úcontribution_labelsÚ
ctype_listÚ	ctype_numÚctype_exampleÚpval_thresh_listÚpval_threshr;  rÆ  rë  r?  r@  r=  r>  Úplace_cell_prop_tableÚ	ctype_valÚ
ctype_psigr’  r6  ÚparrayÚnparrayrÎ   ÚpavgÚnpavgrJ  rK  rL  Úctype_val_tableÚ
label_saver@   rw   r   r×   ro  Úcolor_ctypeÚlabel_ctypeÚtotal_samplesÚavgpÚstdpÚavgnpÚstdnpr  Ú	ctype_idxrE  rG  rð  rÝ  r¦  rH   rI   ÚsamplespÚ	samplesnprO  rP  rM  rN  rˆ  r¾   rÂ   ÚlineÚ
color_axonÚ
label_axonÚaxon_idxÚ
axon_midxsÚtable_colorsr£   rg  r¤   Úplace_cell_statisticss  sF   

















$$"



("(            r”  c            q         s¶  t dƒ‰t dƒ‰tˆƒ} tˆƒ}‡fdd„ˆD ƒ}‡fdd„ˆD ƒ}d}|ˆv r\ˆ |¡}nˆd }d}d}|ˆv r€ˆ |¡}nˆd }d}d	}d	}	d
}
d}d}d‰d‰d}d‰ d‰d‰d‰d	}d}d}t ˆˆ¡}tƒ }ddg}ddg}ddg}d}d}d
}t|| ƒ}g }g }t |ƒD ]B}|| }|| | }| ||| f¡ | || d d ¡ qt 	|¡}t 
|¡| }t 
|¡| }t|ƒ}tjtd ddd } tjtd ddd }!tjtd  ddd }"tˆƒ} tˆƒ}d!d„ ˆD ƒ}#tjtd ddd } tjtd ddd }!‡ ‡‡‡‡‡fd"d#„}$t | |df¡}%t | |d|f¡}&t | |d|f¡}'tˆƒD ]Ò\}(})tˆƒD ]¼\}*}+tjt|)|+|
||	|d$},t |,|¡\}-}.}/|-jd }0|"|)|+f \}.}1| |)|+f }2|!|)|+f }3|1jd }0tj|)|+d%d& t¡}4t |4¡d }5t t |4¡¡d }6t|5ƒ}7t|6ƒ}8|7dks||8dkrLq|t|5|6gƒD ]Þ\}9}:t|:ƒ};|-|: }<|$|.|<ƒ\}=}>}?|?ˆ }@|@|%|(|*|9f< |=d'd(…d'd'…f }Atj|A|.||dd)\}B}C|C|'|(|*|9d'd'…f< t |ƒD ]T}Dtjjt |0ƒ|;dd*}E|-|Ed'd'…f }F|$|.|Fƒ\}G}>}H|Hˆ }I|I|&|(|*|9|Df< qÞqXq|qjd+}Jtj t|J d, |%|&d-œ¡ d}tj d.d/\}K}L|d	7 }|& !| | d|f¡}Mt||gƒD ]ž\}N}O|&|O  !t|Oƒ| d|¡}M|N}Pt dƒD ]j}9|%|Od'd'…|9f  "¡ }Q|Md'd'…|9f }Rtj#|Rd	d0}S|Q|S }Tt|Qƒ}U|Ndkr*||9 }Vnd'}Vt|Qƒ}U|Lj$|Pg|U |T||9 d	|Vd1 |Lj%|Pgt #|T¡t &|T¡d2||9 dd(d(dd3	 tj'j(|Tdd4d5\}W}Xtj'j(|Tdd6d5\}W}Yt )|X|Y¡}Ztj*|Zg d7¢dd8}[d9}\|P|\ }]|]|\d  }^t #|T¡}_d}`|Lj+|]|^|^|]g|_|_|`|`gd:dd; |Lj,|^|\d(  |_d |[|d<d= qÌqœ|L -¡ }at .|ad |ad	 ¡}b|Lj+|bdgt|bƒ d>d?dd@ |Lj/|d	 dA |L 0dd	g¡ |Lj1dBdCg|dD dA |L 2dEdFg¡ |Lj3dG|d( dH |Lj4dIˆ |dA |Lj5dJ| |d dA |K 6¡  t 7t|J dK ¡ g dL¢}ct 8‡fdMd„|cD ƒ¡
rXddNg}ddOdg}edBdCg}f‡fdPd„|cD ƒ}gt|cƒ}hd}tj d.d/\}K}L|d	7 }t 9t :|h¡|hd	 t :|h¡ f¡}id}jdQd„ |cD ƒd }kt||gƒD ]Ü\}N}Ot|gƒD ]Æ\}*}+|&|O|+f  !t|Oƒd|¡}M|i|j }lt dƒD ]†}9|%|O|+|9f  "¡ }Q|Md'd'…|9f }Rtj#|Rd	d0}S|Q|S }Tt|Qƒ}U|*dkrn||9 dR |f|N  }Vnd'}V|Ndkr‚|d}mn|e}m|m|9 }nt|Qƒ}U|Lj$|lg|U |T|nd	|Vd1 |Lj%|lgt #|T¡t &|T¡d2|ndd(d(dd3	 tj'j(|Tdd4d5\}W}Xtj'j(|Tdd6d5\}W}Yt )|X|Y¡}Ztj*|Zg d7¢dd8}[d9}\|l|\ }]|]|\d  }^t #|T¡}_d}`|Lj+|]|^|^|]g|_|_|`|`gd:dd; |Lj,|^|\d(  |_d |[|d<d= q|jd	7 }jqÔqÂ|L -¡ }at .|ad |ad	 ¡}b|Lj+|bdgt|bƒ d>d?dd@ |Lj/|d dA |L 0|i¡ |Lj1|k|dA |Lj3dG|d( dH |Lj4dSˆ |dA |Lj5dJ| |d dA |K 6¡  t 7t|J dT ¡ tˆƒdkr²ddNg}ddOdg}edBdCg}fg dU¢g dV¢dWdgg}ot|oƒ}hd}tj d.d/\}K}L|d	7 }t 9t :|h¡|hd	 t :|h¡ f¡}id}jg dX¢d }kt||gƒD ]ô\}N}Ot|oƒD ]Þ\}*}p|&|O d'd'…|pf  !t|Oƒt|pƒ d|¡}M|i|j }lt dƒD ]Ž}9|%|O d'd'…|p|9f  "¡ }Q|Md'd'…|9f }Rtj#|Rd	d0}S|Q|S }Tt|Qƒ}U|*dkrº||9 dR |f|N  }Vnd'}V|NdkrÎ|d}mn|e}m|m|9 }nt|Qƒ}U|Lj$|lg|U |T|nd	|Vd1 |Lj%|lgt #|T¡t &|T¡d2|ndd(d(dd3	 tj'j(|Tdd4d5\}W}Xtj'j(|Tdd6d5\}W}Yt )|X|Y¡}Ztj*|Zg d7¢dd8}[d9}\|l|\ }]|]|\d  }^t #|T¡}_d}`|Lj+|]|^|^|]g|_|_|`|`gd:dd; |Lj,|^|\d(  |_d |[|d<d= qL|jd	7 }jq
qö|L -¡ }at .|ad |ad	 ¡}b|Lj+|bdgt|bƒ d>d?dd@ |Lj/|d dA |L 0|i¡ |Lj1|k|dA |Lj3dG|d( dH |Lj4dSˆ |dA |Lj;dY|dA |Lj5dJ| |d dA |K 6¡  t 7t|J dZ ¡ d'S )[ú^ Dropout tests based on cell type
        Wiener takes about 48s, Kalman about 20 minutes
    r  r   c                    s   g | ]}|d k rˆ   |¡‘qS ©rµ   ©r  ri  r±  r£   r¤   r¤  ‘  r¥  z+place_cell_dropout_test.<locals>.<listcomp>c                    s   g | ]}|d krˆ   |¡‘qS ©r   r—  ri  r±  r£   r¤   r¤  ’  r¥  rD   r   r>   r   r\  r]  TFr   r¦   r§   r6   r   r  r  ú	Non-Placer   r   Ú
powderbluerc  r    r^  rP  ræ  r£   rÂ  rå  c                 S   s   g | ]}t | ‘qS r£   r  r  r£   r£   r¤   r¤  Ý  r¥  c                    s   |j d }tj|d}| |j¡ tj|||d}ˆdkrPtj| |ˆd\} }}|d d…d d …f }tj|| ˆddˆd ˆ ˆd	\}}}|||fS ©	Nr   rà   rå   TrÞ   r   Frê   ©	rV   r   rú   rû   rü   rT   r  r
  rÄ   ©r   r#  rÛ   r*  rü  rÎ   Úposition_predrÍ   ©r¬   rÈ   rN  rÉ   rß   r«   r£   r¤   Údo_pca_and_predictç  s    
þz3place_cell_dropout_test.<locals>.do_pca_and_predictrÜ  r  r  Nr   rb  ©rÅ   ÚreplaceÚplace_cell_dropout_resultsrR  ©Úprediction_error_by_cell_typeÚprediction_error_random©r6   r  rô   rü  ©rH   r»  rI   rÎ   ©r¹  r  rH   rØ  r	  r
  r»  r\  ©r  Úlessr…  r]  r†  r  r  r  r  úk--râ   ©r¹   rÃ  r7   rd  r®  rµ   ç      à¿rý  rÂ   r¿   ú$Error difference with random %s (cm)ú	Dropout, re  ©rD   r   r>   ri  c                    s   g | ]}|ˆ v ‘qS r£   r£   r  ra  r£   r¤   r¤  ¬  r¥  r˜  rb  c                    s   g | ]}ˆ   |¡‘qS r£   r—  r  ra  r£   r¤   r¤  ²  r¥  c                 S   s   g | ]}t | ‘qS r£   r  r  r£   r£   r¤   r¤  ¹  r¥  r	  z)Error diff. with random dropout [%s] (cm)z_by_session.pdfrä  rè  ri  ©ÚBrü   ÚPzSession Typez_by_session_type.pdf)<ra   rb   r  rT   rz  rj  r  rø   rW   rv  rw  ré  r   r*  rö   rP  rQ  r÷   rV   r  rž  rã  râ  r:  rx  ÚrandomÚchoicer2  rk  rl  r   rQ   rd   rh  rv  r0  rÆ   r/  rÝ  r3  Úttest_1samprX   r5  rh   r7  râ  rà  rj   rÚ  rÛ  rá  rÇ   re   rl   rk   rt  ru  r+  rg   rf   )qrÜ   rÝ   Úmouse_idÚmouse_ddÚexample_mouseÚexample_mouse_idxÚexample_sessionÚexample_session_idxrW  rX  rV  r  ró  r&   ru   rw   r@   r‹  ru  Úcell_labelsÚcell_colorsÚcell_colors_randomÚrandom_samplesr{  r|  rk  r}  r~  rF  Úar   r  r;  rÆ  rë  r<  r   rt  Úerror_array_randomÚsegment_arrayrû  rr  r„  rŸ  r"  r#  r   r%  Únum_neurons_totalÚpca_data_originalrA  r+  r  rB  rC  Ú	num_placeÚ
num_nplacer0  rD  Ú	num_cellsÚpca_input_cell_dataÚpca_data_cellrž  rÍ   r  rœ   r†  r‡  ÚridxÚselected_neuronsÚpca_input_data_selectedÚpca_data_randomÚ
error_dictÚerror_randomrƒ  r   r×   Úerrors_random_collapsedÚaxon_type_idxÚmouse_axon_listrí  ÚerrorsÚerrors_randomÚerrors_random_avgÚerrors_relativeÚtot_samplesrI   rJ  ÚpvalgÚpvallrK  rL  r£  rM  rN  rO  rP  Úxlimsr  Úsessions_to_plotÚcolor_idÚcolor_ddÚaxon_labelsÚsessions_to_plot_idxsÚnum_sessions_to_plotÚ	xpos_listÚxpos_counterÚxpos_labelsr¦  rp  rH   Úsession_types_nums_listr  r£   )r¬   rÈ   rN  rÉ   rp  rß   r«   rz  r¤   Úplace_cell_dropout_test|  sà   


 %

."("

*"$
"*

*"$
rç  c            `         sN  t dƒ‰t dƒ} tˆƒ}t| ƒ}‡fdd„ˆD ƒ}‡fdd„ˆD ƒ}d}|ˆv r\ˆ |¡}nˆd }d}d}|| v r€|  |¡}n| d }d}d	}	d	}
d
}d}d}d‰d‰d}d‰ d‰d‰d‰d}d	}d}d}t | ˆ¡}tƒ }d}tjtd ddd }tjtd ddd }tjtd ddd }tˆƒ}t| ƒ}dd„ | D ƒ}tjtd ddd }tjtd ddd }‡ ‡‡‡‡‡fdd„}t 	||df¡}t 	||d|f¡}t
ˆƒD ]l\}}t
| ƒD ]V\}} tjt|| ||	|
|d}!t |!|¡\}"}#}$|"jd }%||| f \}#}&||| f }'||| f }(|&jd }%tj|| d d! t¡})t |)¡d }*t t |)¡¡d }+t|*ƒ},t|+ƒ}-||| f }(||| f }'t 	|%¡}.t |%ƒD ]}/t|'|(d"|/g|d#|.|/< q¢t |.¡d$d$d%… }0t|'|(d"d"|d#}1|,dksÀ|-dkr qÀt
|*|+gƒD ]\}2}3t|3ƒ}4|"|3 }5||#|5ƒ\}6}7}8|8ˆ }9|9||||2f< |2dkrht|0d$|4… ƒ}:nt|0d$d$d%… d$|4… ƒ}:|"|: };||#|;ƒ\}<}7}=|=ˆ }>|>|||d|2 f< t |ƒD ]T}?tjjt |%ƒ|4dd&}:|"|:d$d$…f };||#|;ƒ\}@}7}=|=ˆ }A|A||||2|?f< q¼qqÀq®tj td' ||d(œ¡ d)}tjd*d+ |d	7 }t ¡ }Bd,d-g}Cd.d/g}Dd0d1g}Ed2d3g}|  || d|f¡}Fd}Gt
||gƒD ]ú\}H}I||I   t|Iƒ| d|¡}F|H}Jt dƒd$d$d%… D ]¼}2t dƒD ]ª}K|2d|K  }L||Id$d$…|Lf  !¡ }M|Fd$d$…|2f }Ntj"|Nd	d4}O|M|O }Pt|Mƒ}Q|Hdkr`|KdkrV|C|2 }Rn||2 }Rnd$}R|Kdkrx|D|2 }Sn|E|2 }St|Mƒ}Q|Bj#|Jg|Q |P|Sd	|Rd5 |Bj$|Jgt "|P¡t %|P¡d6|Sd)d7d7dd8	 |Kd	krˆ|P}T|G}Utj&j'|T|Udd$d9d:\}V}Wtj(|Wg d;¢dd<}Xt|Xƒdkrˆd=}Y|J|Y }Z|Z|Yd  }[t "|T¡}\t "|U¡}]|Bj)|Z|[|[|Zg|\|\|]|]gd>dd? |Bj*|[|Yd7  |\d |X|d@dA |P}GqâqÔqš|B +¡ }^t ,|^d |^d	 ¡}_|Bj)|_dgt|_ƒ dBdCddD |Bj-|d	 dE |B .dd	g¡ |Bj/dFdGg|d dE |B 0dHdIg¡ |Bj1dJ|d7 dK |Bj2dLˆ |dE |Bj3dM| |dE d$S )Nr•  r  r   c                    s   g | ]}|d k rˆ   |¡‘qS r–  r—  ri  r±  r£   r¤   r¤  m  r¥  zBplace_cell_and_contribution_dropout_comparison.<locals>.<listcomp>c                    s   g | ]}|d krˆ   |¡‘qS r˜  r—  ri  r±  r£   r¤   r¤  n  r¥  rD   r   r>   r   r\  r]  TFr   r¦   r§   r6   rã  r   r  rÕ  rP  ræ  r£   rÂ  rå  c                 S   s   g | ]}t | ‘qS r£   r  r  r£   r£   r¤   r¤  ¥  r¥  c                    s   |j d }tj|d}| |j¡ tj|||d}ˆdkrPtj| |ˆd\} }}|d d…d d …f }tj|| ˆddˆd ˆ ˆd	\}}}|||fS r›  rœ  r  rŸ  r£   r¤   r   ¯  s    
þzJplace_cell_and_contribution_dropout_comparison.<locals>.do_pca_and_predictrµ   rÜ  r  r  ru  r3  Nrö  r¡  zplace_cell_dropout_results.matr¤  r    r§  rô   r  r™  r   r   rš  rc  zMost contr.zLeast contr.rü  r¨  rÎ   r   r©  r  r  r…  r]  r†  r  r  r  r  r¬  râ   r­  r7   rd  r®  r®  rý  rÂ   r¿   r¯  zPlace cell dropout, )4ra   rb   r  rT   rz  rj  rW   ré  r   r*  rö   rP  rQ  r÷   rV   r  rž  rã  râ  r:  r:  rv  rk  rµ  r¶  r2  rk  rl  r   rQ   rd   r  rh  rv  r0  rÆ   r/  rÝ  r3  r4  r5  rh   r7  râ  rà  rj   rÚ  rÛ  rá  rÇ   re   rl   )`rz  rÜ   rÝ   r¸  r¹  rº  r»  r¼  r½  rW  rX  rV  r  ró  r&   r6  ru   rw   r@   r‹  ru  rÁ  r;  rÆ  rë  r<  r   rt  rÃ  rû  rr  r„  rŸ  r"  r#  r   r%  rÅ  rÆ  rA  r+  r  rB  rC  rÇ  rÈ  Úneuron_contributionsrH  Úneurons_by_contributionÚtotal_contributionr0  rD  rÉ  rÊ  rË  rž  rÍ   r  rÍ  rÎ  rü  rÐ  ÚerrrÌ  rÏ  rÑ  r×   r¾  r¿  Úcontribution_colorsrÒ  Úprevious_errors_relativerÓ  rÔ  rí  Údropout_type_idxÚlast_idxrÕ  rÖ  r×  rØ  rÙ  rI   rH   r6  r8  rJ  rK  rL  r£  rM  rN  rO  rP  rÜ  r  r£   )r¬   rÈ   rN  rÉ   rp  rß   r«   r¤   Ú.place_cell_and_contribution_dropout_comparisonX  s   



 "





*
" rð  c            (   
      s  t dƒ} t dƒ}d}tjtd ddd }tjtd ddd }tjtd	 ddd }tjtd ddd }tjtd ddd }tjtd	 ddd }i }t| ƒD ](\}}t|ƒD ]\}	}
|||
f \}}|||
f }|||
f }|jd
 }tj||
dd t	¡}t 
|¡d
 }t 
t |¡¡d
 }t|ƒ}t|ƒ}|||
f }|||
f }t |¡}t |ƒD ]}t||d|g|d||< qdt |¡ddd… }|| }|| }|d
ks¶|d
kr¼q¶||f|||
f< q¶q¤d}d}tj|d\}}ddg‰ g }t| ¡ ƒD ]x\}\}}
|||
f \} }!t| ƒ}"t |"¡}#|d g|" }$‡ fdd„|!D ƒ}%tj|#|$|%dd | d|t|
 f ¡ q t dt| ¡ ƒd ¡}&| |&¡ |j|dd |jd|d |jd |d td
gd
gdd!ˆ d
 d"d#d$td
gd
gdd!ˆ d d%d#d$g}'|j|'d& dS )'zK Is it equivalent to get the most contributing cells and only place cells? r  r   rã  rP  Træ  r£   rÂ  rå  r   r  r  ru  r3  Nrö  )r   ri  r    rô   r   r   r   c                    s   g | ]}ˆ t | ƒ ‘qS r£   rf  r  ©Úplace_cell_colorsr£   r¤   r¤  ã  r¥  z;overlap_of_place_cell_with_contribution.<locals>.<listcomp>r   rá  zM%d, %sr6   r7   r¾   r¿   z"Neuron ordered by PCA contributionrÔ  z
Place cellri  )rH   r×  ÚmarkerfacecolorrI   rØ  zNon-place cell)Úhandles)ra   rW   ré  r   rö   rV   rT   r  rž  rã  râ  r:  rb   r*  r:  rv  rQ   rd   rl  rg   rÆ   rø   r   ru  rÌ  rÇ   rf   r   rj   )(rp  rz  r6  r;  rÆ  rë  Úcell_contribution_dictrû  rr  r„  rŸ  r   rÆ  rA  r+  rÅ  r  rB  rC  rÇ  rÈ  rè  rH  ré  Úneuron_contributions_orderedÚplace_cell_bool_orderedr@   rw   r   r×   Úytick_labelsr›   ÚcontributionsÚ
place_boolrÉ  r  Úyyrp  ÚyticksrS  r£   rñ  r¤   Ú'overlap_of_place_cell_with_contribution  sl    



ÿrý  c            Q         s6  t dƒ‰t dƒ} tˆƒ}t| ƒ}‡fdd„ˆD ƒ}‡fdd„ˆD ƒ}d}d}d}d}d	}	d
‰d‰d}
d
‰d‰d‰d‰d}d}d}t | ˆ¡}tƒ }ddg}ddg}ddg}d}tjtd d	dd }tjtd d	dd }tjtd d	dd }tˆƒ}t| ƒ}‡‡‡‡‡‡fdd„}t ||df¡}t	ˆƒD ]š\}}t	| ƒD ]„\}}tj
t||||||	d}t ||¡\}}} |jd  }!|||f \}}"|"jd  }!tj||d!d" t¡}#t |#¡d  }$t t |#¡¡d  }%t|$ƒ}&t|%ƒ}'|&d ks@|'d krøq@t |&|'¡}(|&|'g |(¡})d|) d# }*|$|%g|) }+|$|%g|* },||+ }-|||-ƒ\}.}/}0|0ˆ }1|1||||)f< d }2t |ƒD ]@}3tjj|,|(d
d$}4||4 }-|||-ƒ\}.}/}0|0ˆ }1|2|17 }2qp|2| }2|2||||*f< d }2|&|! |'|! g‰ ‡ fd%d„|#D ƒ}5t |5¡t |5¡ }5t |ƒD ]¢}3|(dkrltˆ d  |( ƒ}6tˆ d |( ƒ}7tjj|$|6d
d$}8tjj|%|7d
d$}9t |8|9f¡}4ntjjt |!ƒ|(d
d$}4||4 }-|||-ƒ\}.}/}0|0ˆ }1|2|17 }2q
|2| }2|2|||d#f< q@q.d&}tjd'd(\}:};|d7 }t	||gƒD ]|\}<}=|<}>t d#ƒD ]b}?||=d)d)…|?f  ¡ }@||=d)d)…d#f  ¡ }A|@|A }Bt|@ƒ}C|<d kr`||? }Dnd)}Dt|@ƒ}C|;j|>g|C |B||? d|Dd* |;j|>gt  |B¡t !|B¡d+||? d&ddd#d,	 t"j#j$|Bd d-d.\}E}Ft"j#j$|Bd d/d.\}E}Gt |F|G¡}Htj%|Hg d0¢d	d1}Id2}J|>|J }K|K|Jd#  }Lt  |B¡}Md }N|;j&|K|L|L|Kg|M|M|N|Ngd3d#d4 |;j'|L|Jd  |Md# |I|d5d6 q
qô|; (¡ }Ot )|Od  |Od ¡}P|;j&|Pd gt|Pƒ d7d8d#d9 |;j*|d d: |; +d dg¡ |;j,d;d<g|d= d: |; -d>d?g¡ |;j.d@|d dA |;j/dBˆ |d: |;j0dC| |dD d: |: 1¡  d)S )Eá   Compare errors using the same value of place and non-place cells
        - We select the number of cells according to the minimum of place/non-place cells
        - Whichever group has more cells, randomize a selection of them (same amount of shuffles as the "random" comparison)
    r  r   c                    s   g | ]}|d k rˆ   |¡‘qS r–  r—  ri  r±  r£   r¤   r¤    r¥  z2place_cell_dropout_same_number.<locals>.<listcomp>c                    s   g | ]}|d krˆ   |¡‘qS r˜  r—  ri  r±  r£   r¤   r¤    r¥  r   r\  r]  TFr   r¦   r§   r6   r   r  r  r™  r   r   rš  rc  rP  ræ  r£   rÂ  rå  c                    s   |j d }tj|d}| |j¡ tj|||d}ˆdkrPtj| |ˆd\} }}|d d…d d …f }tj|| ˆddˆd ˆ ˆd	\}}}|||fS r›  rœ  r  rŸ  r£   r¤   r   8  s    
þz:place_cell_dropout_same_number.<locals>.do_pca_and_predictr   rÜ  r   r  r  rD   r¡  c                    s   g | ]}ˆ t |ƒ ‘qS r£   rf  r  )Úcell_type_propr£   r¤   r¤  †  r¥  r    r§  rô   Nr¨  rÎ   r©  r\  rª  r«  r…  r]  r†  r  r  r  r  r¬  râ   r­  r7   rd  r®  rµ   r®  rý  rÂ   r¿   r¯  r°  r>   )2ra   rb   rT   rz  rj  rW   ré  r   r*  rö   rP  rQ  r÷   rV   r  rž  rã  râ  r:  rX   r  rµ  r¶  rw  r•  r  r+  rQ   rd   rv  rÆ   r/  r0  rÝ  r2  r3  r·  r5  rh   r7  râ  rà  rj   rÚ  rÛ  rá  rÇ   re   rl   rk   )Qrz  rÜ   rÝ   r¸  r¹  rW  rX  rV  r  ró  r&   ru   rw   r@   r‹  ru  r¾  r¿  rÀ  rÁ  r;  rÆ  rë  r   rt  rû  rr  r„  rŸ  r"  r#  r   r%  rÅ  rü  r  rB  rC  rÇ  rÈ  Únum_cells_minÚcell_type_with_leastÚcell_type_with_mostÚcell_idxs_leastÚcell_idxs_mostrÊ  rË  rž  rÍ   r  Ú	error_avgÚitrÍ  ÚpÚnum_pÚnum_npÚ
selected_pÚselected_npr   r×   rÓ  rÔ  rí  r0  rÕ  rÖ  rØ  rÙ  rI   rJ  rÚ  rÛ  rK  rL  r£  rM  rN  rO  rP  rÜ  r  r£   )rÿ  r¬   rÈ   rN  rÉ   rp  rß   r«   r¤   Úplace_cell_dropout_same_numberö  sð    	

	


."(r  c            O         sh  t j d¡ tdƒ‰ tdƒ} tˆ ƒ}t| ƒ}‡ fdd„ˆ D ƒ}‡ fdd„ˆ D ƒ}d}d}d}d	}d
}	d}
d}d}d}d}d}d}d}d}d}t | ˆ ¡}tƒ }ddg}ddg}ddg}d}t jt	d d
dd }t jt	d d
dd }t jt	d d
dd }t jt	d d
dd }tˆ ƒ}t| ƒ}t
tj||||d|d}t  ||d f¡}tˆ ƒD ]˜\} }!t| ƒD ]‚\}"}#t|!|#ƒ ||!|#f \}$}%||!|#f \}$}&|&jd! }'tj|!|#d"d# t¡}(t  |(¡d! })t  t  |(¡¡d! }*t|)ƒ}+t|*ƒ},t  |+|,¡}-|-d$k r"t j || |"d!f< || |"df< qd|+|,g |-¡}.d|. d  }/|)|*g|. }0|)|*g|/ }1|%|0 }2||$|2ƒ\}3}4}5|5| }6|6|| |"|.f< d!}7t|ƒD ]@}8t jj|1|-dd%}9|%|9 }2||$|2ƒ\}3}4}5|5| }6|7|67 }7qŽ|7| }7|7|| |"|/f< qdqRd&}:tj t|: d' d(|i¡ d)}tjd*d+\};}<|d7 }t||gƒD ]„\}=}>d,}?|=}@td ƒD ]Ì}A||>d,d,…|Af  ¡ }B|Bt   |B¡  }Bt|Bƒ}C|=d!kr”||A }Dnd,}D|<j!|@g|C |B||A d|Dd- |<j"|B|@gd.d
ddd/d0}E|Ed1 D ]}F|F #||A ¡ |F $d2¡ qØ|Ed3  %||A ¡ |Ad!krN|B}?qNtj&j'|?|Bd
d,d4d5\}G}Htj(|Hg d6¢d
d7}Id8}J|@|J }K|K|Jd   }Lt  )|B¡}Mt  )|?¡}N|<j*|K|L|L|Kg|M|M|N|Ngd9d d: |<j+|L|Jd$  |Md  |I|d;d< q4|<j,|d d= |< -d!dg¡ |<j.d>d?g|d@ d= |< /dAdBg¡ |<j0dC|d$ dD |<j1dE| |d= |<j2dF| |d d= |; 3¡  t 4t|: dG ¡ t 4t|: dH ¡ d,S )Irþ  rÕ  r  r   c                    s   g | ]}|d k rˆ   |¡‘qS r–  r—  ri  r±  r£   r¤   r¤  ¶  r¥  z=place_cell_dropout_same_number_non_random.<locals>.<listcomp>c                    s   g | ]}|d krˆ   |¡‘qS r˜  r—  ri  r±  r£   r¤   r¤  ·  r¥  r   r\  r]  TFrä  r   r¦   r§   r6   r   r  r  r™  r   r   rš  rc  rP  ræ  r£   rÂ  rå  úinput_data_dict.npy©rß   rç   rÈ   r«   r¬   rÉ   rD   r   r  r  r   r¡  Ú)place_cell_dropout_same_number_non_randomrR  rt  r    r§  rô   Nr¨  râ   Úscott)ÚwidthsÚ	showmeansÚshowextremaÚshowmediansÚ	bw_methodÚbodiesçš™™™™™Ù?Úcmeansr  r  r…  r]  r†  r  r  r  r  r7   rd  r®  rµ   r®  rý  rÂ   r¿   zPrediction error %s (cm)zSame number dropout, re  ú.svg)5rW   rµ  Úseedra   rb   rT   rz  rj  ré  r   r   r   r*  rö   rm   rV   r  rž  rã  râ  r:  rX   rl  r  r¶  r2  rk  rl  r   rQ   rd   rv  ro  rÆ   Ú
violinplotÚset_facecolorÚ	set_alphaÚset_edgecolorr3  r4  r5  r0  rh   r7  rj   rÚ  rÛ  rá  rÇ   re   rl   rk   rt  )Orz  rÜ   rÝ   r¸  r¹  rW  rX  rV  r  ró  rN  rç   rß   r¬   r«   rÉ   rÈ   ru   rw   r@   r‹  ru  r¾  r¿  rÀ  Úshuffling_samplesr;  rÆ  rë  Úinput_data_dictÚdo_pca_and_predict_partialrt  rû  rr  r„  rŸ  r   r#  rü  rÅ  r  rB  rC  rÇ  rÈ  r   r  r  r  r  rÊ  rË  rž  rÍ   r  r  r  rÍ  rƒ  r   r×   rÓ  rÔ  Úprev_errorsÚxx_posr0  rÕ  rÙ  rI   ÚpartsÚpcrJ  rK  rL  r£  rM  rN  rO  rP  r£   r±  r¤   r     sÜ    
ÿ





"$r  c            A         sâ  t dƒ} t dƒ} t dƒ}g d¢}t| ƒ‰ t|ƒ‰d}|| v rH|  |¡}n| d }d}d}||v rl| |¡}n|d }d}d}d}d}d}	d	}
d
}d}d}d}d}d}t || ¡}tƒ }ddg}ddg}ddg}d}d}d}t|| ƒ‰tj|||d\}}t 	|¡}t 
|¡| }t 
|¡| }t|ƒ‰tjtd d	dd }tjtd d	dd }tjtd d	dd }t| ƒ‰ t|ƒ‰dd„ |D ƒ}tjtd d	dd }tjtd d	dd }t ˆ ˆdf¡} t ˆ ˆd|f¡}!t ˆ ˆdˆf¡‰t| ƒD ]p\}"}#t|ƒD ]Z\}$}%tjt|#|%||||
d}&t |&|	¡\}'}(})|'jd }*||#|%f \}(}+||#|%f },||#|%f }-|+jd }*tj|#|%dd  t¡}.t |.¡d }/t t |.¡¡d }0t|/ƒ}1t|0ƒ}2|1dks|2dkrÒqt|/|0gƒD ]z\}3}4t|4ƒ}5|'|4 }6|'jd }7tj|5d!}8|8 |6j¡ tj|6|8|5d"}9|d	krJtj|(|9|d#\}(}:};|9d$d%…d$d$…f }<tj|<|(||d
d&\}=}>|>ˆ|"|$|3d$d$…f< |#|krÞ|%|krÞ|3dkrútd'|#|%|1|2f ƒ tj |+d$d%…d$d$…f |(||d$d( |d7 }t! "¡  #d)|* ¡ t!j$d*d+ |d7 }t! %||>¡ tj |9d$d%…d$d$…f |(||d$d( |d7 }t! "¡  #d,|3 ¡ qÞqqðt!j$d-d+ |d7 }t! "¡ }?‡ ‡‡‡fd.d„t dƒD ƒ}@tj&|@|||?d
||d/}?|d7 }t || ¡}|?j#d0| | d1d2 d$S )3z" Dropout tests based on cell type r  rµ   r   rä  r   r   r\  r]  TFr   r   r  r  r™  r   r   rš  rc  rD   r^  r_  rP  ræ  r£   rÂ  rå  c                 S   s   g | ]}t | ‘qS r£   r  r  r£   r£   r¤   r¤  ¬  r¥  z5place_cell_dropout_segment_length.<locals>.<listcomp>rÜ  Úlosonczyr  rà   rå   rÞ   Nr   rb  zExample M%d S%d, P:%d NP:%dr4   zAll cells %d)r6   ri  rô   zCell Type %drd  c                    s0   g | ](}ˆd d …d d …|f   ˆ ˆ ˆf¡‘qS rf  rg  ri  ©rÜ   rk  rÄ  rÝ   r£   r¤   r¤  ý  r¥  rm  rq  r³   r7   )'ra   rb   r  rT   rz  rj  r  ru  rW   rv  rw  ré  r   r*  rö   rP  rQ  r÷   rV   r  rž  rã  râ  r:  r   rú   rû   rü   r  r
  rx  rm   rU   rQ   r  rl   rd   rh   ry  )Arp  rz  rº  r»  r¼  r½  rW  rX  rV  r  ró  rN  rß   r&   ru   rw   r@   r‹  ru  r¾  r¿  rÀ  rÁ  r{  r|  r}  r~  r  r;  rÆ  rë  r<  rt  rÃ  rû  rr  r„  rŸ  r"  r#  r   r%  rÅ  rÆ  rA  r+  r  rB  rC  rÇ  rÈ  r0  rD  rÉ  rÊ  rÛ   r*  rË  rü  rÎ   rœ   r†  r‡  r×   rŠ  r£   r'  r¤   Ú!place_cell_dropout_segment_length^  s¼    





,,r(  c            A         s¼  t dƒ} t dƒ} t ddƒ} t dƒ}g d¢}g d¢}t ddƒ}t| ƒ‰ t|ƒ‰d}|| v rd|  |¡}n| d }d}d}||v rˆ| |¡}n|d }d}d}d}d	}d
}	d}
d}d}d}d}d}d}t || ¡}tƒ }ddg}ddg}d}d}d	}t|| ƒ‰tj|||d\}}t 	|¡}t 
|¡| }t 
|¡| }t|ƒ‰tjtd ddd }tjtd ddd }tjtd ddd }t| ƒ‰ t|ƒ‰dd„ |D ƒ}tjtd ddd }tjtd ddd }g d¢}t ˆ ˆt|ƒdˆf¡‰t| ƒD ]Ä\} }!t|ƒD ]®\}"}#tjt|!|#||||
d }$t |$|	¡\}%}&}'|%jd }(||!|#f \}&})||!|#f }*||!|#f }+|)jd }(t |(¡},t |(ƒD ]}-t|*|+d!|-g|d"|,|-< q„t 	|,¡d#d#d$… }.t|*|+d!d!|d"}/t|ƒD ]Ü\}0}1t|(|1d%  ƒ}2t|ƒD ]¸\}3}4|4dkr|.d#|2… }5n |4dkr2|.d#d#d$… d#|2… }5|%|5 }6t |6|2¡}7|dkrftj|&|7|d&\}&}7}8|7d#d'…d#d#…f }9tj|9|&||dd(\}:};|;ˆ| |"|0|3d#d#…f< qòqÒqqðt|ƒ}<tj|<dd|<d' fd)\}=}>|d7 }t|>ƒD ]Š\‰}?‡ ‡‡‡‡fd*d„t dƒD ƒ}@tj|@|||?d||d+}?|? d#¡ |? d,|ˆ  ¡ ˆdkr\|? ¡  ¡  ˆ|<d krì|? d#¡ qìt || ¡}|=jd-| | dd. |=j d/d0d1d2d3d4d5 |= !¡  d#S )6z/ Segment length taking different types of cell r  rµ   r   rä  rè  ri  r   r   r\  r]  TFr   r   r  ÚMostÚLeastr   r   rã  r^  r_  rP  ræ  r£   rÂ  rå  c                 S   s   g | ]}t | ‘qS r£   r  r  r£   r£   r¤   r¤  S  r¥  z*dropout_segment_length.<locals>.<listcomp>)r    rÓ  r   éP   r”  rD   rÜ  ru  r3  Nrö  r”  rÞ   r   rb  rô   c                    s2   g | ]*}ˆd d …d d …ˆ|f   ˆ ˆ ˆf¡‘qS rf  rg  ri  ©rÜ   rk  ÚpidxrÄ  rÝ   r£   r¤   r¤  ¥  r¥  rm  zProportion: %dz+Dropout by contribution, %d mm seg length, r7   gš™™™™™©¿râ   zSegment Length Proportionr    rê  rh  )r8   rì  Úrotation)"ra   rb   r  rT   rz  rj  r  ru  rW   rv  rw  ré  r   r*  rö   rP  rQ  r÷   rV   r:  Úget_pca_from_datar
  rx  rQ   rd   ry  re   rl   Ú
get_legendrm  rf   rc   r7  rk   )Arp  rz  rº  r»  r¼  r½  rW  rX  rV  r  ró  rN  rß   r&   ru   rw   r@   r‹  ru  Úneuron_labelsÚneuron_colorsr6  r{  r|  r}  r~  r  r;  rÆ  rë  r<  Ú	prop_listrû  rr  r„  rŸ  r"  r#  r   r%  rÅ  rÆ  rA  r+  rè  rH  ré  rê  ÚpropidxÚpropÚnum_neurons_propÚntypeidxÚntypeÚneuron_idxsÚpca_input_data_dropoutÚpca_data_dropoutrÎ   rœ   r†  r‡  Únum_proportionsr   rÕ   r×   Úsegment_best_worst_listr£   r,  r¤   Údropout_segment_length  sÀ    








&$ÿ

r>  c            4      C   s  d} d}d}d}d}d}d}d}d}d}	d	}
d
}d}d}g d¢}g d¢}g d¢}g d¢}|}t  t| |||||||¡	\}}|dd…dd…f }t j|||
|d\}}}tj||d}|d7 }|jdd}t j|||d|	dd|dd	}| ¡  tj||d}|d7 }|jdd}t j|||d|	dd|dd	}| ¡  d}|d|…dd…f }t j	|||
|dd\}}t |¡ |d7 }t
 t|ƒ¡|
 }t ||¡ tjddd tjddd t j|||
|d\}}|| }t  |¡}t|ƒd } ||d |d … }!tt|!ƒ|  ƒ}"|! | |"f¡}!|jd }#|dd…|d |d …f }| |#| |"f¡}d}$d}%t
 ||$ ||$d  ¡}&|!|$ }'|dd…|$f }(t
 ||% ||%d  ¡})|!|% }*|dd…|%f }+tj||d}|d7 }|jdd}t j|(|'|dddddddddd  t j|+|*|dddddddddd  | ¡  t
j|"td!}d},t| ƒD ]ˆ}-|dd…|-dd…f }.|-|$krbq:t|-d | ƒD ]N}/|/|%kr‚qp|dd…|/dd…f }0t
jj|0|. dd"}1||17 }|,d7 },qpq:||, }t |¡ |d7 }t
 |"¡|
 }t ||¡ tjddd tjd#dd dS )&z› Function to test the "within session PCA segment distance" functionally in a single session.
    
        Basic idea is to analyze distances within a PCA r6   r   r   r\  r]  Tr´   r   r¨  r   Fr   r©  rª  r®  rµ  Nr¹  rô   rÕ  r  r  r  ©r®  r»   r7   z!PCA variance per bin (normalized)r   rö  rD   rÆ  )	r  rw   rÆ   r5   r¹   r"   Ú
angle_azimr   r   rV  rü  zPCA distance (AU)r”  rb  )rT   rº  rQ  rî  rQ   r  r%  rï  ri   Úget_pca_variance_by_binrW   rg   rb   rh   ÚxlabelÚylabelrH  Úget_round_endtimesr  rh  rV   r*  r  ra   r^   r_   rm   rx  )4rr  rŸ  rW  rX  rV  r  ró  ru   r@   rw   r#   rz   rN  r&   r»  r¼  r½  r¾  r¿  rü  r   rœ   rE  rþ  rÎ   r   r×   Únum_pca_compÚpca_distance_by_binr  rI  rž  Únum_full_roundsÚposition_by_roundÚnum_bins_per_roundrç   Úround1Úround2Úround1_idxsÚ
round1_posÚround1_dataÚround2_idxsÚ
round2_posÚround2_dataÚcounterÚr1r+   r  r,   Úpca_distr†  r‡  r£   r£   r¤   Ú#within_session_pca_segment_distanceº  sÀ    ÿÿ	


ÿ
ÿ

      rU  c            2      C   sÖ  t  d¡} t  dd¡} t| ƒ}t  d¡}t|ƒ}d}d}d}d}d}d}	d}
d	}d
}d}d}d}d}d}d}d}t|| ƒ}t  |||f¡}g d¢}t| ƒD ]¨\}}t|ƒD ]–\}}t t||||||||¡	\}}|d |…d d …f }|dkrt 	||||¡\}}n"|dkr(tj
|||||d\}}||||f< t |||¡}q¬qœ|dkrVd}n"|dkrx|rld} nd} d|  }g d¢}!t|!ƒD ]ä\}}|| vržqˆt |	¡}"|	d7 }	t ¡ }#t  |¡| }$t  |¡}%t|ƒD ]>\}}|||d d …f }&|%|&7 }%tj|$|&d| dddd qØ|%t|ƒ }%|#jdd	d |#j|dd |#jd | d!d tj|$|%d"d# |" ¡  qˆt |	¡}"|	d7 }	t ¡ }#t  |¡| }$t| ƒD ]@\}}t j||d d …d d …f d$d%}&tj|$|&d&| d"d' qž|# ¡  |#jdd	d |#j|dd |#jd(d!d |" ¡  d)}'d*}(t |	¡}"|	d7 }	t ¡ }#t  |¡| }$t  |¡})t  |¡}*t| ƒD ]`\}}t j||d d …d d …f d$d%}&|dk r¦|)|&7 })|'}+n|*|&7 }*|(}+tj|$|&d+|+d, qf|)d })|*d }*tj|$|)d-| d"|'d. tj|$|*d/| d"|(d. |# ¡  |#jdd	d |#j|dd |#jd0d!d |" ¡  d)},d*}-d1}.t |	¡}"|	d7 }	t ¡ }#t  |¡| }$t  |¡}/t  |¡}0t  |¡}1t|ƒD ]š\}}t j|d d …|d d …f d$d%}&|d2v rê|/|&7 }/tj|$|&d+|,d, nJ|d3v r|0|&7 }0tj|$|&d+|-d, n$|d4v rœ|1|&7 }1tj|$|&d+|.d, qœ|/d }/|0d }0|1d" }1tj|$|/d5| d"|,d. tj|$|0d6| d"|-d. tj|$|1d7| d"|.d. |# ¡  |#jdd	d |#j|dd |#jd8d!d |" ¡  d S )9Nr  rµ   r   r   r\  r]  TrÁ  r   r    Fr   r   ÚvariancerÜ  r  rÂ  r$  r?  zSegment PCA distance (AU)z (normalized)rò  zPCA variance per bin)r   rD   r6   r>   zS%drþ  rÍ  )rI   rÃ  r¹   rH   r»   r7   ró   zMouse %drQ  rD   r  r   rü  úM%d)rI   rÃ  zAll sessions averager   r   rÄ  )r¹   rH   ÚVD)rI   rÃ  rH   ÚDDzVD vs DDr  rä  rè  )ri  r  ÚBaselineÚAirpuffÚProbezBy trial type)rW   rg   rb   r  rn  rö   rT   rº  rQ  Úget_pca_distance_by_binrA  Úget_segment_valuesrQ   r  r  r*  rh   rf   re   rl   rk   rÜ  rj   )2r  Úmtotr  ÚstotrW  rX  rV  r  ró  ru   r@   rw   r#   rN  rE  r&   Úmeasure_typeÚmeasure_normalizer!  Únum_pca_binsÚsegment_distance_storerÙ  rû  rr  r„  rŸ  rü  r   rE  rF  Úsegment_sizesrÑ  ÚextraÚ
mlist_plotr   r×   r  Úpcadist_avgÚpcadistÚvdcolorÚddcolorÚvdÚddrH   ÚbbcolorÚapcolorÚppcolorÚbbÚapÚppr£   r£   r¤   Ú&pca_segment_distance_multiple_sessionsS  sú    







 

 



 


rt  c            &         sJ  dg} dg}d}d}d}d}d}dddd	d
ddddddd
dddd
ddœ‰t  | |ˆt¡\}}‰‰ dd„ ‰d.‡‡fdd„	‰d/‡fdd„	}	tˆƒ}
|	ˆˆ d
d\‰‰t d¡ ttˆƒƒD ]8}t ˆ| ¡ tjddd tj	ddd t 
d¡ q¶d}t|ƒD ] }tt|
ƒƒ}tj |¡ |dt|
d ƒ… }|t|
d ƒd… }‡fdd„|D ƒ}‡fd d„|D ƒ}ˆ||ƒ\}}‡fd!d„|D ƒ}‡fd"d„|D ƒ}ˆ||ƒ\}}t j|||||d#\}}}}}‡fd$d„|D ƒ}‡ fd%d„|D ƒ}ˆ||d
d\}}‡fd&d„|D ƒ}‡ fd'd„|D ƒ}ˆ||d
d\}}t j|||||d#\} }!}"}}#|d(k rütj||d)}$|d7 }|$jd*d+}%t j|||%d,|dd
|d
d-	}%t j|||%d,|dd
|d
d-	}%|% ¡  tj||d)}$|d7 }|$jd*d+}%t j|!| |%d,|dd
|d
d-	}%t j|"| |%d,|dd
|d
d-	}%|% ¡   qüt||#ƒ ttˆƒˆ d( jˆd( jƒ dS )0z' Testing the trial randomizer function r6   rD   r   r´   r   r¨  r   r   r\  FTr   r„  r]  r§   N)rß   rW  rX  rV  r  ró  r  r«   r  rÉ   rY  r  r  ré   r  r¬   r  c                 S   sd   g }|d j d }t| ƒ}t |df¡}t|ƒD ]$}| | | ¡ t ||| f¡}q0t |¡|fS )a_   Reverse of "slice_data_by_trial 
            position_by_trial must be a list of length "num trials", each element the position for one trial of size "round length" (might vary per round)
            data_by_trial must be a list of length "num trials", each element a data matrix of size "num_neurons" X "round length" (might vary per round)
        r   )rV   rb   rW   rn  ra   r¥  r+  rw  )Úposition_by_trialÚdata_by_trialÚposition_jointrÛ   Ú
num_trialsÚ
data_jointÚtrialr£   r£   r¤   Újoin_data_by_trialO  s    z1trial_randomizer_test.<locals>.join_data_by_trialc                    s&   ˆ | |ƒ\}}t  |ˆd ¡}||fS )Nr  )rT   r/  )ru  rv  Ú	trim_endsÚposition_allÚdata_allÚpca_data_all)r{  Ú
param_dictr£   r¤   Úget_pca_from_data_by_trial_  s    z9trial_randomizer_test.<locals>.get_pca_from_data_by_trialc                    s.   ˆ | |dd\}}t j|||d\} }| |fS )NF©r|  )rT   Úslice_data_by_trial)ru  rv  r|  r}  r  Úpca_by_trial)r  r£   r¤   Ú#get_pca_by_trial_from_data_by_triald  s    zBtrial_randomizer_test.<locals>.get_pca_by_trial_from_data_by_trialr‚  r”  z Time (Discontinuous, normalized)r7   r»   zAll trials for M5,S2c                    s   g | ]}ˆ | ‘qS r£   r£   ©r   r›   ©Úposition_by_trial_wholer£   r¤   r¤  }  r¥  z)trial_randomizer_test.<locals>.<listcomp>c                    s   g | ]}ˆ | ‘qS r£   r£   r†  ©Úpca_by_trial_wholer£   r¤   r¤  ~  r¥  c                    s   g | ]}ˆ | ‘qS r£   r£   r†  r‡  r£   r¤   r¤    r¥  c                    s   g | ]}ˆ | ‘qS r£   r£   r†  r‰  r£   r¤   r¤  ‚  r¥  rë   c                    s   g | ]}ˆ | ‘qS r£   r£   r†  ©ru  r£   r¤   r¤  ‰  r¥  c                    s   g | ]}ˆ | ‘qS r£   r£   r†  ©rv  r£   r¤   r¤  Š  r¥  c                    s   g | ]}ˆ | ‘qS r£   r£   r†  r‹  r£   r¤   r¤  Ž  r¥  c                    s   g | ]}ˆ | ‘qS r£   r£   r†  rŒ  r£   r¤   r¤    r¥  r   rô   rÕ  r  r  r  )F)F)rT   Úload_data_by_trialrQ  rb   rQ   r  ra   rh   rB  rC  rÑ  rk  rW   rµ  r©   r  r  r%  rï  ri   rm   rV   )&rp  rz  ru   r@   rw   r#   rz   Ú
mnum_labelÚ
snum_labelr…  rx  ÚdrG  ÚsampleÚ
trial_idxsÚidxs1Úidxs2Úposition1_sharedÚpca1_sharedÚposition2_sharedÚpca2_sharedrE  rc  re  Úpca_diffÚpca_diff_avg_sharedÚposition1_separateÚdata1_separateÚpca1_separateÚposition2_separateÚdata2_separateÚpca2_separateÚposition_bins_separateÚpca1_average_separateÚpca2_average_separateÚpca_diff_avg_separater   r×   r£   )rv  r  r{  r€  rŠ  ru  rˆ  r¤   Útrial_randomizer_test  sœ    æ 

ÿÿÿÿ
r¥  c            ]         sB  d} d}g d¢‰g d¢}t tˆƒƒ}‡fdd„|D ƒ‰ t t¡}dd„ |D ƒ}t|ƒ dd„ }t|ƒ}‡ fd	d
„t | ƒD ƒ}t|dd… ƒD ]z\}}ˆ| }	ˆ|d  }
|	d |
 }z|t|ƒ\}}W n& tyî   t 	g ¡}t 	g ¡}Y n0 t t|ƒd ƒD ]}|| }||d  }|||… }|dd…df dk}d|v rPt 
|¡}nt|ƒ}|d|… }||d… }|dkrÎtjt|ƒ|ftdd }||dd…dd…f< tj|ˆ d}t || |g¡||< nÀt 	|| ¡}|dd…|f }t|dd…df ƒD ]z\}}||v r>t ||k¡d }||df |||d f< n:dg| |||df g dg|d |   }t ||f¡}q tj|ˆ d||< |
ˆ d kr t|ƒ}t ||f¡d }||dd…dd…f< t 	|| ¡}t ||f¡} d| | dk< tj| ˆ d||< q qŒttd ddd*}!tj|!ddtjd}"|" g d¢ˆ  dg ¡ |" g ¡ ddg}#t|dd… ƒD ]È\}}ˆ| }	ˆ|d d… }$t|$ƒD ]š\}%}
|	d |
 }z| |¡ W n tyÖ   Y q˜Y n0 |
ˆ vræq˜|d |% }&|&|% d }'|t|ƒ\}}t t|ƒd ƒD ]}|| }||d  }|||… }t 
|dd…df dk¡}|d|… }|dd…df dk}(||(dd…f })t 	|| ¡}*|*dd…|f }+|*dd…|&f },|)D ]Z\}-}.|*dd…|f }+|*dd…|&f },t|+ƒ |-¡}/t|,ƒ |.¡}0|/|0kr¾|*|/ }1|*|0 }2t |¡}3d}4t |ƒD ]V}5|1|5 }6|2|5 }7|6dkrl|7dkrl|6|7krld }4n|6dkr€|7|3|5< n|6|3|5< q4t|-ƒd! t|.ƒ }8|" ||g|8g t|1ƒ |#|4 g ¡ |" ||g|8g t|2ƒ |#|4 g ¡ |" g ¡ |4dkr¾|3|*|/< tj|*|0dd"}*q¾tj|*ˆ d||< qq˜qnW d  ƒ n1 sP0    Y  i }9t | ƒD ]>}:tj	||: td};t |;j¡}<t |;¡}=d}>t |ƒD ] }t |=dd…df dk¡d }?t|?ƒdkr|?d }@|=d|@…dd…f }A|=|@d…dd…f }=n|=}A|Adk}Btj |Bdd"}Ct !|C¡ddd… }D|A|Ddd…f }E|E}A|Ajd }Ft|:||;j|Aj|>|Ft|?ƒƒ |A|;|>|>|F …|d…f< |>|F7 }>|E|9|:|f< |;||:< q qft | ƒD ]}:tj	||: td};t |ƒD ]n}|;|;dd…|f dk|f }Gt "t #t $|G¡¡¡}Ht|HƒdkrÎt|H|:|ˆ| ƒ tt $|G¡ƒ td#ƒ qÎq°t %td$ ˆ ¡ t %td% |¡ t %td& |9¡ d}Id}:d'}Jt& '|I¡ |Id7 }It&j(d(d)\}K}Lt 	||: ¡}Mt )|Md¡d }M|M *t¡}M|Lj+|Md*d+ |L ,t -|¡d, ¡ |Lj.ˆ |Jd- |Lj/d.|Jd/ |Lj0d0|: |Jd1 d- d2}Jt& '|I¡ |Id7 }It&j(dd3d4d)\}K}N|N 1¡ }N|Kj2d5|Jd6 d- t dƒD ]Š}:|N|: }Lt 	||: ¡}Mt )|Md¡d }M|M *t¡}M|Lj+|Md*d+ |L ,t -|¡d, ¡ |Lj.ˆ |Jd- |Lj/d.|Jd/ |Lj0d0|: |Jd1 d- 	qh|K 3¡  dS ]ˆ}:tj	||: td};d}|;|;dd…|f dkdd…f }Pt|Pƒ}|Pdk}Btj |B *t¡dd"| }Q|Lj4|O|Qdd8t|:ƒd9 |L 5|O|Q¡ 
q |L ,|O¡ |Lj.ˆ |Jd- |Lj/d.|Jd/ |Lj0d:|Jd1 d- |Lj6|Jd3 d- d;}Jt& '|I¡ |Id7 }It&j(dd<d4d)\}K}N|N 1¡ }N|Kj2d5|Jd6 d- t -|¡}Ot | ƒD ]}:tj	||: td};t |d ƒD ]â}|;dd…|f dk}R|;|R|d…f }Pt|Pƒ}|Pdk}Btj |B *t¡dd"| }Qt -|| ¡}O|N| }L|Lj4|O|Qdd8t|:ƒd9 |L 5|O|Q¡ |L ,|O¡ |Lj.ˆ |d… |Jd- |Lj/d.|Jd/ |L 7ddg¡ |Lj0d=ˆ|  |Jd1 d- qLq(|Nd j6|Jd3 d- |K 3¡  t | |d f¡}St | ƒD ]È}:t |d ¡}Ttj	||: td};t d|ƒD ]†}Ud}Vd}W|;j\}}Xt |ƒD ]T}Yt d||U ƒD ]>}Z|;|Y|Zf dkrÈ|Vd7 }V|;|Y|Z|U f dkrÈ|Wd7 }WqÈq¶|W|V |T|Ud < q˜|T|S|:dd…f< qjd>}Jt& '|I¡ |Id7 }It&j(d4d)\}K}L|Lj0d?ˆ  |Jd- t -d|¡}Otj8|Sdd"}[tj9|Sdd"}\|Lj:|O|[|\d@d>d<d<ddAdBdC
 t d| ƒD ] }:|Lj5|O|S|: t|:ƒd8dD q¼|L ,|O¡ |Lj.|O|Jd- |Lj;dE|Jd- |Lj<dF|Jd- |Lj/d.|Jd/ |L 7ddg¡ |Lj6|Jd1 d- dS )Gá9   Takes the data from the tracked fibers folder to create a matrix of each fiber over sessions
        Each column contains the index of the fiber in the next session (-1 if it doesn't have a match)
        The data is indexed as (mnum : DataFrame), where the rows of the dataframe correspond to each fiber and the column to the session (the sessions are properly labeled)
            * Consecutive elements from column to column correspond to the index of the same fiber in each session
                e.g. a row like [2, 24, 12] means that fiber 2 is then labeled 24, then 12, etc.
            * A -1 is used to mark unmatched fibers
                e.g. [2, 24, -1] means the fiber was lost for the 3rd session
                e.g. [-1, 2, 24] means the fiber appeared in the 2nd sessions and wasn't there before
    
    r  )ÚB1ÚB2ÚB3ÚT1ÚTnÚP1)r   r   rD   r   rµ   r6   c                    s   g | ]}ˆ | ‘qS r£   r£   rÊ  ©Úsnames_trackedr£   r¤   r¤  Å  r¥  z:create_tracked_fibers_dict_consecutive.<locals>.<listcomp>c                 S   s$   g | ]}t j td  | ¡r|‘qS )ú\)ÚosÚpathÚisdirr   ri  r£   r£   r¤   r¤  É  r¥  c                 S   sh   t j | d | d ¡d }| t¡}|d8 }t |dd…df dk¡d }t|ƒ|jd g }||fS ©z_ Given a folder name, loads the samecell_array inside and returns the row indexes of each mice r¯  z\tracked_fiber.matÚtracked_fiber_arrayr   Nr   ©	r2  rk  Úloadmatrž  r  rW   râ  rk  rV   ©r   ÚfnameÚsamecell_arrayÚ
mouse_idxsr£   r£   r¤   Úload_samecell_arrayÎ  s    
zCcreate_tracked_fibers_dict_consecutive.<locals>.load_samecell_arrayc                    s   i | ]}|t jˆ d “qS ©©r2  ©r7  r8  rà  )Úsnamesr£   r¤   Ú
<dictcomp>Û  r¥  z:create_tracked_fibers_dict_consecutive.<locals>.<dictcomp>Nrö  r   rÁ  r   rV  rD   r½  éþÿÿÿztracked_fibers_merge.csvrã  rò  )ÚmodeÚnewlineú,ú")Ú	delimiterÚ	quotecharÚquoting)zMouse numberzSessions to mergezFibers to mergeÚStatusÚSuccesszContradiction!FTrÌ  rü  ú8These sessions have missing fibers in the tracked arraysú tracked_fibers_session_names.npyútracked_fibers_dict.npyú!tracked_fibers_dict_mnum_snum.npyr³   ©r  r   rô   Úsummer©rß  râ   r7   rÂ   r¿   rW  r6   ró   rµ   ©r½  r  úTracked arrays over sessionsrÕ  ©r  r>   r¶  ©r¹   rI   úProportion of tracked fibersr   r   úProportion from %sr    ú4Proportion of tracked cells by session interval (%s)rÎ   rÉ  r¶   ©r  rØ  r	  r
  r»  rH   r¹   ©rI   r¹   úSession intervalúFiber Proportion)=ra   rb   r°  Úlistdirr   rm   rö   ÚFileNotFoundErrorrW   rw  rÿ   r*  r  r7  r8  Úconcatrâ  ÚvstackÚopenr   ÚcsvÚwriterÚQUOTE_MINIMALÚwriterowr  r  rk  r  Údeletern  rV   r[   r•  rv  rª  rz  ÚsortÚsaverQ   r  rd   rX   rž  rÍ  rÚ  rg   rÛ  rÇ   rl   rv  rc   rk   rh   rÆ   rj   r8  rÜ  rÝ  r/  rf   re   )]rñ  rò  r  Úfolder_listr»  r+  Útracked_fibers_dictr„  rŸ  Úsname1Úsname2r¸  r¹  rº  rû  Úmidx_samecell1Úmidx_samecell2Úmouse_samecellÚsamecell_s1_boolÚnext_session_samecell_idxÚmouse_samecell1Úmouse_samecell2Útracked_array1Útracked_df1Útracked_prevÚcurrent_columnÚ	fiber_idxÚ	fiber_numÚfiber_prev_idxÚrowÚ
num_fibersÚlast_array_trackedÚtracked_updatedÚtracked_csvÚcsvwÚstatus_listÚfuture_sessionsÚs2idxÚ	s2_columnÚ column_last_consecutive_sessionsÚ
has_fibersÚmouse_samecell1_hasfibersÚtracked_arrayÚtracked_array_s1Útracked_array_s2Úneuron_s1_numÚneuron_s2_numÚneuron_s1_idxÚneuron_s2_idxÚneuron_s1_rowÚneuron_s2_rowÚ
merged_rowÚtracking_contradictionÚscounterÚconsecutive_neuronÚnon_consecutive_neuronÚntomergeÚtracked_fibers_dict_mnum_snumrr  Útracked_fibersÚtracked_fibers_orderedÚtracked_fibers_nextÚprev_row_idxÚempty_cellsÚsession_row_idxÚtracked_fibers_currentÚtracked_fibers_boolÚconsecutive_trackedÚsorted_idxsÚtracked_fibers_sortedrÉ  Útracked_sessionÚ	diffthingru   rw   r   r×   Ú
plot_arrayrÕ   r  Útracked_fibers_sessionÚtracked_fibers_propÚactive_fibersÚproportion_arrayÚproportion_listÚ
s_intervalr¿  Únum_hitsÚnum_sÚcellr¸   Úprop_avgÚprop_stdr£   )r¿  r®  r¤   Ú&create_tracked_fibers_dict_consecutive¯  sô   



,


	


&&

>



     


"

r1  c            2   	      s`  g d¢‰ d  ˆ ¡} dd„ }|t| ƒ\}}t|ƒd }tˆ ƒ}‡ fdd„t|ƒD ƒ}tt|ƒƒD ]:\}}|| }	||d  }
||	|
… }tj|ˆ d||< q^i }t|ƒD ]}tj|| t	d	}t 
|j¡}t |¡}d
}t|ƒD ]â}t |dd…d
f dk¡d
 }t|ƒd
krB|d
 }|d|…dd…f }||d…dd…f }n|}|dk}tj|dd}t |¡ddd… }||dd…f }|}|jd
 }||||| …|d…f< ||7 }||||f< |||< qàq¦t|ƒD ]}tj|| t	d	}t|ƒD ]n}||dd…|f dk|f }t t t |¡¡¡}t|ƒdkrìt|||ˆ | ƒ tt |¡ƒ tdƒ qìqÎt td ˆ ¡ t td |¡ t td |¡ d}d
}d}t |¡ |d7 }tjdd\}}t || ¡} t | d
¡d } |  t	¡} |j| dd | t |¡d ¡ |jˆ |d |jd|d |j d| |d d d}t |¡ |d7 }tjddd d\}}!|! !¡ }!|j"d!|d" d t|ƒD ]Š}|!| }t || ¡} t | d
¡d } |  t	¡} |j| dd | t |¡d ¡ |jˆ |d |jd|d |j d| |d d q†| #¡  dS ]ˆ}tj|| t	d	}d
}#||dd…|#f dkdd…f }$t|$ƒ}%|$dk}tj| t	¡d
d|% }&|j$|"|&d$d%t%|ƒd& | &|"|&¡ q| |"¡ |jˆ |d |jd|d |j d'|d d |j'|d d d(}t |¡ |d7 }tjdd)d d\}}!|! !¡ }!|j"d!|d" d t |¡}"t|ƒD ]}tj|| t	d	}t|d ƒD ]â}#|dd…|#f dk}'||'|#d…f }$t|$ƒ}%|$dk}tj| t	¡d
d|% }&t ||# ¡}"|!|# }|j$|"|&d$d%t%|ƒd& | &|"|&¡ | |"¡ |jˆ |#d… |d |jd|d | (d
dg¡ |j d*ˆ |#  |d d qjqF|!d
 j'|d d | #¡  t )||d f¡}(t|ƒD ]È}t )|d ¡})tj|| t	d	}td|ƒD ]†}*d
}+d
},|j\}%}-t|%ƒD ]T}.td
||* ƒD ]>}/||.|/f dkræ|+d7 }+||.|/|* f dkræ|,d7 },qæqÔ|,|+ |)|*d < q¶|)|(|dd…f< qˆd+}t |¡ |d7 }tjd d\}}|j d,ˆ  |d t d|¡}"tj*|(d
d}0tj+|(d
d}1|j,|"|0|1d-d+d)d)dd.d/d0
 td|ƒD ] }|j&|"|(| t%|ƒd%d1 qÚ| |"¡ |j|"|d |j-d2|d |j.d3|d |jd|d | (d
dg¡ |j'|d d dS )4r¦  )r©  rª  r«  r¬  rr  c                 S   sh   t j | d | d ¡d }| t¡}|d8 }t |dd…df dk¡d }t|ƒ|jd g }||fS r³  rµ  r·  r£   r£   r¤   r»  x  s    
zEcreate_tracked_fibers_dict_single_folder.<locals>.load_samecell_arrayr   c                    s   i | ]}|t jˆ d “qS r¼  r¾  rà  r­  r£   r¤   rÀ  ˆ  r¥  z<create_tracked_fibers_dict_single_folder.<locals>.<dictcomp>r½  rV  r   Nrö  rü  rË  rÌ  rÍ  rÎ  r³   rÏ  rô   rD   rÐ  rÑ  râ   r7   rÂ   r¿   rW  r6   ró   rµ   rÒ  rÓ  rÕ  rÔ  rÁ  r¶  rÕ  rÖ  r   r   r×  r    rØ  rÎ   rÉ  r¶   rÙ  rÚ  rÛ  rÜ  )/r#  r   rb   ra   rö   r7  r8  rW   rw  r  rn  rV   r[   râ  r•  rv  rª  rz  rç  rm   rè  r   rQ   r  rd   rX   rž  rÍ  rÚ  rg   rÛ  rÇ   rl   rv  rc   rk   rh   r  rÆ   rj   r8  r*  rÜ  rÝ  r/  rf   re   )2Úfolder_namer»  r¹  rº  r  r+  rê  rû  rr  ÚidxstartÚidxendrï  r  r  r  r  r  r„  r  r  r  r  r   r!  r"  rÉ  r#  r$  ru   rw   r   r×   r%  rÕ   r  rŸ  r&  rü  r'  r(  r)  r*  r+  r¿  r,  r-  r.  r¸   r/  r0  r£   r­  r¤   Ú(create_tracked_fibers_dict_single_folderg  s2   





	     


"

r5  c                 C   sF  i }i }i }i }d}d}d}d}	d}
d}d}| D ]Ð}|D ]Æ}t jt||||||
||d	}t  ||	¡\}}}|dkrˆt j|||d\}}}||f|||f< |jd	 }tj|d
}| |j	¡ t j
|||d}||f|||f< |j}||||f< |j}||||f< q8q0t td |¡ t td |¡ t td |¡ t td |¡ dS )z5 Convenience function to pre-compute PCA information r   r\  r]  TFr   ©rM  rN  rß   rÞ   r   rà   rå   r  rP  rÂ  rå  N)rT   rP  rQ  r÷   r
  rV   r   rú   rû   rü   r  r	  rý   rW   rè  r   )rp  rz  r;  rÆ  rë  r   rW  rX  rV  r  ró  rN  rß   rr  rŸ  r"  r#  r   r%  rÎ   rÛ   r*  rü  rA  r+  r£   r£   r¤   Úsave_pca_data„   sB    ÿ
r7  c                  C   s¾   t  g d¢g d¢g d¢g¡} t  g d¢¡}t| ƒ t| |ƒ}td| ƒ t| |dd}td| ƒ t| |dd	gd
}td| ƒ t| |dd	gd}td| ƒ t| |ddd}td| ƒ d S )N)râ   r   rö  )r  gÍÌÌÌÌÌô?r¶  )g333333ó¿r  r   )r¶  rÄ  r†  z0All neurons and dims. Expected: 2.545, Got: %.3fr   )r4  z/All neurons and dims. Expected: 2.41, Got: %.2fr   )r5  ©r4  r5  )rW   rw  rm   r:  )r!  r+  Úresult1r£   r£   r¤   Útest_get_PCA_contributionÉ   s    
r:  c                  C   s   dddddddœ} | S )z] Returns title labels for each type of contribution from the "get_PCA_contribution" function ÚPCA1zPCA1-3z50% varzweighted PCAzweighted 50% varzweighted relative)rK  rL  rM  rã  rN  rO  r£   )ru  r£   r£   r¤   rj  å   s    ûrj  ru  rã  c                 C   s  t |ƒtttjfv r|g}t |ƒtttjfv r4|g}| }t |¡}|dkrZ| | }|| }|dkrr|dd…|f }t |¡}|d dkr²|dd… }tjt | ¡ddd}|| }|dkrÞt |ddd…f |¡}t |¡}	n®|d	krþt |d
dd…f ¡}	nŽ|dkr$t |dd…dd…f ¡}	nh|dv r„t 	t 
|¡dk¡}
|dkrd|d|
… }t |¡}	n|dkrŒt||t|
ƒdd}	ntdƒ |	S )aÁ   Returns PCA contribution for those selected neurons
        components must be matrix of size "num PCA dims" X "num neurons"
        variance_explained must be a 1d array of size "num PCA dims"
        neurons and PCAdims can be "all", an int indicating the dimension to keep, or a list of ints
        For more than one neuron, it returns the sum of the weighted contributions of each
        
        ctype can be:
            'w': the weight scaled by the variance explained of that dimension
            '1': weight of the 1st dimension
            '3': sum of the weights of the first 3 dimensions
            '50': sum of the weights of the dimensions that explain 50% of the variance
            '50w': sum of the weighted of the dimensions that explain 50% of the variance scaled by the variance explained of that dimension

            if an 'r' is added at the end, the weights are normalized by the total weight sum for that dimensions
        
    ru  Nrö  Úrr   T)rÀ   Úkeepdimsrã  rK  r   rL  r   ©rM  rN  râ   rM  rN  )r4  r6  z2Error: no recognized contribution method specified)r  r  r  rW   r  r[   r6  r•  Údotrÿ   rþ   r:  ra   rm   )rA  r+  r4  r5  r6  Ú
pcaweightsÚvariance_arrayÚpcaweightssumÚweighted_contributionrê  r-  r¬  r£   r£   r¤   r:  ò   s@    





r:  rK  c           (         sÄ  t jtd dd‰ t jtd ddd }‡ fdd„ttˆ ƒƒD ƒ}t jtd ddd }t jtd	 ddd }t|ƒ}	| d
u rˆt  |	¡} |d
u rœttˆ ƒƒ}‡ fdd„|D ƒ}
g }g }| D ]þ}t j|| td}|jd }t	|
d
d… ƒD ]Ê\}}|t|
ƒ| kr qº|
||  }| 
|¡}| 
|
||  ¡}|||f }|||f }|||f }|||f }|dkrþt|ƒD ]‚}|||f }|||f }|dkrv|dkrvzü|dv r‚t  t  |¡dk¡}t  t  |¡dk¡}t  ||¡}t  ||jd |jd ¡}t  |d
|…|f ¡} t  |d
|…|f ¡}!|dkrNt  | ¡}"t  |!¡}#n2|dkr¢t||t|ƒ|d}"t||t|ƒ|d}#n t||||d}"t||||d}#W n> tyâ   t|||
| |
ƒ td|||||j|jƒ Y n0 | |"¡ | |#¡ qvqìg }$g }%t|ƒD ]F}|||f }|||f }|dkr|dkr|$ |¡ |% |¡ qt j |$¡ t j |%¡ t|$|%ƒD ]>\}&}'t|||&|d}"t|||'|d}#| |"¡ | |#¡ qxqìqº||fS )aÑ   
        session_num_list must be the list of session numbers *ACCORDING TO THEIR ORIGINAL ORDER, WITHOUT SKIPPING*
    
        interval: interval in the session_num_list that is considered
        random: if True, the contribution vectors will not take tracked cells into account, hence be (in principle) random 
        ctype: contribution type (always absolute PCA weight is considered)
            '1': Only the first PC dimension is considered
            '3': Sum of first 3 PCs
            '50': Sum of the PCs that explain 50% of variance
            'w': Weighted sum of all PCs by the explained variance
            '50w': Sum of the PCs that explain 50% of variance, weighted by their explained variance
    rÌ  Træ  rÍ  r£   c                    s   g | ]}t  ˆ | ¡‘qS r£   ©r   r  ri  r­  r£   r¤   r¤  I!  r¥  z>get_contribution_vectors_from_tracked_data.<locals>.<listcomp>rP  rÂ  Nc                    s   g | ]}t  ˆ | ¡‘qS r£   rD  ri  r­  r£   r¤   r¤  V!  r¥  rV  r   rö  Fr>  râ   rM  rN  r8  )r5  r6  zError!)rW   ré  r   ra   rb   rg   rw  r  rV   rö   r  rÿ   rþ   r   r  r6  r•  r:  Ú
IndexErrorrm   rø   rµ  r©   rs  )(rp  Úsession_idx_listÚintervalrµ  r6  rê  Úsession_num_list_trackedr;  rÆ  rÜ   Úsession_num_listÚcontribution1Úcontribution2rr  r  Únum_neurons_all_sessionsr„  rŸ  Ú	snum_nextÚsidx_trackedÚsidx_tracked_nextÚcomponents_currentÚcomponents_nextÚvariance_explained_currentÚvariance_explained_nextÚ	row_indexÚfidx1Úfidx2Údim_for_50_1Údim_for_50_2r)  r-  Úweights1Úweights2Úweight1Úweight2Úlinked_neurons_1Úlinked_neurons_2Ún1Ún2r£   r­  r¤   Ú*get_contribution_vectors_from_tracked_data8!  s†    










ra  c                 C   s  d}t  |¡ |d7 }t jdd\}}	|	j| |dd tj | |¡\}
}}}}tj| ||	dd\}}	|	 	¡ }|	 
¡ }t d|d	 ¡}t d|d	 ¡}t j||d
ddd |	j||d |	j||d |	jd|d |	jd|d |	jd||f |d |	j|d d |||	fS )Nr³   r   rÔ  rô   r   r  r  r   rö  rÌ  rÍ  râ   rF  r7   r¾   r¿   rÂ   zTracked Fibers, M%s, S%srµ   )rQ   r  rd   rÆ   r2  r3  r   rT   ry  râ  r9  rW   rà  rh   rf   re   rÇ   rl   rj   )rJ  rK  rp  Úsession_names_listru   rB  rC  rw   r   r×   r  r  r“  rK  ÚstderrrÜ  Úylimsr  rû  r£   r£   r¤   Úplot_tracked_contributions±!  s$    re  c            %         sÈ  t j d¡ t jtd dd} t| ƒ}d‰ d}g d¢}d}d}d	d
ddddddœ}g d¢}d	dg}g d¢}g }	|D ]È‰ i }
t|ƒD ]¬\}}tt| ƒƒ‰‡ ‡fdd„t|ˆ  ƒD ƒ}|d	krÌd}d}|| }n|}d}|}g }t|ƒD ]@\}}td|ˆ ||d\}}t	j
 ||¡\}}}}}| |¡ qä||
|< q‚|	 |
¡ qrd}tjdd\}}|d7 }t  |¡d }t|ƒD ]¬\}‰ || }|	| }
t|ƒD ]ˆ\}}|
| }|| } |dkrº|| }!nd}!|gt|ƒ }"|j|"|| d|!d t  |¡}#t  |¡}$|j|g|#|$d dddd!| dd"
 qŽqn| |d d# |d$ d# g¡ |j||d% | | ¡ d dg¡ |jd&|d' |jd(|d) |jd*|d' |jd+|d) |jt| ƒ|d d) | ¡  |j|d, d) dS )-zÌ Analyze the contributions of individual cells to the low-dimensional representation and their changes with time 
        "create_tracked_fibers_dict" must have been run in the same folder beforehand
    r   rÌ  Træ  r   r\  )r   rD   r   r³   rµ  ÚPC1zsum of PC1-3zweighted sum of PCszsum of 50% var componentszweighted sum of 50% varzWeighted relative)rµ  rK  rL  rã  rM  rN  rO  )rµ  rK  rL  rã  rM  rN  rã  )rÍ  r   r   r  ÚgoldÚ
bluevioletÚ	turquoisec                    s(   g | ] ‰ ‡ ‡fd d„t ˆd ƒD ƒ‘qS )c                    s   g | ]}ˆˆ |  ‘qS r£   r£   )r   rŒ  )rF  Úsidxsr£   r¤   r¤  ð!  r¥  z5analyze_tracked_fibers.<locals>.<listcomp>.<listcomp>r   r]  )r   ©rG  rj  )rF  r¤   r¤  ð!  r¥  z*analyze_tracked_fibers.<locals>.<listcomp>rK  FN)rp  rF  rG  rµ  r6  r    )r6   r>   rô   r   r¶   r[  rÎ   rD   )r¹  r  rØ  r	  r
  r»  rH   r¹   râ   rö  )r  r¾   r¿   rÛ  r7   rÂ   zR valuer6   )rW   rµ  r  ré  r   rb   rö   ra   ra  r2  r3  r   rø   rQ   rd   rw  rÆ   rÜ  rÝ  r/  rá  rÚ  r8  r9  rÇ   rf   re   rl   r  rk   rj   )%r®  r+  rÁ  Úinterval_listrw   ru   Úctype_labelsrv  Úctype_color_listÚrval_dict_listÚ	rval_dictr‹  Úctype_originalÚsidx_pair_listr6  rµ  Úslist_currentÚ	rval_listÚspairidxÚspairrJ  rK  r  r  r“  rK  rc  Úfig_rvalÚax_rvalÚ	xintervalÚintidxr¦  rH   rI   r  rð  rÝ  r£   rk  r¤   Úanalyze_tracked_fibersÏ!  sv    
	




(r{  c            W         s.  t j d¡ tdƒ} tdƒ}t| ƒ}t|ƒ}d}|  |¡}d}| |¡}d}d}	d}
d}d	}d
‰d‰d
‰ d‰d‰d‰d}d}d}t || ¡}g d¢}d‰g d¢}d}t jt	d d	dd }t jt	d d	dd }‡ ‡‡‡‡‡fdd„}‡‡‡‡	fdd„}‡fdd„}t  
||t|ƒ|f¡}t  
||t|ƒf¡}t  
||t|ƒf¡}t  
|j¡}t  
|j¡}t  
|j¡}t| ƒD ]z\}‰t|ƒD ]d\} ‰	t|| ƒ tjtˆˆ	|
||	|d}!t |!|¡\}"}#}$|"jd }%|ˆˆ	f }&|ˆˆ	f }'t  
|%¡}(t|%ƒD ]})t|'|&d|)gˆd|(|)< qòt  |(¡d d d!… }*t|'|&ddˆd}+t|ƒD ] \},}-t|%|-d"  ƒ}.t|ƒD ]º}/t jjt|%ƒ|.d
d#}0|"|0d d …f }1||#|1ƒ\‰}2}3|3ˆ }4||'|&|0|+|.ƒ}5|-d"krà|4||| |,|/f< |5||| |,|/f< n:|4g| ||| |,d d …f< |5g| ||| |,d d …f<  qqbt|*d |.… ƒ}0|"|0 }1||#|1ƒ\‰}2}3|3ˆ }4|4||| |,f< ||'|&|0|+|.ƒ}5|5||| |,f< t|*d d d!… d |.… ƒ}0|"|0 }1||#|1ƒ\‰}2}3|3ˆ }4|4||| |,f< ||'|&|0|+|.ƒ}5|5||| |,f< q@q€qnt j|d$d%}6d&}d'}tj||d(}7|d7 }t ¡ }8t  dt|ƒd ¡}9g d)¢}:t|ƒD ]|\},}-||||,f };|9|, }<|:|, }=|8j|<g| |;|=d* |-d"krDt  |;¡}>t  |;¡}?|8j|<g|>|?d+|=d,d$d$dd-d.
 qDtj|9|||f d/dd0d1d2 tj|9|||f d/dd3d4d2 |8  |9¡ |8j!||d5 |8j"d6|d7 | d ‰|d ‰	|8j#d8ˆt$ˆ	 f |d d5 |8j%d9ˆ |d5 |8j&d:|d5 |8j'|d; d5 |7 (¡  d&}d'}tj||d(}7|d7 }t ¡ }8g d)¢}:g }@g }At|ƒD ]X\},}-||||,f };||||,f }<|A )|;¡ |@ )|<¡ |:|, }=|8j|<|;|=t*|-ƒd< qÈtj+|@|A|8d=d*\}B}8|||f }9tj|9|||f d/d$d0d1d2 |||f }9tj|9|||f d/d$d3d4d2 |8 ,¡ }Ct  -t  .|Cd |Cd d>¡d¡}D|8  |D¡ |8j!|D|d5 |8j"d6|d7 | d ‰|d ‰	|8j#d8ˆt$ˆ	 f |d d5 |8j%d9ˆ |d5 |8j&d?|d5 |8j'|d; d5 |7 (¡  || }Ed&}d'}tj||d(}7|d7 }t ¡ }8t  dt|ƒd ¡}9g d@¢}:g dA¢}Ft|6||gƒD ]Ê\}G}H|:|G }=|H /|| t|ƒf¡}It|ƒD ]D\},}-|Hd d …d d …|,f  0¡ }J||, }<|8j|<g|E |J|=dBdC qÌt j|Idd%}Kt j|Idd%}L|8j||K|Ld+|=d,d$d$ddDd.
 |8j||KdE|=dB|F|G dF qž|8  |¡ |8j!||d5 |8j"d6|d7 | d ‰|d ‰	|8j#dG| |d d5 |8j%d9ˆ |d5 |8j&d:|d5 |8j'|d; d5 |7 (¡  d&}d'}tj||d(}7|d7 }dHdIg}:dJdKg}Ft ¡ }8t  dt|ƒd ¡}9||6 }M||6 }Nt|M|NgƒD ]&\}G}O|:|G }=|O /|| t|ƒf¡}Pt j|Pdd%}Kt j|Pdd%}L|8j||K|Ld+|=d,d$d$ddD|F|G dL |8j||KdE|=dBdC t|ƒD ] \},}-|Od d …d d …|,f  0¡ }J||, }<|8j|<g|E |J|=dBdC t1j2j3|JdddMdNdO\}Q}R|-}Sd}T|K|, }U|Gdk
rTdP}VndQ}Vtj4|8|R|S|T|Udd|V||dR
 	qØ	qT|8j|dgt|ƒ dSdBdT |8  |¡ |8j!||d5 |8j"d6|d7 | d ‰|d ‰	|8j#dU| |d d5 |8j%dVˆ |d5 |8j&d:|d5 |8j'|d; d5 t 5|8|¡ |7 (¡  d S )WzÇ What happens to the prediction error if we start taking out cells?
        For all mice/sessions and 25 random, Wiener filter takes X minutes
        Same for Kalman filter takes X minutes
    
    r   r  r   r6   rD   r   r\  r]  TFr   r„  r§   r   r  r…  rã  )r”  r+  r   rÓ  r    rP  ræ  r£   rÂ  c                    s   |j d }tj|d}| |j¡ tj|||d}ˆdkrPtj| |ˆd\} }}|d d…d d …f }tj|| ˆddˆd ˆ ˆd	\}}}|||fS r›  rœ  r  rŸ  r£   r¤   r   "  s    
þz(dropout_test.<locals>.do_pca_and_predictc                    sÒ   d}d}t j| |d}| d7 } t |j¡}t  ¡ }	|	j||ddd |	j||dddd	 |	jd
|d |	jd|d |	j	dt
ˆ ˆ|ˆ  ˆ f |d | ¡  ˆd d…d d …f }
| d7 } tj|
||| d d | S )Nró   r   rô   r   rµ   r¶   r·   r   rº   r»   r7   rÃ   rõ   r   r4   )rQ   r  rW   rg   rÅ   r  rÆ   re   rf   rl   r   rk   rT   rU   )ru   r   rž  r*  rÐ  rw   r@   r   rÖ   r×   rœ   )rÉ   rr  rü  rŸ  r£   r¤   Úplot_pca_and_distance•"  s    "z+dropout_test.<locals>.plot_pca_and_distancec                    s   t | |dt|ƒˆ d}|S )zI Convenience function as it's used 3 times and might be prone to changes ru  r3  )r:  rk  )rA  r+  rÍ  rê  rÛ   r!  )r6  r£   r¤   Úget_contribution«"  s    z&dropout_test.<locals>.get_contributionrÜ  ru  r3  Nrö  r”  r¡  r   rü  é   r=   rô   )r   r   r  rg  rh  r  rÎ   r    r¶   )r¹  r  rH   rØ  r	  r
  r»  r¹   zo--rÍ  Úordered)rÃ  rH   rI   ÚdarkturquoiseÚreversedr7   rÂ   r¿   z"Dropout prediction results M%d S%szPrediction error (%s)zNeuron percentagerµ   rG   rÉ  re  z'Proportion of weighted PCA contribution)rÍ  r   r   )rµ  r  Úreverserâ   rF  rå  rÌ  r[  zDropout prediction results, r  Údarkcyanzrandom - reversezrandom - ordered)	r¹  r  rH   rØ  r	  r
  r»  r¹   rI   Ú	propagater  )rÀ   Ú
nan_policyr  ri  rd  )rj  r^  rw   r¬  ©r¹   zError difference with random, zError difference (%s))6rW   rµ  r  ra   rb   r  rT   rz  ré  r   r*  rV   rö   rm   rP  rQ  r÷   r:  rv  r  r¶  rk  r0  rQ   r  r  rg   rÆ   rÜ  rÝ  r/  rh   rÚ  rÛ  rÇ   rl   r   re   rf   rj   rk   r¥  r  ry  râ  Úaroundrà  rh  rv  r2  r3  r·  Údraw_significanceÚadd_significance_testing_legend)Wrp  rz  rÜ   rÝ   rº  r»  r¼  r½  rW  rX  rV  r  ró  ru   rw   r@   r‹  r;  r*  rÁ  r;  rÆ  r   r|  r}  rÃ  Úerror_array_orderedÚerror_array_reversedÚcontribution_array_randomÚcontribution_array_orderedÚcontribution_array_reversedrû  r„  r"  r#  r   r%  rÅ  r+  rA  rè  rH  ré  rê  r-  r5  rÛ   rÌ  rÍ  rÎ  rž  rÐ  rë  r!  Úerror_array_random_avgr   r×   r  ry  r¦  r¦  rH   rð  rÝ  Úcontribution_list_totalÚerror_list_totalr“  ÚxlimÚxxticksr†  r  r›   rt  Úerror_array_by_propÚerror_array_collapsedr  Ú	error_stdÚerror_array_diff_rrandomÚerror_array_diff_orandomÚerror_array_diffÚerror_array_diff_by_proprJ  rK  rM  rO  rP  Úpval_orientationr£   )
r¬   r6  rÈ   rN  rÉ   rr  rü  rß   r«   rŸ  r¤   Údropout_test6"  s˜   	

		







$




$
&
rœ  c            *      C   s"  d} d}d}d}d}d}d}t dƒ}dg}t dƒ}d	g}d}	d
}
d}d}d}d}d}tjtd ddd }tjtd ddd }tjtd ddd }d}|}d	}d}d} d}d}d}d}d}	d}d}
d}d}d}d}d}d}d}d}t d¡}d}d}d}t |¡ |d7 }tjdd\}}t |¡} |D ]–}!||!|f \}"}#g }$t |ƒD ]N}%|#|%|%d …d d …f }&tj	|&|"|dd|
d |	|d	\}'}(})|$ 
|(| ¡ qL|j| |$ddt|!ƒd | | |$¡ q,|jd|d |jd|d |jd |d! |jd"|d! |jd#|d d |j|d$ d d S )%Nr   r\  r]  TFr   r  r6   rD   r„  r§   r   r  rP  ræ  r£   rÂ  rå  r   r¦   rÕ  r³   rÔ  rô   rê   rÁ  r¶  rÕ  zStarting PCA dimensionr7   zError (sse)r¾   r¿   rÂ   zT1, all mice, 3 dimensionsrµ   )ra   rW   ré  r   rg   rQ   r  rd   rT   rÄ   rø   rh   r  rÆ   rf   re   rÇ   rl   rj   )*rW  rX  rV  r  ró  rN  rß   rp  rz  r¬   r«   rÉ   rÈ   ru   rw   r@   r;  rÆ  rë  r  r  r  r  r  r  ré   r  r  rŸ  Údims_numr   r×   r  rr  r   rü  r¦  Ú	first_dimÚpca_data_cutr8  rÍ   rÎ   r£   r£   r¤   Úanalyze_higher_dimensions¿#  s„    &

þr   c            /      C   sJ  d} d}d}d}d}d}d}d}d}d}	d}
d}d}d}d}d	}d
}d}t tj||d||d|d}d}d}d}d}d}d}d}| dkr’|dkr’d}tjt| |||||d}t ||¡\}}}|jd }tj|d}| 	|j
¡ tj|||d} |dkrtj|| |d\}} }!tj| ||d\}"}#}$| dd…dd…f }%d| d t| f }&tj t|& | |#|dœ¡ tj|%||dd|d||d	\}'}(}!d})d}*tj|%|||||||d|d|)|*d\}+}t |d ¡ |+j},|+ ¡  t t|& d ¡ t t|& d  ¡ d!}d"}-d#}tjdd||d$\}+}.|d }t |.||'| ||(| ||¡}.|+ ¡  dS )%zû Simple function that runs the prediction position algorithm on a single mouse and session, plotting the details
        Use to check particularities in position, prediction, etc.
        
        Prediction is split up into its own function
    
    r   rD   r   r\  r]  TFr   r¦   r§   r6   rÆ  )rß   rç   r@  rÈ   r«   r¬   rÉ   r=   r    r   rÜ  rà   rå   rÞ   rÝ  Nr   zpca_M%d_S%s)r*  rþ  r   rê   râ   rý  Úon©	r5   r"   r@  r#   r   rw   rÀ   ÚmsrÃ  re  r  r   r³   r   r?   )r   rT   r   rP  rQ  r÷   rV   r   rú   rû   rü   r  r
  rî  r   r2  rk  rl  r   rÄ   rU   rQ   r  Úaxesrk   rt  rd   Úplot_position_prediction)/rr  rŸ  rW  rX  rV  r  ró  rN  rß   r&   rª   r3  r4  r©   r¬   r«   rÉ   rÈ   r!  ru   r@   rw   r5   rz   Úpca_view_angle_azimÚpca_bin_sizer"  r#  r   r%  rÛ   r*  rü  rÎ   Úposition_uniquerþ  Úpca_stdÚpca3drƒ  rž  rÐ  r£  rÃ  r   rÕ   rÔ   r×   r£   r£   r¤   Ú+position_prediction_single_session_detailedY$  s|    ÿ

þ ÿ
r«  c            $      C   s–  d} d}d}d}d}d}d}d}d}d}	d	}
d}d}d}d
}d}d}d}d}d}d}d}d}d}d}| dkr||dkr|d}d}t jt| |||||||	d	}t  ||¡\}}}|jd }ttt|ƒƒƒ}||d… |d|…  }|dd…|f }t j|||	|
||||d\}}} t j	|dd…dd…f |||d|||d|dddd\}!}d}d}"d}t
jdd||d\}!}#|d }t  |#||| || | ||¡}#|! ¡  dS )z½ Simple function that runs the prediction position algorithm on a single mouse and session, plotting the details
        Use to check particularities in position, prediction, etc.
    
    r   rµ   r   r\  r]  TFr   ú.9r¦   r  r6   r   r=   r    r   rD   é-   é_   r6  Nr  r   r¡  r¢  r³   r   r?   )rT   rP  rQ  r÷   rV   rk  ra   rb   r   rU   rQ   rd   r¥  rk   )$rr  rŸ  ÚshiftrW  rX  rV  r  ró  rN  rß   Úpca_componentsrª   r©   r¬   r«   rÉ   rÈ   ru   rw   r@   r5   rz   r¦  r§  r"  r#  r   r%  rÛ   r  rü  rž  rÐ  r   rÔ   r×   r£   r£   r¤   Ú"position_prediction_single_sessionK%  s`    ÿ
ÿ"ÿ
r±  c            *   	   C   s   t  d¡} t| ƒ}t  d¡}t|ƒ}d}d}d}d}d}d}	d}
d	}d
}d
}d}d}t jtd ddd }t jtd ddd }t  ||f¡}t  ||f¡}t| ƒD ]H\}}t|ƒD ]4\}}|||f \}}|jd }|||f }t 	||¡}t
t  d| t|ƒ ¡ƒ|||f< ||||f< ||kr¶||kr¶t ¡ }|d7 }d}d}dt  |¡ | } |j| ||d |jd|d |jd||d |jd|d |jd||d | ¡ }!d}"t  |¡}#|!j| |#|"d |!jd|"|d |!jd|"|d q¶q¤d}$d}d d!g}%tjdd|$d"\}&}'|d7 }t|ƒD ]æ\}}|'d }|d#d$…|f  ¡ } t  | ¡}(t  | ¡})|jt| g|(|)d%d|%d d& |j|gt| ƒ | d'dd(d) |'d }|d$d…|f  ¡ } t  | ¡}(t  | ¡})|jt| g|(|)d%d|%d d& |j|gt| ƒ | d'dd(d) q$|&jd*t
|d ƒ |d |'d jd+|d, d |'d jd|d |'d jd|d |'d jd|d |'d jd-|d, d |'d jd|d |'d jd|d |'d jd|d |& ¡  d}$d}d d!g}%tjdd|$d"\}&}'|d7 }t|ƒD ]æ\}}|'d }|d#d$…|f  ¡ } t  | ¡}(t  | ¡})|jt| g|(|)d%d|%d d& |j|gt| ƒ | d'dd(d) |'d }|d$d…|f  ¡ } t  | ¡}(t  | ¡})|jt| g|(|)d%d|%d d& |j|gt| ƒ | d'dd(d) qú|&jd*t
|d ƒ |d |'d jd+|d, d |'d jd.|d |'d jd|d |'d jd|d |'d jd-|d, d |'d jd.|d |'d jd|d |'d jd|d |& ¡  d#S )/z4 How many dimensions to explain X% of the variance? r  r   r6   rD   r   r\  r]  TFr   rå  rÂ  ræ  r£   rå  r   r”  r   r   r  zDimensions (%)r7   zVariance explained (ratio))rH   r8   r¾   r¿   rÂ   )rÀ   Ú
labelcolorrÁ   r   zCumulative variance explained)ri  r>   r  rp  rô   Nrµ   r¶  )r¹  rº  r»  rH   r½  r¾  r¿  z*Dimensions to explain %d%% of the variancerd  r   r®  Ú
Dimensions)rW   rg   rb   ré  r   r*  rö   rV   rT   rÃ  r  r‡  r  rQ   Úsubplotrh   rf   re   rÇ   Útwinxrþ   rd   rv  rÜ  rÝ  rÞ  r   rÆ   rc   rl   rk   )*r  r  r  r+  ÚmexÚsexrW  rX  rV  r  ró  rN  rß   r&   rÅ  ru   rÆ  rë  Údimensions_arrayÚdimensions_array_absrû  rr  r„  rŸ  rí  rü  rÛ   r+  Údimensions_for_xr×   rw   Úcolor1Údim_listrÚ  Úcolor2r,  r@   Úcondition_colorr   rÕ   Údim_meanÚdim_stdr£   r£   r¤   ÚPCA_statisticsŸ%  sÄ    


"


 

 "

 

 "rÁ  c                  C   s^   t  d¡t  dd¡g} g d¢g d¢ddgg}g d¢g d¢g}| D ]}|D ]}t||ƒ qHq@d S )Nrµ   r  rä  rè  ri  )rW   rg   Úplot_place_field_aggregation)Úmouse_list_listÚsession_list_listrp  rz  r£   r£   r¤   Úplace_cell_aggregationB&  s    rÅ  c           #   	   C   s.  t | ƒ}t |ƒ}d}t ¡ jd }d}tjtd ddd }d}|}	tj||	|d	\}
}t |ƒ}t 	|||f¡}g }t
|ƒD ]Ø\}}t
| ƒD ]Æ\}}|||f \}}tj||d
d t¡}t |¡d }t
|ƒD ]€\}}t 	|¡}t
|
ƒD ]Z\}\}}||k rt ||k||k ¡}nt ||k||k ¡}|||f }t |¡||< qê| |¡ qÐqŒq|t |¡}t |¡}t |¡| }|dd…|f }tjd|d\} }!|d }tj|g|||!dddd}!d}t || ¡}"|!jd||"f |d d |!jd|d |!jd|d |!jd|d |!jd|d |  ¡  |!| fS )zO Plots the result of averaging all place fields for selected sessions and mice r   r   r   r  Træ  r£   r\  r_  r  r  r   N©rÕ  ri  r?   ©ru   r×   rn  rp  ro  r    zBin size: %d (mm), %srµ   r7   zAverage activity (amplitude)úSegment center (mm)r¾   r¿   rÂ   )rb   rQ   rR   rS   rW   ré  r   rT   ru  r*  rö   r  rž  rã  râ  r  Ú
bitwise_orr0  rø   rw  rv  rd   Úplot_belt_valuesrz  rl   re   rf   rÇ   rk   )#rp  rz  rÜ   rÝ   rß   ru   rw   r   r{  r|  r}  r~  Úsegment_numÚactivity_by_position_arrayÚactivity_by_position_listr„  rŸ  rû  rr  r   r#  r  rB  Ú	pcell_numÚpcellÚactivity_by_positionrâ  ÚstartÚendÚsegment_idxsÚactivityr  r   r×   r‹  r£   r£   r¤   rÂ  R&  sV    

	

ÿrÂ  c            1   	   C   s  t  d¡} t  d¡} t  dd¡} t| ƒ}g d¢}t|ƒ}d}d}d}d}d}d	}t ¡ jd
 }	d}
d}ddg}ddg}g d¢}t jtd ddd }d}d}d}|t  dt|| ƒ¡|  }|| | }t	j
|||d\}}t|ƒ}tt	j||||d|d}t  |||f¡}t  |||f¡}t|ƒD ]Ö\}}t| ƒD ]Â\}}|||f \}} ||| ƒ\}!}"}#t  t	j||"|d¡}$tt||ƒƒD ]r\}%\}&}'|&|'k r¬t  |&|k||'k ¡}(nt  ||&k||'k ¡}(|$|( })t  |)¡||||%f< t  |)¡||||%f< q€q4q$| || |f¡}*t  |¡}+t  |¡|+ }|*dd…|+f }tt|*jd ƒƒD ]$\},}-|*|, })|)t  |)¡ |*|,< qHtjd|	d\}.}/|	d
 }	t	j|*g||	|/dddd }/d!}
t	 || ¡}0|/jd"|||0f |
d d# |/j d$|
d# |/j!d%|
d# |/j"d&|
d' |/j"d(|
d' |. #¡  dS ))zC Analyzes patterns in the prediction error based on their position r  rµ   rä  r   r   r¬  r6   r¦   r§   r   r   r  rd  r®  r  rp  r…  r  Træ  r£   r   r¬  rÕ  r_  Fr  ©ÚperiodNrÆ  r?   rÇ  r    ú Seg length: %d, interval: %d; %sr7   úError (normalized)rÈ  r¾   r¿   rÂ   )$rW   rg   rb   rQ   rR   rS   ré  r   r  rT   ru  r   r   r*  rö   r6  Úget_periodic_differencers  r  rÉ  r0  rÝ  rh  rv  rw  ra   rV   r-  rd   rÊ  rz  rl   re   rf   rÇ   rk   )1rp  rÜ   rz  rÝ   rß   rç   rÈ   r«   rÉ   ru   rw   r@   Úcondition_labelsr¾  r;  r   Úoffsetr{  r|  Úsegment_startsÚsegment_endsr}  r~  rË  r!  Úerror_avg_by_position_arrayÚerror_std_by_position_arrayr„  rŸ  rû  rr  r   r#  rü  rž  rÐ  rz  râ  rÑ  rÒ  rÓ  rÕ  r€  r  rÂ  r‘  r   r×   r‹  r£   r£   r¤   Úerror_by_position¤&  s|    


ÿ
 *
ÿrà  c            8      C   s  d} d}d}d}d}d}d}d}t  ¡ jd	 }d
}d}	ddg}
ddg}g d¢}tjtd ddd }d}d}d}d	}t |¡||   t¡}t	j
|||d\}}t|ƒ}tt	j||||d|d}t d||f¡}t d|df¡}|| |f \}}t |¡}t |¡}t|ƒD ]‚\}}ttt|ƒƒƒ}||d… |d|…  }|dd…|f }|| }tddgƒD ](\} }!|!dkr¬|jd	 }"tjjtt|"ƒƒ|"dd}|dd…|f }n
t |¡}|||ƒ\}#}$}%|d d d tj tj }&t t t |&¡¡t t |&¡¡¡}&|&tj dtj  d }'|$d d d tj tj }(t t t |(¡¡t t |(¡¡¡}(|(tj dtj  d })|'|)f||dd…f< t t	j||$|d¡}*t|ƒD ]^\}+\},}-|,|-k rÔt |,|k||-k ¡}.nt ||,k||-k ¡}.|*|. }/t |/¡|| ||+f< q¨|t|ƒd	 krbd
}d}0d}	t jd	d	|	|d \}1}2|d	 }t	  |2||$| ||%| ||¡}2|1 !¡  t j|d!\}1}2|d	 }t  "|*¡ qbqd"d#g}3t #|¡}t $|¡| }t jd$|d \}1}2|d	 }t	j%|d g|||2ddd"gd%}2|2 &¡ }4t	j%|d	 g|||4dd&gd#gd%}4d'}|2j'd(||f |d) |2j(d*|d) |2j)d+|d) |2j*d,|d- |2j*d.|d- |1 !¡  t jd/|d \}1}2|d	 }|2 +|ddd…df |ddd…d	f ¡ |2 ,d|g¡ |2 -¡ \}5}6t .|5|6¡}7t j"|7|7d0d1d2d3 |2j)d4|d) |2j(d5|d) dS )6ú^ If we scramble the data, error by position still has a certain shape. How does it look like? r>   rD   r   r   r¬  r6   r¦   r§   r   r   r  rd  r®  r  rp  r…  r  Træ  r£   r   rÆ  rÕ  r_  Fr  Nr¡  rÕ  r³   r   r?   rù  rM   Ú	ScrambledrÆ  rÇ  r   r    úSeg length: %d, interval: %dr7   rØ  rÈ  r¾   r¿   rÂ   rƒ  rÌ  rÍ  râ   rF  úAverage position (from angle)ú'Average predicted position (from angle))/rQ   rR   rS   rW   ré  r   rg   rž  r  rT   ru  rb   r   r   r*  r[   rö   rk  ra   rV   rµ  r¶  ÚpiÚarctan2r0  ÚsinÚcosr6  rÙ  r  rÉ  rd   r¥  rk   rh   rv  rw  rÊ  rµ  rl   re   rf   rÇ   rÆ   rá  râ  rà  )8rr  rŸ  rß   rç   rÈ   r«   rÉ   ru   rw   r@   rÚ  r¾  r;  r   rÛ  r{  r|  Ú	shift_numÚ
shift_listr}  r~  rË  r!  Úerror_by_position_arrayÚaverage_position_arrayr   r#  Úposition_originalÚpca_input_data_originalÚshift_trialr¯  r  Úrandomize_idxÚ	randomizeÚ
timepointsrü  rž  rÐ  Úangle_dÚposition_averageÚangle_d_predÚposition_average_predrz  râ  rÑ  rÒ  rÓ  rÕ  rÔ   r   r×   Úlabels_randomizationrÚ  rò  ró  r  r£   r£   r¤   Ú*error_by_position_scrambled_single_session='  s®    
ÿ




$$

 "(rù  c            >      C   s  t  d¡} t| ƒ}t  d¡}t|ƒ}d}d}d}d}d}d}t ¡ jd	 }	d
}
d}ddg}ddg}g d¢}t jtd ddd }d}d}d}d	}t  |¡||   t	¡}t
j|||d\}}t|ƒ}tt
j||||d|d}t  d|| | |f¡}t  d|| | df¡}d}t| ƒD ]Z\}}t|ƒD ]D\}}|||f \} }!t  | ¡}"t  |!¡}#t|ƒD ]
\}$}%ttt| ƒƒƒ}&|&|%d… |&d|%…  }&|#dd…|&f }!|"|& } tddgƒD ]¨\}'}(|(dkr |!jd	 })t jjtt|)ƒƒ|)dd}&|#dd…|&f }!n
t  |#¡}!|| |!ƒ\}*}+},| d d d t j t j }-t  t  t  |-¡¡t  t  |-¡¡¡}-|-t j dt j  d }.|+d d d t j t j }/t  t  t  |/¡¡t  t  |/¡¡¡}/|/t j dt j  d }0|.|0f||'|dd…f< t  t
j| |+|d¡}1t|ƒD ]^\}2\}3}4|3|4k r*t  |3| k| |4k ¡}5nt  | |3k| |4k ¡}5|1|5 }6t  |6¡||'||2f< qþq¶|d	7 }q`q*qdd g}7d!d"g}8t  |¡}&t   |¡|& }tj!d#|	d$\}9}:|	d	 }	t
j"|d |d	 g||	|:dd|7d%}:d&}
|:j#d'||f |
d( |:j$d)|
d( |:j%d*|
d( |:j&d+|
d, |:j&d-|
d, |:j'|
d d( |9 (¡  tj!d.|	d$\}9}:|	d	 }	tdƒD ]<}'|:j)||'dd…df ||'dd…d	f |8|' |7|' d/ qh|: *d|g¡ |: +¡ \};}<t  ,|;|<¡}=tj-|=|=d0d1d2d3 |:j%d4|
d( |:j$d5|
d( |:j'|
d d( |9 (¡  dS )6rá  r  r   r   r   r¬  r6   r¦   r§   r   r   r  rd  r®  r  rp  r…  r  Træ  r£   r   rÆ  rÕ  r_  Fr  rD   Nr¡  rÕ  rM   râ  r   r   rÆ  r?   rÇ  r    rã  r7   rØ  rÈ  r¾   r¿   rÂ   rƒ  rG   rÌ  rÍ  râ   rF  rä  rå  ).rW   rg   rb   rQ   rR   rS   ré  r   rž  r  rT   ru  r   r   r*  rö   r[   rk  ra   rV   rµ  r¶  ræ  rç  r0  rè  ré  r6  rÙ  r  rÉ  rv  rw  rd   rÊ  rl   re   rf   rÇ   rj   rk   rÆ   rá  râ  rà  rh   )>rp  rÜ   rz  rÝ   rß   rç   rÈ   r«   rÉ   ru   rw   r@   rÚ  r¾  r;  r   rÛ  r{  r|  rê  rë  r}  r~  rË  r!  rì  rí  Úsample_counterrû  rr  r„  rŸ  r   r#  rî  rï  rð  r¯  r  rñ  rò  ró  rü  rž  rÐ  rô  rõ  rö  r÷  rz  râ  rÑ  rÒ  rÓ  rÕ  rø  Úcolors_randomizationr   r×   rò  ró  r  r£   r£   r¤   Ú-error_by_position_scrambled_multiple_sessionsý'  s®    


ÿ




$$

$:rü  c            7   	   C   sÊ  t  d¡} t  d¡} t| ƒ}g d¢}g d¢}t|ƒ}d}d}d}d}d	}d
}t ¡ jd }	d}
d}ddg}ddg}g d¢}t jtd ddd }d}d}d}|t  dt|| ƒ¡|  }|| | }t	j
|||d\}}t|ƒ}tt	j||||d|d}t  |||f¡}t  |||f¡}t  |||f¡}t|ƒD ]L\}}t| ƒD ]6\}}|||f \} }!t	j| |!d|dd\}"}#t	 |"|#¡\} }!t  t	j| dd¡}$tj|!jd d }%|% |!j¡ t	j|!|%dd!}&t	j|&| ||dd"\}'}(|(|||f< tt||ƒƒD ]~\})\}*}+|*|+k r$t  |*| k| |+k ¡},nt  | |*k| |+k ¡},t  |,¡}-|-t| ƒ ||||)f< |$|, }.t  |.¡||||)f< qøqBq0| || |f¡}/| || |f¡}0| || |f¡}1t   |¡}2t  |¡|2 }|/d#d#…|2f }/|0d#d#…|2f }0|1d#d#…|2f }1tj!d$|	d%\}3}4|	d }	t	j"|/g||	|4dd#d#d&}4|4 #¡ }5t	j"|0g||	|5ddgd#d&}5d'}
t	 $|| ¡}6|4j%d(|||6f |
d d) |4j&d*|
d+d, |4j'd-|
d. |5j&d/|
dd, |5j'd-|
d. |4j(d0|
d) |4j'd1|
d. |3 )¡  tj!d$|	d%\}3}4|	d }	t	j"|/g||	|4dd#d#d&}4|4 #¡ }5t	j"|1g||	|5dd2gd#d&}5d'}
t	 $|| ¡}6|4j%d(|||6f |
d d) |4j&d*|
d+d, |4j'd-|
d. |5j&d3|
d2d, |5j'd-|
d. |4j(d0|
d) |4j'd1|
d. |3 )¡  d#S )4z] Analyzes patterns in the time spent at each position. Used as comparison with segment lengthr  rµ   rä  rè  r   r   r¬  r6   r¦   r§   r   r   r  rd  r®  r  rp  r…  r  Træ  r£   r   r^  r\  r_  Fr  rÆ  ©Útrial_bin_numr&   Úwarp_by_positionrÞ   rà   rå   rb  NrÆ  r?   rÇ  r    r×  r7   úTime spent (normalized)r   ©r8   rH   rÂ   r¿   úVelocity (AU)rÈ  r¾   r   zSegment length proportion)*rW   rg   rb   rQ   rR   rS   ré  r   r  rT   ru  r   r   r*  rö   Úwarping_oldÚflatten_warped_data_oldrw  Úcompute_velocityr   rú   rV   rû   rü   r  rx  rs  r  rÉ  r•  r0  rh  rv  rd   rÊ  rµ  rz  rl   re   rÇ   rf   rk   )7rp  rÜ   rz  rÝ   r&   rç   rÈ   r«   rÉ   ru   rw   r@   rÚ  r¾  r;  r   rÛ  r{  r|  rÜ  rÝ  r}  r~  rË  r!  Útime_by_position_arrayÚv_by_position_arrayrl  r„  rŸ  rû  rr  r   r#  Úposition_warpedÚpca_input_warpedÚvr*  rü  r†  r‡  râ  rÑ  rÒ  rÓ  Útimesteps_spentÚ
velocitiesÚ time_by_position_array_flattenedÚv_by_position_array_flattenedÚsegment_length_array_flattenedr  r   r×   rÚ  r‹  r£   r£   r¤   Útime_spent_by_position¤(  s²    


ÿ
ÿ


 
r  c            +      C   s|  d} d}d}t  |¡ d}d}d}d}d}d}t  ¡ jd }d	}	d
}
tjtd ddd }|| |f \}}tj||dd}||d d |d d … }|dd…|d d |d d …f }tj||dd}tj	||||||d|d\}}}t 
t|ƒ¡}t jdd}|d7 }t  ||¡ |D ]0}t dd¡}t j|gt|ƒ |dddd qtj|dd…dd…f ||
|ddddd|	dddd\}}d	}	d}d}
t jdd|
|d \}}|d }t |||| ||| ||	¡}| ¡  tj||||dd!\}}t ||¡\}}tj	||||||d|d\}} }!tj|dd…dd…f | |
|ddddd|	dddd\}}d	}	d}d}
t jdd|
|d \}}|d }t ||| | ||!| ||	¡}| ¡  tj||||dd!\}}t ||¡\}}tj	||||||d|d\}} }!tj|dd…dd…f | |
|ddddd|	dddd\}}d	}	d}d}
t jdd|
|d \}}|d }t ||| | ||!| ||	¡}| ¡  tj||d"\}"}tj||||dd!\}}#t ||#¡\}}$tj|$||dd|dd|d#	\} }%}&tj|$dd…dd…f | |
|ddddd|	dddd\}}d	}	d}d}
t jdd|
|d \}}|d }t ||| | ||%| ||	¡}| ¡  tj||d"\}"}tj||||dd!\}}#t ||#¡\}}$tj|$||dd|dd|d#	\} }%}&tj|$dd…dd…f | |
|ddddd|	dddd\}}d	}	d}d}
t jdd|
|d \}}|d }t ||| | ||%| ||	¡}| ¡  d$}tj||||dd!\}}tj|dd%}'tj|dd%}(tj|'|d"\}"})tj|)|(ddd|dd|d#	\}&}&}*tj||d"\}"}tj|||dd||*d|d#	\}}}&t j||
d&}|d7 }|jdddd'd(}tj|)dd… |(|d)d	dddddddd*dd+ d	}	d}d}
t jdd|
|d \}}|d }t |||| ||| ||	¡}| ¡  dS ),z! Test warping on a given session r   r>   r   r\  r   r6   r¦   r§   r   r  r  Træ  r£   ©r&   Úfull_rounds_onlyr   rö  NFr  r   rô   rÌ  rÍ  r¶   rF  rÆ  r¡  rD   r¢  r³   r?   rý  ©rç   rê   r”  rü  r  rÕ  r  r  rÕ  )r  rw   rÆ   r5   r¹   r"   r@  r   r   r£  rÃ  )rQ   r  rR   rS   rW   ré  r   rT   Úget_round_endtimes_pairsr   rg   rb   rd   rÆ   rà  rh   rU   r¥  rk   r  r  Úcompute_pcarÄ   r0  r%  rï  )+rr  rŸ  ru   rþ  r&   rç   rÈ   r«   rÉ   rw   r@   r   r   r#  Ú
round_endsÚposition_fullÚpca_input_data_fullÚround_ends_fullrü  rž  rÐ  Úttr×   rÒ  rû  r   rÔ   r  r	  Úposition_warped_flatÚpca_input_warped_flatÚpca_data_warpedÚposition_pred_warpedÚerror_dict_warpedr*  Ú
pca_warpedÚpca_warped_flatÚerror_dict_pca_warpedrÎ   Úpca_input_warped_avgÚposition_warped_avgÚpca_data_avgr;  r£   r£   r¤   Úwarping_test=)  sö    $ÿ""ÿ
ÿ"ÿ
ÿ"ÿ
þ"ÿ
þ"ÿ

ÿ
þþÿr&  c            0      C   sÈ  t  d¡} g d¢}t| ƒ}d}d}d}d}d}d}d	}t ¡ jd
 }	d}
d}t jtd ddd }tt	j
||||d|d}t  d|df¡}g d¢}t| ƒD ]ê\}}ttdƒƒD ]Ò\}}|||f \}}tdƒD ]®}|dkrô|||ƒ\}}}nx|d
krJt	j||||dd\}}t	 ||¡\}}t	j
||||||d|d\}}}n"|dkržt	j||||dd\}}t	 ||¡\}}t	j
||||||d|d\}}}nÎ|dkrt	j||d\} }t	j||||dd\}}!t	 ||!¡\}}"t	j|"||dd|dd|d	\}}}#nf|dkrlt	j||d\} }t	j||||dd\}}!t	 ||!¡\}}"t	j|"||dd|dd|d	\}}}#|| }$|$||||f< qÒq°qšdd„ }%tdƒD ]"}|%|dd…dd…|f |ƒ q˜t ¡ jd
 }	d}
d}tj|	|d}&|	d
7 }	t ¡ }'tdƒD ]n}|dd…dd…|f }(|( ¡ })t  |)¡}*t  |)¡}+|},tj|,gt|)ƒ |)ddd d! |'j|,|*|+d"d
d# qø|}-t  t|-ƒ¡}.|'jd$|
d% |'jd&| |
d% d}/|'j|.|-|/d% |'jd'd(d) |& ¡  dS )*ú¯ Gets the average prediction error by session for warped data
        Wiener: 1.5s
        Wiener Cascade: 2s 
        Kalman: 35s
        XGBoost: 9min
        SVR: 2min
    r   r±  r\  r   r   r¬  r6   r¦   r§   r   r   r  r  Træ  r£   Fr  r  )ÚNormalúPosition Warpú	Time WarpúPCA position warpúPCA time warpr   rý  rD   r  Nrê   rµ   c                    sô  t  d¡‰ g d¢}t  d¡t  dd¡g}t ¡ jd }d}d}dd	g}d
dg}t|gƒD ]”\}	}
‡ fdd„|
D ƒ}d}d}tj||d}|d7 }t ¡ }t|ƒD ]š\}}t|ƒD ]ˆ\}}|dkrÌ|| }nd }| ||f }t  |¡}t  	|¡}|t
|
ƒd |  }tj|gd |dddd |j|||dd|| |d q²q¢dd„ |
D ƒ}|dg | }t  dt
|
ƒ d ¡}|jd|d |jd| |d |jd|d |ddt
|
ƒ   }|j|||d |j|d d d! |jd"|d d# | ¡  qXd S )$Nr   r±  rµ   r  r   r   r  rd  r®  r  rp  c                    s   g | ]}t ˆ ƒ |¡‘qS r£   ©rk  r  rÊ  ra  r£   r¤   r¤  y*  r¥  zlwarped_prediction_error_across_sessions_old.<locals>.plot_error_by_session_and_condition.<locals>.<listcomp>)r>   rµ   r    rô   r   rD   r½  r¾  ©r»  r¸   rH   r¶  ©r¹  rº  r»  rH   rI   c                 S   s   g | ]}t | ‘qS r£   r  r  r£   r£   r¤   r¤  “*  r¥  rò  úError of position predictionr7   ú%s error (cm)rµ  rý  r   úupper centerr	  rÂ   r¿   )rW   rg   rQ   rR   rS   rö   r  r  r0  rÝ  rb   rÆ   rÞ  rl   re   rf   rÚ  rj   rÇ   rk   )rt  rÉ   Úsession_list_to_plotÚmouse_list_by_conditionru   rw   r@   rÚ  r¾  r"  r  Ú
slist_idxsr   r×   Úsidx_loopidxr„  Úcond_idxr  rI   Úerr_listrð  rÝ  rí  ÚslabelsÚxlabelsr¦  Ú	xticks_fsr£   ra  r¤   Ú#plot_error_by_session_and_conditioni*  sF    



 zXwarped_prediction_error_across_sessions_old.<locals>.plot_error_by_session_and_conditionrô   r½  r¾  r.  r¶  ©r¹  rº  r»  r0  r7   r1  rÂ   r³   r¿   )rW   rg   rb   rQ   rR   rS   ré  r   r   rT   r   r*  rö   ra   r  r  r  rÄ   r  r  rv  r0  rÝ  rÆ   rÞ  rl   re   rÚ  rÇ   rk   )0rz  r3  rÝ   rþ  r&   rç   rÈ   r«   rÉ   ru   rw   r@   r   r!  Úerror_array_allÚwarp_type_labelr„  rŸ  rû  rr  r   r#  rF  rü  rž  rÐ  r  r	  r  r  r  r  r*  r   r!  rÎ   rë  r<  r   r×   rt  rÕ  rð  rÝ  rí  r:  r¦  r;  r£   r£   r¤   Ú+warped_prediction_error_across_sessions_old*  sž    

ÿ
ÿ
ÿ
þ
þ9 

r@  c            @      C   s¸  d} d}d}t  |¡ d}d}d}d}d}d	}d}d
}	d}
d}d}d}t  ¡ jd }d}d}tjtd ddd }|| |f \}}tj||dd}||d d |d d … }|d d …|d d |d d …f }tj||dd}tj	||||||	d|
d\}}}t 
t|ƒ¡}t jdd}|d7 }t  ||¡ |D ]0}t dd¡}t j|gt|ƒ |dddd q4tj|d d…d d …f |||dd d dd|d ddd!\}}tj||||||dd"\}} }!t |¡}"t | ¡}#tj	|"|#||||	d|
d\}$}%}&tj|$d d…d d …f |%||dd d dd|d ddd!\}}d}d#}'d}t jdd||d$\}}|d }t ||"|%| ||&|
 |
|¡}| ¡  |dkrŠ|  ¡ }(n|d%kr¦t |$| jd ¡}(tjd&d'})|)j|(td|ƒ|d( t  dd¡\}}*tj|)|*d d) tj|)|*d d) d*d+i}+|*d jd@d-d#i|+¤Ž |*d jd,d#d. |*d jd/d#d. |*d jd0d#d. | ¡  t  d|d ¡}d},|) !|¡|, }-|-d }.|-d }/|-d }0d|d f}1tj"|) !|¡|, |1d\}}2}3d1}d}4d}5t|ƒD ]Ö}6tdƒD ]Ä}7|2|6|7f }|-|7 d d …|6f }8t 
dt|8ƒ¡}9t #|8¡t $|8¡ }:};|j|9|8d2|4d3 | %|:|;g¡ |j&|:|;gtj'|:dd4tj'|;dd4g|d. |7dkrØt|8jd ƒ}<|j(d5d6|d7 |6|d kr¼|jd8|d. |6dkrØ|j)d9|d: d. |7dkrjt |:|;¡}g d;¢}=g d<¢}>|j*|=|=|d. tt|=ƒƒD ]2}?|=|? gt|ƒ }9|j|9|d|>|? |4dd= q|6|d krj|jd>|d. |7dkrà|j(d5d6|d7 |6|d krà|jd?|d: d. qàqÒ| ¡  d S )ANr6   rD   r   r”  r$   r   r   r   r¬  r¦   r§   rÕ  rM  r   r  r  Træ  r£   r  r   rö  Fr  r   rô   rÌ  rÍ  r¶   rF  rÆ  r¡  r¢  r%   r³   r?   r*  Úncp_hals©Ú
fit_method©ÚranksÚ
replicatesrñ  Ú
fontfamilyÚRobotoú
Model rankr8   r7   Ú	ObjectiveúModel similarityr\  útab:blue©rH   rÃ  ©Údecimalsr¾   rÑ  rÒ  zNeuron numberúTCA factors (AU)rµ   ©r   rÆ  r”  é•   ©rÉ  r   r  rÉ  rÅ  úPosition (cm)úTrial number)rI  )+rQ   r  rR   rS   rW   ré  r   rT   r  r   rg   rb   rd   rÆ   rà  rh   rU   rY   Úflatten_warped_datar¥  rk   r[   Úunflatten_warped_datarV   ÚtensortoolsÚEnsemblerû   ra   Úplot_objectiveÚplot_similarityrf   re   rX   ÚfactorsÚplot_factorsr,  r-  r8  ru  r‡  rÇ   rl   rÚ  )@rr  rŸ  ru   rþ  r'   r(   r&   rç   rÈ   r«   rÉ   Útca_rankÚtca_replicatesÚtca_input_typerw   r@   r   r   r#  r  r  r  r  rü  rž  rÐ  r  r×   rÒ  rû  r   r  r	  rÎ   r  r  r  r  r  rÔ   Ú	tca_inputÚensembler¤  ÚhfontÚplot_replicateÚKTensorÚneuron_factorsÚtime_factorsÚtrial_factorsÚtca_factors_figsizerÕ   Úplot_objrÃ  Údrawn_AP_titleÚfactorÚfactor_typeÚvalsr  ÚminvalÚmaxvalÚpca_dim_listÚpos_landmarksÚcolors_landmarksÚlandmarkr£   r£   r¤   Útca_testÄ*  sÜ    $ÿ""ÿ
ÿ

ÿ"ÿ



,



ru  c            $      C   sè  g d¢} g d¢}d}d}d}d}d}d}d	}d	}d
}	t  ¡ jd }
d}d}tjtd ddd }t d|f¡}t| ƒD ]à\}}t|ƒD ]Î\}}|||f \}}|d d }|	d
kr¼| ¡ }n|	dkrÚt	j
||d\}}|}t	j||||||dd\}}}tjdd}|j|td|ƒ|d | |d ¡d }|d }|d }|d }t ||jf¡}q†qvt  ¡ \} }!t  |j¡ t  ¡ jd }
t d||¡}"t	j|g|"|
dddgddd}!t	 || ¡}#|!jd |# d!d" |!jd#|d" |!jd$|d" dS )%z' Get statistics for single-session TCA ©rµ   r6   r>   ri  rä  r”  r$   r   r   r   r¬  rÕ  rM  r   r   r  r  Træ  r£   r   r¬  r*  r  Fr%   rA  rB  rD  rö  rD   Nr   ©ru   r×   rn  rp  ro  Údraw_legendz%sr    r7   r»   zTime factor (normalized))rQ   rR   rS   rW   ré  r   r*  rö   r[   rT   r  rY   rX  rY  rû   ra   r\  rà  rü   rd   rh   rà  rÊ  rz  rl   rf   re   )$rp  rz  rþ  r'   r(   r&   rç   r^  r_  r`  ru   rw   r@   r   Útime_factors_totalrû  rr  r„  rŸ  r   r#  Útca_input_unwarpedr*  rü  r  ra  rÎ   rb  re  rf  rg  rh  r   r×   Úcentersr‹  r£   r£   r¤   Útca_single_session_statistics+  s\    
ÿÿr|  c               
   C   sª   t  d¡} t  d¡}d}d}d}d}d}t jtd d	d
d }t|ƒD ]^\}}t| ƒD ]L\}	}
||
|f \}}tj||d\}}tj|||d||d\}}}  dS qFdS )zM Sometimes the position goes back. Function to check issues and correct them r  r   r\  Útimer$   r   r¬  r  Træ  r£   r  r   )r&   r'   r(   N)rW   rg   ré  r   rö   rT   r  rY   )rp  rz  rþ  r(   r'   rç   r   r„  rŸ  rû  rr  r   r#  r*  rü  r  Údata_warpedÚsampling_warpedr£   r£   r¤   Únegative_position_checksë+  s     

ÿr€  c            :         sT  t  d¡‰ g d¢‰ g d¢} tˆ ƒ}d}d}d}d}d}t ¡ jd }t jtd	 d
dd }d}d}	d}
t ¡ jd }d}d}t jtd	 d
dd }tt	j
||||	d|
d}tt	j|dd
|	dd|
d}g d¢}t  d|t|ƒf¡}d}ttdƒƒD ]&\}}tˆ ƒD ]\}}|||f \}}t|ƒD ]ì}t|||ƒ |dkrT|||ƒ\}}}n¦|dkrt	j|||||dd
d\}}}|||ƒ\}} }nj|dkrÌt	j|||||dd
d\}}}|||ƒ\}} }n.|dkrt	j||d\}!}t	j|||||dd
d\}}}|||ƒ\} }}nâ|dkrdt	j||d\}!}t	j|||||dd
d\}}}|||ƒ\} }}n–|dkr°t	j||d\}!}t	j||||d dd
d\}}}|||ƒ\} }}nJ|d!krút	j||d\}!}t	j||||d dd
d\}}}|||ƒ\} }}||
 }"|"||||f< q$qqðt  d¡t  dd¡g}#g d¢} ˆ } d}d}d"d#g}$d$d%g}%t ¡ jd }d}&d||&  }'tj|'|&d|& d|' fd&\}(})|d7 }|) ¡ })t|ƒD ]š}|dd…dd…|f }*‡ fd'd(„| D ƒ}+|)| },t|+ƒD ]X\}-}t|#ƒD ]Œ\}.}/|-dkr|$|. }0nd}0|*|/|f }1t  |1¡}2t  |1¡}3|-t| ƒd |.  }4|,j|4gd |1dd)d*d+ |,j|4|2|3d,d|%|. |0d- qúd.d(„ | D ƒ}5|5d/g |5 }6t  dt| ƒ d ¡}7|,jd0||  |d1 |,jd2|
 |d1 |,jd3|d1 |d4dt| ƒ   }8|,j|7|6|8d1 |,j|d d5d6 |,jd7|d d8 |( ¡  qèqªt ¡ jd }d}d}tj||d&}(|d7 }t  ¡ },t|ƒD ]n}|dd…dd…|f }*|* ¡ }9t  |9¡}2t  |9¡}3|}4tj|4gt|9ƒ |9dd)d*d+ |,j|4|2|3d,dd9 q„|}6t  t|6ƒ¡}7|,jd:|d1 |,jd2|
 |d1 d)}8|,j|7|6|8d1 |,jd7d;d8 |( ¡  dS )<r'  r   r±  r   r   r$   r   r¬  r   r  Træ  r£   r6   r¦   r§   r   r  Fr  Nrê   )rM   r*  r)  r,  r+  zPCA time interp warpzPCA position interp warpr  ri  r   r}  r%   rD   r   r  rµ   Úinterpolationr>   rd  r®  r  rp  rô   c                    s   g | ]}t ˆ ƒ |¡‘qS r£   r-  rÊ  ra  r£   r¤   r¤  ¤,  r¥  z;warped_prediction_error_across_sessions.<locals>.<listcomp>r½  r¾  r.  r¶  r/  c                 S   s   g | ]}t | ‘qS r£   r  r  r£   r£   r¤   r¤  ·,  r¥  rò  zPrediction error, %sr7   r1  rµ  rý  r2  r	  rÂ   r¿   r=  r0  r³   )!rW   rg   rb   rQ   rR   rS   ré  r   r   rT   r   rÄ   r*  rö   ra   rm   rY   r  rd   rv  r0  rÝ  rÆ   rÞ  rl   re   rf   rÚ  rj   rÇ   rk   r  r  ):r3  rÝ   r&   rþ  r'   rç   ru   r   rÈ   r«   rÉ   rw   r@   r!  rÊ   r?  r>  Únum_of_plotsrû  rr  r„  rŸ  r   r#  rF  rü  rž  rÐ  r  r	  rÎ   r  r  r*  rë  r4  rÚ  r¾  Únum_columnsÚnum_rowsr   rÕ   rt  r5  r×   r6  r7  r  rI   r8  rð  rÝ  rí  r9  r:  r¦  r;  rÕ  r£   ra  r¤   Ú'warped_prediction_error_across_sessions,  s   

ÿÿ

ÿ
ÿ
ÿ
ÿ
ÿ
ÿ(



 

r…  c                     s|  t  d¡} t| ƒ}dg}t|ƒ}d}d}d}d}d}t ¡ jd }t jtd	 d
dd }	d}
d}d}t ¡ jd }d}d}t jtd d
dd }t|ƒD ]Þ\}}g }g }t j	‰ t| ƒD ]B\}}|||f \}}|j
d }t  ˆ |¡‰ | |¡ | |¡ q¶tˆ ƒ‰ ‡ fdd„|D ƒ}t| dd… ƒD ]P\}}|| ||d   }}|| ||d   }}t|||||
|||dd	 q$q˜dS )á   Performs TCA across sessions for an animal.
        Step 1: perform PCA, limit to minimum possible of dimensions
        Step 2: align through CCA, so every dimension represents something similar about the data
        Step 3: split into trials through warping
        Step 4: TCA!
    r   r6   r   r   r$   r   r¬  r   r  Træ  r£   r¦   r§   r   r  rå  r   c                    s   g | ]}|d ˆ … ‘qS rf  r£   ©r   r*  ©Úmin_dimensionr£   r¤   r¤  +-  r¥  ú'CCA_across_sessions.<locals>.<listcomp>Nrö  F©rÈ   r«   rÉ   r&   rh   ©rW   rg   rb   rQ   rR   rS   ré  r   rö   ro  rV   rX   rø   r  rÙ   ©rz  rÝ   rp  rÜ   r&   rþ  r'   rç   ru   r   rÈ   r«   rÉ   rw   r@   rë  rû  rr  r@  rA  r„  rŸ  r   rü  rÛ   rn   rp   ro   rq   r£   rˆ  r¤   ÚCCA_across_sessionsã,  sH    	


ÿrŽ  c                     s|  t  d¡} t| ƒ}dg}t|ƒ}d}d}d}d}d}t ¡ jd }t jtd	 d
dd }	d}
d}d}t ¡ jd }d}d}t jtd d
dd }t|ƒD ]Þ\}}g }g }t j	‰ t| ƒD ]B\}}|||f \}}|j
d }t  ˆ |¡‰ | |¡ | |¡ q¶tˆ ƒ‰ ‡ fdd„|D ƒ}t| dd… ƒD ]P\}}|| ||d   }}|| ||d   }}t|||||
|||d
d	 q$q˜dS )r†  r   r6   r   r   r$   r   r¬  r   r  Træ  r£   r¦   r§   r   r  rå  r   c                    s   g | ]}|d ˆ … ‘qS rf  r£   r‡  rˆ  r£   r¤   r¤  …-  r¥  rŠ  Nrö  r‹  rŒ  r  r£   rˆ  r¤   rŽ  =-  sH    	


ÿc	           n         st  ddl m}	 |du r"t t| ƒ¡}
ˆdu r0tj‰|du r>tj}|du rLtj}t|ƒ}|}tj	}tj
}tj}d}tj‰ tj}tj}t ¡ jd }|du r¤dddddœ}t ¡ jd }d	}d
}dd„ | D ƒ}t |¡}ˆ|krîtd|ˆf ƒ |‰‡fdd„| D ƒ} |	|| ||||ƒ\}‰‰‡‡fdd„t|ƒD ƒ}‡ ‡fdd„t|ƒD ƒ}|}g }t|ƒD ]‚\}}|| }|| }tj||||||dd\} }!}"tt| ƒ| ƒ}#| |#¡ |dkr¼| }$|!}%nt |$| f¡}$t |%|!f¡}%qXtj|%dd\}%}"}"tt|ƒƒ}&t|&dƒ t |%|&¡}'tj|d}(|(j |'tddƒ|dd |})d}*|( !|)¡|* }+|+d },|+d }-|+d }.g }/t|ƒD ]\}}0|/ "|g|0 ¡ qpt #|/¡}/ddl$m%}1 |1ddddd}2g }/t|ƒD ]\}}0|/ "|g|0 ¡ q¾t #|/¡}/|2  |.|/¡ |2 &|.¡}3tj'|3|/|dd\}4}5}"}"|dkrtj(|dd}6|d7 }|6j)dd}7|7 *d |t+|d  d!d„ |D ƒf ¡ tj,d|d||d"did#\}8}9|d7 }t|ƒD ]Š}:t|:|d kƒ};| |: }||: }tj-|||| d$\}<}=}"tj.|=|<|9d|:f d|;d% |9d|:f  /¡  |9d|:f j*t+||:  d&d' q”|8 0¡  tj,d|d||d"did#\}8}9|d7 }t|ƒD ]Š}:t|:|d kƒ};||: }||: }tj-|||| d$\}<}=}"tj.|=|<|9d|:f d|;d% |9d|:f  /¡  |9d|:f j*t+||:  d&d' qV|8 0¡  tj,d|d||d"did#\}8}9|d7 }d‰ t|ƒD ]Ž}:t|:|d kƒ};ˆˆ  |: }||: }tj-|||| d$\}<}=}"tj.|=|<|9d|:f d|;d% |9d|:f  /¡  |9d|:f j*t+||:  d&d' qtj1ˆˆ  d |d ||d(ddd|d)ddd*\}8}tj1|%|$||d(ddd|d)ddd*\}8}t 2¡ }>|> *d+¡ t (|¡ |d7 }t 3|'¡}?t 4|?ddd…f ¡ t ,dd¡\}8}@|d7 }tj5|(|@d d, tj6|(|@d d, |@d j7d-d.d' |@d j7d-d.d' |@d j8d/d.d' |@d j8d0d.d' |8 0¡  d	|d f}Atj9|( !|)¡|* |Ad1\}8}9}B|d7 }d&}d2}Ct|)ƒD ]œ}DtdƒD ]Š}E|9|D|Ef }>|+|E dd…|Df }Ft dt|Fƒ¡}Gt |F¡t :|F¡ }H}I|>j4|G|Fd3|Cd4 |> ;|H|Ig¡ |>j<|H|Igtj=|Hdd5tj=|Idd5g|d' |EdkrVt|Fj>d ƒ}J|>j?|J|J|d' |JD ]4}Kt @|H|I¡}L|Kgt|Lƒ }G|>j4|G|Ld6d7d8d9 qè|D|)d kr:|>j7d:|d' |DdkrV|>j*d;|d< d' |Edkrèt @|H|I¡}Lg d=¢}Mg d>¢}N|>j?|M|M|d' tt|MƒƒD ]2}O|M|O gt|Lƒ }G|>j4|G|Ld6|N|O |Cd?d@ q˜|D|)d krè|>j7dA|d' |Edkr$|>jAdBdC|dD t|ƒD ]¢\}}t|d|… ƒ}Pt|d|d … ƒ}Qt @|H|I¡}L|Pgt|Lƒ }G|>j4|G|Ld6dEdFd9 |dGv 	r
t @|P|Q¡}G|Hgt|Gƒ }R|Igt|Lƒ }S|>jB|G|R|Sd7d8d9 	q
q$qtj'|3|/|dd |d7 }dH}tj(|d
d1}8|d7 }t 2¡ }>|3dd…df |3dd…df  }T}Ut|ƒD ]R}Vt C|/|Vk¡d }W|T|W }X|U|W }Y|>jD|X|YdI|/|W dJd|d t+||V  dK 
q|>jEddLdM |>j7dN|d' |>j8dO|d' |>jAdPdC|dD |>j*dQ|4 |d2 d' |2jF}Z|2 &|2jF¡}Z|Zj>d }[t G|[|[f¡}\t|[ƒD ]:}]t|[ƒD ]*}^tjH I|Z|] |Z|^  ¡}_|_|\|]|^f< 
qþ
qòt :|\¡}`d}atj,|dRd\}8}>|d7 }d	}|>jJ|\dSdTdU}bdVd„ |D ƒ}c|>j?t |¡|c|d' |>j<t |¡|c|d' |>j*dW|d< d' |8jK|bdXdY};tj@|a|`dZtd[}d|;jLj<|d|d|d' |;jLj8d\|d' t|\ƒ t|2jFj>ƒ t|2 &|2jF¡j>ƒ g }/t|ƒD ]N\}}0t+||  }ed]|ev sRd^|ev rXd}Vnd_|ev rfd}V|/ "|Vg|0 ¡ q*t #|/¡}/tt M|/¡ƒ}ft Nd|fd ¡}g|1dd|gdd}2|2  |.|/¡ |2 &|.¡}3tj'|3|/|dd\}4}5}"}"|dkrht (|¡ |d7 }g d`¢}ht|gƒ |gdkr°dadbg}it t|/ƒ¡}jtt M|/¡ƒD ]d\}k}Vt C|/|Vk¡d }W|j|W }l|3|W }mtjD|l|mdc|h|k |i|V dd tjOded.d' tjPdfd.d' q<tjEd	d' n´|gdkrdg dg¢}i|3dd…df |3dd…df  }T}Utt M|/¡ƒD ]d\}k}Vt C|/|Vk¡d }W|T|W }X|U|W }YtjD|X|Ydc|h|k |i|V dd tjOdNd.d' tjPdOd.d' qòtjEd	d' dS |(|3|/|4fS )haO  
    

    Parameters
    ----------
    pca_list : list of arrays
        List with the PCAs to analyze, each of size (num features) X (num samples).
    position_list : list of arrays
        list with the position arrays, each of size (num samples).
    session_list : list of ints, optional
        List with the session INT indicators. If None, it assumes it goes from 0 to num_sessions. The default is None.
    mnum : int, optional
        Mouse number, only used for plotting. The default is None.
    cca_dim : int, optional
        Dimensions of the PCA used by the CCA. The default is 3.
    tca_method : str, optional
        Can be:  "cp_als", "mcp_als", "ncp_bcd", "ncp_hals"
        See https://github.com/neurostatslab/tensortools for details

    tca_factors : int, optional
        Number of TCA factors. The default is 3.
    tca_replicates : int, optional
        Number of times the TCA analysis is repeated (increases robustness). The default is 10.
    max_pos : int or float, optional
        Maximum value attained by the position. The default is 1500.
    SI_params : dict, optional
        Dictionary with the parameters for the structure index. The default is None.
    plot : bool, optional
        If True, plot all the steps of the process. The default is True.

    Returns
    -------
    LDA : TYPE
        DESCRIPTION.

    r   ©Úperform_warped_mCCANTr   r   F)Ún_neighborsÚdiscrete_labelÚnum_shufflesÚverboser   r  c                 S   s   g | ]}|j d  ‘qS r—  )rV   r‡  r£   r£   r¤   r¤  ð-  r¥  z/perform_tca_across_sessions.<locals>.<listcomp>zSWARNING: reducing cca_dim to %d as at least one dataset has less than %d dimensionsc                    s   g | ]}|d ˆ … ‘qS rf  r£   r‡  )r‚   r£   r¤   r¤  ÷-  r¥  c                    s    g | ]}ˆ   ˆ| | |¡‘qS r£   )Úto_canonicalr‘  )ÚmCCA_objÚpca_dict_alignedr£   r¤   r¤  ú-  r¥  c                    s   g | ]}ˆˆ  | ‘qS r£   r£   r‘  )Úalign_tor—  r£   r¤   r¤  ÿ-  r¥  )r)   rü  ÚhrB  rÕ  ©rE  rF  r”  rD   r   Úsvd©ÚsolverÚ	shrinkagerá   Ústore_covariance©ÚSI_binsrh   r´   r  rÕ  r  r  c                 S   s   g | ]}t | ‘qS r£   r  rÊ  r£   r£   r¤   r¤  M.  r¥  rÔ  rÖ  rÝ  ©r×   rÆ   r5   r\  r7   rÆ  r¡  )	r@   r#   r5   r"   r@  rw   rÀ   r£  rÃ  zConcatenated PCArñ  rI  r³   rJ  rK  rô   r6   rL  rM  rN  rÌ  rÍ  râ   rF  úPCA dimrP  rµ   rQ  rS  r¶   rÅ  rT  r¾   rÑ  rÒ  rÉ  r¶  rè  r~  r^  r÷  ©r¸   rb  rß  r^  r_  rI   r½  ©Úscatterpointsr8   úLDA 1úLDA 2rÐ  ú	SI = %.3f©ri  ró   ÚGreysÚnearest©rß  r  c                 S   s   g | ]}t | ‘qS r£   r  rÊ  r£   r£   r¤   r¤  õ.  r¥  úLDA class means distancesr  ©Úshrinkr>   ©rA   rW  úDistance (AU)r³  r´  rü   r  úNo APr   r”  r%  rU  ÚLDAr²  )QÚmCCAr  rW   rg   rb   ÚpparamÚCCA_concat_dimÚTCA_factorsr
   ÚCCA_concat_trial_bin_numÚCCA_concat_warp_sampling_typeÚCCA_concat_warp_based_onÚCCA_concat_align_toÚ
TCA_methodÚTCA_replicatesrQ   rR   rS   r,  rm   ra   rö   rT   rY   r  rø   r+  r	  r•  rW  rX  rY  rû   r\  r¥  rw  Úsklearn.discriminant_analysisr   Ú	transformÚget_structure_indexr  r%  rl   r   rd   rî  rï  ri   rk   rU   r  rV  rh   rZ  r[  rf   re   r]  r-  r8  ru  r‡  rV   rÚ  rà  rÇ   rH  râ  rÆ   rj   Úmeans_r*  r^   r_   rq  r|  r×   rª  rX   rB  rC  )nrA  r@  rz  rr  rh   r‚   Útca_factorsr&   Ú	SI_paramsr  Úsessoin_listrÝ   ÚMrþ  r'   r(   Útransform_original_dataÚ
tca_methodr_  ru   rw   r+  Úpca_dimsÚpca_smallest_dimÚpos_list_alignedÚpca_list_canonicalÚpca_list_alignedÚnum_trials_listr„  rŸ  rí  r*  Úpos_wÚpca_wrÎ   rx  Úpos_concatenatedÚpca_concatenatedÚtotal_trial_numÚpca_concatenated_by_trialÚTCA_ensemblerç   ÚTCA_replicate_selectionre  rf  rg  rh  r  Úntrialsr   r´  Útrial_factors_projectionÚSIÚ	bin_labelr>  r?  r   rÕ   r’  r5   Úpos_binsÚpca_avgr×   Úfr¤  ri  rj  rÃ  rl  rm  rn  r  ro  rp  rq  Úpca_dim_idxrû  rr  rs  rt  rÑ  rÒ  Úyy1Úyy2ÚldaxÚldayrI   Ú
label_idxsr¾   rÂ   Úclass_meansÚnum_classesÚLDA_dist_matrixÚc1Úc2r  Úmax_valÚmin_valÚimgr¿  Ú
cbar_ticksÚsnameÚunique_labelsrá   Úlabel_colorsÚlabel_namesÚldatÚ	label_idxÚtÚlda1r£   )r˜  r‚   r–  r—  r¤   Úperform_tca_across_sessions–-  s   &ü
ÿ




ý


&"""ÿ
ÿ


,




 ".



ý



" 6rõ  c                  C   sÌ   ddl m}  d}g d¢}t|ƒ}|tv r\t| D ]*}|d |v r0|d |v r0| |d ¡ q0d}tjtd dd	d
 }g }g }t|ƒD ],\}}	|||	f \}
}| 	|
¡ | 	|¡ q†t
||||d|d dS )r†  r   r  r>   ©r   rD   r   rµ   r6   r>   ri  r   r6   rå  Træ  r£   )rz  rr  rh   rÃ  N)rµ  r  rk  r	   rm  rW   ré  r   rö   rø   rõ  )r  rr  rz  Úrepeated_pairrÃ  rë  r@  rA  r„  rŸ  r   rü  r£   r£   r¤   Ú$tca_across_sessions_single_mouse_old/  s(    


ÿ	rø  c                 C   sˆ   t  dd¡\}}tj| |d d tj| |d d |d jddd |d jddd |d jddd |d jd	dd | ¡  d S )
Nr   rD   r   rñ  rI  r³   r7   rJ  rK  )rQ   rd   rX  rZ  r[  rf   re   rk   )rÕ  r   r¤  r£   r£   r¤   Úplot_TCA_optimization×/  s    rù  c                  C   s  d}t | jƒ}|  |¡| }|d }|jd }d|d f}tj|  |¡| |d\}}	}
d}d}t|ƒD ]–}tdƒD ]†}|	||f }|| d	d	…|f }t dt |ƒ¡}t 	|¡t 
|¡ }}|j||d
|d | ||g¡ |j||gtj|ddtj|ddg|d |dkr¨t|jd ƒ}|j|||d |D ]4}t ||¡}|gt |ƒ }|j||dddd q:||d krŒ|jd|d |dkr¨|jd|d d |dkr:t ||¡}g d¢}g d¢}|j|||d tt |ƒƒD ]2}|| gt |ƒ }|j||d|| |dd qê||d kr:|jd|d |dkrv|jdd|d t|ƒD ]¢\}}t|d	|… ƒ}t|d	|d … ƒ}t ||¡}|gt |ƒ }|j||dddd |dv rZt ||¡}|gt |ƒ }|gt |ƒ }|j|||ddd qZqvqhd	S ) aY   Plots TCA results for trials of an aversive task following Negar's experimental design.
        Assumes the trials are concatenated across sessions, computed for PCA.
        TCA_ensemble: output from tensortools' TCA method
        session_list: list of session numbers used
        num_trials_by_snum: number of trials per session number
    r   rD   r   r   rô   r\  r6   r   NrL  rM  rN  r7   rÌ  rÍ  râ   rF  r£  rP  rµ   rQ  rS  r¶   rÅ  rT  r¾   rÑ  rÒ  rÉ  r¶  rè  )rb   r'  r\  rV   rX  r]  ra   rW   rg   r,  r-  rh   r8  ru  r‡  rÚ  rà  rf   rl   rÇ   rö   r•  rH  ) rÕ  rz  Únum_trials_by_snumrÖ  r¸  re  rh  ri  r   rÕ   rj  rw   rÃ  rl  rm  r×   rn  r  ro  rp  rq  rÞ  rû  rr  rs  rt  r„  rŸ  rÑ  rÒ  rß  rà  r£   r£   r¤   Úplot_TCA_in_aversive_taskã/  sh    

,



rû  rÆ  c                 C   s¨   |d u r0t  ¡ jd }t j|dd t jdd}t| ƒ}t|ƒD ]B}d}| | }	|| }
tj|	|
|d\}}}tj	|||d|d q@| 
¡  |d u r¤t  ¡ }| ¡  d S )	Nr   rU  rô   rÕ  r  FrÝ  r¢  )rQ   rR   rS   r  r´  rb   ra   rT   rî  rï  ri   rk   )rA  r˜  Úaverage_by_sessionÚpca_plot_binsr×   ru   r+  r„  r5   r*  rí  rÛ  rÜ  rÎ   r   r£   r£   r¤   Úplot_pca_overlapped10  s    rþ  c                 C   sÞ  |du r(t  ¡ jd }t  |¡ t  ¡ }| jd }t |¡}g d¢}|dkröddg}	t t	|ƒ¡}
t
|ƒD ]ˆ\}}t ||k¡d }|
| }| | }|j||d|| |	| d |jd	d
d |jdd
d | ¡ d dkrj| | ¡ d dg¡ qjn¢|dkr˜g d¢}	| dd…df | dd…df  }}t
|ƒD ]d\}}t ||k¡d }|| }|| }|j||d|| |	| d |jdd
d |jdd
d q2|jddd |jddd |rÆ|jdd |durÚt||ƒ dS )aD   Plot LDA projection. Assumes it's either 1d or 2d
        LDA_projection is the output of scipy's LDA.transform, has shape "num_trials" X "LDA dimension"
        label_by_trial has shape "num_trials"
        snum_by_trial has shape "num_trials", indicates the session number. Used to mark session separation (optional)
    Nr   r  r³  r   r   r”  r%  rU  r³   r7   r´  r   g      @rD   r²  r§  r¨  rÂ   r¿   r¾   )rQ   rR   rS   r  r  rV   rW   rª  rg   rb   rö   râ  rÆ   rf   re   r9  r8  rÇ   rj   Ú$add_session_delimiters_to_trial_plot)Útrial_factors_LDA_projectionÚlabel_by_trialÚsnum_by_trialÚplot_legendr×   ru   ÚLDA_componentsrî  rï  rð  rñ  rò  rI   rã  ró  rô  rá  râ  r¾   rÂ   r£   r£   r¤   Úplot_LDA_projectionG0  sD    



"
r	  c                    sþ   |   ¡ \}}t t |¡¡}g d¢‰ ‡ fdd„|D ƒ}d}|D ]¬}||k}t|ƒt |ddd… ¡ d }	||d kr | j|	d gd tj||dd	d
ddd ||v r>|du r¾t |¡d }||d kr>|	d }
| j||
g||ddd q>|  	||g¡ dS )zí For a plot whose x axis is the trial number, add session delimiters.
        snum_by_trial: array of size "num trials", each element is the session number
        assumes sessions 3,4,5,6 have an airpuff, and are marked differently
    rè  c                    s   g | ]}|ˆ v r|‘qS r£   r£   r  ©ÚAP_sessionsr£   r¤   r¤  ”0  r¥  z8add_session_delimiters_to_trial_plot.<locals>.<listcomp>Nrö  r   râ   r”  rù  rÌ  rÍ  rF  r  )
r9  rW   rç  rª  rb   rÿ   rh   rà  rH  r8  )r×   r	  rR  rI  Úsnum_uniqueÚAP_sessions_datasetÚstart_APrŸ  ÚsboolÚlast_trial_idxÚend_APr£   r	  r¤   rÿ  Œ0  s"     *rÿ  c                    s†  t |ƒ}t t |¡¡}g d¢‰ ‡ fdd„t|ƒD ƒ}|d u ræt |¡ |d7 }d}	t ¡ }
|
 t 	|¡| ¡ t
|
|ƒ |
jd|	d |
jd|	d |
jd	dd
 |
jddd
 t |¡ |d7 }t ¡ }t |¡ |d7 }t ¡ }nt |ƒdksöJ ‚|\}}d}	g }g }t|ƒD ]b\}}t ||k¡d }| | }| t |¡¡ | t |¡¡ |j|gt |ƒ |dddd qt 	t |ƒ¡}|j|||ddddddd	 t | | ¡}t | t |¡ ¡}t ||g¡}| ¡ \}}|j||gddgdddd | ||¡ | |¡ |jdd„ |D ƒ|	d |jd	|	d
 |jd|	d | dt | ¡|f ¡ d}	g }||k}t|ƒD ]4\}}t ||k¡d }|| }| t |¡¡ qrt 	t |ƒ¡}|j||ddd t || ¡}t |t |¡ ¡}t ||g¡}| ¡ \}}|j||gddgdddd | ||¡ | |¡ |jdd„ |D ƒ|	d |jd	|	d
 |jd|	d | dt |¡|f ¡ |S ) Nrè  c                    s   g | ]\}}|ˆ v r|‘qS r£   r£   )r   r›   rŸ  ©ÚAP_snumr£   r¤   r¤  «0  r¥  z*plot_LDA_probabilities.<locals>.<listcomp>r   r   rU  r7   zProbability of correct labelrÂ   r¿   r¾   rD   r   rÍ  râ   )r¸   rb  r¹   rÎ   r   r    r   r©  rÌ  rM  c                 S   s   g | ]}t | ‘qS r£   r  r  r£   r£   r¤   r¤  ß0  r¥  zProbability correct labelz Avg p: %.3f  //   Weighted: %.3fzo-r  c                 S   s   g | ]}t | ‘qS r£   r  r  r£   r£   r¤   r¤  û0  r¥  zPercentage correctz Total: %.3f  //   Weighted: %.3f)rb   rW   rç  rª  rö   rQ   r  r  rh   rg   rÿ  rf   re   rÇ   râ  rø   rÜ  rÝ  rÆ   r/  r:  râ  rá  rÚ  rÛ  rl   )ÚLDA_prob_correctr	  Úlabel_by_trial_predictedr	  ru   rÕ   rx  rz  ÚAP_idxsrw   r×   Úax_probÚax_accÚprob_avg_listÚprob_std_listr„  rŸ  Úsnum_trial_idxsÚprobr  ÚAP_avgÚNAP_avgÚtotal_weighted_prò  ró  Ú	pred_boolÚpred_bool_sessionr£   r	  r¤   Úplot_LDA_probabilities¤0  s~    

"

r	  c            +         sÀ  d} d}t jtd|  ddd }|d }|d }d	}d
}d}d}d}	d}
d
}g d¢‰ ||df }‡ fdd„|D ƒ}t|ƒ}||df }||df }t||||ƒ\}}‰‡fdd„t  ˆ¡D ƒ}tˆƒ}t|ƒ}d}||k r.z,tj|d}|j|t	d|d ƒ|dd W n t
y&   |d7 }Y qÔ0 q.qÔd}| |¡| }|d }|d }|d }tˆƒ}t  |¡}t|ƒ}t  d|d ¡}t  ||f¡} t j|td}!t  |¡}"|}#t	|ƒD ]’}$t  |¡|$k}%|#|% }&|#|$g }'||% }(||$ })tdd|dd}*|* |&|(¡ t  |* |'¡¡| |$dd…f< |* |'¡|!|$< |* |'¡d|)f |"|$< q´t||d|
d |	d7 }	t|ƒ |	d7 }	t|||ƒ |	d7 }	t| |ˆƒ |	d7 }	t| |!ˆƒ |	d7 }	t|"||!ˆ|	ƒ dS )r†  r   Úoptimized_aligned_data_dictú%s.npyTræ  r£   rp  r?  rA  r>   rÕ  r   rÆ  ©	r   r   rD   r   rµ   r6   r>   ri  r  rz  c                    s   g | ]}|ˆ v r|‘qS r£   r£   r  ©Úsessions_to_decoder£   r¤   r¤  +1  r¥  z4tca_across_sessions_single_mouse.<locals>.<listcomp>rí  r*  c                    s   g | ]}t  ˆ |k¡‘qS r£   ©rW   r•  r  ©r	  r£   r¤   r¤  21  r¥  r   rB  Frš  rD   rV  Úeigenrœ  N)rü  rý  )rW   ré  r   rb   Úreshape_pca_list_by_trialrª  rX  rY  rû   ra   rE  r\  Ú get_AP_labels_from_snum_by_trialrX   r*  r  rg   r   rÙ  rÀ  ÚpredictÚpredict_probarþ  rù  rû  r	  r	  )+r&   Údata_filenamer	  rp  r?  r½  r¸  r¾  ÚTCA_convergence_attemptsru   rý  rr  rz  rÝ   r˜  rA  r„  Úpos_by_trialrú  rx  r+  ÚTCA_attempts_counterrÕ  rÖ  re  rf  rg  rh  r	  rî  Únum_unique_labelsr	  ÚLDA_projectionr	  r	  Ú	LDA_inputÚ	trial_idxÚ
train_idxsÚLDA_train_inputÚLDA_test_inputÚLDA_train_labelÚLDA_test_labelr´  r£   )r#	  r	  r¤   Ú tca_across_sessions_single_mouse1  s‚    	
 


ýr8	  c                 C   s~   t  |¡}t  |¡}t|ƒD ]*\}}| d|¡}|  |¡ ¡ }|||< q|t j |¡ }t  	d| |  d| ¡ ¡ ¡szJ ‚|S )Nr   rD   )
rW   r`   r*  rö   rh  rÀ  rÙ  r^   r_   Úallclose)ÚLDA_objÚnum_featuresÚIDÚLDA_axÚdim_idxÚeuler_vectorÚ
euler_projr£   r£   r¤   Úget_LDA_axis“1  s    


"rA	  r¶   r\  c           '         s,  d}| j d }tˆƒ‰t ˆ¡}‡‡fdd„|D ƒ}t |¡t |¡ }	}
t ˆ|f¡}tjˆtd}t ˆ¡}t ˆ|f¡}tˆƒD ]–}t 	ˆ¡|k}|
|kr†t ||f¡}tj|td‰ t |¡}t ||f¡}t|ƒD ]}||	 }ˆ|k}ˆ|k}d ||< ||< tj
jt |¡d t |¡dd}tjˆtd}d	||< t ||¡}|}| | }| |g }ˆ| }ˆ| }td
d|dd}| ||¡ t | |¡¡||dd…f< | |¡ˆ |< | |¡d|f ||< t||ƒ}|||dd…f< t |t |¡¡} qà‡ fdd„|D ƒ}!|t |!¡ }"ˆ |"k}#t ||# ¡}$t ||# ¡}%tj|dd}&|$||dd…f< |"||< |%||< |&||dd…f< q†| | }| |g }ˆ| }ˆ| }td
d|dd}| ||¡ t | |¡¡||dd…f< | |¡||< | |¡d|f ||< t||ƒ}|||dd…f< q†||||fS )zþ LDA_input: size "num samples" X "num features"
        labels: size "num samples"
        LDA_components: int
        imbalance_prop: float between 0 and 1 (if the proportion of a class is larger than this, deal with data imbalance during training)
    r”  r   c                    s   g | ]}t  ˆ |k¡ˆ ‘qS r£   r$	  ©r   rI   ©r  r¿  r£   r¤   r¤  «1  r¥  zperform_LDA.<locals>.<listcomp>rV  Fr   ©r¢  Tr&	  rœ  Nc                    s   g | ]}t  ˆ |k¡‘qS r£   r$	  rB	  ©Úlabel_list_repr£   r¤   r¤  â1  r¥  rü  )rV   rb   rW   rª  rÿ   r-  r*  r  ra   rg   rµ  r¶  râ  r•  rã  rÉ  r   rû   rÙ  rÀ  r)	  r*	  rA	  r?  r0  )'r1	  r  r	  Úimbalance_propÚimbalance_repetitionsru   r;	  rî  Úprop_by_labelÚmax_class_idxÚmax_propr0	  Úlabel_predictedr	  ÚLDA_ax_per_binrÂ  r3	  Úproj_list_repÚprob_list_repÚ
LDA_ax_repÚrepÚ	max_classÚmax_boolÚmin_boolÚselected_trialsÚkept_trials_boolr4	  r5	  r6	  r7	  r´  r=	  ÚLDA_proj_from_axÚlabel_countÚlabel_prã  Úprojr	  Úlda_axr£   ©rF	  r  r¿  r¤   Úperform_LDAŸ1  sŠ    




"
ý

ý
r]	  c            R         s°  d} d}t jtd|  ddd }|d }|d }d	}d
}d}d}d}	d}
d}d}d}d}d}ddg}ddg}t|ƒ}g d¢‰g d¢‰d}|d |d  }|dkr¦d}tj||dd| d| f|ddid\}}|d7 }tj||dd| d| f|d\}}|d7 }||g}t  |df¡}t  ||df¡‰t  ||df¡‰ t jtd ddd }t|ƒD ]4\}}t|ƒ ||d f ‰||d!f }||d"f }‡fd#d$„ˆD ƒ‰tˆƒ} t	|||ˆƒ\}!}"‰t|"j
ƒ  d%S ]\}+d},|,|k r†z,tj|d(}-|-j|!td|d ƒ|dd) W np ty(   |,d7 },Y nZ t jjyF   |,d7 },Y n< ty| }. ztd*|.ƒ |,d7 },W Y d%}.~.nd%}.~.0 0 q†qÖd}/|- |¡|/ }0|0d }1zt|1|#|)|
|ƒ\}2}3}4}5W n t jjyÚ   Y qÌY n0 t |#|3¡}6t  |6¡}7|7|*kr|7}*|6}8|1}9|2}:|3};|4}<|5}=|8||d%d%…f< qÌt|ƒD ]R}>t jjt  |%¡|%dd+‰|#ˆ }?t|9|?|)|
|ƒ\}@}A}@}@t |#|A¡ˆ||>f< q4t|ƒD ]–}>t jjt  |&¡|&dd+‰‡‡fd,d-„tˆƒD ƒ‰‡fd.d$„ˆD ƒ}Bt|Bƒ}Ct  |#|C¡dkr”qøq”t|9|C|)|
|ƒ\}@}D}@}@t |#|D¡ˆ ||>f< q| ¡ | }E|Ej d/| d0d1 t!||d||Ed2 | ¡ | }E|Ej d/| d0d1 t"|:|;ˆ|dk|Ed3 qXtjdddd4|d\}F}G|Gd5 }G|d7 }t  |¡}HttdƒƒD ]8\}I}J||I }K|Gj#|H|d%d%…|If d6||I |Kd7d8 qÎ|Gj#|Ht j$|dd9d6d:d;d< |Gj%|Ht j$|dd9dg| d=d:d>dddd?	 |dkr¨‡fd@d$„t|ƒD ƒ}L‡fdAd$„t|ƒD ƒ}M|Gj%|H|L|Md=dBddCd>ddddD |dkrþ‡ fdEd$„t|ƒD ƒ}L‡ fdFd$„t|ƒD ƒ}M|Gj%|H|L|Md=dGddHd>ddddD |Gj&dId1 |G 'dJ|d7 g¡ |G (d|G )¡ d g¡ d0}Nt  |¡}HdKd$„ |D ƒ}O|Gj*|H|O|Nd1 |Gj+dL|Nd1 |Gj,dM|NdN |G -¡ }P|Gj.|PdOdOgdPdOdQ |D ]}Q|Q /¡  qœd%S )Rr†  r   r	  r 	  Træ  r£   rp  r?  rA  r>   rÕ  r6   r¶   r   r   rÆ  r   r   r³  r   r!	  ©r   r   rD   r   rµ   r6   r>   rD   Frµ   r   rÔ  rÕ  rÖ  rÛ  rå  rz  rí  r*  c                    s   g | ]}|ˆ v r|‘qS r£   r£   r  r"	  r£   r¤   r¤  Z2  r¥  z5tca_across_sessions_multiple_mice.<locals>.<listcomp>Nc                    s   g | ]}t  ˆ |k¡‘qS r£   r$	  r  r%	  r£   r¤   r¤  c2  r¥  rö  rB  rš  úUnexpected errorr¡  c                    s   i | ]\}}|ˆ ˆ|  “qS r£   r£   )r   r„  rŸ  )rz  Úshuffled_idxsr£   r¤   rÀ  ±2  r¥  z5tca_across_sessions_multiple_mice.<locals>.<dictcomp>c                    s   g | ]}ˆ | ‘qS r£   r£   r  )Úsession_dict_shuffledr£   r¤   r¤  ²2  r¥  rW  r   r7   ©rü  rý  r×   ©r	  r×   ©r>   r6   rÈ  r+  rå  ©r¸   rH   rI   r¹   rü  rÉ  ÚAvgr%  rÎ   r    r©  c                    s$   g | ]}t  t jˆ | d d¡‘qS ©r   rü  ©rW   rÜ  ©r   rû  ©Úf1_array_shuffler£   r¤   r¤  Ó2  r¥  c                    s$   g | ]}t  t jˆ | d d¡‘qS rg	  ©rW   rÝ  ri	  rj	  r£   r¤   r¤  Ô2  r¥  rÍ  úTrial shuffle©	r¹  r  rH   r¹   rI   rØ  r	  r
  r»  c                    s$   g | ]}t  t jˆ | d d¡‘qS rg	  rh	  ri	  ©Úf1_array_session_shuffler£   r¤   r¤  Û2  r¥  c                    s$   g | ]}t  t jˆ | d d¡‘qS rg	  rl	  ri	  ro	  r£   r¤   r¤  Ü2  r¥  Ú	darkkhakiúSession shuffler  çš™™™™™¹¿c                 S   s   g | ]}d | ‘qS ©rW  r£   rà  r£   r£   r¤   r¤  æ2  r¥  úF1 scorerÂ   r¿   râ   ú--kr†  )0rW   ré  r   rb   rQ   rd   r*  rö   rm   r'	  rV   r(	  rª  rX   ra   rX  rY  rû   rE  r^   ÚLinAlgErrorÚ	Exceptionr\  r]	  rT   Úmulticlass_f1r0  rµ  r¶  rg   r9	  rv  rl   rþ  r	  rÆ   rÜ  r/  rj   rá  r8  r9  rÚ  re   rÇ   râ  rh   rk   )Rr&   r+	  r	  rp  r?  r½  r¸  r¾  r,	  ÚTCA_on_LDA_repetitionsÚLDA_imbalance_propÚLDA_imbalance_repetitionsÚLDA_trial_shufflesÚLDA_session_shufflesru   rý  rï  Úlabel_APr  r×  rØ  Úfig_pcaÚaxs_pcaÚfig_LDAprojÚaxs_LDAprojÚfig_listÚf1_arrayÚpca_data_dictrû  rr  r˜  rA  rÝ   r„  r-	  r	  rú  rx  r+  rî  r/	  r	  Ú
f1_avg_maxÚTCA_on_LDA_counterr.	  rÕ  r  rÖ  re  Útrial_factors_tempÚLDA_projection_tempÚlabel_by_trial_predicted_tempÚLDA_prob_correct_tempÚLDA_ax_per_bin_tempÚf1_list_tempÚf1_avgÚf1_listrh  r0	  r	  r	  rM	  ÚrandidxÚlabel_by_trial_shuffledrÎ   Ú label_by_trial_predicted_shuffleÚsnum_shuffledÚlabel_by_trial_session_shuffledÚ(label_by_trial_predicted_session_shuffler×   Ú	fig_LDAf1Úax_LDAf1rã  Ú	class_idxÚclass_labelrI   Úshuffle_avgÚshuffle_stdrw   r:  rÜ  r   r£   )rp	  rk	  ra	  rz  r#	  r`	  r	  r¤   Ú!tca_across_sessions_multiple_mice
2  s   2,
         
 
ÿ

(
*,
 
 
r	  c           6         sf  d}| j d }tˆƒ‰|j d }t ˆ¡}	t|	ƒ}
‡‡fdd„|	D ƒ}t |¡t |¡ }}t ˆ|f¡}tjˆtd}t ˆ¡}t ˆ|f¡}t ˆ¡}t ˆ|f¡}tˆƒD ]¤}t 	ˆ¡|k}t ||f¡}tj|td‰ t |¡}t ||f¡}t |¡}t ||f¡}t|ƒD ]|}|	| }ˆ|k}ˆ|k}d ||< ||< tj
jt |¡d t |¡dd}tjˆtd}d	||< t ||¡} | }| | }!| |g }"ˆ| }#ˆ| }$td
d|dd}%|% |!|#¡ t |% |!¡¡}&t |% |"¡¡}'t |% |¡¡}(d})|&|#|)k }*t |*¡}+t |+|' ¡},t |+|( ¡}-|'||dd…f< |,||< |-||dd…f< |% |"¡ˆ |< |% |"¡d ||< |% |¡d ||dd…f< q‡ fdd„|	D ƒ}.|	t |.¡ }/ˆ |/k}0t ||0 ¡}1t ||0 ¡}2tj||0 dd}3t ||0 ¡}4tj||0 dd}5|1||dd…f< |/||< |2||< |3||dd…f< |4||< |5||dd…f< q°|||||fS )a;   LDA_input: size "num samples" X "num features"
        LDA_input_probe: size "num samples" X "num features"
        labels: size "num samples"
        LDA_components: int
        imbalance_prop: float between 0 and 1 (if the proportion of a class is larger than this, deal with data imbalance during training)
    r”  r   r   c                    s   g | ]}t  ˆ |k¡ˆ ‘qS r£   r$	  rB	  rC	  r£   r¤   r¤  3  r¥  z5perform_LDA_with_probe_projection.<locals>.<listcomp>rV  FrD	  Tr&	  rœ  NrÈ  c                    s   g | ]}t  ˆ |k¡‘qS r£   r$	  rB	  rE	  r£   r¤   r¤  \3  r¥  rü  )rV   rb   rW   rª  rÿ   r-  r*  r  ra   rg   rµ  r¶  râ  r•  rã  rÉ  r   rû   rÙ  rÀ  r0  r6  r)	  r*	  Ú	TypeError)6r1	  ÚLDA_input_prober  r	  rG	  rH	  ru   r;	  Únum_samples_proberî  Ú
num_labelsrI	  rJ	  rK	  r0	  rL	  r	  ÚLDA_prob_probeÚLDA_projection_distanceÚLDA_projection_distance_proberÂ  r3	  rN	  rO	  Úprob_probe_list_repÚLDA_projection_distance_repÚ!LDA_projection_distance_probe_reprQ	  rR	  rS	  rT	  rU	  rV	  r4	  r5	  r6	  r7	  r´  ÚLDA_proj_trainÚLDA_proj_testÚLDA_proj_probeÚlabel_referenceÚLDA_proj_refÚLDA_proj_ref_avgÚLDA_dist_testÚLDA_dist_proberX	  rY	  rã  rZ	  r	  Ú
prob_probeÚdistÚ
dist_prober£   r\	  r¤   Ú!perform_LDA_with_probe_projectionõ2  s    






"
ý
r³	  c            b         s¦
  d} d}t jtd|  ddd }|d }|d }d	}d
}d}d}d}	d}
d}d}d}d}d}ddg}ddg}t|ƒ}g d¢}d}|d |d  }|dkržd}tj||dd| d| f|ddid\}}|d7 }tj||dd| d| f|d\}}|d7 }tj||dd| d| f|d\}}|d7 }tj||dd| d| f|d\}}|d7 }||||g}t  |df¡}t  ||df¡‰t  ||df¡‰ t  |df¡} t  |df¡}!t|ƒD ]¬\}"}#||#df }$||#d f }%||#d!f }&t|$ƒ}'d"|$v s d#|$v s J ‚t|&|%||$ƒ\}(})‰t	ˆƒ‰d$d%„ ˆD ƒ}*‡fd&d%„t  
ˆ¡D ƒ}+‡fd'd%„t  
ˆ¡D ƒ},ˆ}-tˆƒ}.t|$ƒ}/|,d |,d  }0td(d%„ |$D ƒƒ}1ˆd)|0… }2t  d*d%„ ˆD ƒ¡}*t  
|*¡}3t|3ƒ}4t  d|4d ¡}5d+}6t|	ƒD ]€}7d}8|8|k r˜z,tj|d,}9|9j|(td|d ƒ|dd- W np ty:   |8d7 }8Y nZ t jjyX   |8d7 }8Y n< tyŽ }: ztd.|:ƒ |8d7 }8W Y d)}:~:nd)}:~:0 0 q˜qèd};|9 |¡|; }<|<d }=|=d)|0… }>|=|0d)… }?z t|>|?|*|5|
|ƒ\}@}A}B}C}DW n t jjy   Y qÞY n0 t |*|A¡}Et  |E¡}F|F|6krN|F}6|E}G|>}H|@}I|A}J|B}K|?}L|C}M|D}N|G||"d)d)…f< qÞ| ¡ |" }O|Ojd/|# dd0 t|&|%d||Od1 | ¡ |" }O|Ojd/|# dd0 t|I|J|2|"dk|Od2 | ¡ |" }O|Ojd/|# dd0 t|Md)d)…t jf |J|2|"dk|Od2 |Oj d3dd0 |Nj!d }Pt j|Ndd4}Nt|0|0|P ƒ}Q|Oj"|Q|Nd5d6d7d8 |O #¡  | ¡ |" }O|Ojd/|# dd0 t|Md)d)…t jf |*|2|"dk|Od2 |Oj d3dd0 t|0|0|P ƒ}Q|Oj"|Q|Nd5d6d7d8 |O #¡  t  |M|*dk ¡| |"df< t  |M|*dk ¡| |"df< t  |N¡| |"df< t  $|M|*dk ¡|!|"df< t  $|M|*dk ¡|!|"df< t  $|N¡|!|"df< q²tjdddd9|d\}R}S|Sd: }S|d7 }t  %|¡}TttdƒƒD ]8\}U}V||U }W|Sj"|T|d)d)…|Uf d;||U |Wd<d= q |Sj"|Tt j&|dd4d;d>d?d8 |Sj'|Tt j&|dd4dg| d@d>dAddddB	 |dkrz‡fdCd%„t|ƒD ƒ}X‡fdDd%„t|ƒD ƒ}Y|Sj'|T|X|Yd@dEddFdAddddG |dkrÐ‡ fdHd%„t|ƒD ƒ}X‡ fdId%„t|ƒD ƒ}Y|Sj'|T|X|Yd@dJddKdAddddG |Sj#d#d0 |S (dL|d< g¡ |S )d|S *¡ d g¡ d}Zt  %|¡}TdMd%„ |D ƒ}[|Sj+|T|[|Zd0 |Sj dN|Zd0 |Sj,dO|ZdP |S -¡ }\|Sj.|\dQdQgdRdQdS |D ]}]|] /¡  qnt 0|¡}]|d7 }t 1¡ }Og dT¢}^g dU¢}_t|^ƒD ]R\}U}V| d)d)…|Uf }`|!d)d)…|Uf }a|Oj'|T|`|ad@|_|U d|^|U dAddddG q°|Oj#d#d0 |O (dL|d< g¡ d}Zt  %|¡}TdVd%„ |D ƒ}[|Oj+|T|[|Zd0 |Oj dW|Zd0 |Oj,dO|ZdP |S -¡ }\|Oj.|\ddgdRdQdS |] /¡  t 0|¡}]|d7 }t 1¡ }Og dT¢}^g dU¢}_t|^ƒD ]R\}U}V| d)d)…|Uf }`|!d)d)…|Uf }a|Oj'|T|`|ad@|_|U d|^|U dAddddG 	qÂ|Oj#d#d0 |O (dL|d< g¡ d}Zt  %|¡}TdXd%„ |D ƒ}[|Oj+|T|[|Zd0 |Oj dW|Zd0 |Oj,dO|ZdP |S -¡ }\|Oj.|\ddgdRdQdS |] /¡  d)S )Yr†  r   r	  r 	  Træ  r£   rp  r?  rA  r½  rÕ  r6   r¶   r   r   r   rÆ  r   r   r³  r   r!	  rD   Frµ   r   rÔ  rÕ  rÖ  rÛ  rz  rí  r*  ri  r  c                 S   s   g | ]}|d kr|‘qS ©rD   r£   ©r   Úlr£   r£   r¤   r¤  Ö3  r¥  zFtca_across_sessions_multiple_mice_probe_projection.<locals>.<listcomp>c                    s   g | ]}t  ˆ |k¡‘qS r£   r$	  r  r%	  r£   r¤   r¤  Ø3  r¥  c                    s   g | ]}t  ˆ |k¡‘qS r£   r$	  rµ	  )Úlabel_by_trial_TCAr£   r¤   r¤  Ù3  r¥  c                 S   s   g | ]}|d v r|‘qS )r^	  r£   rÊ  r£   r£   r¤   r¤  à3  r¥  Nc                 S   s   g | ]}|d kr|‘qS r´	  r£   rµ	  r£   r£   r¤   r¤  æ3  r¥  rö  rB  rš  r_	  rW  r7   rb	  rc	  zLDA distance to Brü  r”  r  r\  r%  rd	  rÈ  r+  rå  re	  rÉ  rf	  rÎ   r    r©  c                    s$   g | ]}t  t jˆ | d d¡‘qS rg	  rh	  ri	  rj	  r£   r¤   r¤  €4  r¥  c                    s$   g | ]}t  t jˆ | d d¡‘qS rg	  rl	  ri	  rj	  r£   r¤   r¤  4  r¥  rÍ  rm	  rn	  c                    s$   g | ]}t  t jˆ | d d¡‘qS rg	  rh	  ri	  ro	  r£   r¤   r¤  ˆ4  r¥  c                    s$   g | ]}t  t jˆ | d d¡‘qS rg	  rl	  ri	  ro	  r£   r¤   r¤  ‰4  r¥  rq	  rr	  rs	  c                 S   s   g | ]}d | ‘qS rt	  r£   rà  r£   r£   r¤   r¤  “4  r¥  ru	  rÂ   r¿   râ   rv	  r†  r²  r  c                 S   s   g | ]}d | ‘qS rt	  r£   rà  r£   r£   r¤   r¤  ²4  r¥  zLDA dist to Bc                 S   s   g | ]}d | ‘qS rt	  r£   rà  r£   r£   r¤   r¤  Î4  r¥  )2rW   ré  r   rb   rQ   rd   r*  rö   r'	  Ú*get_session_type_labels_from_snum_by_trialrª  rw  rX   ra   rX  rY  rû   rE  r^   rw	  rx	  rm   r\  r³	  rT   ry	  r0  rv  rl   rþ  r	  Únewaxisre   rV   rÆ   rj   rÝ  rg   rÜ  r/  rá  r8  r9  rÚ  rÇ   râ  rh   rk   r  r  )br&   r+	  r	  rp  r?  r½  r¸  r¾  r,	  rz	  r{	  r|	  r}	  r~	  ru   rý  rï  r	  r  r#	  r×  rØ  r€	  r	  r‚	  rƒ	  Úfig_LDAdistÚaxs_LDAdistÚfig_LDAdist2Úaxs_LDAdist2r„	  r…	  ÚLDA_dist_allÚLDA_dist_all_stdrû  rr  rz  r˜  rA  rÝ   r„  r-	  Úlabel_by_trial_LDArú  Únum_trials_by_labelÚsnum_by_trial_TCAÚnum_trials_TCAÚnum_sessions_TCAÚnum_trials_LDAÚnum_sessions_LDAÚsnum_by_trial_LDArî  Únum_unique_labels_LDAr	  r‡	  rˆ	  r.	  rÕ  r  rÖ  re  r‰	  ÚLDA_input_tempÚLDA_input_probe_temprŠ	  r‹	  rŒ	  ÚLDA_projection_distance_tempÚ"LDA_projection_distance_probe_temprŽ	  r	  r	  r1	  r0	  r	  r	  rŸ	  r£	  r¤	  r×   r 	  Úxx_prober—	  r˜	  rã  r™	  rš	  rI   r›	  rœ	  rw   r:  rÜ  r   Úclass_labelsry  ÚLDA_distÚLDA_dist_stdr£   )rp	  rk	  r·	  r	  r¤   Ú2tca_across_sessions_multiple_mice_probe_projection†3  sz   2,,,

 
ÿ

$
$(
*,
 
 
ÿ

ÿ

rÑ	  c            G         sþ  d} g d¢}d}|rd}nd}d}d}d}d}d	}d
}	d}
d}ddg}ddg}t  d¡}t|ƒ}g d¢‰ g d¢‰ t  dd¡}t|ƒ}t  |||f¡d }t  |||f¡d }t|ƒD ]R\}}t  t  |¡t  |¡d ¡}t|ƒD ]"\}}tj||||dd t j	t
d|  ddd }|d }t|ƒD ]Ø\}}||df }||df }||df }‡ fdd„|D ƒ}t||||ƒ\} }!}"t|"ƒ}#t  |#¡}$t|$ƒ}%t  d|%d ¡}&d }'t|ƒD ]}(d!})|)|k r8z,tj|d"}*|*j| td|d ƒ|dd# W n: ty   |)d7 })Y n$ t jjy.   |)d7 })Y n0 q8q¾d!}+|* |¡|+ },|,d }-zt|-|#|&||	ƒ\}.}/}0}1W n t jjyŒ   Y q´Y n0 t |#|/¡}2t  |2¡}3|3|'kr´|3}'|2}4|-}5q´t  |4¡||||f< t  |4¡||||f< t|| jd! ||5jd |4ƒ q*qâq´d}6|d |d  }7|dkr,d}6d!d lm}8 d$d%g}9t||gƒD ]ª\}:};t j  |;d!¡};t!j"|6|7dd&|7 d|6 f|
d'\}<}=|
d7 }
d(}>t  |;¡}?t  |;¡d) }@t|ƒD ]6\}}|= #¡ | }A|;| }Bt|Bƒ |8 $d*¡}C|C %d+¡ |Aj&|Bj'|Cd,|@|?d-}D|Aj(t|ƒ||>d d. |Aj)d/|>d& d. |Aj* +¡  |Aj* ,d0¡ |Aj-t|ƒ||>d d. |Aj.d1||  |>d& d. |Aj/d2|>d& d. |t|ƒd kr´|<j0|Dd3d4}Et j1t j2|@|?d5t3d6dd7}F|Ej4j-|F|F|>d. |Ej4j/|9|: |>d. q´|< 5¡  qLd S )8Nr   r!	  Tr	  Úunoptimized_aligned_data_dictrA  rÕ  r   r¶   r\  rÆ  r   r   r³  r   r  r^	  r   r    F)Úmice_to_saveÚsessions_to_saver   Úoptimized_alignmentr”  r 	  ræ  r£   r?  rz  rí  r*  c                    s   g | ]}|ˆ v r|‘qS r£   r£   r  r"	  r£   r¤   r¤  5  r¥  z3compute_lda_on_tca_by_dimension.<locals>.<listcomp>rD   rö  r   rB  rš  z
F1 averagez
F1 minimumrµ   rÛ  r   rå  r÷  rã  r¬  )rß  r  r^  r_  r7   zPCA dimensionrc  rW  zTCA factorsg¸…ëQ¸î?r¯  r>   r±  rN  )6rW   rg   rb   r*  rö   r,  r-  rµ  Úsave_mcca_multiple_miceré  r   r'	  r(	  rª  rX   ra   rX  rY  rû   rE  r^   rw	  r\  r]	  rT   ry	  r0  rm   rV   Úmatplotlib.cmr}  rn  Úmasked_lessrQ   rd   rv  r  rp  rq  rü   rÚ  rf   rr  rs  rt  ru  rl   re   r|  r‡  rà  r  r×   rk   )Gr&   Úsessions_to_alignrÕ	  r+	  r½  r¾  r,	  rz	  r{	  r|	  ru   rý  rï  r	  rp  r  rq  Úpca_dim_numÚf1_avg_arrayÚf1_min_arrayrC  r   Útca_factor_listÚtca_idxÚ
TCA_factorr	  r?  rû  rr  rz  r˜  rA  r„  r-	  r	  r	  rî  r/	  r	  r‡	  rˆ	  r.	  rÕ  rÖ  re  r‰	  rŠ	  r‹	  rŒ	  rM	  rŽ	  r	  r	  rh  r×  rØ  ÚCMÚ	f1_labelsÚf1_idxr…	  r   rÕ   rw   Úmax_vÚmin_vr×   Ú
f1_array_mrß  rë  r5   rì  r£   r"	  r¤   Úcompute_lda_on_tca_by_dimensionÙ4  sÎ    
ÿ

 

$
,



ræ	  c            ,      C   sì  ddl m}  t d¡}t|ƒ}t d¡}d}d}d}d}t ¡ jd	 }t|ƒd
dd	ddœ}	t ¡ jd	 }d}
d}tjdd||d\}}|d	7 }tj	t
d ddd }t|ƒD ]0\}}dd„ |D ƒ}|dkrÖg d¢}n`|dkrèg d¢}nN|d
krúg d¢}n<|dkrg d¢}n(|dkr"g d¢}n|dkr6t d¡}|tv rzt| D ]0}|d |v rH|d	 |v rH| |d	 ¡ qHdd„ |D ƒ}t|ƒ}||	d< g }g }t|ƒD ].\}}|||f \}}| |¡ | |¡ q¨t||||d||||	d	\}}}}|jd	 }tt |¡ƒ} |dkr| d
kr| ¡ | }!|d d …df |d d …d	f  }"}#t|ƒD ]R}$t ||$k¡d }%|"|% }&|#|% }'|!j|&|'d!||% d"d|d	 t||$  d# q\|!jd	dd$ |!jd%|
d& |!jd'|
d& |!jd(d)|
d* |!jd+| |
d d& nî|dkrð| d
krðg d,¢}(| ¡ | }!|d d …df |d d …d	f  }"}#t| ƒD ]J}$t ||$k¡d }%|"|% }&|#|% }'|!j|&|'d!||% d"dd|(|$ d# qT|!jd	dd$ |!jd%|
d& |!jd'|
d& |!jd(d)|
d* |!jd+| |
d d& |d	kr¬d-d.g}(| ¡ | }!|d d …df }"d})t t|ƒ¡}*t| ƒD ]V}$t ||$k¡d }%|*|% }+|"|% }&|!j|+|&d!||% d/dd	|(|$ d# |)t|%ƒ7 })q6|!jd	dd$ |!jd0|
d& |!jd1|
d& |!jd(d)|
d* |!jd+| |
d d& q¬| ¡  d S )2z@ 
        Performs TCA across sessions for multiple animals
    r   r  r  r   r   r>   r6   rÕ  r   r   TF©Ún_binsr‘  r’  r“  r”  r   )r    rÕ  rD   rµ   r  rå  ræ  r£   c                 S   s   g | ]}|‘qS r£   r£   rÊ  r£   r£   r¤   r¤  ²5  r¥  z9tca_across_sessions_multiple_mice_old.<locals>.<listcomp>)r   r   rD   r   rµ   r6   ri  r  )r   r   r   rµ   r6   r>   r  )r   r   r   rµ   r6   r>   ri  r  rö  ri  c                 S   s   g | ]}t | ‘qS r£   r  rÊ  r£   r£   r¤   r¤  Ê5  r¥  rè	  )rz  rr  rh   r‚   rÃ  r&   rÄ  Néx   r÷  r¤  r¥  r§  r7   r¨  rÐ  rÑ  rÒ  r©  r²  r³  r   ÚbwrrU  r´  )rµ  r  rW   rg   rb   rQ   rR   rS   rd   ré  r   rö   r	   rm  rø   rõ  rV   rª  rv  ra   râ  rÆ   r   rj   rf   re   rÇ   rl   rk   ),r  rp  r  rz  r&   r‚   rÃ  r_  ru   rÄ  rw   r@   r   rÕ   rë  rû  rr  Úsession_list_currentr÷  r<  rÝ   r@  rA  r„  rŸ  r   rü  rÕ  rØ  Ú
LDA_labelsrÙ  r	  ÚLDA_labels_numr×   rá  râ  rI   rã  r¾   rÂ   ÚLDA_label_listrR  rñ  ró  r£   r£   r¤   Ú%tca_across_sessions_multiple_mice_old5  sÀ    

û	










ÿ
"."&"rï	  c            ?      C   s>  t  d¡} t  d¡} t| ƒ}t  d¡}g d¢}t|ƒ}d}d}d}d}d	}d
}d}	d}
d}t ¡ jd }d}d}ddg}ddg}g d¢}ddg}g d¢}t jtd ddd }d}d}d}|t  dt|| ƒ¡|  }|| | }t	j
|||d \}}tt|Ž ƒ\}}t|ƒ}tt	j|||	|
d!|d"}t  |||d#f¡}t  |||d#f¡}t  |||d#f¡} t|ƒD ]\}!}"t| ƒD ]ò\}#}$td#ƒD ]Ü}%||$|"f \}&}'|%dkrÆt	j|&|'||||dd$\}&}'}(t  t	j|&dd%¡})tj|'jd d&}*|* |'j¡ t	j|'|*dd'}+t	j|+|&||d!d(\},}-|-| |#|!d)d)…|%f< tt||ƒƒD ]‚\}.\}/}0|/|0k rnt  |/|&k|&|0k ¡}1nt  |&|/k|&|0k ¡}1t  |1¡}2|2t|&ƒ ||#|!|.|%f< |)|1 }3t  |3¡||#|!|.|%f< qBt |#|!ƒ |#d*v rˆ|!d*v rˆt !¡ \}4}5|5 "¡ }6|5j#|| |#|!d)d)…|%f ||% d+ |6j#|||#|!d)d)…|%f |d# d+ |5 $d,||%  ¡ |5 %d-¡ |5 &d.¡ |6 &d/¡ |%dkrêt !¡ \}7}8|8 "¡ }9|8 $d0|d |d f ¡ |8j#|| |#|!d)d)…|%f ||% d+ |8 %d-¡ |9 &d1||%  ¡ n@|%dkr*|9j#|| |#|!d)d)…|%f ||% d+ |9 &d1||%  ¡ t ¡ jd }t	j'|+d)d… |&||dd2d)d3d!dd4d5dd6 qˆqvqd| (|| |d#f¡}:| (|| |d#f¡};|  (|| |d#f¡}<td#ƒD ]L}%t ¡ jd }t	j)|<d)d)…d)d)…|%f g||d)d!||% gd)dd7}=|= "¡ }6t	j)|:d)d)…d)d)…|%f g|||6d!|d# gd)d!d7}6d3}t	 *|| ¡}>|=j$d8|||>f |d d9 |=j&d1||%  |||% d: |=j+d;|||% d< |6j&d=||d# d: |6j+d;||d# d< |=j%d>|d9 |=j+d?|d@ |%dkrø|6 ,d|6 -¡ d g¡ |4 .¡  q´t ¡ jd }t	j)|<d)d)…d)d)…df g||d)d!||% gd)dd7}=|= "¡ }6t	j)|<d)d)…d)d)…df g|||6d!|d# gd)d!d7}6d3}t	 *|| ¡}>|=j$d8|||>f |d d9 |=j&d1|d  ||d d: |=j+d;||d d< |6j&d1|d  ||d d: |6j+d;||d d< |=j%d>|d9 |=j+d?|d@ |4 .¡  t !¡ \}4}=|= #|:d)d)…d)d)…df |<d)d)…d)d)…df ¡ |=j%d=|d9 |=j&dA|d9 t !¡ \}4}=|= #|:d)d)…d)d)…df |<d)d)…d)d)…df ¡ |=j%d=|d9 |=j&dB|d9 t !¡ \}4}=|= #|:d)d)…d)d)…df |<d)d)…d)d)…df ¡ |=j%d=|d9 |=j&dB|d9 d)S )CzM Repeating the PCA segment lenght calculations while correcting for velocity r  rµ   r   rä  r   r   r¬  r”  r$   r   r6   r¦   r§   r   r   r  rd  r®  r  rp  r…  znon-warpingrY   r  r  Træ  r£   r   r^  r\  r_  Fr  rD   r%   rÞ   rà   rå   rb  Nr—  r  z!Segment length vs time spent (%s)r»   zSegment length (AU)zAverage steps spentzSegment length, %s vs %szSegment length (%s) (AU)r   r    rV  rÕ  r¢  rw  r×  r7   r  rÂ   ©rÀ   rÁ   rH   r   rÈ  r¾   r¿   zSegment lengthzSegment length (warped))/rW   rg   rb   rQ   rR   rS   ré  r   r  rT   ru  rk  rs  r   r   r*  rö   ra   rY   rw  r  r   rú   rV   rû   rü   r  rx  r  rÉ  r•  r0  rm   rd   rµ  rÆ   rl   rf   re   rU   rh  rÊ  rz  rÇ   r8  r9  rk   )?rp  rÜ   rz  rÝ   r&   rç   rþ  r'   r(   rÈ   r«   rÉ   ru   rw   r@   rÚ  r¾  r;  Úlabels_warpÚcolors_warpr   rÛ  r{  r|  rÜ  rÝ  r}  r~  rË  r!  r  r  rl  r„  rŸ  rû  rr  Úwarpidxr   r#  rÎ   r
  r*  rü  r†  r‡  râ  rÑ  rÒ  rÓ  r  r  r   rå  rÚ  ÚfigbothÚaxbothÚaxboth2r  r  r  r×   r‹  r£   r£   r¤   Ú&PCA_segment_length_velocity_correction#6  s   



ÿ
ÿ


$$



$

$8"ÿ"ÿ
"ÿ"ÿ000r÷	  c                  C   sŽ  dd l } dd l}dd l}dd l}|j dd¡ ddlm}m} dd„ }d}d}t	 
|df¡}	t	 
|f¡}
t|ƒD ]"}|d	|ƒ\|	|d d …f< |
|< qptjd
d}tjdd}|j|	j|
dddd	dœŽ}|j||ddg d¢d}|jddd |jdddd |jdddd |jdddd |jd|› dd d! | g ¡ | g ¡ | g ¡ d"d#d$d"d%d&œ}||	|
fi |¤Ž\}}}}tjd	dd'd\}}tjd	dd	dd}|j|	j|
ddd	d(œŽ}|j||ddg d¢d}|jddd |jd|› dd d! |jdddd |jdddd |jdddd | g ¡ | g ¡ | g ¡ |d	 j|dd)tjjd*}|d	 j  d+¡ |j||d	 d,d	g d-¢d}|jd.ddd/ |d	 jd0d d! |d	 jd1dd! |d	 jd1dd! |||d2 tjj!tjj"t	 #|d	 d d …dd	f d2¡d3 |d2  $d4t	 %|d2  &¡ ¡ ¡ |d2  'd4t	 %|d2  (¡ ¡ ¡ |d2 jd5d d! |d2 j)d6dd7|d8›d9d+|d2 j*d:d; t +¡  d S )<Nr   z)D:/Albert/MPI_Brain/Codes/structure_index)Úcompute_structure_indexÚ
draw_graphc           
      S   s¾   dd l }t |d d ¡}| d| ¡}| dtjd ¡}| ddtj d ¡}|t |¡ t |¡ | d|¡ }|t |¡ t |¡ | d|¡ }|t |¡ | d|¡ }	|||	f|fS )Nr   rD   r   g{®Gáz„?)rµ  rW   r1  Úuniformræ  rè  ré  Úgauss)
ÚradÚsigmarµ  Ú	dim_sigmar<  ÚthetaÚphir¾   rÂ   Úzr£   r£   r¤   Úsample_from_ballñ6  s    $$z.structure_index_test.<locals>.sample_from_ballr†  i@œ  r   r   rÒ  rô   rÕ  r  r    Ú	inferno_r)rb  r¸   rß  r^  r_  )r   rÄ  çš™™™™™é?)r   râ   r   )r×   Úanchorr°  ÚticksÚradiuséZ   )r.  zDim 1iøÿÿÿró   )ÚlabelpadrÅ   zDim 2zDim 3z3D solid ball (sigma: ú)rQ  ©rÅ   rÕ  r   FTrç	  )r³   r6   )rb  rß  r^  r_  râ   )r^  r_  rß  Úbottom)r   r  )r   r“  râ   zoverlap score)r.  r8   zAdjacency matrixz
bin-groupsrD   )Ú	node_cmapÚ	edge_cmapÚ
node_namesr`  zDirected graphg\Âõ(\ï?zSI: z.2frd  r\  )ÚhorizontalalignmentÚverticalalignmentrÀ  r8   ),r°  Úsysrµ  Ú
matplotlibr±  ÚinsertÚstructure_indexrø	  rù	  rW   rn  ra   rQ   r  r¤  rÆ   rü   r|  Ú	set_labelrf   re   Ú
set_zlabelrl   rÚ  ru  Ú
set_zticksrd   r´  Úmatshowr}  r÷  rr  Úset_ticks_positionr
  r«  râ  rá  rw  râ  r8  r9  r7  Ú	transAxesrk   )r°  r
  rµ  r
  rø	  rù	  r
  rý	  ÚnpointsÚembÚfeatureÚiir   r×   r   r5   ÚparamsrÙ  ÚbinLabelÚ
overlapMatÚsSIrÝ  Úatr£   r£   r¤   Ústructure_index_testç6  sx     


û


ÿ  ÿr%
  c                  C   s†   d} d}d}d}d}d}t  ¡ jd }d}d	}d
dddddœ}tjtd ddd }	|	| |f \}
}tj||
|d||d\}}}}d S )Nrµ   rD   r   r   r¬  r\  r   r   r  rÕ  Trç	  rå  ræ  r£   ©rh   r&   r#   )rQ   rR   rS   rW   ré  r   rT   Ú get_structure_index_for_position)rr  rŸ  r&   rç   r#   ru   rw   r@   rÄ  r†	  r   rü  rÙ  rÚ  rÎ   r£   r£   r¤   Ústructure_index_single_sessionA7  s$    û	r(
  c            #   
      s<  ddg‰ t  d¡‰ tˆ ƒ} ddg}t  d¡}t|ƒ}d}d}d	}d
}t ¡ jd }d}d}d
dddddœ}	t jtd ddd }
t  | |f¡}t	ˆ ƒD ]h\}}t	|ƒD ]V\}}t
d|t| f ƒ |
||f \}}tj|||	d||d\}}}}||||f< q¦q–t ¡ jd }t |¡}|d7 }t ¡ }t  t|ƒ¡}dd„ |D ƒ}dd„ ˆ D ƒ}dd„ ˆ D ƒ}ddg}ddg}t	||gƒD ]~\}}‡ fdd„|D ƒ}|| } t j| dd}!t	|ƒD ]&\}"}tj|| |" || dd d! q´tj||!|| d"|| d# q|| ¡  |j||dd$ |jd%d&d$ |jd'd(d) t ¡  d S )*Nr   r6   r  rD   r>   r   r   r   r¬  r\  r   r  TFrç	  rå  ræ  r£   úMouse: %d / Session: %sr&
  c                 S   s   g | ]}t | ‘qS r£   r  r  r£   r£   r¤   r¤  Ÿ7  r¥  z3structure_index_across_sessions.<locals>.<listcomp>c                 S   s   g | ]}|d k r|‘qS r–  r£   rà  r£   r£   r¤   r¤   7  r¥  c                 S   s   g | ]}|d kr|‘qS r–  r£   rà  r£   r£   r¤   r¤  ¡7  r¥  r  rp  ÚiDrY  c                    s   g | ]}t ˆ ƒ |¡‘qS r£   r-  rà  r±  r£   r¤   r¤  §7  r¥  r   rü  r  rÅ  rµ   rú  r7   úStructure Indexr³   rÂ   ró   r¿   )rW   rg   rb   rQ   rR   rS   ré  r   r*  rö   rm   r   rT   r'
  r  r  r0  rh   rj   rÚ  re   rÇ   rk   )#r  rz  r+  r&   rç   r#   ru   rw   r@   rÄ  r†	  ÚSI_arrayrû  rr  r„  rŸ  r   rü  rÙ  rÚ  rÎ   r   r×   r  Ú	xx_labelsÚmidÚmddÚcolors_by_conditionÚlabel_by_conditionr7  Ú
cond_mlistÚcond_mlist_array_idxÚSI_array_condÚSI_cond_avgÚmnumidxr£   r±  r¤   Ústructure_index_across_sessionsj7  s`    

û	  r7
  c            "      C   s  ddg} t  d¡} t| ƒ}ddg}t  d¡}t|ƒ}d}d}d	}d
}d}d}d}	t ¡ jd }
d}d}d
dddddœ}t jtd ddd }t  ||f¡}t  ||f¡}t	| ƒD ]š\}}t	|ƒD ]ˆ\}}t
d|t| f ƒ |||f \}}tj|||dd|d d\}}}||	 }||||f< tj|||d||d\}}}}||||f< qÀq°t ¡ jd }
t |
¡}|
d7 }
t ¡ }| ¡ }| ¡ } t
|j| jƒ |j|| dd tj|| |dd\}!}| ¡  |jd|	 dd |jddd  |jd!dd |jd"dd  |jdd t ¡  d S )#Nr   r6   r  rD   r>   r   r   r   r¬  r\  r¦   r§   r   r  TFrç	  rå  ræ  r£   r)
  r®   r&
  r¢  r   r  zPrediction Error, %s (cm)r³   r7   r¾   ró   r¿   r+
  rÂ   )rW   rg   rb   rQ   rR   rS   ré  r   r*  rö   rm   r   rT   rÄ   r'
  r  r  rv  rV   rÆ   ry  rj   rf   rÇ   re   rk   )"rp  r  rz  r+  r&   rç   r#   rÈ   r«   rÉ   ru   rw   r@   rÄ  r†	  rt  r,
  rû  rr  r„  rŸ  r   rü  rž  rÐ  rÎ   rë  rÙ  rÚ  r   r×   Ú	error_allÚSI_allr“  r£   r£   r¤   Ú*structure_index_versus_position_prediction½7  sf    

û	ÿr:
  c                  C   sÜ   d} d}d}d}d}d}t  ¡ jd }d}d}ddd	dd	d
œ}d}	tjtd d	dd }
|
| |f \}}tj|||d	||d\}}}}tj||	||d}t  	|d ¡}|d7 }t  
¡ }|d dd…ddf }| ||¡ dS )ze Function to test measures of spreads around the diagonal in the overlapping in the adjacency matrix r6   r   r   r¬  r\  r   r   r  Trç	  r”  rå  ræ  r£   r&
  r_  Nr   )rQ   rR   rS   rW   ré  r   rT   r'
  ÚSI_compute_diagonal_spreadr  r  rh   )rr  rŸ  r&   rç   r#   ru   rw   r@   rÄ  Úgaussian_sd_cmr†	  r   rü  rÙ  rÚ  Úoverlap_matÚs_SIÚdiagonal_spreadr   r×   Úbin_centersr£   r£   r¤   Ústructure_index_spread_test8  s6    û	ÿrA
  c            4   
   C   sR  ddg} t  d¡} t| ƒ}ddg}t  d¡}t|ƒ}d}d}d	}d
}ddddddœ}|d }d}	t ¡ jd }
d}d}dd„ t| ƒD ƒ}dd„ t| ƒD ƒ}ddg}ddg}t jtd ddd }t  	|||f¡}t  	|||f¡}t| ƒD ]<\}}t|ƒD ](\}}t
d|t| f ƒ |||f \}}tj|||d||d\}}}}tj||	||d}||||f< t  tj|dd ¡}t  |d d!d!…d"d"f ¡} t  | dd!… | d" f¡}!tt| |!ƒƒD ]f\}"\}#}$|#|$k rèt  |#|k||$k ¡}%nt  ||#k||$k ¡}%t  |%¡}&d|&t|ƒ  ||||"f< q¼qúqè|d d!d!…d"df }'t || ¡}(tj|
|d#})|
d7 }
t ¡ }*| || |g¡}+tj|+g|'|
|*dd!d!d$}*|* d%¡ |* d&¡ d'}|*jd(||(f |d d) |*jd&|d) |*jd*|d+ |*jd%|d) |*jd,|d+ |)  ¡  tj|
|d#})|
d7 }
t ¡ }*g },t||gƒD ]2\}-}.||. }/|/ t|.ƒ| |g¡}+|, !|+¡ q4tj|,|'|
|*d||dd-}*|*j"d.d) d'}t || ¡}(|*jd(||(f |d d) |*jd&|d) |*jd*|d+ |*jd%|d) |*jd,|d+ |)  ¡  dd/g}0d0d1g}1| || |g¡}+| || |g¡}2tj#||
d2\})}*|
d }
tj|+g|'|
|*d|0d" gd!dd-}*|* $¡ }3tj|2g|'|
|3d|0d gd!dd-}3d'}t || ¡}(|*jd(||(f |d d) |*jd&||0d" d3 |*jd*||0d" d4 |3jd5||0d d3 |3jd*||0d d4 |*j%j& '|0d" ¡ |*jd%|d) |*jd,|d+ |*j"d6d) |)  ¡  d!S )7zP Compute the spread of the SI overlap matrix along the diagonal across sessions r   r6   r  rD   r>   r   r   r   r¬  r\  rÆ  r   TFrç	  rè	  r”  r=   c                 S   s   g | ]\}}|d k r|‘qS r–  r£   ©r   rû  rr  r£   r£   r¤   r¤  l8  r¥  z:structure_index_spread_across_sessions.<locals>.<listcomp>c                 S   s   g | ]\}}|d kr|‘qS r–  r£   rB
  r£   r£   r¤   r¤  m8  r¥  r   r   r*
  rY  rå  ræ  r£   r)
  r&
  r_  rÞ   Nr   rô   rÇ  zBin center (mm)zOverlap spread (AU)r    zBin num: %d; %sr7   rÂ   r¿   r¾   rw  r½  r  zoverlap spreadÚvelocityr?   r  rð	  r  r
  )(rW   rg   rb   rQ   rR   rS   rö   ré  r   r*  rm   r   rT   r'
  r;
  rw  r  rÙ  r+  rs  r  rÉ  r•  rz  r  r  rh  rÊ  rf   re   rl   rÇ   rk   rø   rj   rd   rµ  rv  rI   Ú	set_color)4rp  r  rz  r+  r&   rç   r#   rÄ  rè	  r<
  ru   rw   r@   r.
  r/
  r0
  r1
  r†	  Úspread_arrayÚvelocity_arrayrû  rr  r„  rŸ  r   rü  rÙ  rÚ  r=
  r>
  r?
  r
  Ú
bin_startsÚbin_endsrâ  rÑ  rÒ  rÓ  r  r@
  r‹  r   r×   Úspread_array_flattenedÚspread_array_list_to_plotr7  Ú
mlist_condÚspread_array_condrp  ro  Úvelocity_array_flattenedrÚ  r£   r£   r¤   Ú&structure_index_spread_across_sessionsA8  sÐ    

ûÿ

"

ÿÿÿrN
  c            c         sz	  d} t  d¡}dg}t|ƒ}g d¢}d‰d}d}d}d	}d
}d}	d}
ddddd	dœ}d	}d}d}t jtd ddd }t jtd ddd }t|ƒD ]Þ\}}t |¡\}}t|ƒ}||df ‰ ||df }tˆ ƒ}t  ˆ ¡}t  |¡}t	j
ˆ d | ddd}|d d |d d  ‰‡fdd„ˆ D ƒ}t  |t j|dd d¡sHJ ‚t  |¡ t¡}t  |¡}t	 ||¡}t	 ||¡}tj|dd}|d7 }tjdd } t|ƒD ]X}!t|!|d kƒ}"||! }#ˆ |! }$t	j|#|$| |d!  d"\}%}&}'t	j|&|%| d	|"d# q¤|  ¡  | ¡  tj|d$}(|(j|td|	ƒ|
d	d% |	d })d}*|( |)¡|* }+|+d },|+d }-|+d& }.‡ fd'd„t|ƒD ƒ}/g }0|D ]:}1d(|1v sšd)|1v r¦|0 d¡ nd*|1v r‚|0 d¡ q‚tt  |0¡ƒ}2t d+|2ƒ g }3t|ƒD ]\}4}5|3 !|0|4 g|5 ¡ qât  |3¡}3dd,l"m#}6 |6d-d d&d	d.}7g }8t|ƒD ]\}4}5|8 !|4g|5 ¡ q4t  |8¡}8t |.j$d/ƒ |7 |.|8¡ |7 %|.¡}9t	j&|9|8|d	d0\}:};}'}'|dkr”t 'dd&¡\}}<|d7 }tj(|(|<d d1 tj)|(|<d d1 |<d j*d2d3d4 |<d j*d2d3d4 |<d j+d5d3d4 |<d j+d6d3d4 | ¡  d|	d& f}=tj,|( |)¡|* |=d\}}>}?|d7 }d}@d}At|)ƒD ]œ}BtdƒD ]Š}C|>|B|Cf } |+|C d d …|Bf }Dt  dt|Dƒ¡}Et  -|D¡t  .|D¡ }F}G| j/|E|Dd7|Ad8 |  0|F|Gg¡ | j1|F|Ggt j|Fd&dt j|Gd&dg|@d4 |Cdkr¬t|Dj$d ƒ}H| j2|H|H|@d4 |HD ]4}It  3|F|G¡}J|Igt|Jƒ }E| j/|E|Jd9d:d;d< q>|B|)d kr| j*d=|@d4 |Bdkr¬| j4d>|@d? d4 |Cdkr>t  3|F|G¡}Jg d@¢}Kg dA¢}L| j2|K|K|@d4 tt|KƒƒD ]2}M|K|M gt|Jƒ }E| j/|E|Jd9|L|M |AdBdC qî|B|)d kr>| j*dD|@d4 |Cd&krz| j5dEdF|@dG t|ƒD ]¢\}4}Nt|d |4… ƒ}Ot|d |4d … ƒ}Pt  3|F|G¡}J|Ogt|Jƒ }E| j/|E|Jd9dHdId< |NdJv r`t  3|O|P¡}E|Fgt|Eƒ }Q|Ggt|Jƒ }R| j6|E|Q|Rd:d;d< q`qzqlt	j&|9|8|dd0 |d7 }dK}@tj|dLd}|d7 }t 7¡ } |9d d …df |9d d …df  }S}Tt|ƒD ]R}Ut  8|8|Uk¡d }V|S|V }W|T|V }X| j9|W|XdM|8|V dNd|d t:||U  dO qr| j;ddPdQ | j*dR|@d4 | j+dS|@d4 | j5dTdF|@dG | j4dU|: |@d d4 |7j<}Y|7 %|7j<¡}Y|Yj$d }Zt  =|Z|Zf¡}[t|ZƒD ]:}\t|ZƒD ]*}]t j> ?|Y|\ |Y|]  ¡}^|^|[|\|]f< qTqHt  .|[¡}_d}`tj'|dVdW\}} |d7 }d}@| j@|[dXdYdZ}ad[d„ |D ƒ}| j2t  |¡||@d4 | j1t  |¡||@d4 | j4d\|@d? d4 |jA|ad]d^}"t j3|`|_dtd_}b|"jBj1|b|b|@d4 |"jBj+d`|@d4 t |[ƒ t |7j<j$ƒ t |7 %|7j<¡j$ƒ q”d S )aNr   r  r>   r!	  r   r   r   TFÚncp_bcdr6   rÕ  rÆ  r   r   rç	  rå  ræ  r£   zoptimized_aligned_data_dict.npyrí  r*  r   r\  )r&   r  Ú
pos_threshc                    s   g | ]}|j ˆ  ‘qS r£   r
  )r   rí  )Úwarping_binsr£   r¤   r¤  9  r¥  z'LDA_on_aligned_data.<locals>.<listcomp>rN  rU  rô   rÕ  r  rè	  rÝ  r¢  rB  rš  rD   c                    s   g | ]}ˆ | j ‘qS r£   r
  r‘  )rË  r£   r¤   r¤  \9  r¥  r³  r´  rü   Úheher   r›  rœ  Úhuhuhuhr   rñ  rI  r³   r7   rJ  rK  rL  rM  rÌ  rÍ  râ   rF  r£  rP  rµ   rQ  rS  r¶   rÅ  rT  r¾   rÑ  rÒ  rÉ  r¶  rè  r~  r  r^  r÷  r¤  r½  r¥  r§  r¨  rÐ  r©  rª  r  r«  r¬  r­  c                 S   s   g | ]}t | ‘qS r£   r  rÊ  r£   r£   r¤   r¤  2:  r¥  r®  r  r¯  r±  r²  )CrW   rg   rb   ré  r   rö   r¶  Úget_session_list_from_mouser+  rT   r  r9	  r‡  rw  rž  r  r•  rW  rQ   r  r´  ra   rî  rï  ri   rk   rX  rY  rû   r\  rø   rª  rm   r¥  r¿  r   rV   rÀ  rÁ  rd   rZ  r[  rf   re   r]  r,  r-  rh   r8  ru  rÚ  rà  rl   rÇ   rH  r  râ  rÆ   r   rj   rÂ  r*  r^   r_   rq  r|  r×   )cr&   rp  Úmice_numrä  r(   r‚   Úreturn_warped_dataÚreturn_trimmed_datar½  r¸  r¾  rÄ  Úplot_SIru   rh   r†	  r	  rû  rr  r  r¿  rÝ   rÍ  rÆ  rÑ  rÒ  Úround_endtimesÚtrials_per_sessionÚnum_trials_totalÚpos_concatenated_by_trialrÔ  r   r×   r’  r5   r*  rí  rÛ  rÜ  rÎ   rÕ  rç   rÖ  re  rf  rg  rh  Úsession_lengthsÚslabel_listrí  r¡	  Útrial_labelsr„  r×  r   r´  r  rØ  rÙ  rÚ  r¤  ri  rÕ   rj  rw   rÃ  rl  rm  rn  r  ro  rp  rq  rÞ  rû  rr  rs  rt  rŸ  rÑ  rÒ  rß  rà  rá  râ  rI   rã  r¾   rÂ   rä  rå  ræ  rç  rè  r  ré  rê  rë  rì  r£   )rË  rQ
  r¤   ÚLDA_on_aligned_dataá8  sf   
û

 



,ý

,




 ".

r`
  c                 C   s²   g }g }g }g }t |ƒD ]h\}}	| | }
|| }t|
jd | ƒ}| |¡ | t |
|¡¡ | t ||¡¡ | |	g| ¡ qt|ƒ}t 	|¡}t 
|¡}t |¡}|||fS )Nr   )rö   r  rV   rø   rT   rW  r¥  r•  rW   Údstackr+  r   )rA  r˜  r?  rz  Úpos_aligned_by_trial_listÚpca_aligned_by_trial_listrÎ  Úsnum_by_trial_listr„  rŸ  r*  rí  r×  rx  r„  r-	  r	  r£   r£   r¤   r'	  B:  s"    



r'	  c                 C   sR   g d¢}g d¢}g }| D ]*}||v r0|  d¡ q||v r|  d¡ qt |¡}|S )N)r   r   rD   ri  r  rè  r   r   ©rø   rW   rw  )r	  Úrandomize_session_labelÚno_ap_trialsÚ	ap_trialsr	  rŸ  r£   r£   r¤   r(	  c:  s    
r(	  c                 C   sn   g d¢}g d¢}ddg}g }| D ]>}||v r8|  d¡ q ||v rL|  d¡ q ||v r |  d¡ q t |¡}|S )Nrä  rè  ri  r  r   r   rD   re
  )r	  Úb_trialsÚt_trialsÚp_trialsr	  rŸ  r£   r£   r¤   r¸	  t:  s    
r¸	  c            "      C   s  d} d}d}ddddddœ}d}t  ¡ j}d	d
g}tjtd ddd }tjtd|  ddd }t jdddd|ddid\}	}
|d7 }|d }|d }g }t|ƒD ]V\}}|dkr¸q¤||df }| |¡ ||df }||df }|d j	d }t
||||ƒ\}}}t|ƒ}t|ƒ}|dkrBtjjt |¡|dd}|| }tj||dd}t |¡}t |¡ |
 ¡ | }t|ƒD ]t}|| }|dd…|f }|dd…dd…|f }|| } |dkoÄ|dk}!tj|||| | dd|!d dddd!d"d#}qz|	 ¡   dS dS )$zf Use LDA to reconstruct trajectories at each time point, maximizing label separability (i.e. airpuff) r   r	  FrÆ  r   Tr   rç	  ÚBluesÚRedsrå  ræ  r£   r 	  rD   rµ   ©rQ  r  rÔ  rÕ  rÖ  rp  r?  r>   rz  rí  r*  r   r¡  ÚAlbert©Úreconstruction_methodNÚBinrV  rÕ  ©r×   r&   r  rw   rÆ   r5   Ú
cbar_labelr¹   r"   r@  rÀ   r£  )rQ   rR   rS   rW   ré  r   rd   rö   rø   rV   r'	  r(	  rb   rµ  r¶  rg   ÚLDArecÚ%reconstruct_PCA_trajectories_with_LDAÚquantify_LDA_reconstructionÚplot_LDA_resultsrv  ra   rT   rï  rk   )"r&   r+	  r©   rÄ  rX
  ru   Ú
task_cmapsr†	  r	  Úfig_trialPCAÚaxs_trialPCArp  r?  r  rû  rr  rz  rË  rÍ  r   Úpca_aligned_by_trialÚpos_aligned_by_trialr	  r	  rx  r`	  ÚLDA_results_dictr×   rz  Útrial_labelrí  Ú	pca_trialrß  r5   r£   r£   r¤   ÚLDA_reconstructionˆ:  s`    û





ÿ
r
  c            L      C   sŽ	  d} d}d}d}dddddd	œ}d}t  ¡ j}d
dg}tjtd ddd }tjtd|  ddd }	t jdddd|ddid\}
}|d7 }|	d }|	d }g }d}d}g d¢}d }d }ddd||ddœ}ddg}d
dg}dd g}d}d}t j||dd| d!| f|ddid\}}|d7 }t j||dd| d!| f|ddid\}}|d7 }t j||dd| d!| f|d"\}}|d7 }t j||dd| d!| f|d"\}}|d7 }t j||dd| d!| f|d"\} }!|d7 }t j||dd| d!| f|d"\}"}#|d7 }t j||dd| d!| f|d"\}$}%|d7 }t j||dd| d!| f|d"\}&}'|d7 }t j||dd| d!| f|d"\}(})|d7 }t j||dd| d!| f|d"\}*}+|d7 }i },g }-t|ƒ t|ƒD ]ì\}.}/|	|/d#f }0| 	|0¡ |	|/d$f }1|	|/d%f }2|2d& j
d& }3t|2|1||0ƒ\}4}5}6t|6ƒ}7t|7ƒ}8|5d d …d&f }9|dkrjtjjt |8¡|8dd'}:|7|: }7tj|4|7|d(};t |;¡};|- 	|;¡ | ¡ |. }<t|8ƒD ]h}=|7|= }>|4d d …d d …|=f }?||> }@|=d&koà|.t|ƒk}Atj|?|9|<| |@dd|Ad)d||d*d+d,}<q¢|;d- }B| ¡ |. }<t|8ƒD ]h}=|7|= }>|Bd d …d d …|=f }?||> }@|=d&kof|.t|ƒk}Atj|?|9|<| |@dd|Ad)d||d*d+d,}<q(| ¡ |. }<tj|;|<|||.d&kd. | ¡ |. }<tj|;|<d/d ||.d&kd0 |! ¡ |. }<d1}Ctj|;|<|C||.d&kd2 |# ¡ |. }<tj|;|<||.d&kd3 |% ¡ |. }<tj|;|<||.d&kd3 |' ¡ |. }<tj|;|<||.d&kd3 |) ¡ |. }<tj|;|<d4||.d&kd2 |+ ¡ |. }<tj|;|<d/||.d&kd5 qÆ|  ¡  |  ¡  |j!d6|d! d7 |  ¡  |j!d8|d! d7 |  ¡  | j!d9|d! d7 |   ¡  |"j!d:|d d7 |"  ¡  |$j!d;|d d7 |$  ¡  |&j!d<|d d7 |&  ¡  |(j!d=|d! d7 |(  ¡  |*j!d>|d! d7 |*  ¡  d?d@„ |; "¡ D ƒ}Dt #dAdB„ |-D ƒ¡}E|E|DdC< dDdB„ t|ƒD ƒ}FdEdB„ t|ƒD ƒ}G|F|GfD ]–}Ht|Hƒd&krqðt j$|dFdG |d7 }t  %¡ }<t|HƒD ]j\}.}/|-|. }IdH}J|I|J }Ktj&|KdIdJd |E…  '|Ed¡}K|.d&kr||K|D|J< ntj(|D|J |KfdIdJ|D|J< q.tj|D|<|dd3 t j$|dFdG |d7 }t  %¡ }<t|HƒD ]`\}.}/|-|. }IdK}J|I|J }K|Kd |E…  '|Ed¡}K|.d&kr|K|D|J< ntj(|D|J |KfdIdJ|D|J< qÒtj|D|<|dd3 t j$|dFdG |d7 }t  %¡ }<t|HƒD ]`\}.}/|-|. }IdL}J|I|J }K|Kd |E…  '|Ed¡}K|.d&kr°|K|D|J< ntj(|D|J |KfdIdJ|D|J< qltj|D|<d|ddM t j$|dFdG |d7 }t  %¡ }<t|HƒD ]j\}.}/|-|. }IdN}J|I|J }Ktj&|KdIdJd |E…  '|Ed¡}K|.d&k	rV|K|D|J< ntj(|D|J |KfdIdJ|D|J< 	qtj|D|<|dd3 qðd S )ONr   r	  Fro
  rÆ  r   Tr   rç	  rl
  rm
  rå  ræ  r£   r 	  rD   rµ   rn
  rÔ  rÕ  rÖ  rp  r?  rä  zPos. binr÷  r¡  )rt
  r  r5   r"   r@  rÀ   r   r   zTask 1zTask 2r   rÛ  rz  rí  r*  r   r¡  rp
  rr
  rV  rÕ  rs
  Úpca_reconstructed_by_trial)Útask_colorsrw   Údraw_labelsrÉ  )rH   rI   rw   r„
  Úbone)r  rw   r„
  )rw   r„
  rÐ  )rH   rw   r„
  zLDA projectionr7   z LDA probability of correct classzStructure Index per binzBin-averaged PCA distancezPer-bin PCA distancez1Difference between cross- and self-task distanceszClustering metricsz#Angle between velocity and LDA axisc                 S   s   i | ]\}}||“qS r£   r£   )r   r  r
  r£   r£   r¤   rÀ  †;  r¥  z8LDA_reconstruction_multiple_mice_old.<locals>.<dictcomp>c                 S   s   g | ]}|d  ‘qS )Únum_bins_per_trialr£   )r   ÚLDA_dr£   r£   r¤   r¤  ‰;  r¥  z8LDA_reconstruction_multiple_mice_old.<locals>.<listcomp>r†
  c                 S   s   g | ]\}}|d kr|‘qS r˜  r£   rB
  r£   r£   r¤   r¤  Œ;  r¥  c                 S   s   g | ]\}}|d k r|‘qS r–  r£   rB
  r£   r£   r¤   r¤  ;  r¥  rÔ  rô   Ú!LDA_prediction_correct_prob_arrayrö  rü  Úpca_distance_diffÚclustering_sil)Úonly_silrw   r„
  Úangle_array))rQ   rR   rS   rW   ré  r   rd   rm   rö   rø   rV   r'	  r(	  rb   rµ  r¶  rg   ru
  rv
  rw
  rv  ra   rT   rï  r	  Úplot_prediction_probabilityÚplot_SI_scoresÚplot_PCA_distance_bin_averagedÚplot_PCA_distance_per_binÚplot_PCA_distance_differenceÚplot_cluster_metricsÚplot_angle_LDA_vs_velocityrk   rc   Úitemsr,  r  r  r0  rh  Úconcatenate)Lr&   r+	  r©   rq
  rÄ  rX
  ru   ry
  r†	  r	  rz
  r{
  rp  r?  r  rw   Úpca_plot_dimsÚ	pca_angleÚpca_angle_azimÚ
pca_kwargsrƒ
  Útask_labelsr×  rØ  Ú	fig_pca3dÚ	axs_pca3dÚfig_pca3d_reconstructedÚaxs_pca3d_reconstructedr‚	  rƒ	  Úfig_predÚaxs_predÚfig_SIÚaxs_SIÚfig_pcadistance_barÚaxs_pcadistance_barÚfig_pcadistanceÚaxs_pcadistanceÚfig_pcadistance_diffÚaxs_pcadistance_diffÚfig_clusterÚaxs_clusterÚ	fig_angleÚ	axs_angleÚLDA_results_dict_stackedÚLDA_results_dict_listrû  rr  rz  r˜  rA  r   r„  r-	  r	  r	  rx  r   r`	  r~
  r×   rz  r
  r€
  rß  r5   r‚
  r  ÚLDA_results_globalÚmin_binsÚmice_to_plot1Úmice_to_plot2Úmice_to_plotr‡
  Údata_keyrŸ  r£   r£   r¤   Ú$LDA_reconstruction_multiple_mice_oldÛ:  s<   û
22,,,,,,,,




ÿ

ÿ








rµ
  c               
   C   s@  d} d}t jtd|  ddd }|d }|d }d	}d
}d}d}d}	d}
dd„ |D ƒ}g }g }g }t|ƒD ]¶\}}||df }||df }||df }|d jd }t||||ƒ\}}}t|ƒ}t|ƒ}|dd…df }|
dkrt jj	t  
|¡|dd}|| }| |¡ | |¡ | |¡ qlt ||||||||	¡ dS )ag   Things to do:
        - Correct PCA dims thing (only first iteration is kept), redo results
        - Check PCA dimensionality, what is going on?
        - Check 2nd session backwards, where to the invalid divides come from?
        - Re-do trial-wide metrics on reconstructed data (PCA distance on task average, TCA)
        - Across-bin averaged stats
        - Clean individual LDA function, change code in "plot LDA"
        - Clean other code (useless stuff, delete the "all metrics" one?)
        - Initialize LDA dict (with position, num dims, etc.)
        - Transform LDA stuff into a class!
        
    r   r	  r 	  Træ  r£   rp  r?  rD   r   ro
  r    rÄ  Fc                 S   s   g | ]}d | ‘qS rt	  r£   rà  r£   r£   r¤   r¤  û;  r¥  z4LDA_reconstruction_multiple_mice.<locals>.<listcomp>rz  rí  r*  r   Nr¡  )rW   ré  r   rö   rV   r'	  r(	  rb   rµ  r¶  rg   rø   ru
  Ú'LDA_reconstruction_on_multiple_sessions)r&   r+	  r	  rp  r?  Ú	num_tasksÚLDA_regularization_factorrq
  Únum_label_shufflesÚminimum_samples_per_binÚtrial_shuffleÚdataset_name_listÚpca_by_trial_listÚlabel_by_trial_listr@  rû  rr  rz  r˜  rA  r   r„  r-	  r	  r	  rx  r   r`	  r£   r£   r¤   Ú LDA_reconstruction_multiple_miceÓ;  sB    


ÿr¿
  c                  C   s€   t  d¡} t  d¡}i }d}d}d}d}d}| D ]:}|D ]0}	tjt||	|||||td	}
|
d |||	f< q8q0t  td	 |¡ d
S )z8 Convenience function to pre-compute skaggs information r  r   r   r\  TFr6  Úskaggsúskaggs_dict.npyN)rW   rg   rT   rP  rQ  r
   rè  r   )rp  rz  Úskaggs_data_dictrW  rX  rV  ró  rN  rr  rŸ  r"  r£   r£   r¤   Úsave_skaggs_data!<  s    

ÿrÃ
  c            '   	   C   s*  t  d¡} t  d¡}t| ƒ}t|ƒ}t jtd ddd }t  ||f¡}t  ||f¡}t  ||f¡}t| ƒD ]~\}}	t|ƒD ]l\}
}||	|f }t  t  t  	|¡¡¡d }t  
|| ¡}t|ƒ}t|ƒ|||
f< ||||
f< ||||
f< q|ql|| }|| }|| }g d¢}g d	¢}d
}t |¡ |d
7 }d}t ¡ }t  |¡}t||gƒD ]~\}}|| }t j|dd}t j|ddt  t|ƒ¡ }|j||tj| dtj| d |j||| || tj| dd qL|jd|d |jdd|d |jd|d tt|ƒƒ}dd„ |D ƒ}|jtt|ƒƒ||d |j|d d t |¡ |d
7 }d}t ¡ }t  |¡}t||gƒD ]~\}}|| }t j|dd}t j|ddt  t|ƒ¡ }|j||tj| dtj| d |j||| || tj| dd qn|jd|d |jdd|d |jd|d tt|ƒƒ}dd„ |D ƒ}|jtt|ƒƒ||d |j|d d t |¡ |d
7 }d}t ¡ }t  |¡}t||gƒD ]~\}}|| }t j|dd}t j|ddt  t|ƒ¡ }|j||tj| dtj| d |j||| || tj| dd q|jd|d |jdd|d |jd|d tt|ƒƒ}dd„ |D ƒ}|jtt|ƒƒ||d |j|d d t |¡ |d
7 }d}t ¡ }t  |¡}t||gƒD ]~\}}|| }t j|dd}t j|ddt  t|ƒ¡ }|j||tj| dtj| d |j||| || tj| dd q²|jd |d |jdd|d |jd!|d tt|ƒƒ}d"d„ |D ƒ}|jtt|ƒƒ||d |j|d d t |¡}|d
7 }t ¡ }|j|d#d$dd%} t|ƒ}d&d„ |D ƒ}!d'd„ | D ƒ}"|jt|ƒ|!|d |jt|ƒ|"|d |j| |d(d)}#t jdd
d*t d+}$|#j!j|$|$|d tj"d,|d- d t |¡}|d
7 }t ¡ }|j|d#d$dd%} t|ƒ}d.d„ |D ƒ}!d/d„ | D ƒ}"|jt|ƒ|!|d |jt|ƒ|"|d |j| |d(d)}#t  #|¡t  $|¡ }%}&t j|%|&d*t d+}$|#j!j|$|$|d |#j!jd|d tj"d0|d- d t |¡}|d
7 }t ¡ }|j|d#d$dd%} t|ƒ}d1d„ |D ƒ}!d2d„ | D ƒ}"|jt|ƒ|!|d |jt|ƒ|"|d |j| |d(d)}#t  #|¡t  $|¡ }%}&t j|%|&d*t d+}$|#j!j|$|$|d |#j!jd|d tj"d3|d- d d4S )5z* Load Skaggs information and summarize it r  r   rÁ
  Træ  r£   r   )r   r   rD   r   rv  r   r   rü  r   rú  râ   rF  z%Proportion of cells with spatial infor7   rÂ   rÑ  rÒ  Ú
Proportionc                 S   s   g | ]}t | ‘qS r£   r  r  r£   r£   r¤   r¤  ~<  r¥  z"skaggs_summary.<locals>.<listcomp>rµ   zTotal spatial infozSpatial info (bits)c                 S   s   g | ]}t | ‘qS r£   r  r  r£   r£   r¤   r¤  ”<  r¥  z Average spatial info (all cells)zSpatial info per cellc                 S   s   g | ]}t | ‘qS r£   r  r  r£   r£   r¤   r¤  «<  r¥  z%Average spatial info per spatial cellz$Spatial info per spatial cell (bits)c                 S   s   g | ]}t | ‘qS r£   r  r  r£   r£   r¤   r¤  Â<  r¥  r÷  r¬  )rß  r  r^  c                 S   s   g | ]}t | ‘qS r£   r  rÊ  r£   r£   r¤   r¤  Î<  r¥  c                 S   s   g | ]}d | ‘qS rt	  r£   rà  r£   r£   r¤   r¤  Ï<  r¥  g      ð?)r×   r°  r>   r±  zSpatial cell proportionrÕ  c                 S   s   g | ]}t | ‘qS r£   r  rÊ  r£   r£   r¤   r¤  à<  r¥  c                 S   s   g | ]}d | ‘qS rt	  r£   rà  r£   r£   r¤   r¤  á<  r¥  zTotal spatial informationc                 S   s   g | ]}t | ‘qS r£   r  rÊ  r£   r£   r¤   r¤  ò<  r¥  c                 S   s   g | ]}d | ‘qS rt	  r£   rà  r£   r£   r¤   r¤  ó<  r¥  zSpatial info per spatial cellN)%rW   rg   rb   ré  r   r*  rö   râ  r:  ro  r•  rQ   r  r  r0  rÝ  r1  rh   r¶  ÚMOUSE_TYPE_COLORSÚMOUSE_TYPE_LABELSrH  rl   rÇ   re   ra   rÚ  rj   rq  ru  r|  rà  r  r×   rc   r,  r-  )'rp  rz  rÜ   rÝ   Úskaggs_dictÚskaggs_stotal_arrayÚskaggs_cellnum_arrayÚtotal_cell_arrayrû  rr  r„  rŸ  rÀ
  Úspatial_idxsÚstotalÚcellnumÚskaggs_cellprop_arrayÚskaggs_stotalavg_arrayÚskaggs_savg_arrayÚid_idxsÚdd_idxsru   rw   r×   r  r¡  Ú
mtype_numsrŸ  rð  rÝ  r:  r   rë  r¿  Úmnamesr5   rì  r3  r4  r£   r£   r¤   Úskaggs_summaryA<  s   


 &
 &
 &
 &rÕ
  c                   C   s
   t ƒ  d S rf  )r§  r£   r£   r£   r¤   Úmain=  s    rÖ
  r[  c              	   C   s    g | ]}t td ddd|ƒƒ‘qS )r   r   r  r  ©rß  rg  ri  r£   r£   r¤   r¤  e=  r¥  r¤  rµ   c              	   C   s    g | ]}t td ddd|ƒƒ‘qS )rµ   ri  r¶   r
  r×
  ri  r£   r£   r¤   r¤  f=  r¥  r  r<  Ú__main__r   zTime Ellapsed: %.1f)r   T)r6   r¦   r§   r   T)rÚ   r   r6   r¦   FFTr   r§   TFFNTr   )NFFTr   r§   FFFNF)FFTFFNF)FFTFFNF)r   )r   r   TTNT)ru  ru  rã  )NNr   FrK  )NNTNNNN)TrÆ  N)NTN)N)r   r¶   r\  )r   r¶   r\  )T)§Ú__doc__Úproject_parametersr¶  r   r   r   r   r   r   r   r	   r
   r°  râ  r}  r2  Úscipy.ioÚnumpyrW   r
  rx  Úmatplotlib.pyplotÚpyplotrQ   Úmatplotlib.patchesr   Úmatplotlib.linesr   Úh5pyÚpandasr7  Úprocessing_functionsrT   rµ  Úsklearnr   Úsklearn.metricsr   Úsklearn.cross_decompositionr   r¿  r   Úscipy.statsr   Ú	functoolsr   rX  r¥   rÙ   rK  r[  r_  rg  ry  r~  r\  r  rœ  rª  r¯  r°  rÒ  r  rE  rP  r]  rl  r§  rÀ  rã  rì  rU  r5  r  r  rê  r  r  r  r1  rG  rJ  r”  rç  rð  rý  r  r  r(  r>  rU  rt  r¥  r1  r5  r7  r:  rj  r:  ra  re  r{  rœ  r   r«  r±  rÁ  rÅ  rÂ  rà  rù  rü  r  r&  r@  ru  r|  r€  r…  rŽ  rõ  rø  rù  rû  rþ  r	  rÿ  r	  r8	  rA	  r]	  r	  r³	  rÑ	  ræ	  rï	  r÷	  r%
  r(
  r7
  r:
  rA
  rN
  r`
  r'	  r(	  r¸	  r
  rµ
  r¿
  rÃ
  rÕ
  rÖ
  r  rß  ra   Úmouse_colors_vdÚmouse_colors_ddr°  ÚFilerQ  Ú__name__r  rµ  r  rm   rr  r£   r£   r£   r¤   Ú<module>   sÒ  D,
 B
d     ü
    +    ü
B  ü
F  ü
>  G   kd ,  3  D:2o  =o   Y  ÿ
W  .D4 5!     _  9g   - ? ) 5  G    ;  EFyg     sT $R  A (  F C L\+ NZY ÿ
   zJNE^ k l   U ) # EZ)SR2 !  c!S yN  Bb

