dipy-0.5.0/0000755000373300037330000000000011525644160012165 5ustar mb312mb31200000000000000dipy-0.5.0/doc/0000755000373300037330000000000011525644160012732 5ustar mb312mb31200000000000000dipy-0.5.0/doc/examples_built/0000755000373300037330000000000011525635224015750 5ustar mb312mb31200000000000000dipy-0.5.0/doc/examples_built/find_correspondence.py0000644000373300037330000000615711525644130022340 0ustar mb312mb31200000000000000""" ========================================== Find correspondence between tractographies ========================================== First import the necessary modules numpy is for numerical computation """ import numpy as np """ dipy.tracking.distances is for tractography distances """ from dipy.tracking.distances import mam_distances """ dipy.data is for getting some small datasets used in examples and tests. """ from dipy.data import get_skeleton """ ``get_skeleton`` provides two skeletons 'C1' and 'C3' previously generated from Local Skeleton Clustering (LSC) """ C1=get_skeleton('C1') C3=get_skeleton('C3') """ We create a diagram with the two skeletons offset [100,0,0] apart """ from dipy.viz import fvtk r=fvtk.ren() T1=[] for c in C1: T1.append(C1[c]['most']) fvtk.add(r,fvtk.line(T1,fvtk.gray)) T3=[] for c in C3: T3.append(C3[c]['most']) T3s=[t+ np.array([100,0,0]) for t in T3] fvtk.add(r,fvtk.line(T3s,fvtk.gray)) # To show now use: #fvtk.show(r) """ For each track in T1 find the minimum average distance to all the tracks in T3 and put information about it in ``track2track``. """ indices=range(len(T1)) track2track=[] mam_threshold=6. for i in indices: rt=[mam_distances(T1[i],t,'avg') for t in T3] rt=np.array(rt) if rt.min()< mam_threshold: track2track.append(np.array([i,rt.argmin(),rt.min()])) track2track=np.array(track2track) np.set_printoptions(2) """ When a track in T3 is simultaneously the nearest track to more than one track in T1 we identify the track in T1 that has the best correspondence and remove the other. """ good_correspondence=[] for i in track2track[:,1]: check= np.where(track2track[:,1]==i)[0] if len(check) == 1: good_correspondence.append(check[0]) elif len(check)>=2: #print check,check[np.argmin(track2track[check][:,2])] good_correspondence.append(check[np.argmin(track2track[check][:,2])]) #good_correspondence.append()) #print goo_correspondenced good_correspondence=list(set(good_correspondence)) track2track=track2track[good_correspondence,:] print 'With mam_threshold %f we find %d correspondence pairs' % (mam_threshold, np.size(track2track,0)) # If you did an fvtk.show(r) before, you'll need to clear the figure #fvtk.clear(r) """ Now plot the corresponding tracks in the same colours .. figure:: find_corr1000000.png :align: center **Showing correspondence between these two modest tractographies**. The labels on the corresponding tracks are the indices of the first tractography on the left. """ for row in track2track: color=np.random.rand(3) T=[T1[int(row[0])],T3s[int(row[1])]] fvtk.add(r,fvtk.line(T,color,linewidth=5)) pos1=T1[int(row[0])][0] pos3=T3s[int(row[1])][0] fvtk.add(r,fvtk.label(r,str(int(row[0])),tuple(pos1),(5,5,5))) fvtk.add(r,fvtk.label(r,str(int(row[0])),tuple(pos3),(5,5,5))) # To see in an interactive window: #fvtk.show(r,png_magnify=1,size=(600,600)) # To make the illustration print('Saving illustration as find_corr1000000.png') fvtk.record(r,n_frames=1,out_path='find_corr',size=(600,600)) dipy-0.5.0/doc/examples_built/fornix_most1000000.png0000644000373300037330000001560011525635211021544 0ustar mb312mb31200000000000000PNG  IHDRXX1GIDATx͋]}gT҅.KO^Jf%DB hL'ʐ 9Me)xQp($@]%;"uhΜ9os=™~-/ } +džD9"/A!Зd10B*B퓋w ! Q)aT3gqSB B3/,0  |J `\>?4o\~퓋#,!stƩ$ WRD>yB8};^#AL,lk퓋'I ;2Stb FJ2_¼woG8 Bf֍S?Z(`5Y$[7Nn}*kEe B?e,LC,_K[7N5B`!qNݼ᥽‰L_Ej~J/LLY^Dgg bN@h dzVNoɟ2긚0I9*>Xs2B8>@|o}W'ɗ~"ATe0r9 !;v0."'?jR:%+Cv[4\tN`EP#*5>VK"J-=iUCzˀ djoqBe[v@!Am]R%!ٙ|e\:Afܓ(|*/08A\0*j2Y\e!J'e+'Wв/{yo'Oz8\xBo( 0!*B(^;!gv:֓}~O+̿lI a9}0{{)AkڒIt6ߌMJw.sN<), ;%!k'}f e*0e&Bό2SqJkv^HOoU~U4u0UuՀ#r9Z XB22w"|B\皁BB8\_dܓp_7޸5><҅ݭ\wvB$:Akv( ) dfv=I_ph 3wz uΣ(괓5AIk'v[l&`T!ZgZf+ al!`ς?ALuWf>(6E!tG2;] #xafD*T: d2ugVG.Bh7.ԙ5Ҩ:AȬ+e5eS: nqa̶`M > B.ɕU w[D`%:!3.vq 5g$\T E*<S({37>h]Ԃ0B& aT!JSFj?W¨BXW~{ϞЦNO ITB!&W #^[~Gŋ/^?tq@!+UFNB_;رcǎ? %c#!_|'B8tw~W곜^Ang񲧢#[%/hp@c~w:&?A֌ƌ €!T򝏖&ih~K$0Ak_.JMHA &⩄e[S'MfĤ Bhz\0Qr@Bs2U°!o\6 dv*#|xiz:Ea$!4DD+}( N2kKk?e$^8sղ|su@+! ;#*tDBkV Kh0Z:˗Z"ɨNAjkҴd0=Lf!޼2eﭻ[:LV#qYiOES%:0!A۩O@ dFz807@!0«w?a!&E-AYOo `!s2;h Bd<$5A~q|-A,>@X6ip(5^;taB!A BaB'Ak6@ [rØ B8O+H"B8L\~xi: C_tka|2p%ڢb0yVGRB'^|d[leNW BH\}+?|zIa@ԕ/t@;Fd]T"Hp-0 !j%5 \9>xABhnE a<!,vbr0fX+ ƙ2S{%haOU"Wl0#x'^fģ?̿z5AȬu>YD8`aB AȌ>=-駶Ԓ 7ja7s)̞—U!2o\e>?25!P%/ުR_#ܿc( dUDZzK[[[ɔJ]L&_; uZ/ d+_&?2qE fĤ1-i2+\ڞZ'@sURh>2)X,A&ϿuT㯨R+__,<"D:%N0|}1òV}Jh dӬ⫕l+__LG`aJZ/͸"n1槕f~Blg.hF S d)S?Bnkkkܓ0,AFYgpѕb&WkQ dv ִt:So B8L+QzgBo!sn-ݲ¾h&еC_foǿڪH:Z>ؒe:!N >z$ ~. Hwo\9\[u/=_&M X1Bf$Y۾R#HBf?uaṻYLf,!0 AL[g<2BJ>+ 0ual!st샡zkk+9)= k V=PQ-f~BfM2/̔)dOB<5Š0_Q2S,3,`-eHjt| < #͑/(sIPB״FI4E3!I^}EK{IkTBGTlk]z{Y]ldtpcHAV/^{2+뎆TkTBTlXf6)faPKXeȌ.. Y3T7EOa R(b̗|T8Yر)Ѕ):K&ʌ3 fʜk)Y3Edf,m BhE p0ÌXbWQml|Sŋ_dޱcfғ 5EE_YM5Qb9ŌsLFQh@d3EF^Vsw¦h8h!V?' 0Gɒ  KZLMh2MѨP9) 8T G0eR0 taM!hfNͿjIԖsQ6k*n=4BuSt*3:Qg' +)U4HM4ie RY``.b Mќ3,t k^~Nj R:6)$)4EQlL ]SҰNj`ERpM`)4E*, mRY0FzK7&cq)؅W+{З92ifi(={&ےO'Rueac+B6Y68=;j˙<)80}ҽ8H \V8?A&)85K d!̎ ԘIhAKÿϕ| :. C'! O.%7Ja#AXM nUK0DJA P85F nYX_)-+<- &A4̴Ipr:! k̬4+ C)]u(Ni[JA,f^5( +oF9̋!Ta+ s0O;mҊSBay1^wCA=Bjuݗe^8YƥaS!gAdUg:ߢ/ }gZ AcgVo]穄* A)H}07p(a3B -Z4 ϟ?:bP!HJqC>/Η†,Tҩ|I4Zj/phòҰ:^Sc A)HGJ$. atfB([$ɚaov0-B +8l4L'\+AMdY9o}Px^}fgYziI:AX=e4}faΌיL MY4Ⱅ0deA,,SAϤΈ{eah)W'Cy7fqMn}ggB܊ַҿƿ&߼uT-WB?b)|᥽w.gRg$Iv3O%ħoI$Y.΋/YƠfiY#VW~e/lV+r+fa_e+ݽGŨa8LU1A>#M/I7Cvh5}\(԰}~Q& K,OT4t˴zK4?G2вj:Gp0΂OԊ8U  Ҋdw}Sᅬ{ROe_7|s_B0yAXƪNixpPV. +Be6 Xa@Ivީ&Z+JP>JPTGX,H˚7{ ڗGʶL˿´4°b֙&#s7XL:7^us0ϔ+:Q/͘B0V0   QO F ,<)d!ldv 6PR⛜/ HFIRqYd!lLPF†X5(jcQj^Bjy)5Bd\PB+d!LIzvLYS_V% a 4# aD B0w̞̞̞,`I@i) @i) @im@iӧO}Lt遡/dx[C_,ܿ3 6ĄJçG }9ScahӘKL "c4A@W&BFd8Гq*Bz58(@/`H*B7` Hk`xKF> D!#O BFm8^A#tA!c#&#SnBJLU) 39IENDB`dipy-0.5.0/doc/examples_built/nii_2_tracks.py0000644000373300037330000002244411525644130020673 0ustar mb312mb31200000000000000""" =============================== From raw data to tractographies =============================== Overview ======== **This example gives a tour of some simple features of dipy.** First import the necessary modules ---------------------------------- ``numpy`` is for numerical computation """ import numpy as np """ ``nibabel`` is for data formats """ import nibabel as nib """ ``dipy.reconst`` is for the reconstruction algorithms which we use to create directionality models for a voxel from the raw data. """ import dipy.reconst.gqi as gqi import dipy.reconst.dti as dti """ ``dipy.tracking`` is for tractography algorithms which create sets of tracks by integrating directionality models across voxels. """ from dipy.tracking.propagation import EuDX """ ``dipy.data`` is for small datasets we use in tests and examples. """ from dipy.data import get_data """ Isotropic voxel sizes required ------------------------------ ``dipy`` requires its datasets to have isotropic voxel size. If you have datasets with anisotropic voxel size then you need to resample with isotropic voxel size. We have provided an algorithm for this. You can have a look at the example ``resample_aniso_2_iso.py`` Accessing the necessary datasets -------------------------------- ``get_data`` provides data for a small region of interest from a real diffusion weighted MR dataset acquired with 102 gradients (including one for b=0). In order to make this work with your data you should comment out the line below and add the paths for your nifti file (``*.nii`` or ``*.nii.gz``) and your ``*.bvec`` and ``*.bval files``. If you are not using nifti files or you don't know how to create the ``*.bvec`` and ``*.bval`` files from your raw dicom (``*.dcm``) data then you can either try recent module nibabel.nicom """ try: from nibabel.nicom.dicomreaders import read_mosaic_dir except: print('nicom for dicom is not installed') """ or to convert the dicom files to nii, bvec and bval files using ``dcm2nii``. """ fimg,fbvals,fbvecs=get_data('small_101D') """ **Load the nifti file found at path fimg as an Nifti1Image.** """ img=nib.load(fimg) """ **Read the datasets from the Nifti1Image.** """ data=img.get_data() print('data.shape (%d,%d,%d,%d)' % data.shape) """ This produces the output:: data.shape (6,10,10,102) As you would expect, the raw diffusion weighted MR data is 4-dimensional as we have one 3-d volume (6 by 10 by 10) for each gradient direction. **Read the affine matrix** which gives the mapping between volume indices (voxel coordinates) and world coordinates. """ affine=img.get_affine() """ **Read the b-values** which are a function of the strength, duration, temporal spacing and timing parameters of the specific paradigm used in the scanner, one per gradient direction. """ bvals=np.loadtxt(fbvals) """ **Read the b-vectors**, the unit gradient directions. """ gradients=np.loadtxt(fbvecs).T """ Calculating models and parameters of directionality --------------------------------------------------- We are now set up with all the data and parameters to start calculating directional models for voxels and their associated parameters, e.g. anisotropy. **Calculate the Single Tensor Model (STM).** """ ten=dti.Tensor(data,bvals,gradients,thresh=50) """ **Calculate Fractional Anisotropy (FA) from STM** """ FA=ten.fa() print('FA.shape (%d,%d,%d)' % FA.shape) """ As expected the FA is a 3-d array with one value per voxel:: FA.shape (6,10,10) Generate a tractography ----------------------- Here we use the Euler Delta Crossings (EuDX) algorithm. The main input parameters of ``EuDX`` are * an anisotropic scalar metric e.g. FA * the indices for the peaks on the sampling sphere. Other important options are * the number of random seeds where the track propagation is initiated, * a stopping criterion, for example a low threshold for anisotropy. For instance if we are using *Fractional Anisotropy (FA)* a typical threshold value might be ``a_low=.2`` """ eu=EuDX(a=FA,ind=ten.ind(),seeds=10000,a_low=.2) """ EuDX returns a generator class which yields a further track each time this class is called. In this way we can generate millions of tracks without using a substantial amount of memory. For an example of what to do when you want to generate millions of tracks with minimum memory usage have a look at ``save_dpy.py`` in the ``examples`` directory. However, in the current example that we only have 10000 seeds, and we can load all tracks in a list using list comprehension([]) without having to worry about memory. """ ten_tracks=[track for track in eu] """ In dipy we usually represent tractography as a list of tracks. Every track is a numpy array of shape (N,3) where N is the number of points in the track. """ print ('The number of FA tracks is %d' % len(ten_tracks)) print ('The number of points in ten_tracks[130] is %d' % len(ten_tracks[130])) print ('The points in ten_tracks[130] are:') print ten_tracks[130] """ As we use random seeding for the tractography the results will differ when repeated, however one run gave us the following information:: The number of FA tracks is 8280 The number of points in ten_track[130] is 7 The points in ten_tracks[130] are: [[ 1.73680878 5.08249903 4.48492956] [ 1.45797026 4.76981783 4.21201992] [ 1.14244306 4.46308756 3.97461915] [ 0.84001541 4.14648438 3.73316503] [ 0.53758776 3.82988143 3.49171114] [ 0.22055824 3.52935386 3.24845099] [ 0.22055824 3.52935386 3.24845099]] Another way to represent tractography is as a numpy array of numpy objects. This way has an additional advantage that it can be saved very easily using numpy utilities. In theory, in a list it is faster to append an element, and in an array is faster to access. In other words both representations have different pros and cons. Other representations are possible too e.g. graphtheoretic etc. """ ten_tracks_asobj=np.array(ten_tracks,dtype=np.object) np.save('ten_tracks.npy',ten_tracks_asobj) print('FA tracks saved in ten_tracks.npy') """ Crossings and Generalized Q-Sampling ------------------------------------ You probably have heard about the problem of crossings in diffusion MRI. The single tensor model cannot detect a simple crossing of two fibres. However with *Generalized Q-Sampling (GQS)* this is possible even up to a quadruple crossing or higher depending on the resolution of your datasets. Resolution will typically depend on signal-to-noise ratio and voxel-size. """ gqs=gqi.GeneralizedQSampling(data,bvals,gradients) """ A useful metric derived from GQS is *Quantitative Anisotropy* (QA). """ QA=gqs.qa() print('QA.shape (%d,%d,%d,%d)' % QA.shape) """ QA is a 4-d array with up to 5 peak QA values for each voxel:: QA.shape (6,10,10,5) QA array is significantly different in shape from the FA array, however it too can be directly input to the EuDX class: """ eu2=EuDX(a=QA,ind=gqs.ind(),seeds=10000,a_low=.0239) """ This shows one of the advantages of our EuDX algorithm: it can be used with a wide range of model-based methods, such as - Single Tensor - Multiple Tensor - Stick & Ball - Higher Order Tensor and model-free methods such as - DSI - QBall - GQI *etc.* We designed the algorithm this way so we that we can compare directly tractographies generated from the same dataset with very different models and/or choices of threshold. Now we look at the QA tractography: """ gqs_tracks=[track for track in eu2] print('The number of QA tracks is %d' % len(gqs_tracks)) """ with output:: The number of QA tracks is 14022 Note the difference between the number of gqs_tracks and ten_tracks. There are more with QA than with FA. This is because of the presence of crossings which GQI can detect but STM cannot. When the underlying directionality model supports crossings then distinct tracks will be propagated from a seed towards the different directions in equal abundance. In ``dipy`` it is very easy to count the number of crossings in a voxel, volume or region of interest """ gqs_tracks_asobj=np.array(gqs_tracks,dtype=np.object) np.save('gqs_tracks.npy',gqs_tracks_asobj) print('QA tracks saved in gqs_tracks.npy') """ **This is the end of this very simple example** You can reload the saved tracks using ``np.load`` from your current directory. You can optionaly install ``python-vtk`` and visualize the tracks using ``fvtk``: """ from dipy.viz import fvtk r=fvtk.ren() fvtk.add(r,fvtk.line(ten_tracks,fvtk.red,opacity=0.05)) gqs_tracks2=[t+np.array([10,0,0]) for t in gqs_tracks] fvtk.add(r,fvtk.line(gqs_tracks2,fvtk.green,opacity=0.05)) """ Press 's' to save this screenshot when you have displayed it with ``fvtk.show``. Or you can even record a video using ``fvtk.record``. You would show the figure with something like:: fvtk.show(r,png_magnify=1,size=(600,600)) To record a video of 50 frames of png, something like:: fvtk.record(r,cam_pos=(0,40,-40),cam_focal=(5,0,0),n_frames=50,magnification=1,out_path='nii_2_tracks',size=(600,600),bgr_color=(0,0,0)) .. figure:: nii_2_tracks1000000.png :align: center **Same region of interest with different underlying voxel representations generates different tractographies**. """ # Here's how we make the figure. print('Saving illustration as nii_2_tracks1000000.png') fvtk.record(r,n_frames=1,out_path='nii_2_tracks',size=(600,600)) dipy-0.5.0/doc/examples_built/tractography_clustering.rst0000644000373300037330000001017211525644130023445 0ustar mb312mb31200000000000000.. AUTO-GENERATED FILE -- DO NOT EDIT! .. _example_tractography_clustering: ============================= Tractography Clustering ============================= Overview ======== **This example gives a tour of clustering related features of dipy.** First import the necessary modules ---------------------------------- ``numpy`` is for numerical computation :: import numpy as np import time from nibabel import trackvis as tv from dipy.tracking import metrics as tm from dipy.tracking import distances as td from dipy.io import pickles as pkl from dipy.viz import fvtk #fname='/home/user/Data_Backup/Data/PBC/pbc2009icdm/brain1/brain1_scan1_fiber_track_mni.trk' #fname='/home/user/Data/PBC/pbc2009icdm/brain1/brain1_scan1_fiber_track_mni.trk' from dipy.data import get_data fname=get_data('fornix') print(fname) Load Trackvis file for *Fornix*: :: streams,hdr=tv.read(fname) Copy tracks: :: T=[i[0] for i in streams] #T=T[:1000] Downsample tracks to just 3 points: :: tracks=[tm.downsample(t,3) for t in T] Delete unnecessary data: :: del streams,hdr Perform Local Skeleton Clustering (LSC) with a 5mm threshold: :: now=time.clock() C=td.local_skeleton_clustering(tracks,d_thr=5) print('Done in %.2f s' % (time.clock()-now,)) Reduce the number of points for faster visualization using the ``approx_polygon_track`` algorithm which retains points depending on how much they are need to define the shape of the track: :: T=[td.approx_polygon_track(t) for t in T] Show the initial *Fornix* dataset: :: r=fvtk.ren() fvtk.add(r,fvtk.line(T,fvtk.white,opacity=1)) #fvtk.show(r) fvtk.record(r,n_frames=1,out_path='fornix_initial',size=(600,600)) .. figure:: fornix_initial1000000.png :align: center **Initial Fornix dataset**. :: Show the *Fornix* after clustering (with random bundle colors): :: fvtk.clear(r) colors=np.zeros((len(T),3)) for c in C: color=np.random.rand(1,3) for i in C[c]['indices']: colors[i]=color fvtk.add(r,fvtk.line(T,colors,opacity=1)) #fvtk.show(r) fvtk.record(r,n_frames=1,out_path='fornix_clust',size=(600,600)) .. figure:: fornix_clust1000000.png :align: center **Showing the different clusters with random colors**. :: Calculate some statistics about the clusters :: lens=[len(C[c]['indices']) for c in C] print('max %d min %d' %(max(lens), min(lens))) print('singletons %d ' % lens.count(1)) print('doubletons %d' % lens.count(2)) print('tripletons %d' % lens.count(3)) Find and display the skeleton of most representative tracks in each cluster: :: skeleton=[] fvtk.clear(r) for c in C: bundle=[T[i] for i in C[c]['indices']] si,s=td.most_similar_track_mam(bundle,'avg') skeleton.append(bundle[si]) fvtk.label(r,text=str(len(bundle)),pos=(bundle[si][-1]),scale=(2,2,2)) fvtk.add(r,fvtk.line(skeleton,colors,opacity=1)) #fvtk.show(r) fvtk.record(r,n_frames=1,out_path='fornix_most',size=(600,600)) .. figure:: fornix_most1000000.png :align: center **Showing skeleton with the most representative tracks as the skeletal representation**. The numbers are depicting the number of tracks in each cluster. This is a very compact way to see the underlying structures an alternative would be to draw the representative tracks with different widths. :: Save the skeleton information in the dictionary. Now try to play with different thresholds LSC and check the different results. Try it with your datasets and gives us some feedback. :: for (i,c) in enumerate(C): C[c]['most']=skeleton[i] for c in C: print('Keys in bundle %d' % c) print(C[c].keys()) print('Shape of skeletal track (%d, %d) ' % C[c]['most'].shape) pkl.save_pickle('skeleton_fornix.pkl',C) .. admonition:: Example source code You can download :download:`the full source code of this example <./tractography_clustering.py>`. This same script is also included in the dipy source distribution under the :file:`doc/examples/` directory. dipy-0.5.0/doc/examples_built/nii_2_tracks.rst0000644000373300037330000002321711525644130021052 0ustar mb312mb31200000000000000.. AUTO-GENERATED FILE -- DO NOT EDIT! .. _example_nii_2_tracks: =============================== From raw data to tractographies =============================== Overview ======== **This example gives a tour of some simple features of dipy.** First import the necessary modules ---------------------------------- ``numpy`` is for numerical computation :: import numpy as np ``nibabel`` is for data formats :: import nibabel as nib ``dipy.reconst`` is for the reconstruction algorithms which we use to create directionality models for a voxel from the raw data. :: import dipy.reconst.gqi as gqi import dipy.reconst.dti as dti ``dipy.tracking`` is for tractography algorithms which create sets of tracks by integrating directionality models across voxels. :: from dipy.tracking.propagation import EuDX ``dipy.data`` is for small datasets we use in tests and examples. :: from dipy.data import get_data Isotropic voxel sizes required ------------------------------ ``dipy`` requires its datasets to have isotropic voxel size. If you have datasets with anisotropic voxel size then you need to resample with isotropic voxel size. We have provided an algorithm for this. You can have a look at the example ``resample_aniso_2_iso.py`` Accessing the necessary datasets -------------------------------- ``get_data`` provides data for a small region of interest from a real diffusion weighted MR dataset acquired with 102 gradients (including one for b=0). In order to make this work with your data you should comment out the line below and add the paths for your nifti file (``*.nii`` or ``*.nii.gz``) and your ``*.bvec`` and ``*.bval files``. If you are not using nifti files or you don't know how to create the ``*.bvec`` and ``*.bval`` files from your raw dicom (``*.dcm``) data then you can either try recent module nibabel.nicom :: try: from nibabel.nicom.dicomreaders import read_mosaic_dir except: print('nicom for dicom is not installed') or to convert the dicom files to nii, bvec and bval files using ``dcm2nii``. :: fimg,fbvals,fbvecs=get_data('small_101D') **Load the nifti file found at path fimg as an Nifti1Image.** :: img=nib.load(fimg) **Read the datasets from the Nifti1Image.** :: data=img.get_data() print('data.shape (%d,%d,%d,%d)' % data.shape) This produces the output:: data.shape (6,10,10,102) As you would expect, the raw diffusion weighted MR data is 4-dimensional as we have one 3-d volume (6 by 10 by 10) for each gradient direction. **Read the affine matrix** which gives the mapping between volume indices (voxel coordinates) and world coordinates. :: affine=img.get_affine() **Read the b-values** which are a function of the strength, duration, temporal spacing and timing parameters of the specific paradigm used in the scanner, one per gradient direction. :: bvals=np.loadtxt(fbvals) **Read the b-vectors**, the unit gradient directions. :: gradients=np.loadtxt(fbvecs).T Calculating models and parameters of directionality --------------------------------------------------- We are now set up with all the data and parameters to start calculating directional models for voxels and their associated parameters, e.g. anisotropy. **Calculate the Single Tensor Model (STM).** :: ten=dti.Tensor(data,bvals,gradients,thresh=50) **Calculate Fractional Anisotropy (FA) from STM** :: FA=ten.fa() print('FA.shape (%d,%d,%d)' % FA.shape) As expected the FA is a 3-d array with one value per voxel:: FA.shape (6,10,10) Generate a tractography ----------------------- Here we use the Euler Delta Crossings (EuDX) algorithm. The main input parameters of ``EuDX`` are * an anisotropic scalar metric e.g. FA * the indices for the peaks on the sampling sphere. Other important options are * the number of random seeds where the track propagation is initiated, * a stopping criterion, for example a low threshold for anisotropy. For instance if we are using *Fractional Anisotropy (FA)* a typical threshold value might be ``a_low=.2`` :: eu=EuDX(a=FA,ind=ten.ind(),seeds=10000,a_low=.2) EuDX returns a generator class which yields a further track each time this class is called. In this way we can generate millions of tracks without using a substantial amount of memory. For an example of what to do when you want to generate millions of tracks with minimum memory usage have a look at ``save_dpy.py`` in the ``examples`` directory. However, in the current example that we only have 10000 seeds, and we can load all tracks in a list using list comprehension([]) without having to worry about memory. :: ten_tracks=[track for track in eu] In dipy we usually represent tractography as a list of tracks. Every track is a numpy array of shape (N,3) where N is the number of points in the track. :: print ('The number of FA tracks is %d' % len(ten_tracks)) print ('The number of points in ten_tracks[130] is %d' % len(ten_tracks[130])) print ('The points in ten_tracks[130] are:') print ten_tracks[130] As we use random seeding for the tractography the results will differ when repeated, however one run gave us the following information:: The number of FA tracks is 8280 The number of points in ten_track[130] is 7 The points in ten_tracks[130] are: [[ 1.73680878 5.08249903 4.48492956] [ 1.45797026 4.76981783 4.21201992] [ 1.14244306 4.46308756 3.97461915] [ 0.84001541 4.14648438 3.73316503] [ 0.53758776 3.82988143 3.49171114] [ 0.22055824 3.52935386 3.24845099] [ 0.22055824 3.52935386 3.24845099]] Another way to represent tractography is as a numpy array of numpy objects. This way has an additional advantage that it can be saved very easily using numpy utilities. In theory, in a list it is faster to append an element, and in an array is faster to access. In other words both representations have different pros and cons. Other representations are possible too e.g. graphtheoretic etc. :: ten_tracks_asobj=np.array(ten_tracks,dtype=np.object) np.save('ten_tracks.npy',ten_tracks_asobj) print('FA tracks saved in ten_tracks.npy') Crossings and Generalized Q-Sampling ------------------------------------ You probably have heard about the problem of crossings in diffusion MRI. The single tensor model cannot detect a simple crossing of two fibres. However with *Generalized Q-Sampling (GQS)* this is possible even up to a quadruple crossing or higher depending on the resolution of your datasets. Resolution will typically depend on signal-to-noise ratio and voxel-size. :: gqs=gqi.GeneralizedQSampling(data,bvals,gradients) A useful metric derived from GQS is *Quantitative Anisotropy* (QA). :: QA=gqs.qa() print('QA.shape (%d,%d,%d,%d)' % QA.shape) QA is a 4-d array with up to 5 peak QA values for each voxel:: QA.shape (6,10,10,5) QA array is significantly different in shape from the FA array, however it too can be directly input to the EuDX class: :: eu2=EuDX(a=QA,ind=gqs.ind(),seeds=10000,a_low=.0239) This shows one of the advantages of our EuDX algorithm: it can be used with a wide range of model-based methods, such as - Single Tensor - Multiple Tensor - Stick & Ball - Higher Order Tensor and model-free methods such as - DSI - QBall - GQI *etc.* We designed the algorithm this way so we that we can compare directly tractographies generated from the same dataset with very different models and/or choices of threshold. Now we look at the QA tractography: :: gqs_tracks=[track for track in eu2] print('The number of QA tracks is %d' % len(gqs_tracks)) with output:: The number of QA tracks is 14022 Note the difference between the number of gqs_tracks and ten_tracks. There are more with QA than with FA. This is because of the presence of crossings which GQI can detect but STM cannot. When the underlying directionality model supports crossings then distinct tracks will be propagated from a seed towards the different directions in equal abundance. In ``dipy`` it is very easy to count the number of crossings in a voxel, volume or region of interest :: gqs_tracks_asobj=np.array(gqs_tracks,dtype=np.object) np.save('gqs_tracks.npy',gqs_tracks_asobj) print('QA tracks saved in gqs_tracks.npy') **This is the end of this very simple example** You can reload the saved tracks using ``np.load`` from your current directory. You can optionaly install ``python-vtk`` and visualize the tracks using ``fvtk``: :: from dipy.viz import fvtk r=fvtk.ren() fvtk.add(r,fvtk.line(ten_tracks,fvtk.red,opacity=0.05)) gqs_tracks2=[t+np.array([10,0,0]) for t in gqs_tracks] fvtk.add(r,fvtk.line(gqs_tracks2,fvtk.green,opacity=0.05)) Press 's' to save this screenshot when you have displayed it with ``fvtk.show``. Or you can even record a video using ``fvtk.record``. You would show the figure with something like:: fvtk.show(r,png_magnify=1,size=(600,600)) To record a video of 50 frames of png, something like:: fvtk.record(r,cam_pos=(0,40,-40),cam_focal=(5,0,0),n_frames=50,magnification=1,out_path='nii_2_tracks',size=(600,600),bgr_color=(0,0,0)) .. figure:: nii_2_tracks1000000.png :align: center **Same region of interest with different underlying voxel representations generates different tractographies**. :: # Here's how we make the figure. print('Saving illustration as nii_2_tracks1000000.png') fvtk.record(r,n_frames=1,out_path='nii_2_tracks',size=(600,600)) .. admonition:: Example source code You can download :download:`the full source code of this example <./nii_2_tracks.py>`. This same script is also included in the dipy source distribution under the :file:`doc/examples/` directory. dipy-0.5.0/doc/examples_built/nii_2_tracks1000000.png0000644000373300037330000031531211525635153021554 0ustar mb312mb31200000000000000PNG  IHDRXX1 IDATxoّL-d;ETž.p? 0/|=J%vQ$9?ļ$%eK$A$|wNx#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAp)9 phC,Fe;~1`P[B .ݍywzJo};ro~>|P{1Fpڕd0jo~n/o?M\~[eBS&7v3ǯGpp ieh,Q㭡y9 ڙEdlĵpjβOWsy0-;LGr+Å4"xj}z6>[֟ewgneҕu0D̟ ћ&K=]HC&JԷFb)ڀ&)X؅P)dPsnλ-ǃc1qV4~;iqB )tgЂ(sOϮ .x aop3_:LWf%jQBp1h`ix mS/γ8a3${#jfMhB`E(ke}ouI7Lb4[*l甍|Ap $L6 ):: AZP%w0 UXY M .k7Ȳ>DY7=,ҹtPVEl@S`n@K?YK+6]TChE҂Oji%| iz-(T ev`)N0'Ph WB?WuѰ?2v%gP~zs^MȎg 6r 0Ђi4c.E=+ gVcu]xi(ilwN"a5܆2 5=@`PyBUv7ݮOgy* Qu3wEjrUϾOe((Z%SE8a:T։iLe<~yxVPq_v}MXV%ո ІhA`A`a  A %Df 0pdyVA_{Lr#ϦkmO5JڹihhBU6o0sb10/4%9 &Ͳ /_^.!eJ 7eIk&EmhZ8dƹw_4w$V5hwse i=dDQQR|ѭ&kz̹WY3sw화bg jZ,a!U .LCf N =YH> eݘT~+UV(}'y;JQ_\{qݙj3rJ2%6m+: ;N)@P9؃L>lCSf۾[l40.(x/зt" @\װCvsnH/g_ v?99hC*І6Ԡ u٭1< 'u%T¨~@fҘlUe lx&F>Zv>2+BVmKgꚓ\vaZu~%g04d' -X`&{ЁӰ3<Ch+j!߷&56UyY`pټ0+nE3hx));Mݘr?+аPt8u5S>cL]acI&m`2~C0 YؖRt f Y(,,}" kf5t*"¶fr Lwe%KPGJtiA7$[6,ML>t^{Gdǎ>HZ2m؅;Vx)Uwa""9E/uBwj%g+-S/m muPѫ ndBԿCRO0`׻G4 N1 ;9Pi8iAYaFdkJWtTQ @rV0㐅qU݀PUNwSRl䤬Mv% TRvOLT )3Y[Ѐ؄'%ҙ2-+*k"ffar ~߸/YA+/j c鷅v~sXQ6vIlCZ*fu1)SNKu5)O辐чJM#| ~)Ӯwy!QMh)0 &*0Ko|XPaP)9Iejg! Y(i1C^3YM-ހo#0C@3]%E]W/F V!o)?,%Xh9V}h ܃0 >WVg*p aN}Av䝁l*ijɖPsZZƮeZz,,:7Y[ZUuATw*΋5,I/x#ICP>sϩǜ?K+w T2_r0C2S܀ 5m`: ߂QBsyU؃1 R5hA Ch$|E>,`fܞPp3I:[n%[zTxWUQ?/-m` :`G܂nM>t?@ ¼ڽ*n>MvwYnqקڦyI<<au&[W a>8(mAS=ZD\3W$Xg ;jS|'LIa~߅ּb\kv4a`P?ECq9idrfի@+l 2W@CqTQU#w4M<{2(Z n|5H,YAvQǂ6bȾD5vҚqe nodR3/ݚӻob]mac^Sp#ASU^s_$Sg r&DJU<֔עf&k,*|y]U' FSsQPGC֔WC+0/9؝3ڿfW`?oX%黙 -$A2pe@GWO[K6,:ڃ:T`H)@stv0 qEH `<)>dq* 0N݃e)ྲ27-U[I8 -rA)ƊKPF>CZM7f7Pr/d d[+6LP24Š .@V)T*Zi b[ 6*K>N7G,hmW\~?ge#~w6ΊfyoS:}yF67[jkk/I1ԝ@d0'2u1dD;=8t4sZd& cP6ӐykMz!,9|x?`n| % ?,.,œm@vS,hjQiWd.8>E=L0*3*2ɣCBCj'zo#%9|0+Ian&`_0*Z3855֒KԆp2fvokJ}喛wȂKk+7t{V e%MHIs֤-?Mozn\ aI/{Y{[V+ye0 0؅ CџXRZ-r`VnO m.8Yv #0|dNcfdVkpuNRC؃!B CM*Y6|hyE|s -Q˂dnO–2@cnuWA߸Kͅ1+llZtc_ɅSKfvfk.i]86 xN%܇-ى)Ȼyg9 z,S<MQVtݐxѿ~i&a^reQ5.[J! =}Xy @MQq@Fݐ2CPY,d#0[Zq0F 0/iGu؇܆;(OiX^dfd0*;Z%[97:2S(טh%(*K ܃/p( ℇ]}yK^zRK<?Ih9o J s'PCmer),k;CPcM\c[[S>ZozJ748 PkJ%̱,¨$v7­{Zz2< ?0 Oop`> D6F`G1؄kPW >;p %l~9e `rKU MeCtZdl,:2ܠi[.䵜J#q!Ӫgl0;&tclj$|ʹiS;ԆɝJ?&}Ӗ0Н3"'NUע_ljavWLi\ұA_9u Ů10 fpE êΕe,Pi,)MhvnanUpFQVO1s:~ d> OF_Ic{rp[{;i&lW]pe6`are?@C&܅G*_![x a*(i ;Ze: ✀M7t2jrO+: cp[ũU+ ;LA3sjm=2ug֌Jf06dk3f%؁CW]i\Հ"V܉uuX̎gAPgN<.]A}Ccr{bc¤L6Bhs#jՋe qJq4"-0vR3:p_ WPQ,祜KTԒl%K\ꏅdv,MSBEt>\[*^QƔ6ҥ>YhUD`zRʊ;16=M#\\z/4L-ٰ 3Zo{zv?!d2pBYIΈd0(ajAyDKhiNEyUJLAO2E<-2.rzP5؅y؃//{m;l+~+ LjjgÔoӰvVþ&üjH_ cJ19,ڄUє\=erXQ–MSIwi+ͼJ=# FD%Fjl8 ˲뭫ᜲ˓r_S˺Lm˒NO*{LWNqRj^oNڹspMՕ5L53i#w %pC3IQ+KB'(gSWZ):E [cAz2\*)oöb'5W fONt^R KmBnA]MFb,GT %-.|ۇN!}+ct IDATX-[M⼮΢wB{p JPS'BTgו?3`̻fKŴu*I6{M2mήU |R²{ 78#e}6Ԕ!)eMZ\'Îo˪mUhfZAaNLfH>=-:bV>|6f^%mq%YǼLlGa-g[5UY5|7jYO`6@m{ҭ72ta֙qZۘf.U"c sZo[[>Ԥ ?SFxi䐂ʘ@B$xHeˬߌc*X0 7[Msgg"ֹVMؕȥ ;0]ye+Q>u;*۰Q;09X W^Њ)'z:l9ym2i?v h1h8tk ֚܁ܱ x 7ѝcՇLڸrSTMVkn1%KqA9Ib:YD{b(jzgXP5DZmnw\j;f;ZƘƪGڏ&I%HzЄ}mYX0wdv_hײ^Oa][ۄ).Gj1uXӚ|X69x3EI&^9&eቖkf`l+XkhokQZO,&lQѪeάäևzb *Y\06s֞{8Q+2Q̿킊CW 1p&ՋqUǼ~p4{g|WtYhHRV46N,>1/R)’ɓC&-Q1 zJ% S}<;;3zZ& ƍC(grj'`F% 0Y`KL}Oa >[:Jڑp ;. f%(ciK|v;Kw5BN3lSܕ0+Nkkȉ|DsJ̤L*3#j[Q}B& ,NȧѾ<0-%G0ҷpGRǮɵ}۰eO;rnRYxA-<ыJ#ֻۙW(+ ~:Z2Bߣ`ES^SWv/Qmg7Z3 ҖL=<꟥D~^z|c]'wOchE2*B;`>m)cyǦ(:tҢ{va`;G6ikEa־.u%Tlՙ9 ]e:KG6%.Wl|_3O%H-ܑI(k ]zģu]@^dIٲ,*inT#f@ºU]IQusN >| Y8j[n!dz;:ɁkKVN|̦,T]GA!|Old OkݖSSdY}w)&R -CLQ%%N#y~z ݀*ԪVjð-66Jy(hEpt4ºt4M3xIO6~ې}pC_^)2f [mKnك;;(h[l(Ll†}zL:*8oa[nfrosZZV{Xbά,_V2¤kԓ5ɂӰ{jaH):bŎYmQ]S {#h+5Ab C4lkOώn,}x(CXr7,}׊ْZt,F/uhַҸ깹D B,i3ڕbX ).iyS +T.;Y5麏9국Jźi8b̙^6)YRRکE؁g  taKL`a5B/+@tSHK.s9UnRLǡ{j޻Y,4$sxސL۵e2'K_kht`ݵmfaWkP`Dq =}uWes$M26/% M_MS)YSQٷaOCU&ҘQv{/a~PcQDߕ5Imę9|)Cjf>@MEjA׼fHPkbN2+Zq7e8e 2F- 1XuK&{jr۪+Li2zE=#%o a&\e+`pWQp5p4zDHmקZ+zJehe=.1id)5,lĢ$Ic)JdTA_Wuaz6VÊf>k*P۲ 9vT к|UU`Qe֗j>\6JD~ڃ@^W騶 }hk~xȔ4T-u J>d LJ!e,^ {.L6}-iMXuY)+sr Km,5n;ĨI 0zٲ6~ ?PmuY-Fni@rZc皁Wpveq#d?jPvrW6,(TcQ;pC@Št7ƪ*-˙h9|uC#/-ųdIr}/9$#wFΠU;dP,SDeuARzIzJYZvg^k8 ؆pmuaKb׆"jxSZIxM/Į|IAZ*0 Y(AE>t&Ufj|!6&R YƑM6dl&I;9ED2vd3 BL(װ&`^.ʚzzjS$J7Sja%`^A^"JCmQk^Vjrpk)eJ0 -L3ݚ5) y%۷hu3b~N:HuNJyGxP8]rr앭v dҪ(j_Q}cIZAz|_UJ Ԩz|M}TI~}w=-{`M=Lw ` f'*‡2с?TѤ’z3u%UP_i36teӻ .ub븷>vt+8\BS>J6tcR'a; [0cŎX)Ajs,t+ycmYP>jp kpG%js%᪶\5"eI^>cTuՄ *(OIBYWL^ zA+Lję7\D#eV]gNzg<΂Ig2zU>gY5]E4fj̿eSt>2D/[nfU=Q+0 kB}%iVlʝ+3.!D4E=↡XO} j2msӁ3(ȉVd [rȚNc˸yI4IyZMar{>מ-n**@ ؗOM` p n`>o5Yگpa~ 6pe|5}# -a V:52%–"o(fv]yrI c~fsȉepR+kCzt4zj5^'#SӌcE2*cy(:T`vVɦyi7Ԗzf 5؅]8_B 3ٻ bSy W>l=Bؿ3F*AKSgޕ֝(?SE*()=iu8 ]e)q:W=FN”x̮KL+U𶫐6PAWYeD4|{JϣmO{If`\+psB\)X1xWJʴ`.9&53mS/%7 $;gG?).j?SWa_clL1kF+4H j6(rw=QўuY} Ihc5\S-N;p/!fVa s*H+3S YOGsL/5<u伨p F\ .)Ws# Z$! cj71,J sjU-݁i#@IT'yE68RܗhpYƮ{ a]"} KR2e"{4pOKt`4?QYpo8lKU= l@S&_&S{c 6M醭5톖?=N5]ǪճqCuX=ǃӠWȺj},Cy@>Q!Y yA:1mp1ihHf/#ݸi)s=mKkQ!V"3\PWCL~ B +K#j_UpT\QMReXWq.`cR{*H .IS1߂u8Y꣋hGC;+;Iis}]n=]WV` +؄Ot@ uDr-=DuDS R~ 3EMx M Uϲ770SaY%&\_2|/4ϣ~h^R.*Rp4[_-R rpN;_ im|Xe + S\%aߑS5NTjFs"BE۬TsV81*.YyYQTW퉦 >"Y jUBc3/5hb6WhcNNeDŦQ<>fKR̶6H+9 HCQAt)\S›@I6fLuc)'jjpSWDY%-+u}܄_¡=}p[[ۚ UlkG5R֟S:LA>6<{ D`BDh$hG^aEM0 XFӺJTSUC7gt7RHSOzfQuH<ӖIb[[KOV|-xћRrgᩜ-xr E,J<7{*d|UJ #)c|k}sLaiGtO94]pn}d@f)-'7 Kځ`*x]Һc[ja-՛65$ AG0| e aHɬ^?\MpP R9M,WЌ@I)hݑw1PU,Dq=hif#}i ԉ{XBf]gpMN5ؕ36`>ftwV?%{PV ~M8 W9*芓N\/ !mˆUFv++װm%(7t}]G#2#mPt4R~UO,ݢI7P((N;(mmӖc83(PNy!K F=~rnoHn~ .|ajn[lvGh}t]<0/Zth5O`ܥv̯TW=Yׅٓ5_PMHUmrў(3bNqK_(QҊgS ~qS 1 pP2M%?:P'# za"5xSPq*.z @ : y$MZU8I&`Іǰ{a VM&՗ ϠUlhoMF/-0Rj)od 9@eWז4/uo𲲝֫eHB{J7TQ顩S 0@~]Ҕ5; !SD Er(!ou`u2J B-k U:OpK=Fl@Gg/5Ŝ>mxw s0FV6Gx(A]my%s$n ">ghwM73J22i'Fjy;pOƀ-f;%[4avP|꩖'9)U㑑G;mMUJ>hYԔy$ ç0 +\p`YrD.K\C /d*d6MlnR9..E-Þ:{pi0n`ҁ}䛰0iC^+`;QlrЅUY5*zŠóNuN*03ex۰wby IDAT ƁvZ Qma]f^*U5R Oa~ |L*;?jt=*s|+,L]0t^EdVtfR4R=yxCJ$I$?QO !RẢl@.l^r%D-Ru5Hr An¸B;MX5$س^RBY(uPTbUҺ+P"^vy3F)R1RCgZ=R][qRbBaBK?3w.*W5EkYe]m:x(nڑ†moI޿RG휀ex\!QˎVJZPJ(j+d>5-0p ~ _žZGo~YnDm۩~);O2j!ٔSSͺđ3|!a b@2ZH$CXG^@^ڑ2|.cm)8*Ep,r^A,w?kuW96 tHI&x _HdmfԃEE#(4.o* R~^a@]gzRi gխfH+BSfaRu) -]nf z;ώ,T΢} ټa9%9T|J/u}~ˊ.&5aE i˼ol 7.,YTYU%﵌]]81м(. vT\RJJ+HzPdua2fOMJ gn_^(U3LJMsEGp/@`]&lCU|VRX{x E|?pS`tȐ ;)kstVv]^)IFiВ>QpdS[ x3jiyk_ZX *U$s[é 6\SKҞl۰,bQȢd jfɊ U;FMzI zJYuU8YW(#QvNVS mY DסQLڹ>+` /!go;d9ߠҰ̥m6mUJn9}QuDmsG%:@׮wR:ȧJ5ԵoJAY}y[oǰ;ꉂ3+ҡ.-H)"GwHYxsDXrSSSxTT Nw:*CL\qS=ì4UQl@&mDA"ܗA5T^|S&P,Җ44C6zS sѹt6pm; 3,K` K650Kʘ.P!W]IH%zᔟƑgPp?)I3 L7#v֣S i:t7q)*:SUREĨ|Y\uy !:?ZÍUc`^BQ/km_k 5F%DepZIh}+'jSee'(OO*= yT/{V>h6լ5gq܆ n jO-]NK5a[YB4m@i\:,,0LOF;'yш42V.uBU9܀amX.:`L;i%ؽ\TCh`[{:ojSJl蚦Q #2\TeaOjv L ~xfDAq֠/ӹUKU}ĢJ '!CKJֲ:nǮػ:A(o_3Yf=pd7j2 o_bH.Q)5vDYN{ '9ol)Ul룏/gILeM;QMj4kt_s&.L;~'40E7jςzFydM~‹nn қPeX8LfYZoӦ:K(wώ`_ҶGvd+")%m{WcsDLR>a!BfqAh&wdD9LށsPP af`vUR2ў] 7~e~s/& y]?%ߢ 8@\*-HXyOPHˢO1)Št<'be_z>e 3n棖Kbefi-l$yؼ}nyy~Y*c <:S4A+^ g|&۲OF+12GTuS ۰۰}`V[~L ΄Ɨf_bm[d]x af.DOve1mJf$hDD6|id=5X35l&v-=p` rL^wa0rx!'!OTGՎ-IC߫QvVa>ksB}X=Sת*,A]yIT D㶡M!8+adkt[J &uSW~RUu0}ƹ-SC"Mղ`)ɒܧ:>1g.fGh5%E{5g~ :+x8Ӵk6؆seEmkc#ܮ,&ԬzsEyV8Ť8U"M\R݆"A߄ ܼY|{aBywݭ1[Mwtvfƈs[ f@xLK2~wY`Yb!Nm+{UZ҈sYKF_XK䴦bO'ǭ4^:=T]\EK( /S`,A ϻRYBE_s6lX0h4nj'~ p 8kMە"\t0 % ȫpK:| 3Qk8feQr:Cs)D0dDRKAW290_Κw2t)m(EwB*;I(5LGhl^v(wĭ}!̡f.4 C %XAd$3f{#Ӌ<şf{sdE{z;:ۃ0 O`^.-Xg)&}#X="/IhݲIɷ$Tɬ5-eM(wVǦESU%p8;"n=:p& cn%h ^&:-,Ȯ0ύRE_"<xp&ayWaɽp_Z Q"l(<8f`({_؄ oA_i*^('Y{tD[j̤ayI] ޘ'%YXKf}j Z@ϰ3b/O7ւZut)4nb& eM9W8Cu~Qr_q?u֬!&{m%=KfDM!+Q,*HL0"-yTDRTrdr Uz aHn93]|1pW,莴 kE ``Y~_u؃A )?E -XW_@ ~a vcfgxh,W`^"lBC^!,3r.\#?0>׷XpxLʁZ]%i9"\em.YZPg4SA l9 t];XvkQtӡ'EK"=^|C]Kׁ,0pA%sݼRc/F1XMh܂#˚U`]Z oUYw$5bV "EU_g,P)=IW]#flzWX m%C0%4Hԥ|xq#6aK)z&jAc cǙ-)f ',`{3:{x O`Ngn0 w_wS) #țt9K0P6*ϝ n KWj: ERpdx< Z&g> z,äfatm8q4?.M#!~j!iYw T` nJ j>U"V&WSIsde([{muF(2!*VU81$far+QEu%cc5}N2k-ꭚq7s6}+8uMG(xdtzjmYYq<$Yx`oGhV~?ܧ_$"* _N.SƵn7UצݻQ[CvЧ9\/ aaa"m>s9<%ΰAx8#D!x|p̺1Q_I/n.\d,AbQޗt2kѯ{eZ2( IDATC&aBh~ܰ^zz.t5 l}tmCUu92&e21:!V[_BF( -_cirv>8Zrj8+pͨ~=V<[0m,c #Yyw[]h[f@x[WuF)ٮKMnuݖGXKɃԥ+碑_YSV'^@8uğDd MӑIaCB\ ɬ}H[ 0 s^s܀V]Va{Z'U>0K9pC]Ly?"/qdj&(;6*;ߚ7i#ڐ8f°)m^YІa]u憴{vaJbS"EdŤ3{SePwG؆ -R? TAWTZ\}xE6%.\o\&\nzh9/{<'5A24Y`qX됃1؄p=UڙUaUl y D*gRzН,2sF.Cfv5Lyxb^NrVaJtU*?wϔLG 1HRrGt(xE[ /}#T9e3 ͤĂM Qa|0_?"|O0}s^u-Z/ZMZIֶsofӜFi"`H;6e(2qa(N;3ɀBR;k&97U/ۭ~M3^e_ M˻c*u[fMs{pЂw(ЎF9u =ߓd/}3՗P'pB9%4ͤA؞]efpũ9X1stXDm"/Kv Yw*+jؼ͹'BJ>ڡ 9` 'p atb}3iwaԀmJaUJd2s+Լ s}zckFGƢZ c+j\{n^ge~Eo~Y \ja,F 1s)#+FNr\rKPs[\sW^E]&j~ߑZ6- X BS8zqYwT/JqAXĭ w8HIڼƁeI.EфA} Gs ݲ .9i*܀G0 X~ i>eSeC܇p^|˻` (kJ{:lC9kW::4CpjHV/q9H(KV_GyUEVfդ$ Z"֙p;U==اK$1\m'xi0к,j-ۆ\EC.%[r/ XT"#Va'euD@YZQoN~3ӕi'pniuО-:Ml[v%+vҏDӪګ_ܾ[ U)]= H~iFv`OD'Tš-97*U@0 h85RṞ5߇@(:#*cUԋpM̙ʌSdOMI K^jUa{tU<LH{CEaP؎S%=†<۬PVrzo$|?*C#b= oXM.BqĩquJ-V% )3{x>H82'<`w&oIR >5XUpwL̒۱Y_J1-Y&Wȱ쓲]FS * 3 e_a?umq'0=`Vж? 7{ô_AʍxW 89 c7\(~n%*Ijxk:k)޺vF>17rF7am`D{& Ģ_wՓXXՄ7a4&kAEѥ5]\jt֗wm% I<6az0sq (@/;nL\0 @FIML342a>f´`W$GpI&Nʺn0s Wd͔#a 2XW8s*£PX?%bbi `e(XJdJk*N`e)G2)؃!cpD'{],6 {𧰐LxGJFӏ5"E!\roPф|0Y5L.G:\_gFW3ֻ_?s Sp wJ^_ߊ7:6a5aS-aJ?g\&Qe,qv셳*#d"Ik`+ ^i]$'pYý"ێ+Oe7d8%97:}l9&aԄcD\QUi.j  ܄@a|Pu0aUcg,&X9-G<B6{%Ki-Ic2•{VJ{t4dnX,$yX02IXxO-!9\Q1`H8cCؿ[zpOڋ o )G#]1O&sṌُ\TD3*|!YfUޡUIxJsP`&`JL`!ap1ܺ(\6 `]IbKv8>-uoZ \ʧo,Pd$' vY%.vxmޖg{ט&TSuPȋ6|-vw8% gl&KKS}x jp8z"cdT}^uav)6;N)ݮ#49$0eu}ms Wсa 6]6$$y^0sp!\TQ1ga~ptZ%a%wu?8: ppװ7ޗ\jyܴPsQ5j(Ί̦0ss4^۱I_K?ao}oNˮc? x-̖Y^pz6oC%Irڒ#no;}L6 d,T_Jq7O߭n_(Օ+ڱâPR-S}f!"VxlGJˌy Ru8AGI>9CP ctboHxtTPz}o۰'!NdQ: e&M!D=oP|%CHܷ>kBDe"$xqOi=胨:陊G:cMjG#W\{|ڙ!Lݖu'V]` [pz!\v?NO4; 4ǰc(L;80&<_J#|0alU:h^͉|,s([q %W|'uoaacx*ps+0'tݞ⫟o@(X9ea ܧ5=˽" =SvbuV5֚}USt;CEy<gv3߽< P'c ТE%_O8, |>9w% s 4*' R]iLA߇jV5cN_jׯ]jL*O[s=R;X~[^{="('R'"o˱ 2lk~1`\R * 2 7LJb9 U ٧PQZ2+ ;%8wzEpJۼTR3cԝq"vaWybK78G'ҀC87=pUƈ;yd$h}`=Z ;lǯ,| %n’֏aws*|; ={ s0{p)'Ԅ$y}_ pf?iqBukZxW~:+RU}%:ýdyoWOϒ_df݆f"+ؘ/Ja+aD RovW'BNAqdIVk'-h(r!Huc9%̎ aI+Pw.yx=]7+^@WX}]ՀHΌ:Yx'b˹6b>I*H=mt): )_3}ehF'F軿7a/Z@\,57c ⿇> Cv@b\q۪+ 5?YX!cc!3zɏ#Z&#K/x&K?ImH,F͊ev uKN+ l//%J3j.S_87#^N^Œcj:c]&5m5HL̙bǜbBוnTֿ3Rp5 |^W<ץ-јNi2Khl9Q$HcRWz*d}GҰ-e"04ǵگ>aV`aњ1(@VչwOkјO en}%pJ{ҋn+0bhQG0$)ffa\1/`n)S^K*4t;dd=G=11tYّmYC/-x 0Xr+*p6s}PE/#,-Pǚ\9+|;-{Y%d>ِD/LkJN#K791=`0ٟh?`Oq^v\΢c(pKjiE*PiQ _{3(y ;0 _%K9€mG4R< 4BlW {"dӸ=ºѢ|/OF[4 ]S֕DUנ6#Si՝* aNNi|jXgKpUNa`JdE"k J qDy+48Y&&  1 oʪG줨k~ 5ǥ > E7 It 㛴*5+H{e8yWmVhNح;C˔e3tkXLK,ΰ^ýO9/53P49;Y*赽[jBTnU8rI_W,qgUG4`%mB7|f_I>-O;FE`ܑRO4vނ#? _+CabVIF|=SxΎn(|1E$c(ben/9 l˥ivv+Fy[Eh; A%焗|BփȦ.QxmyhmD?&/7-ֶen~yf;Bۂe`U['B/0K$ w93(I]^_BPp?l2?6O$df-a pk 7i9<%nXU` '@k> 4[?ty0eطϫX.i*B.Ҷ_A&-'qnWvDJm*6VKnC!BUi0-JUҴ\USGwH7u#axYүhK ?ixOZXrMJ3_HGԐŕY bIrhQb뀔_Zr'ST4ŒΉl:%xFm+0( CwR` u?` rԣ!_b.3Ƨ)6O[/UaFr(wN:J#d,wt爢b~ 8o0܅[zysZA/a`m5 IDAT]usPQ603YV=ϩpqqdzޖMlT^7V@ *"X#P%+A;?eCPq0=}wHwCs&E}K^[W$3OFad8Xb3#,Z$609QQGVSCFaH1|6nC^/A؀0 iv}{o'01ЁІ2:V`p1U?`Y \urP7/8ʓ-KІ~:pUn 4`Z'*O`r0Yra WoZ. g¿UCKQ\| 0g쪉k3  >74m&Y1Rj'vTv/E:W޳h1DT6_;C7l6-K *hpIorZ6mk}"ߡj񔊰L9MtZQ2ffGbp"֙Ljd:V}sKc@3U_njLk:d#_:X+6J߂lY›' /oGs\#TSOUUl~A 46I=WV(vnx!ߴ{͋~|^MhGLՕ \ue-ƴuZפO$aބ%܅>chH,"T)W1fL5Q:ؐ9g@NJVπ@o OTNEbbrU%~Ǵ S2*?否LrThp'+ S0 p6ÁEsgcSdw[g" r^m.m e4jZ !L9sW^L;;-[>.!v@J0c+)EMn5sva"e]j+q.9mCvhYӫ󎩊Pp{c:Ntc62lxa姄fdR% ^آ(l+KsˊHʹXu!MGQ*B>Z(U7|]PQx1EKi*XJ llSbNƒ/݊]N1-H+[0-a7 #ơa(j=S]%qYƇۭfiWUXƶJ!`;;p81,[籤9A mðӚ?^! Q>!{mlUs7ņI]w.Z-(k K^ x Z> . ;.La.Ód`9j>] '{?GN'i&zȡv.:-JJ0gG] s#uo_`]- Id>iS M<:vuǶB쵴$9V&HrA\:` _Ĕ2};C+mA6 |eԯhSk,QŽۈ5ʪ?m(-ǧ$De0K0I͔7eX_;7_nђtHMXaBYz 1aUbIMj>LBٹ pZa?b0EԬ9wp\+f'2 +|ky8ZƓٓQ~lB2aO4Kwa1Br2^+R5`gDnkp=)6Luu%@lJM%wqզ6k&[mK.ߊ8M6 Sqh@kb=v0ŀ,l''d6w01"9/ZZ97:\:1C˂ر@$ֵ䖂&?PMhwaFU6^53ed?|b$W6=nX9uVmt`Cw`gDn leۉ;7uK5ptz{::)g0jSp8x7`_F;5+]dT*T>wN( n[=xfR} ux &4}eMabS<HM؁. ú,lدچihi0lشb43ԥB?3 Wi͗duȻ0+9HzM;s@;޹K.31/ȇ9k!u(o~Um0`u5zT Cpzf?+0#3WJ#x SL&ddd[-r@[!KCq`>{դ:(&g{ І>877p]{-ΰ,I>ϒ" .CIg.c8!uEU `Gp`NݗT¿'*WGԿQ;[f9.Æ6^ݕoivwn#=oH|Wc~@`⍂1Y -F}xƒ`xH^ ;M4]AhC r&eo8z Q0Q"ܒ$^K4ѶXq{Rbx`~V\;K'ڈ%p;P- ƒb ~؇KЯ/,2\UUOhEܠj &ĺ sp6}ǿ2j*@b`>܆~ zQ 5mK9`"yu sF\8_55k9/em-Qf1E8KI*bGGhO}Wo{kE_cǧZ1u*ouS%k$#5 E g 0΂M6;@FsW|~Ȋ¬4<,gUV=| 8&bې~0uSb/ er=df;m.`>oQ\e6v,~$<<le_tfD46]:l#G0` :dM"x̙Pqb8,~U7<0;E?QR&gyݓ:}%5?(0Wy$zns.G5aVK= =Ҳ۳XAno) KȞ&܅){ ]Q[ҖMxa(#]a͹aҦr ܆7lqC}Ɇ{;6`ظt;Ԝt0Xe626}zKyVA,^늅pKNPIo{b&lJ3׏8q(ϡ` Rt|cvyt_`Z.T5aUZr{Nb2턪Mm=b&[E*? ?}\nXx"\NNi E ck> /xc8u]KgP߇ᲗOϤGUz5AbpqˎPvOLafoj:k?&q}|sdua'?äH]״&%mWal^P\pQE( gJ^Vm>5鶃-W5 Q5itӈt@l5$e0KNn}߿[1(x:\DzG聏U KvdZ0aՊg)17L8ou~ؖI"AOpKSuh8p:wNiI%[9d bЂ>%ڄƏ^/m26U8ꆚ-ViEu~K0 cT]jP>;l-s鐐 {Ք8f;r0!<&<.UgIqv֤ccq:p.uÜ`A`$Db5~.G}S&H'iv~IkUoZ0 yu +V 7uBÿ́/sgŷ(g 4-ȵuw| aq%hSĻIࢯf;c0_PvQT?\++~]ՑYM%9/cݽwI ' %Ci/L-1<2 .@Wf<16׎2läiAs'0̾La31zy]{*(ØpZ|qi2/"g9[u &',ºo1 t4XMHk<܄"j a*_kp1EMPf2$c[uh0툈^hN=>8J&{v[_cLG2Ak, >D0z0WEai ZMjW6M8^m6y"=: 1D v(B nWȸ9˱r[@ 3Ua6~&41Ehnc.gx”Q93dռ %idw9 uMyvk# v|Sj@\U9^OxuW&zKhN I`|U 肏+vb*LSele*FbIۦ]vܯ|"Ea^`3NUY2DZ;8/{p%L#]@ h5|ʰB')-bh@JBN#)D/}B_Vݱ>d">^V޽]{0 GǷe4bPe= wT:~3VC}06 Ewq zVFܞY0*XPvKmIczXm/V'6Ңo7 +Jk  p(4"~O<['js];Vi˧Zq*35X6K2 Yʟp{Vm\U~*W$ S{(~oU(x+ڨzod ;{6ohL$&rblhjVra!Ih.x_h֜ otPCAh*<Ъq[sŒ N)ˍ_NwJ2)2*ZJx=}+2ڍV1 +p`38{^pC 9,(*_Rj'戗DFGf`N?m[MsD.eNYCh" F , IDAT,&gaQˋխxYW໐NL $b嵷h^1䝔^)ne_# n|RurWSI_#KJ&SSBI3vՖK[aIzYqĿt??d鶤,p6uחf` "\ fXDueLdqp߶o.h6i[`ۇ&G=B}Ѯ|[k@*\hQ[BxW'Ȟ%fè^ wa`Q54MpK?uX3(9T%nCY6[zӡ!$؀Y'%Wocd5>x=?AZdZ喫trʘw`΍:%֤ ׍aplcmf~ BQ]/RiӴ*wN*ezo†c'u]h?j֏7jBІ45Lcl´h'0:u" LڄL,pI5E6rzֻHf{f-!SAǒ?+f1+C6huk藳p.#ҁE%1?_[7uj27CԈ5E0x / 1,z@.)%$g=аUXU}+ sV];0.}$@^0U}9ի"5/rk0[6^` hM5ᎶE }+ QQa7uh#<-xT+av *ݺE؅Ox[d 뷾}9\HW4B껛J4ma~W?n^O/XEXxaZ=(K0|+X:*&7dD/aZpʌ'1T5MKhnl*W0LNP ?)4Xx=+`M0Gfz%KNc[&W:-ЎHYaFjRfa_o)::@]Y/| pᑮMwJLje:T)v`BG, *8/}-9 +*){^43\Ƣ +j!:NۢFS_$-*uIL)^}2< ,鮡Sv0DY)PD?huXJ(?gpO@4VT= Ï{fyY!!ކ;͒ZMExNat@ r_G唗CX~mX<[v6/z$<8)'l 档!\ӯnǔt6ϡ)?5[{a(OC "QЏh4싞^L͞ۑRt '6L׫^a|jx {1 qH4əWS^E:VuҴ%VEESzW/l2N knn$dͶ>]*JZCܳ2zCr`.a3g,BA(R7|\g,** OgpUC-t8v.0O oâ'r[-7gN1@pOӄhjO!oݑS3&PFlñ h`[6W#MH"m2[ l%MzKt` }hW{8丏٩0Žp§to^^W - "c_C]E؀S״  jc!LgBH }jLPڳ=7-"|YYo_f⺩2aDC*ݠ$4#81k }P^@ [VPKE %ʆh_.\:A6r})b)V<{-hO?axh8u MMya!K3M#n- sii`K(dMŃ}EM1Ic}znb'5J&rNY  v*F)JWY|[pӳ{J)\Sۅ}vfZW$畸bcTxbRfSK X6R~iu6g~]M(=# Z3y"+7;(0P סֵV,ؗ[Ǻ\S1fܪɟLd{0jng4c 2S,Qj6U5]k9*jOm:d߹AiIvB! q6a`C6Nme!2I5h( ecd#%GD9׃PU!؆ie=%nx÷<[g?Kg,ZbNkpw_pa#(:`dEk _g00> 4hU@t, /a &<ԼMBϳm}3oƜtscK]׷q討98x  Q\߁J2ںp`_8 _ɦbn;f=vUcvh|7 alw- yU]M w9,$6SC[GIbU[pg )>a_']W[垌ͪ`íc#g݁%k돍-sެ+Փ S1=R&gM%>e< U!.o`*fD3[@HwLb*1C>"R&vBY|~`܁ !Bjުwc jt cpLp~!T9_d[ OT`Lݾ-$v)'Dv4]:tmCE{YiZֶiv~mĥp&|-X'^~+p ~.}E3_>–M"`>[1ǽ$ Rt*hTQk[µdf 3)> #䶡SiT7(hGAȩVOU6 s܀G|[.[I\wmF@ `D*Aʮli 8 pWBtѸUUש waz wx5.nݻ&Іyk ׼(Уa xN:2̚f=_!Z*^n%Epn0o  I}}T\͎eP^N\,}r]]>Ȓ-J>TzsUMyt\1͚_ݓ$@Z2bQ%o-7$#c˺H#?>Id?(gʌٮlt9(TPlm spt`W4|S+fٵO8XtEZqNp:JFd]i cA&MX)la uxU ;q"݅I-6[wm g6; _j"3@k Pv ߆,l}sG=xpay-O0Ǎ\_ zl?=/sx 00 +0\BC(OHəBwdCp`W%K~75[fR)kQ- Ao~ˡN= qa}vGk7muzYIVęTSp۶s[[tbh\2 +n}k𷺊) B/E݇k7eWwpCP-P}M+PF3^C^:? +?5~Fp :.ïpGUYZф3a1%cD  (\2n:OF/4ȏ=5MȪ߸$oT-]O/(5$xaFaS.m[wF:g=)"[:cҊZH#u)Bm=tOj:XR2pC&a7]&$^c`)?7yŒbaLpG[pZޚݖ%1TW9\ .[s0eKjI0lB. ϼOaFUUXMkIvA%gӋ/ ߶oѐh[U'(t ̩sOa--֚u6a.A@˗;‚kkp  Uyfd<[⚰„'r 6`Fv0ԙ5]K$=;A)8>Ԉ g"4bD0+$ ΢:.9b79q)BvMۂl:7kf%a15-犃/I Rb݇#)70aV&_W2 Mgz%-' &h]XoߎަV CŽ},B㠷~#!v!u_tD%W5H]@# 2H;L\@QƦ  1lshÞ:n *g l²t䨳/6 < h/[ބP+p꠆AӬ% S;e E'5TzsF+?S9ӄ1䈢I--"⬈@vGǖaNt8H u8bK{2=J!E0 ϴmwJ0 ]svhsu {`O߀?y~Lle2*qWٮEa.rL/Ift:s:f&WL-bI[Wd?YN}^ZMb@W.]Iϭz;-R-/|ly|0?#XPS1&N<pQ Nm sF lډ sJ5q  b{8Y o^ 5 +ٌu Eg4k 64*ugZMjEs3ÌPZ5㨅(*[!S!aN=_U綆HS&8 iS~ ǰmXp5J1_}fub1 Xcku[۰m g:&v׫^c0hp=p YXUVbZE<9 )zQ!5ec&|܉l`LBK^Ro|wm+JYWRW[BwŽ6ΡO4a UIW`KKƖ~3 ^;/ffP<uSҶư)܃oB~߆CW`p|_?9\΅#Voa[S+XMfaNl3 !Nlt;nCބF=˻99ue_3?9 E򃶦aB}QW.ϰF#)g\H4s3.\8:0 'aR{_5#;L{pUqI2YU]'ʥA!<ZB6{La;V8X}؅p|\z8˸L n9'nI*#+.ŚuDתFo ކ?*{|5;Fj 74=gU"m81R)}0 7ܛ38V•3ك߇8yYmS>iN;Ph&a"r]I36HMaБ|j8KR0ЦcKsW/]>_˫kt5J_R+\y5Ա`MxWp>ˎHhTVazw!Xĥ\ˣHZ IDAT=/BɡJIAxEk` ѕ)s%ʱYڀ0`؃&\P\Hw_^Z҂x%)5t2amS8lkj/aͶe(L}؁rF|ic`F߀gÁ$\;ض^+^^=>Uo=iͮI?UFʓ,TT8lHlM^yjg,_-op}EoC "-$vءXVS8HVϛRE~n@l08#g>w)o{L= ]ǚ6fAc:w\]Mάi,);1m.@Mi`M!]О|EGwXI mq9[t`f($S㖾hnh iIYG;.C 2v$:Q3>5GpaQyX0?#)s*hE,3X:˩S6`)DϦg8070󲬒ҠOYOHl̊|\ɹyY*W%M.kw p"~!@iȷ}Q;eAOĹc@8UM*N?wݗ(k/'Nʝr%"ȥʗȜ7=CɊHc(`ִRPW>m: P6n04a"u@nl! qEյ {0.-e#(U5ڞKwaןE@=b`CL@ ŃVk X6m@ EOLrs++ڇ߇Gp6-l\lЂYGЁQX7iwod m8i S^.;XWguDC]sQ(m /lj\I84aGm,i {öw[0eXCxb -bK%U]3DW?sl) ]U*yDf}aO5 r͔ LV"?6d ŞԬ}\cV4Lx_2sco̶pK'\K!Җ/lD#e:K0eCJ؆+=+?b_"x ӫl]uvO"3n̸` 5BNOΊV xəyO*}0[0 *8 r?l!LݯXk̞Hg?e@w, Fx݁90 =ᴎ>4#(0dxwrˆv 0w+OkYCՒ_šK'M'SQ'dϚ  SI`hXB7K eq*(L%"B+E+jcM:/}y񛩯أ՛K8 7s!h ;0HY`@[*Dz%n^w@ĿbO*7d0&jk;TMǶܟ[uF0FڅiﺞMm(Z/`-.EԔdw =omֱ. V%xZlbĉv2 .S8VdiF! ix9 7%%j5=~w0x_k'U/ŸgF߳6}F jĕN N_D1Pb=bBʉ;cHGrJ\2A6@E}dNl+J %>mKt8maԴ ,M3!~5L sQpP|x_JMTs,8b۳D>ȸ~45+bXK&pt_('t!r0 )mSiH~4wDt;{ 7vR1o55Fw4w4:/_/㲍t قq(/ANKhB 2X6`.& Angqmnju>x6=:_G/q5mIWcό4܃c4aicj&=VWr0d:h_l͉-ZDؾ ]KxgSEekْ\D"bs~.g_,_T'.GTm{mMx37`$˅CKqF]S.(( *Osm{!/yAƒqKyؖG=_[DCZ7pgiRSsn")I'.nD#zOaw`eu~oh|PO(O!G00iaeu X'Ĺ Ű(*| ̪:Q b :ywa|9``k~dk7Tu6#Ru} EEޅ )-9kKY%}v멶/>-u^OΨKT 1R*gMpX&w^DLsfZseL'ret$Ҹq.ռ\PL״#S_WLą{ Sպ}ԶT8p\ﴳL8 Mt]Yzf`f`JLP߾X*hxjJ'19ƶfBn[>eOt~/S(}ЛRنqc55tĝҰÇNIM?l{Ѥ=*|˲iZ2Cma¼Y{0>+P?N):{f&aa\Y V` ]NץܪWG=)ǚJyEWp`~BџP&ɐ )>_T+)QoK\g\E%iTɀ sJ^!E5C*:7 /n6s[&s>/": ?i&\#=İ7 " j)#vG.#J-$fOpUy@-g,zzB0*p|Spf]:e֜U6jndjiw$+ Pw& Bʀ-4/A}qbQN }pe^{Z9{6`n.\"4xÄ!JP*/2; VԺza xjeWuVaV1CkյD*. Ri29i`%$璑KQsoˮg|ꓫğ#/~@0Tcʩ;myz9X2n3>x&j<8V0*QsZ $O:g#6S(:pnՀ1Ug$܁)|CQybi; ߀#3iDt`W[WڔVDsA.[|74d T*o ϛ.Ra)7t {0#Y&r0r4|&ׯi>=Ne+蘆 "[ -&=hl[ >|{y>ӯJd{ sbKMK*R֜b\oƠkhI8-{ YoT[U2V[bl'͸gRwSA,͊~oȞpD5b`̉VtQuī ؜ l$k-JځozFjP}P&9힍@aF&| n #9Ka:̺5`!A0mvqM捝t]4 D& ]u ރiIc&tƚkTBPtPv֯T?lv*5e$)5YԈ~K6|I౩ ẽӐޗ3&'aE5a[ DvrS"Rs+«rḛ%oe?Kx 4=mϢ ,OW%&SSΆۦl|-(*jT ʘWsl# #:7#V_/FzDBG#xn!q>lnv#~5 4Xj}?qX8eq;> u_֊-NU0kg0e(*]nM4 ILj/Ui=eH ~=5͐> kl }dש #2|ʶw )S-;E۰EϣJ.ρ]F@J`̈́A=ڦg=Y6 P_/}J_6[pnת % jmB>rh̤s R+ސ5;>b4'*h3lJpv޸ nS#qSrymuPH֡l"bHsPEϓaT]E4܁*))-ٵ !:.B' _ ӆ..A~ ] 9ߦ/EUᗲ]85=9uo)')!N,c{m<Òz+]!ɡUI/J<5O8RƮik-qF tS4}|W+T}Iz]5})Ӹ6]^/|/&-;eU pUH᷌; q臎5F%j]6 ws_2ba ˓i"M4QU`zQEBӲW)؇ Q dNl)-m!CL/ I%#q&ypu& C/U:TUuj)z %?ew! K aǖuu][u3UhL PO <Б7^sSĴ8"AlN1\rL:Lj=(WsfD"h]sUo9 ӑĶl\s.)0 Of{R 2K jpz\*Lh3R懝S_UAlUM!L9x$6<"WC_Ee[r|˛PͨeU2E8ix%Wi%Jt2<[1EXfeuM-o :hDDJ1} ^+ +#+є#p\jEIhOQ޳&1C 5x*%-ߢʪ=Tߵh0ogY$Fֹr!q;0^*fDyV/]pRfn="Qǰ>_pW >W`O)+xv}(Ů?9,*iހ|p_RFX`43Vd6ELV&EBTUشMQKE*@ѢÆ>w{}_IِS!*V=ߌrA_!-;&1#@I)U9У)q!^ Juv|?dg/€BG}XP>a23| DdCV)s zf!\W`QWqMü@~F \<҃9[L,^ ՠYU5Q.ӐaV>)2p},OuP)]6 ǂDq@}:fr_۞%x{dk2:̛l:w~V58rנߴth+)Ydb_bDXmcUC)z׌Fa[ҵM!e-RYMS %זMݐމE׶LoVķ[9:{YBCV߇߃lCߟI9ݡ_U?B iC2=a/l[-䶔R"FvJ<^L1Eҷ|C$qCÇoH-x'E)Sh tߦn0-j+3~m[B֠=a>dv9S m +Ai &ΟEX]!`>svD/X $T5cm꺔"J1$ʟIp[t_7,qs`#e ,O7awa ZkE[Մtm?\M9DUT%c XW3a9yI;'ViZ2JG邖0'"-w~Π[{z ѲöVC{Ga|2Tc' 5Kr߄#,pӠ&&>wB8W OE +pSS9Y-r|g ly7K8F{+ڴg2`3M%@*aLhAkh{&?2M \-:𶡴 Ϻ^Agpm51L؈\ WTWᡖ4GPlJ&>+"mZNi0j2fU`Ǭs`M2/Y̤/φaw||-gی5a¦uX+cˢafO2UZ͟IwH5-:[2\FSeMO{&9)Ltdӄ}\ܬUl椡x~+% ?9E%Ai+88h &|Vُ=2O V5ӌ ^kwpHN; Àt. <a.±3(# z IDATsJ> x-&eC&["m1C'ƄlRbfSnsjѼH) =N ~ 'ޖDX`zE+S=o#b)eXvRtd^ÛsEaO]<)M8,hYRmgzj`틢`1r LTmIx騬LdB eF9x/EG ڶl]FyA6 {Ep : ^ȦbQ9Q3˩f>| Ì& 3ƴ>,'p >trlb[P8Hcے%'ec?o#/XcXUxC ix PCإ-o3 R@sՌb+ev̀{ [M"C!c57P G0}#ڋ[; eu߇=i[Cp6!G$%-y@X hZaހuO,,[foSi TT{Wt׻n5֠_0Ln(xE$()-g a6hmZS YM"//d9#=iuϜbN}U#J`SJam< )m//EmPĹ y(8V-͎{U[UYGDu eC՗vc@mi㱴\ ux0G}9K0z8U]P5ܤ<|mObar&Cނ}(4iV|hpF2Fk>טY]!~a}wǻkMʀJA>݀Ip$^01( .(^@nҼә[q@`)V]$"> JJC 9.SQS0 ]8MQOKbM|N4og>͹ۏgdhL0}5qXd'~lUH _Ik%*lF;'`5\)Bd?d0w]vtb[HUUyVv9X}#@o]ESʌr :/+:јq:Wh-QglLj_|! +R36W}x꼅-Si?@4rzI;0ÁFnYӻx ÊpsސE+)( |'Lg"ˋ0ﶶ5EصVs\ ˎ=ҼB i*t'};0YC7>JPY[KvX-AƧ8xUv]>xrfo4+z葫V2q6 ?LՃnߦrɤk~]svZQD+ N)+,LVP4C6.z^~T=QjsmL.(OkuOf-mk^T 92h*S+;9qRܭ5_܇?'2dQ1v Si#q pvv-ߢ9~u1/pv (l@:IY. `6-0{.;κT&3*E6S؇8agKCY}QF}胛5 ACӂSx pg~ʳ|ɑ9SDJT{:L;1 '̀ܙӡZ%9sx>fIh`Kyx{M F35X!,@ 3cu⛊_/4i.<57Wˉi|*4Ho]c\SܣxTU xCkݞ]I?'uK3 logLpTw?Z;PjyŜߊ/<6)м`:s@ԹfTS8%*:>PaXÑ g0{>| (Xf1d#qc0Gp8Ӏ`NJ>mXWRs枖ZJ.aSZBva*n ܦ, _+>̹%~aR=ç"->=Ø0]dPúYmC 4Fl,yxjo&`;v4ND#7*6NUXz>Uk)?IQdt`zr #a!yOݩ;|R4\)u`6Ŭaf` j>Rq(lF{ET)*} vK5֜u%7t GGYe#˰"XRhqUnlYj؄ቬV,dU9[ی#߄^l;;5Iym8,b ^HOokS,3\u ܘMLw ńo.Xp1x. Źjh><#F&5@or~o%Rߚ`@5n_k`ى(gٰ&gg1ʲ/Hպ>YPvɯbSFq5$~SޡF6Xu]7$3p"r.jt4#PaNH37drcay^DF2x;eR2¶B2j'5p>,H`EKU'3]hQq-'cs5PQvELB)}+p׏GίFımt)6N.LΔ$Mtt+E]X2W:$=.U7>܇I=QO5=Ԧ55nͨ ށ>‡1| CNQ5;kFl#:h˨YU[I,VoSY - ;U6oʁ7h-OJf_IOͩB H\Zj-!sC|*Mf:q@u@_%ⲆkȧL#.>60v^}؆ps"q,u؊ZxS׫-R7umhZP78-mZ.3?aa9G=3R)ל]4)B+uKQ[c;Ύ>0 x+VSyT୻m8b^s+YaAļqi깇e^CԂsrC@ᇎax oCNnuۀ{RɺCh0; oi֧5/Ts؁ N Y ؁YuxpagЃ4F5nJ̛{ Yx`߃98IZIMr+O o΁uUu̺UlnYN^4s%Mݦ5D댅|*_&gXl޵sS}y ~U=-}ɕS_O}'%_v`r0mU?;pvڎ;ޖiW r am"=Pp*6lVXNn >#x#9G޴4D Lac =tsc2{9tuZswgtVSh-Z;2U?,pӆU s Sͽ5w5IĞVBfzAf3S\q)܀z57d '8H1d +8)u}ۢi[aNcدPFOK8Ussx1e{ [my0J\bb|ӆU-+x YUԳg)GѦhvp`&R&?:g v|mXp̮+w.M!:Yp{hgVHnZ92:&Eub[bD5"ҁ-|`y1쫣@\-x֞8ty mCY}YgzڶuPtt'aE+L**bo0wGpfd(U]0 _,B۠𜿲=EK~~G6w`MD5xre#| B ޷Eʚ g[t1Fe/N*0o@?: x&MQ!+\Wج/Oљ;*M}1 .{sդL@ ; ۖ*/ێk6zP{nԛv&L1 x;fVdTBWaʘQP@FbH`5{`E^ FNȩل09؂mS/" m:waV|+G9< ^$aӟnނЋ^]kՀ6`>rIAm@TpeF wD\9OTfeCKV|$t-><|Oꎔ7"Lϊ4-$52g=Vq(Zv4+⽑? ǰf\EGy И8fo۠o3L"L ~ǘJby !Z8a n% a75E;;kk09ɬ.NŠ>‚Cժ]qd9}~.0# }u x;Jm4V-Bк+U5w~垏Q=4yxHuhc0%cğm&qZ: ~_B ;dI荫y/qϤ߅OόA`v&),E6O9{vQ !ǾG-QSfOG]8J9ܢQ۰'r-S]Vj݅][𿫀zKUGZ8 (5^LℍZI`־kBfV xo{6]^qpY++ksćiNu {6! ؂e ;&PerV`߃0h`GsE7ҫ y )]1 %|MŔ^j;(¢Sn,YBν v%GN뛓_G^^41Qyn/wdZ1)*R`K"4ʚWTDC^^BJλS5jgcU.nE$~r"t>~ֱ X| 03x^h5{y >w^B6STsPh‡0 f7 5x8`_'0"hsۨ#"D$S_U <`0 ukU9pɼXHIX\. - i=gp24J.nMwaYkZq1sīIxm`GSocPO`ނװ/&sZ]\uE") SV!*ؗHY96bGCg_fg-9XZT oG ݰ,'"z4n–+I v ZFCzWmb+ye' \7a*Ƕ]ڊUa48k g_PqP+UL0EDWůlQsaԛ>vg 4L 0-exXjc \AųTR x` LAV'4ArdsmbIphVmRxO $^xbEԊ +p[@^Mi`u|7]|S5.LK;Pt .at7ww0 p~&? IDAT\N F>IeRьW6E 3iR, ?,ʺ8t|vx9x588й\)+Ґ d" =ɥX :.XZغBfb =mx!:7Gu.xj2^9v L|ҹ6$jZx$!0xab弄`]K}o#6>\"!8R"g"Mt,zh]s=9#)Xp&S3G +#,79&k"['7Yw|}`aM VŸ| GaC{<..0v6c(bvGC ư[#-Pϸ&41N.U~9wju1ȌaC)F%(ݐ ؂`ۆ 4ORU$/ F!gLAd[6*YKCw`զZ3n gA&l5t୔jjGyF42#2/`R,|JFvc'R6ևꍏ u?߆3/dcZ|`+z[B)rEl]1ն] 0橠:&Siђϥ2lZ_ag.(8ө*UUmXuA>} 0 -80 g0 5jg&?!i^7ߡaחKX9o+ZDhIY7 pS]CUuUT$' "V߁/)s[Rԧ]xUr7B1E7[>;o~mw[M襺 %ml Ӿcg eC͠s1<&<<%X)Xk^BI\s!LMl^%ށRVіo߃QC9M{0efiGa/Пhh&\փ)؂'~P!RڂI[D5m ҦGT82b F7Xg]W1!P}h5sv` JpK8 cF ؁. vF@M9Ϗ7U{t\2\4:*FW5x!F#\1߄Xu;a\Ũu"m;0-W Z3dEamlp >MMr>=Q2>$R:׼Юq<=]k4'mSGrc&Sԁ!  l: ` aZU m4qxelhs0+(x7!;0 ;~HtuOa`Ja W>OaU7=͂oaLiAM! eڅ)Pu&_ '4s-n`h_Aa6{C#d˶L=2å&ju 5;)jGaJyCr{/m(/Y:0[?F̲ߛp FT U-I֬qHŏbMI>L`k/O IkmX(sޮr] |qʉSȥ/ɞS#oNk!}>1Q(4xZnOL հ@Jg mM[)Pu;D֢RN ۂ-e*F؝T(ơ,s0L7qAyDŽ,<%J)l9ek~ؾ”m,Tk3稗 VJ=}?9TR A.8) a5[`QT>#C1#s7׿Vrp z.)LtO\wit Le`2*/HCjQY'~в= eunXKәOvΡyHzS5iM/4x>BtG`.!V7@cx kðW؀/E]bua?ؾQ.]!i6Di? s K;V3%<9igp@b#aƍ`#p H9ɝh ]їc(vsWo_&Cyd=x-/gږRа%}/m߫a[ôOjLhZr >h Rv$'>^QTezT;L߇[`.,t|Iʓ0HiwS@D֥M}B4yj7TW~!EʁHI.L{ؤRROd9¢F_ \wlq@\o/` ^_(<6dM!TwPa=.YXtكc7 gru # JFMm֞D ew`@&FąlvLtw,fޑ5ө0̦l.; </UaSE _ ЁM"t]Uu!O:CӘKMoHV9X9$iaj1"UwiS/%U굜VNozMO)Tvg~UXJ֤u3܀P0?PF /4W  'w]zV7w}[vmݹ[CF̘bi|)bNf49!l閞R 9XwYǔB@wa#w``#K ? Go~a o>]U7r;LiruTh?!jg";ARx&3Y-gjj:v`4CE)m]}_]dzܳ@8\5yF2l$dx}O>SsG0 g𞺃A ؅c37ү==f ~ l?y É,!r{!_I7pVlaVLl~[08o5zP -,XDÚU&S,2 )+_s]U2ݒBXV8ZI.LiL&uk܏u 8Kyʖo6aaaݒ۶K~ɑՔ<~b@d͌xmS DZ6#34Bw1zr%uy۵ڶqVEƺ5>(юr+ ƕ<}8_p*Xvĵ5:넿,Mr=loKYuYؓ,xt5!H%R)+b/OQ^6| .܂C2KEҫ(Qo™_2\G.A{0% |n":a<0fe58鞇eeڂ3֕=37k _ǡcv)tPc@kSM48zڙBachtyqĠ\^:Y_j6ZkZ˰_lc5 o8 z^i ˁ?E>uL_oJ27U`dgR“mcdR=}e-WMZ)̔qeTKL֕33r+kVԢ`pΖWEY+d4uSehHc28P;&=\~ѭڷ(( =-#–'D"&s9 !ZQR S ?/jF( w 78Z{6p$T;yOg@"qhD h/>klDp7Hv;ߒ4⠐YïlCvW$WHn2܆G,'ѕ=:M-(&nΦ-Q!w\~Ɋ++ZNm2@rp IlgCh-*X)sj^rv$Hδa5=1.:Ɯ7g/y#_sКX5ןBgR'n 2TaKrTAx$3sZNп _уHEgBO:|7LqQZsM>*7JQ-nh[ m-X,e%G<%҉^YcLqZVvƁJ.>o|FVbA|^fg7mfM9u80 _C6c\:W]Ϋ!4=$; `E3䄙:`QZk&3xW\ʭg#EKvF25'hm%5QM󾁺5̖COrVkoah2lqtzb (@ NU]Ix p/TepZ9/Xl=؀-cJ];qwŒ\uDrhoae6gQ.Hx20dDϭLxp9 3=#r-cSޓ̤Fu2dSiOh[cJ_gT76fD[ҳgO ;u(}릝C87={zyz6KfL'Ze*>49ϵaa`#| \79 Oy@nc0 ؃YyO& њC 8 ]2`B@ޜ` C./ V`.`z^¤G9LW:koéYw3"HP >~jS݀FaWރ))ei t9c&RPItdUYQ])OB虦]R-:ù-;fˤ; g?(pP`Gl-;B Uض^¶"ޢ\-sn]IKw H`>R&C؀xOS$tF #&U*Tl*wo- `vw=J%L'+mgē:e{#y S|#ko+>gpg+Ne IDAT\BѢY' Lj%x ?uӿaB|"\ "sV,52= u[*˒ކ g.,,ll(;#|xdZ鐔ۮAk,Ib'`; 1dqك>f܉5ذq_Lx˰HZL*Y !\۰e8m؂=qdnzN:UZr^1@<_m Ɖ~Ҟhgԭc_+peG5 ghlH$6Q> R)+QOuXROpxt =۔MؓPSm22B mUS;.|/\&5+.Cnyu} g̑P.s6"yL5Ɩ.̴ܱS"\'Sv p 3"֒`E+ B2 ^€uΞ=vحm7#K7qNe=я.Td`"P*(gȞGOsx7aaB$PkFvfN۰p2MtZ*aŦr~:v&EW1$W[C*݅{ԪvH:/_հ &|s9 I:Wl|UqSe =0=*.?#\^j g6<%R*`a݁,\1?p#iUv>y7n~>Vs[HEa*1ޖ>smxiyj*ȦPЫO5- MXURWLTvF5 z6k*%ƻ1~Eä5fCM1fKxX™}8 C]hR ݁߫(MؐM*\ N#p pGmށ:L;]l{ e4=GMr݌pf ceUW#Y>8ÚiRFPWzIK0+XK6dUHQ&,!ϲ,Q#넔M ᠸR V$0 +>pm:N| ys7\%3gs!ehuVW|}RsCA`nK: ol\,Aj޷_<sfvS,f<+#h+1JbHZ3 j+Ѳ7yMʳBtZmUpF}P%ݫF2H(M'#~̿YIgZ%w,ۇ%Ys 3 1p,0 <NKG"RǁTSR̢#׉򹮺1unmלw_luj*T~R..yLŢ$+#Zu2 o,܌*w=tT_:Mx>%6O3c2WL(y؀5ppAxF.|kj^zk 洁WSV,{d# RCR-8E;*q*nb(~^F EBU7 mqQ19Ej;nvm%#|/ީP_ 17즗C_+ lj1)x3)juJt79~WF*H$9PMF+ I Juک5K嬦RN'2♉4 ցMؐQ5ׁ=5 g(UCVVVSP0'YƎ}ץ${;dV ۇSXӂ} vh^ *pKԝE L0] JmfCEޱzԶEe5L2 s~B4!r\5\֕ix#~D3T &紑Dg { cB>:>yZ*r^:߆,\9xsه).(ulQ1#Gh2^fU(MN g%%_=7-.Xb{~3# ɪyI}᎒֎ ~SuTxig mqԂ\ju-9vU W2 ^0 ЀgI#p\V\bVC"M}Y[v_& n | "!h򰧃VϤҚ.` V\@^hp6aԇ_Xi~Ө r&stU {ka#Yq4'mqPP̎/$S *K[n(vB *FLIQxwPv\ePOf=R: d!j B?w} +TX*w}^?T>.9oqז*T[_$N͒()j a f BEe/t\m<Zq̩k9 nɺZI툘#JwwLC:)g?6}Y6o.롏/&57ƈ4Sr_úm=s6z{x+T,0 xk؃m8;\'x^/;܂j:RCXsXbЄe x,LM%>mq)짊b.D#FEYIws|}{b9,&ˡZ>jA4&ܓҜiq^kR&1,ϧf9euY Ǭk 0^MVƛY䚱iuu!6h8&آ[Rх7/ &˞3e֒3o Z[Fp̚z.mV$h 0lWx,nE2k^u:M%g.y)XMeg>`f|rHYZ&:Rq 1tn;j%pܵg!C w࡭IJY.A! }`B]>}0NS *pU mɶSx:=|WsL{Xs"s0tAG4κ-2!EaIGXӛ_jk2.8,{F:#ԱmR1#X5lqNgLx6Z;fʦ59,K/m#R)S aE?q_"V:R]u!8I[ 篪޻UF\5e2%DcXE҅mW 6+Rۉg#U5>;b+TSy΢0fǁ  sb hi(9u(Q ޷oWSb Sΐ-C&dvc 8&TL*k0f[;XE) X ;OvwЃM2Ѓpg7$|%؇w6 TUYYJ=pbvRF}2EhLL@(H D|`Zp`C~S+iIH泦 4S@U9  644Z)Xڄ/}1IV+q/ɕ1/=OO3(g #8.H T"fB]§K셧b T܄pf aâyWsHGhMX52ƃl9ll۞!銊3b^I?D!)oU#lL9e9w?<,g͞亯;OUY(l."my?qa^z: mK%QDP-2+y8qi=/ BUfsw;T Үy]Cڂou !>[$;.m1wSs㢎O'p_Bkǰ %˗l;-^&0b7<b?0'QݷsvYEa܊^ؤN v XAʌzZ|V] jYy@هE¦OL.V$jҏ1k?Z}PMMIv$;;4!k^Gp௠PrtՔwFQmV¿?Uő"qAI8`1 ߴ2m؅?ר~f3D\ҁAE5WmuN|8deU*=.r}RÊ]Jg Pb=gЁ+:aܶq &e>xeZMG x0ό;rg֧pnكKi`z^+4vA!Ǘ%7)T`#pI@ӒPڶr'‚Y1 n[0N,XSь5 8Vl*sMN-̈EOݬ 5en- |gG!ے.5?Ǹ ˰pKܬ @SM|H_k Q+}R t{۩ZxK#xC$ҞBk'Öagn\ڇcuUcBrW0 I!5hصx=GeR2K}NHDaW?Ii-V 2KqaN|; Ѓ-X? 6vNaزgQ#EEJ=Ü_RM/SꘒrX$zAuB%kC9f <)a?ے6AMB ?d&ȟ#8ð3xjX3Pq ̫XkN4rU a+U o \/)3iC~5؇)5߃)]w9 z=xE$=Wzߩ<:<04܁3#ʒ̇] 17S=o1OhN`@=N>34*M\b J- Mu`ϵ9T<ø*1 .+yߘosEߖ{ƚU ̩()f (Rkp~{Zl@3D;jꨁeAL;,N`T7~Eg[: sSmmaŖ+0 ' `EB`֦NDlȉ7hjBR2\؆#z 'Rv[pK/;>SiX@mRp-r6pC/.*Ɠda~i4C2>$\ Rv#S1&IND3C." QW]mSujv1G0a Kb8߀6-:<pp? }:ԚzV:ޔMR hb:J 8v}_тQExfwuvTQץ,J޾'2y_E==RA2"Iv'LmLnh(CGuk׌\Ӄvꉿ? GL!$+P3g>X?؃"T} fWwaW 3N0>ԛфMUuHR ¤OKg.Z.+5 ftSKO |vc3b[)q@N kp aMUU=(j $!Q WP%r0omoĮN+?0_7R-VR*mQF!ۄJmc9(9Y鰥N`CAQC:ދ]Ν:092~nDVR-`>z;C [QS%DT]>HOj<`?/P {b o \WXs۶n- C2[2dn{Mñd [ו|  jpy< %l= 65ؖb|7U3ɥ%!"S#ZRB~ja!rJA¥MsV\ǿg'QVNlpd `vᇰĬ#DЊ ]0q^{x5qۯ*j0bVeZֆ ɒ臋npJ#S! )@2е ,ns[%kXדM*VܚFv*3;N3 *Fh9 ; yaHɅf&\*7`eUۜ5Y1LΚAPށ%m,(w#\m&% 7;N:Nz CQ5fEG`NpK%.]԰螩lZ6mYISzJ730ʪi IDATqkav>#xЄ=$~,6pSELFnfAM~؂ ~P)Pkwy9CyQܷd4haF`:'mǩ^+Ld@}n"4udL- fj 5)&ؙsR2^Y59U+opf*HkZϬREρjaώ qڣurl~FKѱ\ Y%㹥c9N1(XZcSa V3ex>;1 ^W&.J<` D #B9u; ^~XIUo ޕ{K'p p0fvM.^0pBjiЍ>C[v{̱ eж"2-XvS( p.T!|F!3W&&@o _x(~Y G؄ܶ pܵ{Jl.|9BL`<*0&VR[*v?oW]{@v[mNWLasLѭ.@)\Ś@eY VsL̉d}T3)5F9w:,z#߲iO&:G̏(A`\Y_ g@6ܔ̪M8V. YcJl:pxs?WpV R}WW[Qm=Lꛃr !쒈7[OV/ag,f'P,;qeš)XmSW0g c)y%ֱ3o҄=Oq]nIN–xXͷ: c0N˟;nI}:jផiu9i4\'],.ybȢqâX|Kx_\ujj j\\3~zAT}&rjY ZsXD}[Ug/P8aAL:>j] 8SrgOǝGCZWae}؅fq6³m~Ix_ ܂4[x# 7Gq !XB_9g - 'lfT`3kc'럞 XRtM-Ou. ܕiU~lȒ7 [13Ȉ˱+8JSs0$My{V7nkesRϽ_}Yo7!"+ chgrOz a:h-a>g0aN4|}Jcb9]Ifk8iK[&| 74]ڿڙڴ>t-m1,)sS\1eLk;Хrن@%ϊ¶AOpPbBFyaZ-)UD!{r"2t ɿ` PUzh!~xf ֮!4J2XXiPcB:2b}oRQvD\Cyy_,(΂ے~۶3b<*R9#oͼMJ݀[)a9q&A%u_gjd*beྔ8Gz(3<;.% a(s؁0/N${)!y,OVS U\BH߀W\:sR98]0pl"<C3W'(LooQK5dmX[g'PY. [dOu7ip*{ejЂ!Fg:NVmEfVԮgb3l7]0Տ,hz[ yUw L*2鎱IO i TzS9dϕX3!}iǢUubu嗉igrA beSK}=Wz̑2 ʗ`lr>aKB^5/ڤ:„c:ttv+2WRGB-NE70_-wYE؃6eu=0tW K,]͚Խv,I/֕A\Aؐ$ȫTJI_U/ug|3P4L=%$ *9 4EŬiQÀ73"e`NR,K*`칹An*N!LsVdP7|SLW#EFd}./(IWu'L]^ Vr "qXÄ ]:QU6_-}jg`SeiohΠ|'OAŽ0jr ?M8 hۆoq~`#qc{²ߤrV Z"eהQ/9gj_2USTbMD!݊u˼Ẻ N==ssRU <߾Q8Qف3&k"h=GTqʩ. . TC̝Dd=Ҍض$~KjQտ@!LpdQ $3Baɢ@|j'r!܍7QJg 7E8UK:SkH}u$"T@o:o})G":SlRLJ}u8%=|`>q񃊷 K UT\W|g>?I9. oH[؉rG8,a0t-:(&" r=س-%GEܸT34g815ߺHO]r.Un|0{7}ySBdT-afGɮ˸iyːt<*.,? vM(Y:úҳ|8%fD5#Г\/YM5mz"!|uEnVa ʚ07 y`ۄAé{UaȆE/HK^ vR蘏޻Xw+SIUε6eQM޷r -}ro(~sȏ)BIe\zr;oXhW%̦G>XrgE<İ'"<&YC +:]^7zkWY:E3{fӜ 82w\8H+wfSs4Dz4ʠCE1_A+pK؃1؀x'Hq?9 mSjP~֚tQ)RR7!+]Ob/6j{r.k t\j$Tr.,Q֞ovz0d*Eo͑q&NOS{&|Cr9?U aT`Nԏ8RR\B=ʘ2Y]x)-7h=xS3Ka3Or=\s;g 5E}wx+ eRĔ Cɒ]*e+I 奲<_pdbMmBĔoK))~PYX;9 >N IvL1okn 4ǰ7`Mb]xvW j.E/w@C(zZ9:"ڥ#_ƋfM~XE@[AJG̨g ↤5GNueO<9KkmPIP26~o V(l͞7 W+RҲ^cTUH?&|5tus]C`\`'0_` #ٌ;yTWu,[aD"U#6䦋 E]şv֒dS6}'@`<Ǣ Ā吻2F[T>k5c7f% m;ѯopy \j3q*)ƋrUozQ#شƘ_eJ}E5*9?O"6Ǽݥj_biDSٳ>=mIFL9>@ )e>mGVj-h ԇ(|I9TSs0|~L׋7&o]WmxL-ce!}^|0Ð-YNnh:a^ &L* ڨ  0$Ԁ qsɢ{ )xKyK`o2@M-5Cԏu"fX<&D"aE;&< ~>1gp Cy8`"hkp V0̉g&T𾺌aD]0MvC8TeYQK{0o&#f䫕Sn*_ǮCs@4 ?R7 >wvMOSh8~[sME jm; [K1A{ؚXӑQ74- u_zxX-]7 "u*+Y[ 0p9 P~Ww ݖR:oZ]&QoDb 9e>mqL)*zS3ڂiJh݀)4<$Lá$}| ʾX-8eaxX]hĜA)vC IDATV~\g-,UD쨅'Oo^%O>嗏9"7qF9kx9A$B]XC1wq#`JNcΦ<13[>ؖnU|;O Y=>lS"q܃тEߨTjAS9~RRS՟BFʞ[QǴ(%&P?p-q֢ap /_4r\ IGSX0xڕM-f蕪)?qØ鮤V vEw LY%oYtV)Lw/NIF{rQRk.,mAY̥QLE CNDLK-uCB%1Bm'|mugJ Aa sȋؠnDdI-̉WYLq|,qD?9ȹ#bGT_GY 8 i¶2(q%\t'3n>+c! 9c-4E[;h]8;p ܻ;cʲ9= kvF\+P_0D{qFyhm|׌c);]@ u7Qo5|j iV]ٓZC&>" RsWѶ 9qz҂lg41SԢo'NɯkX&mErێlJɍ{K=؂:܂,%s}̲QƜX$W;mMӪ]BJ&KDHMS>j/bS; wnZwkp +Ǯ4޹0{P Y軼p$9K2K>4Nvlr[()\NYͰr-w BMQF%ӂxL!{0 8麗cw4 4Ȩ>7)1/`6aK[e؇yS3~IV)ڮ(榿%pZ8*S M=m= VL%LJՅ8^ӒW95{ɯJ8/ TԚԝ'>PNN59x=62%P,SJ<οiV}M,ŔO-3>܏8FTvLL9euů+SIe* zcJȸG{ 6lmטdߴ5LaOȸZǀǃ,X1X!L5^^f x;?J%x!'*l_CMalɑ+j=߱}p29(_<,r0~nY%hۃ0 Ѕo.A0`{ۮ :_AF)L&’x.&}+AaPπ N] SǼz"n WQb݁2[ w,:ğN .|(1pjDN]Z46꒸/ZˣYWFsm`885Q!؀9 >z5)֒UJsu簨dvrK,v@sou a\EghV4݇3XQTVawa f1Չs0 .bMo$`ƬƯS/{mfgGƳbXiJVʦںDFSTsOe`V[r[w?Ua3[ PVѷ+ (+nmxCA*e'2_6S<(I#|׌AY]~ FXǭ=.e{֛c79A>O=Wj+)~E_[pZ2=XK4PTrWJ Ŋv*:1`GK/p 3~YƔ5B*p$`q艩U³eX:܃BͰ %6}ٯpWMWRu+vc]huW"D˲X*ξ O#:"Z#yΨ_ g*<'zuş/S̳1OzP>udĔ vh~ֶRt<OAe * ǀqsGLb  wEٗ}!)FdÆ[1,]BhμOC%9\7hT'TR6h iHbee/uIdh7Tq^ltڈm B;*xyk;G=dmj޸⦘ogN)(]uT'p਌=.,^7fW$D Z=U7S+Cu}tmiڋW" {BK7vKBiЄPtD1"`MSK/`ᖐC0F|̘deK{ހAa!OC9gvM N36oСWmighWHS}_bgڥ`cW"0ctu5|yUYȴH96(2 }&~ 3ms3c kƬ3I^m‘<:qo>qE$,ùΤs=በ1ep3F%*޸^-Yą0Nl Z^6JKB%'7 ;ځRyܙyia:k t 8'NڂgGQn쥂@fSƥd͐K'FTS=bV̐P[ q=}E û+x`>'P[. !dO_)R+:o? ntM8j˦,@#.-:~YxnZFX!&3h)|ݱ+4I7\Qf҅c6`Bg ܴ:n%$&,xtwG ЇY?p#:D3qkʶƅa>wurR܆А$7]JKa0ow daClׄᜦ3ќi!5W]R6a׵X 깼F VxʼFed/nG|'v19Z-܇eGmWmck6"H׌:5S9meWlJKuuuxl8M TIr'-a}y_X*ubv,NiǩB[ե;i^LuxZG|T@|7]]vMgJy; (B={='_n /1w,j+| !`ORdt'05yZ/R緭r$˦&4l,2s;8TSn6/ mn uSDvK*^1UE/ AT&&*]#<%=x`&FW uڜjQ[WZ6r\,o[3KӀQ]^%#!jkJú漚{ ÜG!N 6}6ڃzc]s:VA{3o􆮒 ÀK~ufBYMe‘1[3 qx&/eR)Ԓ-9p4Ɣ ubtn6t`=4&fxμߡkQ:m.lkgSt¥h z(Zli L,ĊHlzPwNEN"j#p^q$(nH kj_p ƞiŵDFpڄeK^]T5:1A0vB ExpĦ r~ܙ ]+Uin{S\A0F!Qg_\6%T rc 󱋝kgy]u\L |+;onۧPUbEw$x"DԷ;OʪYkĶ5!)[u钺ɋ}Lʕ 2t߹+ez)H(<&dMPX@Yyę~|s!ӷU;tUOpafpany}vvj0 ;][>fg4%%}xg.YoY~bݽ%0o МQ2f%rt螼pV3n4"z3 %7 S;_%N)3E++j FËvB3>\ RZx= ?S8#袀#i03FA`_ѫOYeCY9=5iLmNU#]7TV[ $kCrܦZȊ:<%hQ#2܆U#U_QXOK4 ~ػ1TAY 8 MǺ ׅJP?x$^FpU{FK}eebF҅dM9^܄RRQՂ6]k̡y]{ IImQw_5o`b)nº;PQE3ʱoe]f\nPiTOrU !pU7thL5Xp_DܜwB>^e0`s4aN̩DtxX$6<԰UMiPpc*c: ڎ˾4h*<Ւmfɔ1*E{֕MI UX&C+^BզR H;YYeYuEd5ewssІރ]"%=됇]1}x>OL0+x_` ڴy#f]W8,ÜMx|_) M8Ex,c}jn.|* |,?Y g*~Sz@V=IGQձC0 4a\t૰ >]AU] <ҰҘ8>4td֝ɘG`LTĴG1g*遙ٔdh4b"7HlROMQ̾3nSӡTj|  \F+a]di s +ᒁ /AGտR!l1av08ciޠD2`+h).` u᱑.!<1Ly2llms z$[/6p{5(ţJ 6 Ic_4&m؂aln;1ȩjE5 0U@Q"lC6XwME?$#f#\zwZ@es$p0,! kTuGL9a[dǤwE)>Rƽ~!X14! ڡZu剷cFyhvڱU5IvLتfZ5|Eae5eōO%5r\|7oCEKɔ{PEs *kXHX4R! }xcKPM-W,@ v4u=} y/ x}WD ^/`Ko 5?ljD$9h@ձh H x1 AͰYUyf}3S :\ ''ͲZz0cap:]W4L̀VUξ_/lU/5lX8mI=NR<ʞ> CSQ[; +"mEH_A- 3^XC{]M')t]BU_Ea ݊;zWdp0W7}maT {gz$ B f -xP/ShMIN&@cLv-Ζ[8 ~ Lh=!׏߳'h>UЪ[0R|àMGNxUZG]XKuKY!YެΫ0 M1 yX0"0y.9ZQ&` t p|.6hum-|8#G)S u3-TPJEoW=NwǐUB;T ;D 4O>q -EIЊ}(CO즮*Q)E')B Y/d^M`X .mnק} y+Ckw=03[?nZ鹮ekKAU3n X)E4NIξ%™o&s߇{p }3) n+[Y= ?Vޠ3x5 7gFM>Z4  \=pSod%;(G)2^Oq.`KR6sԜ+>ztGI w~H1^|۠vY`'n8rLCX*&C8 X'pOaށ3јG\ߊV֊`MpSWӴJdYޠ+_kM P0`eXЀqM’ݠRe, HFJ|.f[7pkLj;_p+mЪٛU)RគS ")@D 00U3^jZpC|'58/ >xHߎ_-)mʌ"Vs(m(:|ϺPu񣇅bX?$i S+@-|U$q06'l91;&Vl=]O8,[UjIDATUwVg{ HgЂ-5&Ru`C=Čr\(݇]x?}4B8W_=z^&{ %1.c3ڍ[MXm-ci7'T\ι?E6V&ljh~kz㺮3?@cRzˌEIErj׉:H4@|~0 A yAcג횕B[Xf4$E :sf(J]p8sY{>==Ŕ1|,rHޓҦKNVEGrkFUimtSZ;tM;"_dcWc_;% I+;;|z-ڌS%OS }^V :3_H`ff~QV`+=oc$.?rEQ=|%y46qӡW\)⟽D)OI_II/Kg2^=tO[iֽNgF|Ep/]rvv8*Ykq%G JZz3s;Ucef1f%' 6d_.H{Qa/{׾ߞ&7"s$d\_Ձ(]?KΨraάK<7-s须C銣cȞMcCD eiAtI~}2ef\>slƶ65wd¡QJ,3͞w--8Dwc2[u='#)}Kz\1yKc̲CQ:?Nj='#]! e/.63ҏSKƦQz;묯6YOD#ݓ^/΋utݯg{ߟiցvguLuuZ1@+n{^$Bt]& 6׼aƫ{ fKzCTz䪅 ^_O_ڝ ٚuDﴡiGW1皴eFl$ցGwh4L&KU¡;/]vՏcbx^B f ojq6Tt#wRTG˿([o@24C<&9%s%%E6 #'K%3iÜSGx/zv~׷uO:;4&~]'_2?r}Az`a}e1)8jޗ=Wj+b,-RHo5]צvɤܝ p = 57,rSs4%UOz^'(ՔtNǞ?%AZts~,p떄\mWqBf{UͿJv/j'4w@rh8(BK>n9kN-!ݐ.;RfSM\vZeS YP Δ>dmˌrE3ԬIzU,2%]vG|]}XʹYI* u %0) rlNbD1[Қ􎇏b>Ҋ6JNbeWzOy_\hЏ;gt]:w-Lu)(XD{[P*Nh`ݲF-(IEFmS"P /z0wLIUj.4'|)x4G1cB5O}Zjf(xGܒ~,p|ljZkҩQPL:]2N+˽T֮epdoqqөhRPfB"Rص32B<ǞeĠ23xg`n}H~*]qk;ϱ&f+ n7G#vܫ"JIGcWŒauׯqdO>%\{9b˨[n[^ٸȺ,rס ܟY0ngQK~?KBG^s<{H?6c\#Oo{HV[ ^yt ՜5EOw"+{˞PY2KvWDz2^(6yBTg8sԋnwucѿWfwdY\ޖ }슞Ej]q0ZUc\Rf3uLEFZ=<1mZ4md]`Kp rAʦ/',6ÜkX3K`w#qm4S6m+f9cg`goH]|C$5W@H~뇞gkjD65fPyc`oє6 k8\+m'g Dt\ZQs+k]rIA /ʠP.u{}^;Iq\Q|bU{%ənԊsy0ך3AeW zҦbݧΦ<1+}YY+%%j\.O Δim4^jGc7v[A}zI-tUZ*Sd>Ib2%7Ȭ[}ע-zqq4ZN禌preN%εV%D[ {CMl[slK3ԩMƺ#_Hie,2X/a4cdκDj%F`u-gؗ5Wkȳe |_y׬>𪣌}uW y/rPeE/a^JvzhViŽ݅?7øvB.ZppY 4+l;paS3pSmΕ=E n>Y^WioUʃsܗ!k~+b5k^p(8;$Va׎f`܋12ר橩r Pr)Vix 'go&Dh}~9"Hrϵc[*$ҵ:4/\Y/P'IOL T:X/0FF|bj[+3'%"|җ ͷ^Zfw_ԢAkj`荭#`E|.3yMrnSG.άAb;KQ,?) J%-RF0oZ+UHf:4@k9 Ա`<QPpa y|^M+Zr~K 8zr֨F|ލk`:zXcGʱfz0Ji0$/EJ>VZ1>_'4P\IWn5OE'D7AymZG^O{\y:qJM^I7;yjTej`TvݡQf YhӭӢY[ԎdO쯏vgڏ(Xx;5[dQ%KCfrqӯWRԌۮ4XJx6+T3?az*xsPc.VԱ[ jW)CIq?X Qj\4$W6Fry·#:yybw|Z ոݽ#nG7 &|2_3R*7\] ޽1qH k| RE1՞'/ 2yWH[eR ON&-;vbqZ}l##ok`Q1FxLJg>iZNcM 5ڎc^_)u#8̝QH5y*Mic@8koAU{oW`-4OYG7ic:CH8W_PZo ~ٷ1e%mk{Gkytszۘ*>">跏(oܳ£#+# gʬG9ժFFF忦 z乏@ndn=.0) - Vertex 117 is [ 0.54813892 0.76257497 0.34354511] - Vertex 1 is [ 0.0566983 0.17449942 0.98302352] - The number of local maxima is 2 :: summary = [] for i, index in enumerate(np.ndindex(QA.shape[:3])): if QA[index][0] > .0239: summary.append([index, np.sum(IN[index]>0), QA[index]]) #print i, index, np.sum(IN[index]>0), QA[index] print "There are %d suprathreshold voxels" % len(summary) maxcounts = np.zeros(10,'int') for voxel, count, indices in summary: maxcounts[count]+=1 #print maxcounts[maxcounts>0] We are using a fairly low threshold of 0.0239 and all 600 voxels are suprathreshold. maxcounts[maxcounts>0] = [ 0 405 152 30 10], so there are - 405 voxels with a single maximum (no crossing), - 152 with 2 maxima, - 30 voxels with 3 maxima, - 10 voxels with 4 maxima, - and 3 voxels with (at least) 5 maxima. We locate 3 contiguous voxels [3,8,4], [3,8,5], and [3,8,6] which have respectively 1, 2, and 3 crossings. ``fvtk.crossing`` is a helper function which we use to graph the orientations of the maxima of all the voxels in our dataset. We use 3 different colourings and offset the graphs to display them in one diagram. The colourings are: - all blue, with the 3 voxels used above ([3,8,4], [3,8,5], and [3,8,6]) marked in blue, indigo, and red. - the Boys' colour map (see ``colormap.boys2rgb.py``) - the orientation colour map (see ``colormap.orient2rgb.py`` with red: left-right; green: anteroposterior; blue: superior-inferior. :: #3,8,4 no crossing no_cross=fvtk.crossing(QA[3,8,4],IN[3,8,4],verts,1) #3,8,5 crossing cross=fvtk.crossing(QA[3,8,5],IN[3,8,5],verts,1) #3,8,6 double crossing dcross=fvtk.crossing(QA[3,8,6],IN[3,8,6],verts,1) all,allo=fvtk.crossing(QA,IN,verts,1,True) fvtk.add(r,fvtk.line(all,fvtk.azure,linewidth=1.)) no_cross_shift=[c+np.array([3,8,4]) for c in no_cross] cross_shift=[c+np.array([3,8,5]) for c in cross] dcross_shift=[c+np.array([3,8,6]) for c in dcross] fvtk.add(r,fvtk.line(no_cross_shift,fvtk.blue,linewidth=5.)) fvtk.add(r,fvtk.line(cross_shift,fvtk.indigo,linewidth=5.)) fvtk.add(r,fvtk.line(dcross_shift,fvtk.red,linewidth=5.)) from dipy.viz import colormap as cm all_shift=[c+np.array([10,0,0]) for c in all] all_shift2=[c+np.array([20,0,0]) for c in all] colors=np.zeros((len(all),3)) colors2=np.zeros((len(all),3)) for (i,a) in enumerate(all): #print a[0] colors[i]=cm.boys2rgb(allo[i]) colors2[i]=cm.orient2rgb(allo[i]) fvtk.add(r,fvtk.line(all_shift,colors,linewidth=1.)) fvtk.add(r,fvtk.line(all_shift2,colors2,linewidth=2.)) .. figure:: visualize_cross1000000.png :align: center **The crossings of a region of interest shown with one color, or boy2rgb or standard orient2rgb colormap**. :: # To show the figure # fvtk.show(r,size=(800,800)) # Here's how we make the illustration. print('Saving illustration as visualize_cross1000000.png') fvtk.record(r,n_frames=1,out_path='visualize_cross',size=(600,600)) .. admonition:: Example source code You can download :download:`the full source code of this example <./visualize_crossings.py>`. This same script is also included in the dipy source distribution under the :file:`doc/examples/` directory. dipy-0.5.0/doc/examples_built/aniso_vox_2_isotropic.rst0000644000373300037330000000227611525644130023026 0ustar mb312mb31200000000000000.. AUTO-GENERATED FILE -- DO NOT EDIT! .. _example_aniso_vox_2_isotropic: =============================== Anisotropic Voxels to Isotropic =============================== Overview ======== :: import nibabel as nib resample :: from dipy.align.aniso2iso import resample from dipy.data import get_data replace with your nifti filename :: fimg=get_data('aniso_vox') img=nib.load(fimg) data=img.get_data() data.shape (58, 58, 24) :: affine=img.get_affine() zooms=img.get_header().get_zooms()[:3] zooms (4.0, 4.0, 5.0) :: new_zooms=(3.,3.,3.) new_zooms (3.0, 3.0, 3.0) :: data2,affine2=resample(data,affine,zooms,new_zooms) data2.shape (77, 77, 40) Save the result as a nifti :: img2=nib.Nifti1Image(data2,affine2) nib.save(img2,'iso_vox.nii.gz') Or as analyze format :: img3=nib.Spm2AnalyzeImage(data2,affine2) nib.save(img3,'iso_vox.img') .. admonition:: Example source code You can download :download:`the full source code of this example <./aniso_vox_2_isotropic.py>`. This same script is also included in the dipy source distribution under the :file:`doc/examples/` directory. dipy-0.5.0/doc/examples_built/find_correspondence.rst0000644000373300037330000000712311525644130022512 0ustar mb312mb31200000000000000.. AUTO-GENERATED FILE -- DO NOT EDIT! .. _example_find_correspondence: ========================================== Find correspondence between tractographies ========================================== First import the necessary modules numpy is for numerical computation :: import numpy as np dipy.tracking.distances is for tractography distances :: from dipy.tracking.distances import mam_distances dipy.data is for getting some small datasets used in examples and tests. :: from dipy.data import get_skeleton ``get_skeleton`` provides two skeletons 'C1' and 'C3' previously generated from Local Skeleton Clustering (LSC) :: C1=get_skeleton('C1') C3=get_skeleton('C3') We create a diagram with the two skeletons offset [100,0,0] apart :: from dipy.viz import fvtk r=fvtk.ren() T1=[] for c in C1: T1.append(C1[c]['most']) fvtk.add(r,fvtk.line(T1,fvtk.gray)) T3=[] for c in C3: T3.append(C3[c]['most']) T3s=[t+ np.array([100,0,0]) for t in T3] fvtk.add(r,fvtk.line(T3s,fvtk.gray)) # To show now use: #fvtk.show(r) For each track in T1 find the minimum average distance to all the tracks in T3 and put information about it in ``track2track``. :: indices=range(len(T1)) track2track=[] mam_threshold=6. for i in indices: rt=[mam_distances(T1[i],t,'avg') for t in T3] rt=np.array(rt) if rt.min()< mam_threshold: track2track.append(np.array([i,rt.argmin(),rt.min()])) track2track=np.array(track2track) np.set_printoptions(2) When a track in T3 is simultaneously the nearest track to more than one track in T1 we identify the track in T1 that has the best correspondence and remove the other. :: good_correspondence=[] for i in track2track[:,1]: check= np.where(track2track[:,1]==i)[0] if len(check) == 1: good_correspondence.append(check[0]) elif len(check)>=2: #print check,check[np.argmin(track2track[check][:,2])] good_correspondence.append(check[np.argmin(track2track[check][:,2])]) #good_correspondence.append()) #print goo_correspondenced good_correspondence=list(set(good_correspondence)) track2track=track2track[good_correspondence,:] print 'With mam_threshold %f we find %d correspondence pairs' % (mam_threshold, np.size(track2track,0)) # If you did an fvtk.show(r) before, you'll need to clear the figure #fvtk.clear(r) Now plot the corresponding tracks in the same colours .. figure:: find_corr1000000.png :align: center **Showing correspondence between these two modest tractographies**. The labels on the corresponding tracks are the indices of the first tractography on the left. :: for row in track2track: color=np.random.rand(3) T=[T1[int(row[0])],T3s[int(row[1])]] fvtk.add(r,fvtk.line(T,color,linewidth=5)) pos1=T1[int(row[0])][0] pos3=T3s[int(row[1])][0] fvtk.add(r,fvtk.label(r,str(int(row[0])),tuple(pos1),(5,5,5))) fvtk.add(r,fvtk.label(r,str(int(row[0])),tuple(pos3),(5,5,5))) # To see in an interactive window: #fvtk.show(r,png_magnify=1,size=(600,600)) # To make the illustration print('Saving illustration as find_corr1000000.png') fvtk.record(r,n_frames=1,out_path='find_corr',size=(600,600)) .. admonition:: Example source code You can download :download:`the full source code of this example <./find_correspondence.py>`. This same script is also included in the dipy source distribution under the :file:`doc/examples/` directory. dipy-0.5.0/doc/examples_built/fig/0000755000373300037330000000000011525634746016525 5ustar mb312mb31200000000000000dipy-0.5.0/doc/examples_built/visualize_crossings.py0000644000373300037330000001604711525644130022433 0ustar mb312mb31200000000000000 """ ==================== Visualize Crossings ==================== Overview ======== **This example visualizes the crossings structure of a few voxels.** First import the necessary modules ---------------------------------- ``numpy`` is for numerical computation """ import numpy as np """ ``nibabel`` is for data formats """ import nibabel as nib """ ``dipy.reconst`` is for the reconstruction algorithms which we use to create directionality models for a voxel from the raw data. """ import dipy.reconst.gqi as gqi """ ``dipy.data`` is for small datasets we use in tests and examples. """ from dipy.data import get_data """ Isotropic voxel sizes required ------------------------------ ``dipy`` requires its datasets to have isotropic voxel size. If you have datasets with anisotropic voxel size then you need to resample with isotropic voxel size. We have provided an algorithm for this. You can have a look at the example ``resample_aniso_2_iso.py`` Accessing the necessary datasets -------------------------------- ``get_data`` provides data for a small region of interest from a real diffusion weighted MR dataset acquired with 102 gradients (including one for b=0). In order to make this work with your data you should comment out the line below and add the paths for your nifti file (``*.nii`` or ``*.nii.gz``) and your ``*.bvec`` and ``*.bval files``. If you are not using nifti files or you don't know how to create the ``*.bvec`` and ``*.bval`` files from your raw dicom (``*.dcm``) data then you can either try the example called ``dcm_2_tracks.py`` or use mricron_ to convert the dicom files to nii, bvec and bval files using ``dcm2nii``. """ fimg,fbvals,fbvecs=get_data('small_101D') """ **Load the nifti file found at path fimg as an Nifti1Image.** """ img=nib.load(fimg) """ **Read the datasets from the Nifti1Image.** """ data=img.get_data() print('data.shape (%d,%d,%d,%d)' % data.shape) """ This produces the output:: data.shape (6,10,10,102) As you would expect, the raw diffusion weighted MR data is 4-dimensional as we have one 3-d volume (6 by 10 by 10) for each gradient direction. **Read the affine matrix** which gives the mapping between volume indices (voxel coordinates) and world coordinates. """ affine=img.get_affine() """ **Read the b-values** which are a function of the strength, duration, temporal spacing and timing parameters of the specific paradigm used in the scanner, one per gradient direction. """ bvals=np.loadtxt(fbvals) """ **Read the b-vectors**, the unit gradient directions. """ gradients=np.loadtxt(fbvecs).T """ Crossings and Generalized Q-Sampling ------------------------------------ You probably have heard about the problem of crossings in diffusion MRI. The single tensor model cannot detect a simple crossing of two fibres. However with *Generalized Q-Sampling (GQS)* this is possible even up to a quadruple crossing or higher depending on the resolution of your datasets. Resolution will typically depend on signal-to-noise ratio and voxel-size. """ gqs=gqi.GeneralizedQSampling(data,bvals,gradients) """ A useful metric derived from GQS is *Quantitative Anisotropy* (QA). """ QA=gqs.qa() print('QA.shape (%d,%d,%d,%d)' % QA.shape) """ QA is a 4-d array with up to 5 peak QA values for each voxel:: QA.shape (6,10,10,5) The QA array is significantly different in shape from the FA array, however it too can be directly input to the EuDX class: We explore the voxel [0,0,0]. """ qa=QA[0,0,0] """ ``qa`` is the quantitative anisotropy metric """ IN=gqs.ind() ind=IN[0,0,0] """ ``ind`` holds the indices of the vertices of (up to 5) gqi odf local maxima """ print 'quantitative anisotropy metric =', qa print 'indices of local gqi odf maxima =', ind """ There are approximately equal maxima in the directions of vertices 117 and 1. To find out where these are we need to work with the symmetric 362 vertex sphere on which the reconstruction was performed. """ from dipy.data import get_sphere verts, faces = get_sphere('symmetric362') from dipy.viz import fvtk r=fvtk.ren() print 'Vertex 117 is', verts[117] print 'Vertex 1 is', verts[1] print 'The number of local maxima is', np.sum(ind>0) """ - Vertex 117 is [ 0.54813892 0.76257497 0.34354511] - Vertex 1 is [ 0.0566983 0.17449942 0.98302352] - The number of local maxima is 2 """ summary = [] for i, index in enumerate(np.ndindex(QA.shape[:3])): if QA[index][0] > .0239: summary.append([index, np.sum(IN[index]>0), QA[index]]) #print i, index, np.sum(IN[index]>0), QA[index] print "There are %d suprathreshold voxels" % len(summary) maxcounts = np.zeros(10,'int') for voxel, count, indices in summary: maxcounts[count]+=1 #print maxcounts[maxcounts>0] """ We are using a fairly low threshold of 0.0239 and all 600 voxels are suprathreshold. maxcounts[maxcounts>0] = [ 0 405 152 30 10], so there are - 405 voxels with a single maximum (no crossing), - 152 with 2 maxima, - 30 voxels with 3 maxima, - 10 voxels with 4 maxima, - and 3 voxels with (at least) 5 maxima. We locate 3 contiguous voxels [3,8,4], [3,8,5], and [3,8,6] which have respectively 1, 2, and 3 crossings. ``fvtk.crossing`` is a helper function which we use to graph the orientations of the maxima of all the voxels in our dataset. We use 3 different colourings and offset the graphs to display them in one diagram. The colourings are: - all blue, with the 3 voxels used above ([3,8,4], [3,8,5], and [3,8,6]) marked in blue, indigo, and red. - the Boys' colour map (see ``colormap.boys2rgb.py``) - the orientation colour map (see ``colormap.orient2rgb.py`` with red: left-right; green: anteroposterior; blue: superior-inferior. """ #3,8,4 no crossing no_cross=fvtk.crossing(QA[3,8,4],IN[3,8,4],verts,1) #3,8,5 crossing cross=fvtk.crossing(QA[3,8,5],IN[3,8,5],verts,1) #3,8,6 double crossing dcross=fvtk.crossing(QA[3,8,6],IN[3,8,6],verts,1) all,allo=fvtk.crossing(QA,IN,verts,1,True) fvtk.add(r,fvtk.line(all,fvtk.azure,linewidth=1.)) no_cross_shift=[c+np.array([3,8,4]) for c in no_cross] cross_shift=[c+np.array([3,8,5]) for c in cross] dcross_shift=[c+np.array([3,8,6]) for c in dcross] fvtk.add(r,fvtk.line(no_cross_shift,fvtk.blue,linewidth=5.)) fvtk.add(r,fvtk.line(cross_shift,fvtk.indigo,linewidth=5.)) fvtk.add(r,fvtk.line(dcross_shift,fvtk.red,linewidth=5.)) from dipy.viz import colormap as cm all_shift=[c+np.array([10,0,0]) for c in all] all_shift2=[c+np.array([20,0,0]) for c in all] colors=np.zeros((len(all),3)) colors2=np.zeros((len(all),3)) for (i,a) in enumerate(all): #print a[0] colors[i]=cm.boys2rgb(allo[i]) colors2[i]=cm.orient2rgb(allo[i]) fvtk.add(r,fvtk.line(all_shift,colors,linewidth=1.)) fvtk.add(r,fvtk.line(all_shift2,colors2,linewidth=2.)) """ .. figure:: visualize_cross1000000.png :align: center **The crossings of a region of interest shown with one color, or boy2rgb or standard orient2rgb colormap**. """ # To show the figure # fvtk.show(r,size=(800,800)) # Here's how we make the illustration. print('Saving illustration as visualize_cross1000000.png') fvtk.record(r,n_frames=1,out_path='visualize_cross',size=(600,600)) dipy-0.5.0/doc/examples_built/find_corr1000000.png0000644000373300037330000010264711525635103021152 0ustar mb312mb31200000000000000PNG  IHDRXX1 IDATxVUh2P$5Xm%lPJHr$&F*4(ݲ;z7 ٘.ZhڍEʭ)ݲ!ژ(OO>s~{?2 }=sy/"8Z`r! `܁B@N`@B0_=6I ,B@Á vV'2q"l+ TݨA/4f<)xzq@ !~Vh&:e*f<=X'&w<$gM!(G@bkBBn cF'(Emҫ?أD ,Jwf@B82*]Z8IK ~\І@' E[$fvr1.NL5YVi| Td{lXG4Q϶|;.;ӳ,q6%4nLPJmR %49 spقA@X#kt&$aZI0~㟱OL[=Xb!Qf]Ӏ.'1s 5:n~*s>qI:@C1i,/ kir( pbѾL2elذnZ _?2UEj9!#e@&@FE]bY%[sy_3E'2f6B8aifq%`E5/c~P47R|*caQ9Nk\4cL at`"QX3h6E:b9L&e)EkY.5DLSԟ0[R0^lk#Fuhq,K&Ό ThsNduFfn&1754Rs[)(Y7L&H#wöB$I-9c=v|+ ,aXv`0i++W{YѶ\ XM!l88#gN؅? ywMc,¬ǟӺX3Ar 80|8x|+ E̬ 5ҝgLCqDZKmj+b|e^21Uk6 rƩ=Q ~ӓgMRf)]۱ & [e/M(Ʊ"S {~iW6; fGkdy6 WOܹsfݿd֭'9BԞcw<뜫.i4r諣8i҉?&/O/O;Ǭ9k(牨L< 7ȷmK)UqPѧa3㸡061 sÆ rmmBU:ϩU Ħ DzҖ?dJQ|s׎1cծmmPԷ䙣Fğ\Ŋ. K ^Z1=, 2DDtz âXHv9yV3z/޻!h'`Џs`Z xAVAj>y./֋ d?&eYT0U@s&Q MRO}`9?+ߚH ?kDJ;W>W>4䑷Vv,x/4>ëMfSlOcEQD(_{!l"X5Pu _YY'hhLC S?k;Wњy ֹՕ VLcrAkԗ@·VԞc䚘ʱFBG 3eNWtYvRymAʭݹVy\Bֿ,& erv,>C2hyRAV@ iOg7W엯9VLhS M"!~mNDw<©= &bk; "I\=ZQӮ83-ˆ\ޝZ&O7WO A^yQ`u NN)(Ǻ_WA"ݹr`==yUGJAa Bc0n;&#E7 '*ڎUf?aw5C{ ߙvw }|i%PzeVQhH~fhoftg@/ڂW(-yDdKNFǤ룄.+5C{嫙o&S $;NKD7v-M Cɛn^GP߮b@K)*chu΢/5>Ps&;VJmg"U͓ت<]. mP8BchBA2۾^'"\z*YP59 ?R-:X}x<khk矗cVA3G uo'FW9Ǿ4!fݿD&o|0i/-d T!(a_N18¤S{l~7|W2F,zN󜤐2+]9],6"56 TA1 IDQ3NAD+]kRRʱLK>Ou&!lS&kp]sW*䙃$MmPӿF.S^xf,&O/OHsz St"-:%qo :w3O~ⓧ zMנ!\&˜ ;mIptL^̬r Z4ݍ \XV5Xö$2[J59;$V?KmOT89Hvde<@u$D3O7^ѳ_#A+j#5jPA=dƌF6lZY윓y*5C1 ema4Ss-+v uǛ'qV*DSiXCD #RO(sטжUa顡~q?-d BX&TZǘXUg8u$v)C Y~9UU A6F}`\QcLCmEbbL̛vdfÇ0 [ 4ADŕ'l*8Y$0;W"ᑃZHӁ_Y<ϒ1Gd̬6Gy*aPb1&%0 `9 9]e!SjkszQĒdUgl!_*S %0x-]17iP O9:P9'/2ƣ wV@W ) fhΕ%fL{y;3& y7吪N!-X,1E[„!K>smń0V 7?i /+q!ݩlNںuPDz%~ӼASsփAAʼij]BX{;ƪ?X1 W`5gvR8ހ"̱#Jgm"ƜZcޥ'L+2e  cSwpAy":8 R:U3VcKEQ6OA ]+0A;NuϡJgAa>`K p` 1s%L_wW եi"c׼:n3RԜGsKPVME #O F Z cIN@&et-fza9beSS!UUIU$k$LmI{s>x%POϭQXf*I76ʿ,\C 4F,5ZhB9=Gk,R hhB|! e]')3| բVA"[??=?xZؒ%JK3bJfHTYi8ȹӮ8`?DUn'!ha',BPm꫽;jM`)eK]b_S|m?9(F4 6B_3k̄2o*y*(P\?ɿδ|L;H 1$BZc R"lvZW~ʨ' ,\_y%jE,dPB]dj؂~5yd #]:|UZ MԶ'mjM "ߕDZKi$Ӯܳ?3(*]0LW/:X;Gug3?~l9Rf2zܿ:m5 Sm88 yL1j`E !4do?7fzNaIadO@eeSĴU0D‚`E${+דR0Q" ml&㛃# )O\5fjaBhJYLӗx(4BBhy[(|~0|klL-Ӥ-B0V;eOP4=&61u[W1 : [KK*a0Rf a"t|!ӠR$3yy;xvRٕבӓəқ㜉׏\٫5O|O_d-ԝT=>0>S)btAJֆ>IL<H dU+]KT>†Ј*5EtfBIU E%-3``? zzi;;D Y;oX{w?jf^ZAS%OyyigZaZB>2fQhX)QUǟ{Q>#a?YfਸC}d$$S5|nA-僢ˍPww1W8 [ʄBRZ_6UF[2YVM=|+Pg?OY썰.ia=Gw~䋻;WjTu { 2ypl__%BZtk;n{~ ,9:YQxt2 a=LH?qeѵ<&Ĕ L[qw3@kK|X#O(d7hP]#ː;#/-%=C)n_aM*,߿r=UNR'QԶD,1 =e!eS58>L -fSPGx?঱ i̚5TmKr~"ZԜœIy~Q'gD!, 2zvY[3qLfpDrc(Ѽ5cmGs0f5Bcߍݱ,23݄O2I)(:=c?}i]Jr5>v9LGw~vwa&G+ wα7~칙L&fZN8Yh+О"l~!I2S{bQ5S45 th2:޼]Ӯ >RQ IDATvE@Y?sDB< Y9˺`Ãݗu޻[La F"7M+kfz2Cu7qUm$IqΑ]pZxJa;:ndb wc6;3X"ratWe"-/6*l̷~G#HmdU쪴FQSWM,6khBuG5C{DZ_+ 3*fq .wU†"2o2&ls 6!Cfqٱ|+VG$ԨW@l7 G.ܻ*(JH};ߌ G/3F^&Lh2y cLǂv`ŘBX&y X:tBB‹/X_U٤[H$D \)7q"֛nOfVް#%.Z0&IlJ"Dw__o$Lv)D "GbOfMSC+)j%63/./ \z%q-p29o9Ij '/\۱؅2IUΐ}bXd$HW]#OAϯ7)"oLs oI? hӦMrߕq|U ~^,fG.pPev[X¶ Vgݿ Qߴ7Z'Okط8/O2 @Q Ǔ&M2ooӦMZ /wSQ___Z$~rIߘ Z O)RsE@ 1;Tg~!/T4P ^"fo&3Qnҫ i96m$*#eݔb56-΄sB@G eFTPE檯bV4V Z]˛7`.Ic>xQdЗ@SZiKdOEDS%q#3I%hiѦ,'IOqwJvvt%V)Ǎ&ii4xknц |@} p/fjϱ>Fz߮,/r|諌 _w9 N9hsݴ>|J2[@\ F@Z38ېOT\/M"&:9^b&I-]ӹ%tq .ʷw`@;h S}zmf:H5TΔZ $S}s\ZI(栫_U- ODX!l*˪(0Oq 4QQֆhଅ/.i yhp7&shSCqϻ;z֞%j!UNmT0ذM\o\`!lS5;D3 ͜zm# w#0(?L0mm\ۍzT0OHj9"q_PWJ"ҥE m?>-$YzX6@RJu&'_/N@kPn˲2cKMe4kI,ȠUctl\znٟ[hrNYC 9B3ߪ?m = Fcy.p{wK,dXPD+,̈'_uՋ4^4X9N ' Z jZQ~Tc;>qd6邭%0akSHQ#Z^*wfc=B_)G| ٨ w3M\Ak! u_֥$$!};QL3LPbW9b0imp xϻ;`0祿P2N[)*6s+x4%Y2?j.ڎs'+֡'m3]df*[?X*[}6+\U7fpΩub<4tΉ9hTgi9\.2_#1wkW]2@N*(-I*@[CRm,]mɟB[ɋ]i|t(q֖RAJ k#"_\y<&煘;4\!bѶYhb!l 1m˼EZ=@=|Fa,)%<6@Ӏ6_fj(3F>J) '`cݚ2Z9;"3 iE?^L$Uy&Ny-D4Aϩ'O'ieB}>OF ԨXQl36`QyFKRu?cMnJRA&8X4ALSx(/~͘wMhzȨQ"꾬^5cT\`iޗ3C %'Vb :̈́_ޏ\NImRTP$0j+S[tC^-O"adB}-Oo3 G~:C=3XLݲ6.̔߬lR']bИ tҥ:X.o&1ga|眿SH+g%!B-eE3Zxkϒ%u>BCK07"sRRXbbVqq0q$k4]Nns9UiM9FVQįt Ғ䋲xଅCGQ-NrPiӘUbm? |K[{ms# N2?ж' \:WN`޶jaAh&"kgY$gtg6;6SN,EDjsV5W9#Uz ASoWK`l'KL~I[@E֡HL+Z(EZW8#:dG[D !CZF`TЯs(m R>R-z_Xm?m%D=ߔu1[,Z{Gs>;>Ws' ^Ij"_x ?KFûqi23[~pXv?iu}!5u4,B|0t&~7nH_bzq;V3k`ecՖґ]o|GZ8H~sP_9|:3II=Bf")Gw~CWL6O>V'`⢋7%RI>cJ)y?yMq.j豃+,Moo͛)4"J/:C.hmU?rs.[U{$t `!\۱``Z/#*\ oyZ9ykϒJE)kEA?SGTV:B屔N_,\5A#E 5N >vՖ-[l٢KE]tEUZ8k\$b(#~m,\-L<|Z竑&gG }Dz'"irJyO/BoM*iR,¦BBRC$:7nٲEB?B(YE 4NIYbԌ^e"*HDs9 ͛7]eEјyjz*RTe{ s*ə`p=vpÃzNK*M)Td>B\){h†cCp [lOGV.Ȩ;2p6_7 M7R[-^Au^d&9ϟe|ue[P/#eF\+׻"?ktT'nKrnOY3,]e$駟T+St`}fdDp~a ~yVA?"A#b q)c6O#9ϯXgЯ~U@NEӉqd״PX))-t bA6D+AHL`Y/~AE[Sô[&zSQh557o޼yɓ'O_LZLZ=7yJ4sl,V-~3&+`^,9+ײ/=)f#u>m .nO\tEw=X_5/ ; r}`^z{Ŵk8i@ۅ<'53U_Ţ6l9~Qnf77:?Z{r=%Wj*#޹* uF,̭㮠á_c/UK\8.\ gGج7?o%8oI9Q<~_§.&SY|.h&Ibӑq)z/yLlԟ''&pրrK*(}Z~UΜt"#U^uRhj1c9il9!ZI3 ?93_[X:~sw '{3(Կk1p… +?P5.>㒹ƞd}y R,M.\@D^kdc9 V7@5W}cv_xSO%x{7}AfOZk滁۩Eu7bdRs9fn*ҥ{f/Ʌ{jAoWG_"ۼyH y*(KT=O\c)<MlN7NlϼZAj*X'Vy;b܉5:߽7goԝ~MgU4?j<+/>j˷s'-?I8rMנp(]!RUmwyi7Z6sJ"z 2rZ tz>‘$ױkQ|,G_>ݹCר*ŎI& w""ڴiS-~32MjcW$U~H!9=f:ˑU[gDw|6mzj& ]ąDKr]_wH?,#}{GhqPk4`)@[H`b.f{FՍPRGDf>9 %`~\*W|bY 5&M]ȃhY.\S@̩94wwџ`Qń>t?J-UdFD?_[0MGVm)h#7i=FX74[@H,ybrQ.=_eON"+aL*ӭ-xEst0 sH2 IDATsTe8/\s% L+9q(W|Qb;5R6ޙ~3E{PjT/SweUۈ1wMM'~2{2IVy?`Y#ǃ@֢ZXP aS4hx4m_wtJ`>i^'2^j9*zqR%z+]c;qaw~$}|';ѝo,c*zY<#ec&19\3wշOF_,M6hR^hEd?sɉKUYȪ˾p>OB[*/k "ݿ~,PS9, i6mF պm>'3l zɬ:Pu=X!'.` h9ThlXż1 c?rQ*wLXžo~UٰiӦzpҁؐ_)ʨ Oψ/=g;}znr!,m4,s3964Ձh0/d_1sJKM1zIͽt5|:<1K>B3fĩY QB2%9`DrxKyiXoZczwVF&;y+V"ʼI/of.ce=#$iL)yՓ7@Fɾ9c#<~ #T|nY»,FZ=OV 28Ecc'b9;ƒAG Uyr N0<WX}Εywz!}xb䎛/1Ko5DU'+BYT^C[Zxj*E?qaSWjVn޼]3;TsyۤtZz[2ZPF!lv]U7ވT3 ~pp }# bћ8^GzHNQw1{D ,) |~%qɲ{d # curߡ4,2<`djϱ=g͞{ϻ78r\2ŠɘfOZ&Ys|,,sq4Ww]&"b+]/8h,pO_Oκǟ U ]ӜVtؤ,#;52\&6x]O)ytE~,jvxۙ$V*Ӌx?:|QAwl<u _#XCJiok@$69LF/ԕKO<ό "ݝ+űg'XIQ9qaYIN\/7Se=Rxj|;|uXg2Z_{u/L$Q'~C"Ir ٽX)j#/HhCUgŴk 6aSk >M(C=M4kTk(6DƶJ%+FcRpC &yȨF,*(,+cOUdλ慰yKA6N u1lYB[ٝs7o,,`Ff 6\Lugz٢/Hb쪻IP?~5R: AE #}t\#ݹRNmx^sί}( k‚WIv$]e;QX}I">ym&GnZBL:u+9t7!ymF KmK6ٱ)`l4v$eぇNqFcq;Cr,"== ¯FRg-sDzu\mG~kS|d-n_8ppD>Q<10Iˈ 7w<]k, !X xh"\L~[R~e/}滰Ɵ6s8^J 1DXιMzŝD2ʅ*;_])#g!B3X4gFx'˩z`lZţ7gGDS9mAILooFsZ_8$͸cI "s=w+Ux8^y,tCg&:M"yz#3}xUp].HEt|彽,x+>/SE?/Ǵ"!,#ULUL/lxG eD$""L/4Rw +b:xDztBn?p9@2UZt|5xJ45OW3vGqj16;N>,E8zpr?E]o)o۫UF-BR&\*J0"l*f} Ary-y[n"l_R$1i])m*RWv[g)sZ/ӈZtB|c$Wȿ8Ro=Q?h|@*7ʓB]g)?ɓϟ?۫}mx)1[` Sٵm}J 5z>s.XHn`P6JJr&Tշ=(QᓦB~$%=X?#XB}: q3A&~xPۚQp~ۆn䮳7#1=&f*־_9GuEeB@$+'wέ~S9(6ك^׏9{KY3L-ٌ!bJN}?untT꽛АiX[ 3 :\ł)`TXoܛ]|l`U ݗu &>88~須"I9T/JNs(4e-BT4R.1u^ӹ&xwXi&VcJ! Drw5L9?cBYIʌPk!װjλ^+ދyG>O/LP_;/||nk῍;hݻ Ξ,6E<Ljȑ~d{yYLcu%&pL>r\ȶYPD<}Ӡ#  fUl"7ZOi^LzFǟNQ(8Tଅ-"|9O]!:y;G{ծIcN0ru>O4jL7 Lb+iCPjbTTuӈ秪 UQA*kS9>yH}ydG'Oq<%eYۙv,xulIH}i T3fėAq}7KO<'b'|ϟ]L;o~)zλ}Qcُj534m>Ϩv7 BXDUKWqVN;XҏzrQ܄`mpa%?^bT%_9[KV%\cj/7kaz;fE c+8_Κ/κz}5Wd 镵<~tԌrC 7|}B|4Gw~>TB ύqnP>EܿᩥO(k;Ji(Z l-f)m!udըPm\#ߪ \@Ͼt:(CXfx|xJҚ֋ i(Tϊi׺P~>t?PdX_zZr{1'G/.~i>~+D>rq,ڵ+!&w;H;JH@36 ij"=O}fZ.Ec:_Tݚ:ia![zɓ'ˍzRC,S2A\O7!lIw463eB8VGsFO:TA *+qu>l,(EtH/I*نG,B!G~{A@K=gf:o.NNI`z묚".{{{XT,^%]kH 4j(y wX6Q=2 G#'+c*R V ^Y OZ_ϿL4i%EoeO''s\+T{Gcp^)o &faD^R{$f KBm6Ly&fZeM2g-$zQDn‰ ?qz*74G控c|fho]{7`}:W=bk}Dq5̌7&"AO sWnw^_R;>y7 \jV8 S(+树vk& VIAF'cl!◶jTe#iOj<2݄f=B}/}󮫃];h=ned'ZvD #8L;E2.Dt{{5zm&4 V}SLQɼ#{\e)qh^5\ gǚljAYN| EcSͻ2 WYNV^Խz;Bc(I @0/k5`ݕUg!lRxrnFaH eTXyʪT7ݠ5,KK~i9L/-8՞g t6E﷮j eAU{l7T<tO9׿}Dkx/Q^Q[bltf;s.:0^B(Ί/*Ju8-<8smf_X<,x1]BYh!9дE ;Wi څgo{~ʫ+dPV:z Ӯ2_ cGNGDο/*E! _b13r"tV+iEd959MB,U?_3BXE ~!+Ѿ+8V@ 915`vЋw>-,K1 n;KHfh/?oT0=}k5C{0ι_I } ק-|KN`/"KO:xo 9,jr¹]?߶k\4.'#v0eua1!ѿQ{%:]kBbQRʼha܏WY6Ŧ?9&0gzTZ^K_?|;\j|~M ^g))A:Pw>7:G}0@ۅ-8lP=1H*z3H ܡy>#5[zw:ՖZ44S(k$1뎞'dd{p79O0| AŒbFڎ50|0bp[=LBG=^B*HDmv03b8zEiY(()omh/箒8LO01-B^3:SH"J*L_ YbKM5Ř|[*|g`Oo!/Z=<jF\~ZADty1t;r^'pUrnjϱtߡazN \:CGdt7a&T2;Bu`P3j.J&3EEOMoҳ#H#46 l9H ^C&sep0'w η'(u EI韸L09⽆ιLPjBpGM?MƗnٓkԆ_ŧ%B*h4 aGY[A(#rh"*f ptDM*>b&ƀB+o/}l Q`Ҟ_+ScǴ_|(}!2XFhY{d HJxx+EDjXu\u2+5C#KTWSA1}Lb91m5otD^Q7%0:MB#b,JGDjy#io.@rOhoH/qiQ@#ՋDFA6RdKlȣőUuTF_+'^nR"Z=r+OS#5q N%|yn;TGVm ![#K /&*Kt6E4k;v}oSÖO+])ukmD_q55hh>s5\gpShOU?T20!GQg~.sl>2̯Cj3H8E:i'-'N0mMϾ׻z6)pGk_:`.ytP]W87qX"szMb0n]:?{ ~-};v}mãI90:$Z}o~ep % v }}a0%o!GVm2{" ?iRq/Z s~Xz4LXҶ`kP$kRt_}וIp?˹,wisBD,-)]LDD-H?.F0`P>^"y}H&1 ӈ<:BV–^1\Oh#"rε9?z|>zfEW ~:v{R%˽wŪF~aݷuA>;)r( ՒR{Vu1 IDATHˡoъiN#n;<:%)@&;tS /;^n[ Կ́1˼r>!U|i[0+m[OA?YGgV9_H!ؑUDTeq %qJX7;rL(Ԍ,Cv7 בMó_ztԟ<9&"nw…Im¤V'`0X3rc~tӼ:G{vLm| )E=Ef'4hv? t=Pq}LŦCj---0[,FޏFH g6~iy$05t(/x2 Sqc LӃ k'͹S_zTg~LD٫}ψ쨬UPL7Fo2U)ɢBw4,/}z&zYB)%}42j({ h SAL{\C7uߦoY2Oƺi!㽛FΛq [MU$3̿Q~ҨoLfF^]ڬ>MX'Pk!ûi9]q?|9a nO>i(e MH66TI˜[p#"ig)3嬠ݠ@[!l~֣fs|ɣV5*yG̻ĄPCmgo@WpO>ȩOvt"*8RW$,  83k;U~MYŅ{✛r>JqPg\]̅MYҴg1U9"P,ٌv2cyjmWN$\m]ۑWM٫}/)(ъ 6IRm䉟}aC1"gtN$aX1Zz};~;&B$%% o6a[EެEeۑI &Ty@,EX#u=vk;3J@{E -̜z꫅>f2fDϖ~i["-B*XIkG#?GM_p6w z4aG}T/|<2C݂ppb 0Hɺ>a ѓI HG~@$?(5 F<6^tgѳX fQxZVAm2:qGT0LHL˺? /Fs/kuV ɇ;~Dd O4F!S̷5E /7$j/YQ x#-BB\ۅi[f I4jzxf\:Z"|=\ڈsDʃDM QscyO,lP܉!l9G(U/f|Z8TՄ XSe_e] :BWfvOU4 f%LR-ń*H!$5}Fxr3  uI.MPA}ɠL&2 -ӞUcu2-$0칫~V1 pVYc(&}Y,1fAZNIjz 1S1LeY,sd}O9<n9l3$/JčȆҝT^_203~7WX칫=w,m`IHuMap!輿<'>baF'd*hyHUп8Y8Ĝ##cҙ?%@BmQF)*8014_4XAɌJǩG21Ӑ\oOy ,&>x}e54v"Uꍭ*h;Tݞ &R`Yj &CU&? eSUo.Ƚ4?<<>O0VOP) T\L W"'/ߋ"O>?,|t^?}붋'8*u|[9`#Ms]]]|9w..3cg|iK{qb& "k&rNXWW?_v׋F9sg~Oߺ'%@~m*2euc~XǘC췠X{D1V}kYJ/U}Y /:n!H?1Uw|zD˜1T" 3#L{Ge]O,|}R JʽyN~4ET忲Q('gv.;0|mAw)E8@7\U)4#Xv擺ߠK­]3$7 dg~yd7?}9dp  \$ Z[RT$ `27FKt( Ii:TB E$2l\$B0K1|s?;n}3ۙݵG?;84QSԚN]е1/?Ow7%gqg/|%?3BpmZƎmHYO;=P9<Z\.o?|GwYq{dP3.iKk߶-/'h1FWo=|Ùmo 4'P5ef,SS&J{"Kr5gP/>v7gy#oG/}I9Aeܾ{?n3 >i֎4RCaL)lWIP5&7AbA͗^J_,Wٰ~U/w7<$xPM6:ʞ:7F1-4n-/v$Kwr~t OyhM?&̓{o맶_| RU:O7/:1PCx5B낲!yZ9rl#^N5𢡄rŷ~u%bSU.WN'OyeeBӷl&qo#'o_;9nlV~vZF F SC]jKsJtVUj~t$*؞r{h=SPȗ櫎dBKWqGc s]D (Њa*2}\o2|L2[݃d,~H Ƥ. .~{Ew_*'RcG{\ĭ|mp:#v%PNW5Y&PZp& m(-3rh.7n9˘ȗ- n"edš*8e`٘鄩zZdްo\rVUqT]gQ~WZk@B7шQQz3's{㨜%R aAw;beqVST6}wG6a@K9=J$;?~]N_A Z,n\!W_y֥vPf *),gRA3+b|q(X _9xEm"7c7%VenZ&}?1rna3nbjZ̽0^KŃԨҎS KB3>~&Mkt2,GG?l{Ge_>_P*`|uZ0 ή *%>;zދIБD>Ib奚 u\神AxK8bh?bwc>{k.K嘚r,*j`@"Qm YՒ~zƢW˯s~\Byޒ*#eY)|lXhBU]`/)rDP$;XN&U:D2kbTsRJ4knD,o/~d?OL6Wc@+:.] R^O 9DEX"UG"V`7.Ygv-Q_%_}h: Ί5eN)q,sq%-ryw/S!Gi7_o¦yE8?שʫ1^=Kp,^XǹF]P\zt4t2?b ?Fԛ* a(Hu?3W]OiNP7^3yj>RKxO~&=$uA:QlC~oW'PGոn_6-˷` nvI͙ǔGJ}QpԨR#݌_>4~Qx=;ڈ\7"#P$~cnW1^e秧Jߎ}|s>@w:=U 1:F;;5vԯ|l"逗U[Q0&\w?pKSsY~.R]+-{5ԙAm"hu,x&yVG,rKZV~On]NL뀤ՃI0&/6R+&D`ԣ@>c ȫ1sKj9eXoZ*jQCg *}Տ`1ۣT"RLV%WNٳt#bS|ŷwa}P)XC& p@UU-phBMe\-t[9Ms|b/MQby'dޠ%}!iG_KOΪiC4ܩ9t2d Ӻ`J_,xzpev3wԎth{3zR.'UZ|o!8Zy7,:rENCHL)\0 6݋No˄鵅(-'ˣF V4~[V[0Md_w@#͢ ?OB */T Gc-,?^=\QKe6=gZ5G8MIn-*obn~ sV){/ffRn+JC0l+؅2?N7kcLZM'D:+kDԌR2B0Ka@ؓqœ#ɪ@Mok'&NXš&&pmAȧSl,4Si?"G @؊@.{r jfH.ES+ƾ4s~K}zG'J{l\Xr"F6O]w-:s"؂ӃQ0?U<#?(oTWS s1QBUWɩ :M. lfw6 %uK> ad4]= k՛&;wn!'%MlX#>XԆzŘgϔ4ʫ&@Y*nk4MIsYU +B( ›WQ[OoJ$sP0M]퍣vȟkV,7a/lvdۅ4XXt#J DžtZ6wvwV0(TSz`s3ejXx3X4;(X$yu\KO硛;ʮ#5v{U UD\05 uAYXkᙌl܎G]/ UIXʪQJwA6 BsE§O/bi!8a\#UBw1h9 Vk\)Xh7T<}E8YƋg;;6녪[PL/)Ͻ$"L#^dϲgBqMi4yc.;9]#lj͝-!8YpO[w_C鋅AG7wv22RN"p ͅ;[2Js ΒKH Z>IDATUcMWLDt37\#ĕ #.puwЈ/ؔ19c5QMuЂ_? O:b؃\Dkkhሩph?wL]YQ%5/zJ3 EA:~Q)Ó,71\#[8-6K2X TSwvd,;'GqoeG'9]ۓY]\7j5XkM)_~$N] n㜋piQP+-]0$TU%O>>YQC6I) znSK71JK;*^~.2oD `5QMݙ 9 TL˕>ӈ' .1"NJihф v/EǢ!Qprgil pzT\r{\~] I˕e"_(Wڪ7S4hDJ JyW[M,9jKP /#ghŀn^y(sXӏ9O*N(2B+LESym>g^(QXM`,هrp# aIYz>? 1c̊"H|G,DK I0}hGG,X@m$IENDB`dipy-0.5.0/doc/examples_built/file_formats.py0000644000373300037330000000222411525644130020770 0ustar mb312mb31200000000000000""" ===================== File Format Friendly ===================== Overview ======== Read :ref:`faq` """ import numpy as np from dipy.data import get_data from nibabel import trackvis """ read trackvis """ fname=get_data('fornix') print(fname) streams,hdr=trackvis.read(fname) tracks=[s[0] for s in streams] """ quick way use numpy.save """ tracks_np=np.array(tracks,dtype=np.object) np.save('fornix.npy',tracks_np) """ it is good practice to remove what is not necessary any more """ del tracks_np tracks2=list(np.load('fornix.npy')) """ huge datasets use dipy.io.dpy * direct indexing from the disk * memory usage always low * extendable """ from dipy.io.dpy import Dpy dpw=Dpy('fornix.dpy','w') """ write many tracks at once """ dpw.write_tracks(tracks2) """ write one track """ dpw.write_track(tracks2[0]*6) """ or one track each time """ for t in tracks: dpw.write_track(t*3) dpw.close() """ read tracks directly from the disk using their indices """ dpr=Dpy('fornix.dpy','r') some_tracks=dpr.read_tracksi([0,10,20,30,100]) dpr.close() """ Number of tracks in before and after """ print(len(tracks)) print(len(some_tracks)) dipy-0.5.0/doc/examples_built/fornix_clust1000000.png0000644000373300037330000002572311525635171021730 0ustar mb312mb31200000000000000PNG  IHDRXX1 IDATxe~'uX(jܹd thp50(&61N0MHgF&w1Ƶ6qIn"6a6v@lݠV6-?'~"ȹ{7<'`,cv_ֿ& ) w.s;;_ڡ"8ЕK<ҺXn;}0toFBYA!=?g/a.>VQgA C![ l7Q !|p+[M2DLC!!\܆DΥw'$>p" Ms7m9wӖ?-eae",P°BͦhAx-S|TJA"AHU_7\*cQmR9/(okV'Zaa !{v3vܰpg ֚]Yب'cG۶*aDB6:s_, X/vdo4<;f=0tJS2ru^#_q`٘S]]}7!4S=zOhW}7o!L-[G.<_]޳>w~"AHMń++1/?~|쯮Ի?Ի?ϬcKB}88zTjvh˄qL4!^um[7o?B}pWUR[mF;wMᶭԻ?Z1:wpSPOJSE=s7m{/'_6op%w?s+Vǖ)o*4qr̊o|%l}:ڤԓo) Vʛ/aq]) !M0tFE{[b.X[{RN?:}h|2e NiKRuؤ@ 5"dBĄR|S7B\zkoICͥ̋`[)㐶.Ԝ dT< s7my`KoYx;\}ne;B_0{"V|Ѿ)ɷasoٺ# +׷q8T.Y88ZFH=ypϹ*29–eyTϿOf{)^BiL+Z, ZX^577ܶut8J Bjoy.. Xo][6P;nwK//~x7KP>qf;[<ga_ mn!Bkt(Y8/D+y\+A FṛCqg.78p%mzZzgw0]0b9z ~o⹛nwhVMLM7NR.t0!uS {rvRWi4\t˲kM6i7Z~fW>Jx(VoC\ylH3Fŋ xytcz)H B&i2r0)Ϭ:s_?o7y5!E`W*ktfo0e084Jg>sq@!,⃎FCW}t`}.G杯O-lٷx jE2 .r0E`VZ>1o|%\^cvٽٺ`(|qɻ(Nӗ]>(Mg[Mw!.S-k6t>*;HO= dA{qk돾E7䚍ݻ1W COSL|Zg'*5,MOߐ_~Rk=ڻBuBػ± ]1:>1eO}upl}x,޼HKcC_&n?6h =m!\ Sνq"N.iAQ:#a8Rm>2/ uaiJse!tżL~=/Jas2/8wl>6R9+Vo;}0<:S2E]n4n0\&^TG.4H-/ Sw44hL)A+\OwuSOGiLي_JDh d2DOntΥwn>Sl!;)QxPY# /ZB8sNy"6]^ a~U~Bӹ =r'`!TXu澞\Od 0"!M?ؓANPԚ ~i>nBhp%/PZ0ێÈ0 .pK<4}4}nF]#BB_̼Ux&?Jh6A@ Bj #Hʙ/ B(e뎎AEWO [^*E}LOp BqTkKPkZէ[ Fa!\T/_~@Rwܳy^?–_"AH}U>4 c77y{yN¼D`YyhN9@B^;nYzO> AEvm iYaw>йm.|LG†nZ+g'F_X>WvP Bh7(\UC'_4|O̻tpAGګ!t"uG~_ERwͯon;zyL+/}% =?DBMat B(*OYkLaah5% AH}uv-2iLʿQ ˄0.N$ק2yՈ0zi@{' 6~)@E)S)Ni4h$AH5:;vg/=}-_r/hLff/cEA\ Eoٺc_i. R2AHMNk>Vz6e B($ a!uQ;eV/uGZ lnިɠ5! ZY=7y{2%™t{gfz 7 ?ھTǿ[y= !˄0HZh2Y-q3{L.L"@Me==ot|B"€ BLDzIk^|:8V/<˄~0gF2 y_i#fZy+& A A hӓ;c; b_4-Vϗ |nCy[鉗ֵwp2! ^ } Cie̶[H a0! 0JJ[f"f`X!V6R>AѼ7^y~P"AHGy_'_}դS_ d2YܣotѦ51cuX&GsN7|hW(( . }8Ptǁk\ L>O]~='dy_4?J+>.vp1Ee2h* U0Hygh NqL8캼;~2! R_t[|s?nh20zXyso(<𲯾(>E‚}>דث-3qh, p Bja[Xcm8ѽF(Tc:H+V7oOGo~v+o)EڞOV;T~?`;{xĂRQX(>LQ)?/XLXcAB(E>2 (E~\SfGKG R9AןO}_fUgK[c⃝KmQ!P^܆<*0I4 (*) !P>,9}/gr?~A1 1ɭzB2bn_󋿞6(,օih^Q2a^񒦔B-A: &EAoatvݾų0Teun-AH7l_˶ ͗FL$4Ks.̛}'p;tcɸw\_~XQd_z)śxCvm߾TȴT安&޾<Ӯ|iԲE!l^S2i4MQ hPNĢp@ & dr"LY/ 'uK:tv]Vsׂ]3>AȄHMљKoMOi~▭;CQ8Gq¯GYLiR:Vqo)E2 N< G\n_jеиA2AKKҪX,E,VB&AģcWF(,Ϛ !lx_  B[j/rlwA |i05?˵`|>ՒQ;AĦ( A؋ R0pllpXY8.)G7HM BU)oNE?lҧR8 +!+ '$( )FKy 8n4 }g3 TA&_?RS4`apL }g x|X!'̗+_eI/ЂBFhA.,<'PI2fbS@XyD|6LR9b SI-PI2~%Bv40YHALR96H?|p#jqZh 4}mA|˾rQnyS4f\ͳPrO06 1>g!+ cp~pxvp_wPnpgS/ b5wCϗKX, IDAT/J~qAh,z)_:kŦܙ0wa t"d|*iz6)5ʨH҃GKy 櫆 j&r4[PMcwCǔNіuj 5ʐB T+`?bfvL-jJf[c Ni|&U?yuJOIHHR(Lunbpӄ㪜!"0Td4°u ͷ>y#'D;)|sDC~)[~^XXG,P pŹha.R78#A}#!3y0?tX8wp, #0aFud, Ӓaq5 EƗ 31g.5-q\TXxsƙq&I0?BH)H4PJ}g7<|!šgM1j'+ eFRC0+yo+;A8*Sp^ R[,AqHF9B)H5°Piք {i0d YYsb_)g>"!e^/xɣ"cLѡ~)]y]XY) I<25O;Y!ޡ >454ݏS0F`aX,q%Wd!)% aHAYA Bšs|blc5@O#NMԐ2! ghy(0BtDa0HaDIAY#G €>#$F0 ,'FW_b}O, !;t,H%O*AЪTq@m8fbڦ4PtNiJCjq% ;!( =Y@iSpD08) ?GM`4K@Q!/!q8@FCBq}J2Q1Y4k WQȉ!ŷ~DPG`!kٲ8EIENDB`dipy-0.5.0/doc/examples_built/visualize_cross1000000.png0000644000373300037330000006477611525635223022446 0ustar mb312mb31200000000000000PNG  IHDRXX1 IDATxy\W,%K1%nQbjAV$^O5%BiZn7-;^P2s$5-sUpK\ʭq3gfa>pgf=<_JZҲ*=lY-gB\nx?_JJR녝=$7>3ː,ې,;S33-?s8w(atiW.8%-3g|@dy0;Z2&c!,g=r=Y^A(.un|lmDW~ S*=nCt|w7$l)sb5:Y޿|z&ksK`&ɉ:7r1 E5Ykpibo߲ExqZ,ǃ,hDANɘ+-]b]9üwez3w#~)B*l˻a4$uoz׽mj_Un!#6-gbEqKI[E?mC~+G8WxFsq'偺ώ&@e+Gl|m\AhYv%5{EǺ)kաj;gFz\[Ǟ>B,>e5qmNѕ(j5)UNV ; _bbSL/zЩG:.[MUoSR=2zSMn9Ƞ BE\? wt1R<ɌI{)KC׸RW}obxjw{9х6OrB?˸xQQX:(s9Uķs*9Yh9 "4XŇYS w8 5px4J?'-[6gMzo%,5ά:ɤ9;BiTOq~ /N{g*6bԨٕ3qSʍ4T<#!Pn-O::XmDxam8m9o߭<\{yknKmY 2T;"S2as6miySȝ0wzC}dd*{3p:Pʷ?u:ua)kbCP?ӱfAy?%RnTVK pӮR2A[u~qϧ̸<]ԅ,fRbN^VN%S;W>3F7PlprHGTFf.Wl"H inCj^pgOj6sq34a{j{`amV/okvvsײ0jivf֎rV..9mB\t Gܻ8\*,1gN^-Zu#QY 6bXL]_K+㞫@eyeÖ Z2&/j>r3/X6gQD *9(wEM'QgާpKq+5w-q;4 EM`SW֞P?H@WWL/ו+&0Bfud [f?6W-~""IP7z *;N?gsT]seB.[,Ԭ&eL^<,[UANAEi2M + 2#>_, }9`akYxDQhΗo%[^VVcأhax$+D70;_DPvTzrh" RRI3])\,8[@(X_1f(keQ|@(/j!Bt;H R, !i)iuӼHfyRJ90YM uwʸ8kdnyaJيU,!W,+WJp؊ndV_#tuQQ+KTjpL4S9O/zUwr*7X~*덍-gBG&.t䗲/ew{+ ԏ.Wp$(sc.ګ%xVo+(o^`qqKޥpzT:mt:]s{ot=yw;t}“rߝ*imZ] \<ǵuquaYDUeL xbyian̐3CsQAh"b|l;Jc-DơX[kk;J̩wQ6Bf>'.p콖7f{-nUc-6bR4oѹm}rZǧ6{mw\sq'ܧPeoF˹+^zmHRP!$om<*ZT_f) t%ojDW_E_Ls2pkVo |a8}}}t~o w߶vY酋_뮹n<=.y\FAPOD)P#ȷQ?C)"0n @E[V׍&?]|" hi[Ayu < G-qX :&ؖ+Xy"Ʀ8͏_hpw+qdf carlo~+^l¡ ƷWj$Zһ~E_Cg9*Fwj}J?:e-O[`toyhJCS`1 ljTo,m<`h+|>PT$D+~=jqxu%-R@œWuk cLK/++ԚSo[;h9!"p]tSB2#* +\.OeBSDܜ3|tJ$.Nۉ`  B4[3dI8z65n]̫Ⴥy+~9_fIa^ϛ=zK+Z+LMh4a{.@$H ġ^:wִK5w9cA0;%xveB}-E?cdfQ8ː,b_?hf})m*GN%ʼn؀/"7@j>Oaw}.R7z+ڧ\ut٣w`4v޳`-vNPdTQU^=2jKKl+,L?dNo1&o~;;:"zކf _;cO|x=/z_{JRrCQ`:(ȱfNWk5JfE'i6z?6¡/ԬO}⩟arSrjȑԛZ`D:):W)8K}|G,7yoGTܴ)hcyRp9yo%F5?5Bى֞s|@ GdE⺠QYΰ0) C-{sؗeV5>*RjӧX։M"|/ʉQ1)*,9za>iKK'tTmipBJ"L} B%1 6XNASV0~/&kIn=@ƉKOMW* %5JrHSDDDDR)bwYDET>>d%} TWٶ@ܢX]7d8deiaȉ n<**\ pmRsAyA;Yv"4iGY*W%^rhۙWDXPj* uKO]ҧP-Tҧp)=[ť;+.uT=mre|RP/s\_;vb[IS-=|diV.}WoY`q)eÖ1 953cjfX;VXas6^Nٜfڦ:gwoHga)BYxf)#[-_B2QLJǒIwË?Yh9W].}W_=o`x۲aˬEcN3sΡ'-+yG`m,Z1'O{pഝR&a𔝃(WSGDQB'9hI9.Os.*N@ʙQ;zD0Ë?_F#G"̎8 W~¡ [73WNKԂfXXdc&63n' }5WQ>oyVٛ>UD]HMUASDɾͣ2Ge7?PM7)`ʠ%,O3b|'`f f"4Ω=vlz,[QzgoXa6Dޜ6tZ} ٰYnxw&.ljDu#{k%[+Idin.@zkZҏĪ٢"=pTٛ!RP-Eȟ"/T#bn翛t)?Rez~%ܩ4U=E'pZ;Kq_U@7~tj]Kz>bܘv tؗi|oV֟ͳl~xg.+. 0[ϝ7 @Y9h{^͉jx: ͫqydMMXV4ӱG؞֨Jۄ.j;Nt+|'+knhS=DD n$G'0/:o5SPԂ EhdNmR,JO3" 7>UlB;T/]1-  "0p{4")HBü$C׎zDdoYs(?t,Fzkȩ?[%E `ֆU=:)8/AԂkk<2{^ZH6I40%0[ŷ3>yV 푢) x׆^0(i6R݌bCd;̓:ؕoWԂl *Bksƞo#uȃD]ڛ{>RʣQ&iVq_D1 ^ix!*OjH\^/UĞ_K;߯Zt#R3af+|4v^egf!Y6wћb̿sJٽg u bD? @LEs&H6g%` e\+̈UW6~7VLf)E3Tlc4[uYT&鶠ρhߺ3{T}"K\` ߯Z\2ϼ'eqW٧-L)@ ~X^ R )6Wg6ytɣy7Cl&Grrq" 4nÉ]}'o+ 6y`di) BviKAoc-ELp0*~Y5xԙTp:՜?j9&. 59?5[A +Od]%QwϿsns>;z?7>PjO{γlSD T)t d)(nQ!_pMG=KC9qx|"@Īuk ((D`c측pr^C#oT*h]y{F}kf3kU'H cDRgj@ĞƯ&*,^oP{ړX@gi?F3>DJAۜ9C\շ:(F/ JG=%K3&dL eψ:%sbτxӪGK˟DE e7~i-ϬWo6ֲe۴0Jҝ2C6 XO"""""""""""""""""""""*UMT\Qҧ@tGť;EAr"[k(2H/(9NGUNr]ݭVVwuIrf_'+ T/`f9[ <-2R IDATg9奐LJNzNpexm 3^3EvłRSTAM#gNw7Mqqnsfh;ȱnKU[~#2i6UIVmpFikhқhwãݍB+﬎2);OqsA:j.8M/E>uFY'B E/U u *tgS`Iz~Ğ K YcjB+l/{o=t:"FD wt 8v}؛>}˼ZYj"'X@ГCOX[p޿|Ww,KYl@dxp:q ď+)GV uloԿ#ݍQ%R?sNdOd֝5ٝ/;"XOAӽiv7>O](Z2)~ kyo&L8'%65|:bJO1g_m8I8=%("#uBp#+篝i7~='|$K;lodxwedsj/Lo=DZ{^o);2?w9l#);qز ʥږ7shߔL5EelR;<Ϧ,l+"imWg*9@ -ܮv_#Vu6-׿`)wS9?N!/*<ٝ*9iFv`d!ilkc4:ԟ:?U:䥒9@]ӈXtbI|qՅEAs0ihfEVBJkDMK[dm齪MU~]qOo3" Ҙ!5̚Q XkXu!O;/RpO [hy6a2ݝ+ , 1:AHDDDDDDDDDDDDDDDDDDDDDDDDDDDDDdA %} DwT\S4&$7*6LW|v#%} TN[̫2% vGR%C QbMNq^_ CNl]it?n&GpѢ V6Pgȱcګt6INlLG)";ZfAz S"&e~_!>XUGdԯ]_qbF'@~;/Pha"m8psfo'.O?"ۊy{ްaF|,zN|>S)Ƹ:5my{;sf1?'ǭ=| yOhP|0q:2FPn7pmÝC !YǗq&CK_En~QRz1):#:0 Gab~-|W{șچ#fe{xU>Kܳu~,W?EQXRx~[`OtW ݯu4r'5OɲF(ŒYf׊Ub~Q*?%i5Tqh PQi,RFn^HpԵ{?7ҷ3S~ S_误{t֍{SC욵zx:k~A&qnd !_?)8t'ClݏfEWk{y~P!)yRi(/ni]Kf\;xr\ ;أ ?`| OԺޛsI_ZXצZʮgzdj^>᮴™;ܶsUg 6@Xa-V>!6.RPX>9ݯu ۄí 5?5η7^69G1N)}rWQ*NXWR tt`V\ eۻ{Svi{RlvOv&:' DF$E_ww~˦xa3^LJ#l7vRH)(~f]ڋ۶6WB4{gԶE [{}x~S)(r~ ]IYۂ ?2s=ZDcAn,߲EgZ6$R b)n\ӐOc]VuJwX1pXH/f+,=rGB5h:O@͝Xh / ?sfc==R'H${+ҷYx͢Fn;mB~Ly#RP #rbtJ4#]4I-6 2(|t(d7ҠxstK sP Bjs\?-3d32J[YRAs3sĬ3, k)H)h4 v7<`Q g3tHDpK$urם0|h b p42iIz Py^w.%J 'NYbْI-&bu#yW"]Br!%&KL4<5|O k2{p1h$::ccniwyZNcYh͒g=X+~ǩ;xY ZݢAtnjHPԧ?6 6eE&kg(^YjiQfYʻCH嘆18PPW3 ϪQz@@1Woc]ov>z?"^~Lyzh, Z2Hz}ٷ2.! ċ;MyvH͘$usiݵD vfK u}Dʭ7O9xJI"`VǟXDDKxLo2_X@yӡ>D`3TDb+]䝭PLKty88uY;@z^~\s %ⅣTtWDUUH},ISs6hp#^'. &)xޥ-`tnQsmg"GMf8o ];>;1ta>f^=wRO08̷{fSԳ!  "v˸ie>6Ρ'1{|:xN 6yCwN؉?Q#E?-#i͸&k+. pnt`Y=Y_:PNܶ?@'4@Þ #o_<voRPVDPq];&"zgUN[O׷։@c A4&\^ i"ftE `O^fZ8m4iyy2rқwRL& yШc0l,?Վ93ֽ1fחWkwԷkt25n?qz}ZϔߖO;yk8smZ ; 1I.W?9TSG/KD >xy@A vKR~)~E9mQΡ'uΈ N\|3F< ^Y)8fuAy9QP{e_2s9{:bg?>(̘9a=nj?q=k%[v"})X7 ,<`oIs}9,)hf]¥|grpr_ wO*>Joԩ& Nc:*@N5<ԵSL*^(6VM]Jǒx-I Ys=C |ɽM{Шcp L vY>}{75ў+u}#r|PmLOtGlOm<+mcM_rbTlx{zwY87އ~\fv9YIS'_6H)(Mi-ɣ[R~ `pG{<(ew6~W}G[ÞyS҅ɚyj-8Li%6藘`ÁNm4Ӵ-wlӿc^LV;Pec*zm͘P +7^}i^OTɲacf]5SpBƫyW"N:-M)-Eըh줟c+\ɳc E]w.|͂Zw+wM2uw=y  -,?o~) 7&d[n1v\ VSGڦ̷ ~= / @}I^'}X11lC}ĨcS痲Xd!dO>t=9(yiP>\ 5[RCgC}*HřC}7%Ʈ-%hHNVX&R(L%=DgYHe!*!!g!g2 B""""""""""""""""""""""""Ň Jݘay_,q/k9ؘw/6Z &ĉKn 4*nzw@F``-`,X|#~3soD.V,-WwݛۆYND)&7ʌ$uϪz1wuU["wI-"^o|꠻7cXĜQw,n%}.wcS#e5: Q͞QgP> qoT^ԫ.I)xJ=)`SqZ~̴ [!RPj*Ԭw6sI")x.Rza֢yk-r-?oUChNٲ1&XR;w(-tuo+v[/gBτhR ;pVʿU}STXE^U[ɨP5q@縚}Bֈpw HJzNqǪܚչ;GqUbz[uhy9vmI^WIUS"3ӺD^z-7§wEе닍==n4Z<2C"y!( => IDAT /wկ$G }~R R[x?:yAO{*hL~Њ[v禧_zx+|8P8bZލ|}{Bigx;D%ȫ@1-{+֗ZIŁrzf|nau98t?& XwFrkEPj΂jN3_HT |Ky} y&VqŞ{SmL/eZp#ՉܔcHJAܼ"agF$u2Ӻjp5^t. ػ(b7<֪obGܺ+ܦ &ST`܀B=ŖA{Xʟitp{4.ظU:(JHA?OTؖUK{X#b'ĐOTC&n-< +o3.)Xea)3)|~;1U1' 7?wn|i~Q0`IQb;UndȷKg /}:oJ(&H{N~y=t?>GWzF&nؗ{9@q稶sM4|ڸil~1I>XH\e Nmivx#/F|F?C"!)#;xJiГCOBv?,9QR[]U7 Mn'pћbtO힖m<;%xvJp>m}oO=_1cbxq:4:4wʃ 7|ckHMbvTGf˃N,r5B:wTX./#U s@JEA"LQʫ=K?TU92rD.ŕ]YP?g8{eZesV}˒zOQ;?_SǍ<;vlr湊㎚.F}ڑ@Ϗs: J"QHhւN&~Tij?J.qb/mHYq!Az]eoY':x;y~=x%9!KKGDm2tGyvyC_SʫKG[4틈[c9h U8cP3R#Y^"m2,\#jGID*!PPJG!AGtB 4E* EQ*~*MNƳXÝb'~;Zd~B6;jB A(HAH+ TR{b^,LBE!Qš %} tרp)¥Isa*cx+nIj BXXL؎E+-\^ijV-HF ~)RoXbZRGeo[ȕ"SX"s V1ڧAF옷Gx(ʚ5fA]_na ɍڜ9gb%R'FfBk XQąIm~b>G^udjxhYE+Wהwpۀ넟QLK|?cb]. Bu&m=S FnMNNR)a[Τ!~n r.V0JxfQWiө(hǨ/"ֿ? lkG@^r|T/zCkMsy oX'q# ԏ>4FNmkf#O\*zt7 4eMX8h1qh޽?5o({ȿ3 13#&JR6/HAu3eOn*Hb1"΄xP7)Q4AbHwٵViUdFNU9yQ9M}3J36?:@C"C)?fTM?mD?򛸈xpx>rSxlyq#m_v&tVz\lv9Θ:nWuM`n t)("Pڕ&E>۫>Z|65'T bφƋXґ-~)8/B91wdDD^@}tLUdE;俩=jp/0$6nr+@ن|P?RUPџ8u$ zEgyG9hStW"թi|H Y#%Y߯ BPg N(k\`|,g^m{ {TZ06?)h{G <|W-220"ޖ%q0Qwjmx",sĘn}?G:(RڅBPQM*|c3`FTdOِ:qo_?Y3Cn:{,QdDDDox;~Q&0E-( G(G/V>)յ[!/5g,>5?ӭMi:*> l,SUBst\u2)(`&̎~բx[mm-_s˒ O9KmϾ~CA31_!?.jprpĘn"lmY=hbg4Xt R QE~noE PRPzGf `6Ns߳h>Iƛ LtzPbj&NT:iΑ7<\ӻ٢mh{zkY&uHLD!@^ۡ&OA(H4HQ)3<<BW3u3[ }TP1Tf8օ/6L|,eqnُNZw͟- E~GVw?mh %~ܺ;eGSomRٯa(XfC|Z&Y=bQ7D 9Pѿ@oWteQ"LuzQ#ŐbF"M0'}2`t]soFě4R^#֢kAbЩ;Myh__Ѫ ç"=ûHv'Eѱ]6; jeBE9(SmQCiSJfRKa^%HGsz/fdOdZ8UA(w+V(uZ~p-z {qlq\t]8[cç0"f!D9mn^0zR uq=ҸkpܲG QS7YY _ DAJ9D[^B r)RP* ufGk)>aܞI =.~b3!gBFMz72)WgfKzG=4weNGtk\D36 #O;y[j$i'.pWzid0Sc;.=`jWTf{^єJt,|ڸ? 0("bP:>1]9ȿƭk9VMRL/}5:g6zL1kf^yǤ |g}lTQRo}m`KӶ8.gF<*lW_dƻ(lhܛ˃6Ǝ՝LNBP:)S?7qY@Qq/ _P-\, 4:* qDqh֐!`FI@diA$*d氉 $Fna ; ,.d;0 1QlA28c8qa^rI-OTw0)mZYL:20dfv=(RDs2q 6yG3'[:xɦ./KGo\oBG;r,Q?Wf-{3 Mf̛yTb1 |=@DƯr/rQTsG ;;fCu:Y;}AdUBu4T}:1c'oVoV)^2Ey1/ĞLG.?{AiUn~ۯ^tOi})y]H׋,[mo;~ӑ*dψK/ 4EM T,=$D ڏ0TTf̹HFtj\^c8i,=Ėa+>;,q"}E,8AR(p✼!"{G{Z;*g&="B aU.PSBUPDlꮎ|ˍX>TR0ڝ."ПFPaeYŘj@rFKr~c% a-p9bY.礤_p)-zh0p/%5?0}ܒs褞5~އ>x&Pt/m]:aTyڡM͏ApS6}b_89<9eo5r%@a^eTY/GM rF={qgZ ͵v#}}n~ҼGy^-ȦMעӣfUԊ+n8^XФP8}Pc)c;U;]//LW*ndaPp^x ԋS^ǭYaH[ҪS_AE乣)TdN۵gՐOŗ sϋ-7uACHu2wN}= CќjbZ\ג+7uToCV@ݍZ!i$=BtO^=s(D/Ѕɛzp"b^aih*6Py${׼;tDM޾qwUAS ^>_D0`33)&Rѽ빞R{Rom*kum^㏷5V O$MBqb8jQzd59| CG+!"HsʇЮ'e/u5W<$" 6:GzK$".A=tW.6,.S['oؾeI)5]E}=o.??ݫrNj+ߝWRp*>ol[cRE0-gd8vb`8@;'B2LTQ$dץv7ioym/},5OD cOG׾Qk+"b ݸC<;rڪؾrplIi myoQDƌM h;?km{2zwǶU.T֛/O}'bK2 B\eU,Yj"L U Nm PDzƟs`I'.[/4aø{FyܲtB}3LF$uw]64Kt/{w[\#l%N6q9s_tvWlǟz73UDdN\D >Ȟ^cSߕD^ 6 l+/RѥԇՏA("f#e[Mw}KF=M1M$TswhiRpbD6u| <<>T'c+8k[==-A1#HF2d6^^T9mQE}i>k."Sf KW 7M<"P`(f(cRdə{uY4L[qS Io*)< ,أJWC* T -Ax *H>{e ֓ b>jy鰖/{ZtGzfKQ$I/[{z1_G:?l 6,4S~Jz~gə{G[iP>e[tTBҾc}ksU^D&P/GA*w ?c=tc/ 0Hwۀr!\t]/զ $&qμM1t}k[3=󕏳KAe}3s.q͓"MSRG{b ^[2մ)t_7L :V \ZdܬQ><xaGj#KO"ڱs褞WtߊӒ!^۞G# 7{mPƓ(Q#[|''gd4ʹeDTU7_Z,ԑ7uzM >"".#d@Pq.v?:Z!o^ofHM7$,>s-;}wq$KIDBDTN֪#v|#5uzɟJd ۙty={HATw[r&)즭zj#0͔{<A`&n; ?Tgs2T,u y*~.½&ԘI><B,q) t}mveG#Xخ;^ڰgoM ShJYYM"> VLD:*c?ҹ;'DD-Ϟ"|gs2#ǎTa"6yf!3lh?HD2`<,-qB'}cl{=`x57FĠUY蛽@Dѥ{,хFTF9>ܘ|K$fq)`F-` f,*y1*ͩ14TCFZ3B2 Safkkٍ6)DCVJR62Lf1̎l;"IENDB`dipy-0.5.0/doc/examples_built/aniso_vox_2_isotropic.py0000644000373300037330000000150111525644130022634 0ustar mb312mb31200000000000000 """ =============================== Anisotropic Voxels to Isotropic =============================== Overview ======== """ import nibabel as nib """ resample """ from dipy.align.aniso2iso import resample from dipy.data import get_data """ replace with your nifti filename """ fimg=get_data('aniso_vox') img=nib.load(fimg) data=img.get_data() data.shape """ (58, 58, 24) """ affine=img.get_affine() zooms=img.get_header().get_zooms()[:3] zooms """ (4.0, 4.0, 5.0) """ new_zooms=(3.,3.,3.) new_zooms """ (3.0, 3.0, 3.0) """ data2,affine2=resample(data,affine,zooms,new_zooms) data2.shape """ (77, 77, 40) Save the result as a nifti """ img2=nib.Nifti1Image(data2,affine2) nib.save(img2,'iso_vox.nii.gz') """ Or as analyze format """ img3=nib.Spm2AnalyzeImage(data2,affine2) nib.save(img3,'iso_vox.img') dipy-0.5.0/doc/examples_built/fornix_initial1000000.png0000644000373300037330000001262211525635162022221 0ustar mb312mb31200000000000000PNG  IHDRXX1YIDATxvPtW/>PE )b^նl#8h-}]+}6Y@\c NY~/@RTǝ$P [ WSmY}'<B{ N"p *l5o8ٽxDԬ EBؘj> ߊpH&n) ?uX! CY1,KA(Hک-㟛נZS3)O-j\brRWzlKUC|P'AHhpz"rAHt@ZbHiC(N4~oD)JeIBJtgd BZlT\&AHPm#*`ErD&nfJ&x{:@Ѳi=`0.> eΒ"!AySO 4c F"f˾ISTw!,AH\CT.lU6]N5c3`F^}U1@p*̿"HGF( C|葕F:"$iDwȔQdzڞOE%༚v=q $Y?ЌtѦ1jM~f` P!!g/𲌉UY TD}`yg  B\َ?S)HL͇ɬ7-tPl{iO  $6RGc\4,\QWg9ozh/i`\4f!LEH.Rp0v [24$[_?$nEps ?YY> ٛJQ]8}eb@ g{MC6kIJ}tnhyT- e B:9L47ku(\2.lsPY&d 2fse*8چTNҧuV;2][('ަu&T B:Eh\[|P [hp4\ @Bbi.ֳ!}k+8y];?DҳETsmJ,~.=S(HBz!#A 8RFFB3 21/klsa'}P>eIѲ7gs] \#|g2}p#+A!}*^̝^>ms}|PYq$iT m Ge BB/$0P  4AŨ!~P  4A@hOBp0b&Mқ]c8A@hTi  4A@hAs(&M ´BY  4A@hlFB(<\ECY!f%0MP  4Ai!K+%$TBNfjh!?M  4AHPU6  B(.VU]!HAW Bl(AHtwHzA! ! B⪭4 EBCALXj! BBk-U5j B<qB y $(f %B((%^䜊"e%N  4AMopjn?EQRA(!\4ΛRs5J5-:_}AmFEU4A9g?h $窴̀CA t.@ +9?fcVYGL7!@TrP AH๐CxkY,=Yۀ!ꟛsOhA B"EMB(F C !݉"o\]X[(^Ϯũg s!m;"Z߽kH'AHOVRrQ( !MҼ;wVRxߩ3jƠI`'> BH4JxÁ>BHA {!o½>.ËB=WN:e! !-98}~J\~jB4TVqx6R1_#!mXT{+E{/3I?wǗ S7Y<>wsh/̹\ x[9> =t~9G'TD~ssGAiHHu*u<5.$:ٛ#aq e~LA#O1ѐ8Sźj3r0Ai?zfw5 1M66-"x7o&LGq+B0=_^9x\Д1K tC(L=Sp0>6-et xۼKISޗ%ɼt@E{bU JW f44B^h]w/>;(x [D"7ǂm.1PNDY#)8C!1dyN#g죲d iGk3—E( ŕJf7;)Z,vk6 #ey r|}fN8XG.W ltϥIq7^4ҢP1%7I e5R#eWNin#\\xgB Y65W!% a5~Ōo>^q4\O~ Qѣ͡8yA޵}Jl]̅?l=p =kӃ(tSpΫںkJΑ Spon'C4u ޵psAi\a 7^{ Xg $oi8xꢘYxyh׊polp9颀A8ʧn^(.{p%]* R1߽zDk AxyD{StKYx9ׄ!q)dyh4+ y D.pdM&]ps*nȩ,LψSq8eX*UMpn2k7 {N^X\x@ZB 5U/l ,lyѨRYwiKýJY?)ׅz$&gY5gb{}"t)Ҍ:_e*9XsBK/7T AڒkW2{\/ ōz܌CxUP ҺW83.gB*k8d"(,L0.e5;F9e<7ByrڛPOP-"7簧N4} Q{tIm@|\[#Aߞw4wݩKb6ǂ@bzp+YpF;?4=9xLͽ7κ;b6?#AX?aݔĞ8MJOs3̑ 05fsl) ӋwAzރ!\K~n09gj ©m4Bp}ペqxtmp;#gaP h/ _ܼRғ5{笷-0w-tn^ :ϴSdjBtBh^~G|*} TGhT~L\,dD B^A6D d!N| `. This same script is also included in the dipy source distribution under the :file:`doc/examples/` directory.