├── spectra.png ├── README.md ├── .gitattributes ├── FPvisualization.html ├── links.csv ├── .gitignore ├── PSFPs.csv ├── PSFPs_processed.csv ├── css ├── style.css ├── sliders.css └── jquery-ui-1.10.3.custom.min.css ├── FPparse.py ├── PSFPs_bibliography.html ├── PSFP.html ├── index.html ├── FPs.csv ├── FPs_processed.csv ├── FPs_bibliography.html └── js ├── fpvis.js ├── psfpvis.js └── jQRangeSlider-min.js /spectra.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kthorn/FPvisualization/HEAD/spectra.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | FPvisualization 2 | =============== 3 | 4 | Visualization of fluorescent protein properties with d3.js 5 | 6 | index.html is the master webpage. 7 | 8 | FP.csv stores fluorescent protein data 9 | 10 | FPparse.py processes FP.csv to generate a reference list from the DOIs in FP.csv 11 | 12 | processedFPs.csv is generated by FPparse.py 13 | 14 | bibliography.html is also generated by FPparse.py 15 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | *.sln merge=union 7 | *.csproj merge=union 8 | *.vbproj merge=union 9 | *.fsproj merge=union 10 | *.dbproj merge=union 11 | 12 | # Standard to msysgit 13 | *.doc diff=astextplain 14 | *.DOC diff=astextplain 15 | *.docx diff=astextplain 16 | *.DOCX diff=astextplain 17 | *.dot diff=astextplain 18 | *.DOT diff=astextplain 19 | *.pdf diff=astextplain 20 | *.PDF diff=astextplain 21 | *.rtf diff=astextplain 22 | *.RTF diff=astextplain 23 | -------------------------------------------------------------------------------- /FPvisualization.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | Page Redirection 10 | 11 | 12 | 13 | If you are not redirected automatically, follow the link. 14 | 15 | -------------------------------------------------------------------------------- /links.csv: -------------------------------------------------------------------------------- 1 | state1,state2,lambda_sw 2 | kaede_1,kaede_2,380 3 | kikgr1_1,kikgr1_2,365 4 | pscfp2_1,pscfp2_2,405 5 | meos2_1,meos2_2,405 6 | meos3.2_1,meos3.2_2,405 7 | psmorange_1,psmorange_2,480 8 | mmaple_1,mmaple_2,380 9 | psmorange2_1,psmorange2_2,489 10 | mclavgr2_1,mclavgr2_2,405 11 | mkikgr_1,mkikgr_2,390 12 | pagfp_off,pagfp_on,400 13 | pamcherry1_off,pamcherry1_on,405 14 | patagrfp_off,patagrfp_on,405 15 | dreiklang_on,dreiklang_off,405 16 | dreiklang_off,dreiklang_on,365 17 | rsegfp_on,rsegfp_off,491 18 | rsegfp_off,rsegfp_on,405 19 | pamkate_off,pamkate_on,405 20 | mirisfp_g_on,mirisfp_r_on,405 21 | mirisfp_g_off,mirisfp_g_on,386 22 | mirisfp_g_on,mirisfp_g_off,486 23 | mirisfp_r_on,mirisfp_r_off,546 24 | mirisfp_r_off,mirisfp_r_on,446 25 | dronpa_on,dronpa_off,503 26 | dronpa_off,dronpa_on,400 27 | mgeosm_on,mgeosm_off,503 28 | mgeosm_off,mgeosm_on,405 29 | dendra2_g,dendra2_r,480 30 | rsegfp2_off,rsegfp2_on,408 31 | rsegfp2_on,rsegfp2_off,503 32 | pcdronpa2_g,pcdronpa2_r,405 33 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ################# 2 | ## Eclipse 3 | ################# 4 | 5 | *.pydevproject 6 | .project 7 | .metadata 8 | bin/ 9 | tmp/ 10 | *.tmp 11 | *.bak 12 | *.swp 13 | *~.nib 14 | local.properties 15 | .classpath 16 | .settings/ 17 | .loadpath 18 | 19 | # External tool builders 20 | .externalToolBuilders/ 21 | 22 | # Locally stored "Eclipse launch configurations" 23 | *.launch 24 | 25 | # CDT-specific 26 | .cproject 27 | 28 | # PDT-specific 29 | .buildpath 30 | 31 | 32 | ################# 33 | ## Visual Studio 34 | ################# 35 | 36 | ## Ignore Visual Studio temporary files, build results, and 37 | ## files generated by popular Visual Studio add-ons. 38 | 39 | # User-specific files 40 | *.suo 41 | *.user 42 | *.sln.docstates 43 | 44 | # Build results 45 | 46 | [Dd]ebug/ 47 | [Rr]elease/ 48 | x64/ 49 | build/ 50 | [Bb]in/ 51 | [Oo]bj/ 52 | 53 | # MSTest test Results 54 | [Tt]est[Rr]esult*/ 55 | [Bb]uild[Ll]og.* 56 | 57 | *_i.c 58 | *_p.c 59 | *.ilk 60 | *.meta 61 | *.obj 62 | *.pch 63 | *.pdb 64 | *.pgc 65 | *.pgd 66 | *.rsp 67 | *.sbr 68 | *.tlb 69 | *.tli 70 | *.tlh 71 | *.tmp 72 | *.tmp_proj 73 | *.log 74 | *.vspscc 75 | *.vssscc 76 | .builds 77 | *.pidb 78 | *.log 79 | *.scc 80 | 81 | # Visual C++ cache files 82 | ipch/ 83 | *.aps 84 | *.ncb 85 | *.opensdf 86 | *.sdf 87 | *.cachefile 88 | 89 | # Visual Studio profiler 90 | *.psess 91 | *.vsp 92 | *.vspx 93 | 94 | # Guidance Automation Toolkit 95 | *.gpState 96 | 97 | # ReSharper is a .NET coding add-in 98 | _ReSharper*/ 99 | *.[Rr]e[Ss]harper 100 | 101 | # TeamCity is a build add-in 102 | _TeamCity* 103 | 104 | # DotCover is a Code Coverage Tool 105 | *.dotCover 106 | 107 | # NCrunch 108 | *.ncrunch* 109 | .*crunch*.local.xml 110 | 111 | # Installshield output folder 112 | [Ee]xpress/ 113 | 114 | # DocProject is a documentation generator add-in 115 | DocProject/buildhelp/ 116 | DocProject/Help/*.HxT 117 | DocProject/Help/*.HxC 118 | DocProject/Help/*.hhc 119 | DocProject/Help/*.hhk 120 | DocProject/Help/*.hhp 121 | DocProject/Help/Html2 122 | DocProject/Help/html 123 | 124 | # Click-Once directory 125 | publish/ 126 | 127 | # Publish Web Output 128 | *.Publish.xml 129 | *.pubxml 130 | 131 | # NuGet Packages Directory 132 | ## TODO: If you have NuGet Package Restore enabled, uncomment the next line 133 | #packages/ 134 | 135 | # Windows Azure Build Output 136 | csx 137 | *.build.csdef 138 | 139 | # Windows Store app package directory 140 | AppPackages/ 141 | 142 | # Others 143 | sql/ 144 | *.Cache 145 | ClientBin/ 146 | [Ss]tyle[Cc]op.* 147 | ~$* 148 | *~ 149 | *.dbmdl 150 | *.[Pp]ublish.xml 151 | *.pfx 152 | *.publishsettings 153 | 154 | # RIA/Silverlight projects 155 | Generated_Code/ 156 | 157 | # Backup & report files from converting an old project file to a newer 158 | # Visual Studio version. Backup files are not needed, because we have git ;-) 159 | _UpgradeReport_Files/ 160 | Backup*/ 161 | UpgradeLog*.XML 162 | UpgradeLog*.htm 163 | 164 | # SQL Server files 165 | App_Data/*.mdf 166 | App_Data/*.ldf 167 | 168 | ############# 169 | ## Windows detritus 170 | ############# 171 | 172 | # Windows image file caches 173 | Thumbs.db 174 | ehthumbs.db 175 | 176 | # Folder config file 177 | Desktop.ini 178 | 179 | # Recycle Bin used on file shares 180 | $RECYCLE.BIN/ 181 | 182 | # Mac crap 183 | .DS_Store 184 | 185 | 186 | ############# 187 | ## Python 188 | ############# 189 | 190 | *.py[co] 191 | 192 | # Packages 193 | *.egg 194 | *.egg-info 195 | dist/ 196 | build/ 197 | eggs/ 198 | parts/ 199 | var/ 200 | sdist/ 201 | develop-eggs/ 202 | .installed.cfg 203 | 204 | # Installer logs 205 | pip-log.txt 206 | 207 | # Unit test / coverage reports 208 | .coverage 209 | .tox 210 | 211 | #Translations 212 | *.mo 213 | 214 | #Mr Developer 215 | .mr.developer.cfg 216 | 217 | #misc 218 | js/ga.js 219 | -------------------------------------------------------------------------------- /PSFPs.csv: -------------------------------------------------------------------------------- 1 | UID,Name,state,type,lambda_ex,lambda_em,E,QY,brightness,Aggregation,pka,initialState,bleach,mature,lifetime,DOI 2 | kaede_1,Kaede,Green,pc,508,518,98800,0.88,86.9,Tetramer,5.6,1,,,,10.1073/pnas.202320599 3 | kaede_2,Kaede,Red,pc,572,580,60400,0.33,19.9,Tetramer,5.6,0,,,,10.1073/pnas.202320599 4 | kikgr1_1,KikGR1,Green,pc,507,517,53700,0.7,37.6,Tetramer,7.8,1,,,,10.1038/sj.embor.7400361 5 | kikgr1_2,KikGR1,Red,pc,583,593,35100,0.65,22.8,Tetramer,5.5,0,,,,10.1038/sj.embor.7400361 6 | pscfp2_1,PS-CFP2,Cyan,pc,400,468,43000,0.2,8.6,Monomer,,1,,,, 7 | pscfp2_2,PS-CFP2,Green,pc,490,511,47000,0.23,10.8,Monomer,,0,,,, 8 | meos2_1,mEos2,Green,pc,506,519,56000,0.84,47,Monomer,5.6,1,,,,10.1038/nmeth.1296 9 | meos2_2,mEos2,Red,pc,573,584,46000,0.66,30.4,Monomer,6.4,0,,,,10.1038/nmeth.1296 10 | meos3.2_1,Meos3.2,Green,pc,507,516,63400,0.7,53,Monomer,5.4,1,,20,,10.1038/nmeth.2021 11 | meos3.2_2,Meos3.2,Red,pc,572,580,32200,0.55,18,Monomer,5.8,0,,,,10.1038/nmeth.2021 12 | psmorange_1,PSmOrange,Orange,pc,548,565,113300,0.51,57.8,Monomer,6.2,1,,96,,10.1038/nmeth.1664 13 | psmorange_2,PSmOrange,Far-red,pc,634,662,32700,0.28,9.2,Monomer,5.6,0,,,,10.1038/nmeth.1664 14 | pagfp_on,PA-GFP,On,pa,504,517,17400,0.79,13.7,Monomer,,0,,,,10.1126/science.1074952 15 | pagfp_off,PA-GFP,Off,pa,,,,,,Monomer,,1,,,,10.1126/science.1074952 16 | pamcherry1_on,PAmCherry1,On,pa,564,595,18000,0.46,8.3,Monomer,6.3,0,,,,10.1038/nmeth.1298 17 | pamcherry1_off,PAmCherry1,Off,pa,,,,,,Monomer,,1,,,,10.1038/nmeth.1298 18 | patagrfp_on,PATagRFP,On,pa,562,595,66000,0.38,25.1,Monomer,5.3,0,,,,10.1021/ja100906g 19 | patagrfp_off,PATagRFP,Off,pa,,,,,,Monomer,,1,,,,10.1021/ja100906g 20 | mmaple_1,mMaple,Green,pc,489,505,15000,0.74,11.1,Monomer,8.2,1,,,,10.1371/journal.pone.0051314 21 | mmaple_2,mMaple,Red,pc,566,583,30000,0.56,16.8,Monomer,7.3,0,,,,10.1371/journal.pone.0051314 22 | dreiklang_on,Dreiklang,On,ps,511,529,83000,0.41,34,Monomer,7.2,1,,120,,10.1038/nbt.1952 23 | dreiklang_off,Dreiklang,Off,ps,,,,,,Monomer,,0,,,,10.1038/nbt.1952 24 | rsegfp_on,rsEGFP,On,ps,493,510,47000,0.36,16.9,Monomer,6.5,1,,180,,10.1038/nature10497 25 | rsegfp_off,rsEGFP,Off,ps,,,,,,Monomer,,0,,,,10.1038/nature10497 26 | pamkate_on,PamKate,On,pa,586,628,25000,0.18,4.5,Monomer,5.6,0,,19,,10.1016/j.bpj.2011.07.049 27 | pamkate_off,PamKate,Off,pa,,,,,,Monomer,,1,,,,10.1016/j.bpj.2011.07.049 28 | psmorange2_1,PsmOrange2,Orange,pc,546,561,51000,0.61,31.1,Monomer,6.6,1,,210,,10.1021/ja3034137 29 | psmorange2_2,PsmOrange2,Far-red,pc,619,651,18900,0.38,7.2,Monomer,5.4,0,,,,10.1021/ja3034137 30 | mirisfp_g_on,mIrisFP,Green,ps,486,516,47000,0.54,25.4,Monomer,5.4,1,,14,,10.1038/nmeth.1477 31 | mirisfp_r_on,mIrisFP,Red,ps,546,578,33000,0.59,19.5,Monomer,7.6,0,,,,10.1038/nmeth.1477 32 | mirisfp_g_off,mIrisFP,Green (Off),ps,,,,,,Monomer,,0,,,,10.1038/nmeth.1477 33 | mirisfp_r_off,mIrisFP,Red (Off),ps,,,,,,Monomer,,0,,,,10.1038/nmeth.1477 34 | mclavgr2_1,mClavGR2,Green,pc,488,504,19000,0.77,14.6,Monomer,8,1,17,27,,10.1016/j.jmb.2010.06.056 35 | mclavgr2_2,mClavGR2,Red,pc,566,583,32000,0.53,17,Monomer,7.3,0,175,,,10.1016/j.jmb.2010.06.056 36 | mkikgr_1,mKikGR,Green,pc,505,515,49000,0.69,33.8,Monomer,6.6,1,,,,10.1371/journal.pone.0003944 37 | mkikgr_2,mKikGR,Red,pc,580,591,28000,0.63,17.6,Monomer,5.2,0,,,,10.1371/journal.pone.0003944 38 | dronpa_on,Dronpa,On,ps,503,518,95000,0.85,80.7,Monomer,,1,,,,10.1126/science.1102506 39 | dronpa_off,Dronpa,Off,ps,,,,,,Monomer,,0,,,,10.1126/science.1102506 40 | mgeosm_on,mGeos-M,On,ps,503,514,51600,0.85,43.9,Monomer,4.7,1,,,,10.1073/pnas.1113770109 41 | mgeosm_off,mGeos-M,Off,ps,,,,,,Monomer,4.7,0,,,,10.1073/pnas.1113770109 42 | dendra2_g,Dendra2,Green,pc,490,507,45000,0.5,22.5,Monomer,6.6,1,,,, 43 | dendra2_r,Dendra2,Red,pc,553,573,35000,0.55,19.3,Monomer,6.9,0,,,, 44 | rsegfp2_off,rsEGFP2,Off,ps,,,,,,Monomer,,0,,,,10.7554/eLife.00248 45 | rsegfp2_on,rsEGFP2,On,ps,478,503,61300,0.3,18.4,Monomer,5.8,1,,20,,10.7554/eLife.00248 46 | pcdronpa2_g,pcDronpa2,Green,pc,504,515,100000,0.83,83,Tetramer,5.8,1,,,,10.1021/nn4060144 47 | pcdronpa2_r,pcDronpa2,Red,pc,569,583,105000,0.68,71.4,Tetramer,6.1,0,,,,10.1021/nn4060144 48 | -------------------------------------------------------------------------------- /PSFPs_processed.csv: -------------------------------------------------------------------------------- 1 | UID,Name,state,type,lambda_ex,lambda_em,E,QY,brightness,Aggregation,pka,initialState,bleach,mature,lifetime,DOI,RefNum 2 | kaede_1,Kaede,Green,pc,508,518,98800,0.88,86.9,Tetramer,5.6,1,,,,10.1073/pnas.202320599 ,1 3 | kaede_2,Kaede,Red,pc,572,580,60400,0.33,19.9,Tetramer,5.6,0,,,,10.1073/pnas.202320599 ,1 4 | kikgr1_1,KikGR1,Green,pc,507,517,53700,0.7,37.6,Tetramer,7.8,1,,,,10.1038/sj.embor.7400361 ,2 5 | kikgr1_2,KikGR1,Red,pc,583,593,35100,0.65,22.8,Tetramer,5.5,0,,,,10.1038/sj.embor.7400361 ,2 6 | pscfp2_1,PS-CFP2,Cyan,pc,400,468,43000,0.2,8.6,Monomer,,1,,,,, 7 | pscfp2_2,PS-CFP2,Green,pc,490,511,47000,0.23,10.8,Monomer,,0,,,,, 8 | meos2_1,mEos2,Green,pc,506,519,56000,0.84,47,Monomer,5.6,1,,,,10.1038/nmeth.1296 ,3 9 | meos2_2,mEos2,Red,pc,573,584,46000,0.66,30.4,Monomer,6.4,0,,,,10.1038/nmeth.1296 ,3 10 | meos3.2_1,Meos3.2,Green,pc,507,516,63400,0.7,53,Monomer,5.4,1,,20,,10.1038/nmeth.2021 ,4 11 | meos3.2_2,Meos3.2,Red,pc,572,580,32200,0.55,18,Monomer,5.8,0,,,,10.1038/nmeth.2021 ,4 12 | psmorange_1,PSmOrange,Orange,pc,548,565,113300,0.51,57.8,Monomer,6.2,1,,96,,10.1038/nmeth.1664 ,5 13 | psmorange_2,PSmOrange,Far-red,pc,634,662,32700,0.28,9.2,Monomer,5.6,0,,,,10.1038/nmeth.1664 ,5 14 | pagfp_on,PA-GFP,On,pa,504,517,17400,0.79,13.7,Monomer,,0,,,,10.1126/science.1074952 ,6 15 | pagfp_off,PA-GFP,Off,pa,,,,,,Monomer,,1,,,,10.1126/science.1074952 ,6 16 | pamcherry1_on,PAmCherry1,On,pa,564,595,18000,0.46,8.3,Monomer,6.3,0,,,,10.1038/nmeth.1298 ,7 17 | pamcherry1_off,PAmCherry1,Off,pa,,,,,,Monomer,,1,,,,10.1038/nmeth.1298 ,7 18 | patagrfp_on,PATagRFP,On,pa,562,595,66000,0.38,25.1,Monomer,5.3,0,,,,10.1021/ja100906g ,8 19 | patagrfp_off,PATagRFP,Off,pa,,,,,,Monomer,,1,,,,10.1021/ja100906g ,8 20 | mmaple_1,mMaple,Green,pc,489,505,15000,0.74,11.1,Monomer,8.2,1,,,,10.1371/journal.pone.0051314,9 21 | mmaple_2,mMaple,Red,pc,566,583,30000,0.56,16.8,Monomer,7.3,0,,,,10.1371/journal.pone.0051314,9 22 | dreiklang_on,Dreiklang,On,ps,511,529,83000,0.41,34,Monomer,7.2,1,,120,,10.1038/nbt.1952,10 23 | dreiklang_off,Dreiklang,Off,ps,,,,,,Monomer,,0,,,,10.1038/nbt.1952,10 24 | rsegfp_on,rsEGFP,On,ps,493,510,47000,0.36,16.9,Monomer,6.5,1,,180,,10.1038/nature10497,11 25 | rsegfp_off,rsEGFP,Off,ps,,,,,,Monomer,,0,,,,10.1038/nature10497,11 26 | pamkate_on,PamKate,On,pa,586,628,25000,0.18,4.5,Monomer,5.6,0,,19,,10.1016/j.bpj.2011.07.049 ,12 27 | pamkate_off,PamKate,Off,pa,,,,,,Monomer,,1,,,,10.1016/j.bpj.2011.07.049 ,12 28 | psmorange2_1,PsmOrange2,Orange,pc,546,561,51000,0.61,31.1,Monomer,6.6,1,,210,,10.1021/ja3034137 ,13 29 | psmorange2_2,PsmOrange2,Far-red,pc,619,651,18900,0.38,7.2,Monomer,5.4,0,,,,10.1021/ja3034137 ,13 30 | mirisfp_g_on,mIrisFP,Green,ps,486,516,47000,0.54,25.4,Monomer,5.4,1,,14,,10.1038/nmeth.1477 ,14 31 | mirisfp_r_on,mIrisFP,Red,ps,546,578,33000,0.59,19.5,Monomer,7.6,0,,,,10.1038/nmeth.1477 ,14 32 | mirisfp_g_off,mIrisFP,Green (Off),ps,,,,,,Monomer,,0,,,,10.1038/nmeth.1477 ,14 33 | mirisfp_r_off,mIrisFP,Red (Off),ps,,,,,,Monomer,,0,,,,10.1038/nmeth.1477 ,14 34 | mclavgr2_1,mClavGR2,Green,pc,488,504,19000,0.77,14.6,Monomer,8,1,17,27,,10.1016/j.jmb.2010.06.056,15 35 | mclavgr2_2,mClavGR2,Red,pc,566,583,32000,0.53,17,Monomer,7.3,0,175,,,10.1016/j.jmb.2010.06.056,15 36 | mkikgr_1,mKikGR,Green,pc,505,515,49000,0.69,33.8,Monomer,6.6,1,,,,10.1371/journal.pone.0003944,16 37 | mkikgr_2,mKikGR,Red,pc,580,591,28000,0.63,17.6,Monomer,5.2,0,,,,10.1371/journal.pone.0003944,16 38 | dronpa_on,Dronpa,On,ps,503,518,95000,0.85,80.7,Monomer,,1,,,,10.1126/science.1102506,17 39 | dronpa_off,Dronpa,Off,ps,,,,,,Monomer,,0,,,,10.1126/science.1102506,17 40 | mgeosm_on,mGeos-M,On,ps,503,514,51600,0.85,43.9,Monomer,4.7,1,,,,10.1073/pnas.1113770109,18 41 | mgeosm_off,mGeos-M,Off,ps,,,,,,Monomer,4.7,0,,,,10.1073/pnas.1113770109,18 42 | dendra2_g,Dendra2,Green,pc,490,507,45000,0.5,22.5,Monomer,6.6,1,,,,, 43 | dendra2_r,Dendra2,Red,pc,553,573,35000,0.55,19.3,Monomer,6.9,0,,,,, 44 | rsegfp2_off,rsEGFP2,Off,ps,,,,,,Monomer,,0,,,,10.7554/eLife.00248 ,19 45 | rsegfp2_on,rsEGFP2,On,ps,478,503,61300,0.3,18.4,Monomer,5.8,1,,20,,10.7554/eLife.00248 ,19 46 | pcdronpa2_g,pcDronpa2,Green,pc,504,515,100000,0.83,83,Tetramer,5.8,1,,,,10.1021/nn4060144,20 47 | pcdronpa2_r,pcDronpa2,Red,pc,569,583,105000,0.68,71.4,Tetramer,6.1,0,,,,10.1021/nn4060144,20 48 | -------------------------------------------------------------------------------- /css/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; 3 | font-weight: 300; 4 | width: 1100px; 5 | margin: auto; 6 | padding-top:20px; 7 | } 8 | 9 | /* Graph Styles */ 10 | .FP, .PSFP 11 | { 12 | shape-rendering: geometricPrecision; 13 | text-rendering: optimizeLegibility; 14 | opacity: 0.7; 15 | } 16 | 17 | text.FP 18 | { 19 | font-size: 12px; 20 | font-weight: bold; 21 | opacity: 1; 22 | fill: #000000; 23 | pointer-events: none; 24 | } 25 | 26 | .PSFP 27 | { 28 | stroke-width: 1.5px; 29 | } 30 | line.PSFP 31 | { 32 | stroke-width: 1px; 33 | } 34 | 35 | .PSFP.ps 36 | { 37 | stroke-dasharray: 3,2; /*make photoswitchable proteins dashed */ 38 | } 39 | 40 | .label 41 | { 42 | stroke-width:0.2; 43 | font-size: 12px; 44 | text-rendering: optimizeLegibility; 45 | } 46 | .axis text 47 | { 48 | stroke-width:0.2; 49 | font-size: 10px; 50 | text-rendering: optimizeLegibility; 51 | } 52 | .axis path, 53 | .axis line { 54 | fill: none; 55 | stroke: black; 56 | shape-rendering: crispEdges; 57 | } 58 | .tick 59 | { 60 | stroke: black; 61 | } 62 | .pane 63 | { 64 | fill: none; 65 | pointer-events: all; 66 | cursor: default; 67 | } 68 | rect, 69 | circle { 70 | cursor: pointer; /* this is to make the circles appear "clickable" upon hover */ 71 | } 72 | 73 | #tooltip { 74 | position: absolute; 75 | width: 150px; 76 | height: auto; 77 | padding: 10px; 78 | background-color: #fff; 79 | border: 1px solid #ddd; 80 | -webkit-border-radius: 10px; 81 | -moz-border-radius: 10px; 82 | border-radius: 10px; 83 | -webkit-box-shadow: 3px 3px 6px rgba(0, 0, 0, 0.2); 84 | -moz-box-shadow: 3px 3px 6px rgba(0, 0, 0, 0.2); 85 | box-shadow: 3px 3px 6px rgba(0, 0, 0, 0.2); 86 | pointer-events: none; 87 | color: #333; 88 | } 89 | 90 | #tooltip h3{ 91 | margin: 0 0 5px 0; 92 | line-height: 20px; 93 | 94 | } 95 | 96 | #tooltip p { 97 | margin: 0; 98 | font-size: 16px; 99 | line-height: 20px; 100 | } 101 | 102 | /* Content */ 103 | 104 | .left { 105 | position: relative; 106 | float: left; 107 | width: 750px; 108 | } 109 | .right { 110 | position: relative; 111 | float: right; 112 | width: 310px; 113 | } 114 | 115 | #blurb { 116 | margin-top: 30px; 117 | font-size: .95em; 118 | font-style: italic; 119 | text-align: justify; 120 | } 121 | .bibliography { 122 | font-family: sans-serif; 123 | font-size: 12px; 124 | } 125 | .bibliography li{ 126 | padding-bottom: 6px; 127 | } 128 | .footer{ 129 | border-top: 1px solid #ddd; 130 | font-size: 12px; 131 | padding-bottom: 5px; 132 | } 133 | 134 | /* Controls area */ 135 | .radioboxes { 136 | width:150px; 137 | font-size: .82em; 138 | float:left; 139 | text-align:center; 140 | } 141 | .radioboxes label{ 142 | width:130px; 143 | height: 29px; 144 | } 145 | 146 | .ui-buttonset div{ 147 | margin: 0 !important; 148 | } 149 | 150 | 151 | /* Misc Styles */ 152 | .cf:before, 153 | .cf:after { 154 | content: " "; /* 1 */ 155 | display: table; /* 2 */ 156 | } 157 | 158 | .cf:after { 159 | clear: both; 160 | } 161 | 162 | .hidden { 163 | display: none; 164 | } 165 | 166 | /* Table Styles */ 167 | table 168 | { 169 | border-collapse: collapse; 170 | empty-cells: show; 171 | border-spacing: 0; 172 | border: 1px solid #ccc; 173 | line-height: 1.4; 174 | font-size: 13px; 175 | width: 100%; 176 | margin-top: 20px; 177 | } 178 | 179 | tr { 180 | border: 1px solid #ccc; 181 | } 182 | 183 | tr:nth-child(odd) { background-color:#f0f0f0; } 184 | tr:nth-child(even) { background-color:#fff; } 185 | 186 | th, 187 | td { 188 | border: 1px solid #ccc; 189 | padding-right: 10px; 190 | padding-left: 10px; 191 | } 192 | 193 | .tablename h4 { 194 | padding-bottom: 0px; 195 | line-height: 0px; 196 | padding-top: 10px; 197 | } 198 | 199 | .col.numeric 200 | { 201 | text-align: right; 202 | } 203 | 204 | .col.protein { 205 | width: 100px; /* constant width here gives column width consistency to the different table groupings */ 206 | text-align: left; 207 | } 208 | 209 | .tabletitle{ /*banner titles for tables*/ 210 | text-align: left; 211 | font-size: 16px; 212 | } 213 | -------------------------------------------------------------------------------- /FPparse.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Created on Sat Aug 10 15:10:17 2013 4 | 5 | @author: kthorn 6 | """ 7 | 8 | import urllib2 9 | import csv 10 | import json 11 | import argparse 12 | 13 | def getBibFromDOI(DOI): 14 | """Query dx.doi.org and return bibliographic information 15 | Returns a dictionary with the follow keys: 16 | firstAuthor 17 | soloAuthor - true if only one author 18 | journal 19 | title 20 | volume 21 | number 22 | year 23 | pages 24 | url 25 | doi 26 | """ 27 | bibinfo = {'firstAuthor' : '', 'soloAuthor' : True, 'journal' : '', 28 | 'title' : '', 'volume' : '', 'number' : '', 'year' : '', 29 | 'pages' : '', 'url' : '', 'doi' : ''} 30 | 31 | request = urllib2.Request('http://dx.doi.org/' + DOI, 32 | headers={'Accept' : 'application/citeproc+json'}) 33 | try: 34 | result = urllib2.urlopen(request) 35 | except urllib2.HTTPError: 36 | print('Could not resolve DOI ' + DOI) 37 | #If a DOI doesn't return data 38 | #keep the DOI and put that in the bibliography 39 | bibinfo['doi'] = DOI 40 | bibinfo['url'] = 'http://dx.doi.org/' + DOI 41 | return bibinfo 42 | 43 | #some DOIs are missing metadata, so we have to check for a lot of things 44 | rawbib = json.load(result) 45 | if 'container-title' in rawbib: 46 | bibinfo['journal'] = rawbib['container-title'] 47 | if 'title' in rawbib: 48 | bibinfo['title'] = rawbib['title'] 49 | if 'volume' in rawbib: 50 | bibinfo['volume'] = rawbib['volume'] 51 | if 'issue' in rawbib: 52 | bibinfo['number'] = rawbib['issue'] 53 | bibinfo['year'] = rawbib['issued']['date-parts'][0][0] 54 | if 'page' in rawbib: 55 | bibinfo['pages'] = rawbib['page'] 56 | bibinfo['url'] = rawbib['URL'] 57 | bibinfo['doi'] = rawbib['DOI'] 58 | 59 | if len(rawbib['author']) > 1: 60 | bibinfo['soloAuthor'] = False 61 | bibinfo['firstAuthor'] = rawbib['author'][0]['family'] 62 | return bibinfo 63 | 64 | def formatBibliography(bibinfo): 65 | """Takes a bibinfo dictionary and returns a formatted HTML string 66 | """ 67 | citation = ""; 68 | 69 | if not bibinfo['firstAuthor'] =="": 70 | if bibinfo['soloAuthor']: 71 | citation = bibinfo['firstAuthor'] 72 | else: 73 | citation = bibinfo['firstAuthor'] + r" et al." 74 | 75 | if not bibinfo['title'] == "" and not bibinfo['title'] == None: 76 | citation += " " + bibinfo['title'] + "." 77 | 78 | if not bibinfo['journal'] == "": 79 | citation +=" " + bibinfo['journal'] +"" 80 | 81 | if not bibinfo['year'] == "": 82 | citation +=" " +str(bibinfo['year']) + "." 83 | 84 | if not bibinfo['volume'] == "": 85 | citation += " " + bibinfo['volume'] + "" 86 | if not bibinfo['number'] == "": 87 | citation += "(" + bibinfo['number'] +")" 88 | 89 | if not bibinfo['pages'] == "": 90 | citation += ": " + bibinfo['pages'] + ". " 91 | 92 | citation += "doi: " + bibinfo['doi'] + "" 93 | return citation 94 | 95 | 96 | #Main code here 97 | #input file 98 | parser = argparse.ArgumentParser() 99 | parser.add_argument("infile", help="Input CSV file to generate references for") 100 | args = parser.parse_args() 101 | csvFileIn = args.infile 102 | basename = args.infile.split('.csv') 103 | csvFileOut = basename[0] + '_processed.csv' 104 | bibFileOut = basename[0] + '_bibliography.html' 105 | DOIindex = dict() #here is where we store the mapping of DOI the order of appearance 106 | maxRefNum = 1; 107 | with open(csvFileIn, 'rU') as csvIn: 108 | FPreader = csv.DictReader(csvIn) 109 | with open(csvFileOut, 'wb') as csvOut: 110 | outHeaders = FPreader.fieldnames 111 | outHeaders.append('RefNum') 112 | csvwrite = csv.DictWriter(csvOut, outHeaders) 113 | csvwrite.writeheader() 114 | for datarow in FPreader: 115 | datarow['RefNum'] = "" 116 | if not datarow['DOI'] == "": #some entries don't have DOIs 117 | DOIlist = datarow['DOI'].split() 118 | for DOI in DOIlist: 119 | if not DOI in DOIindex: 120 | DOIindex[DOI] = maxRefNum 121 | maxRefNum += 1 122 | datarow['RefNum'] = datarow['RefNum'] + str(DOIindex[DOI]) + " " 123 | csvwrite.writerow(datarow) 124 | 125 | #Now generate bibliography from DOIindex 126 | indexDOI = dict() 127 | for key, val in DOIindex.items(): 128 | if val in indexDOI: 129 | raise NameError('Duplicate indices!') 130 | else: 131 | indexDOI[val] = key 132 | 133 | with open(bibFileOut, 'wb') as htmlOut: 134 | htmlOut.write("
    ") 135 | for k in sorted(indexDOI.keys()): 136 | print("Processing DOI " + str(k)) 137 | bib = getBibFromDOI(indexDOI[k]) 138 | if bib: 139 | bibstring = formatBibliography(bib) 140 | outstring = "
  1. " + bibstring +"
  2. \r\n" 141 | #deal with unicode characters 142 | outstring = outstring.encode('ascii', 'xmlcharrefreplace') 143 | htmlOut.write(outstring) 144 | htmlOut.write("
") 145 | 146 | -------------------------------------------------------------------------------- /PSFPs_bibliography.html: -------------------------------------------------------------------------------- 1 |
  1. Ando et al. An optical marker based on the UV-induced green-to-red photoconversion of a fluorescent protein. Proceedings of the National Academy of Sciences 2002. 99(20): 12651-12656. doi: 10.1073/pnas.202320599
  2. 2 |
  3. Tsutsui et al. Semi-rational engineering of a coral fluorescent protein into an efficient highlighter. EMBO Rep 2005. 6(3): 233-238. doi: 10.1038/sj.embor.7400361
  4. 3 |
  5. McKinney et al. A bright and photostable photoconvertible fluorescent protein. Nat Meth 2009. 6(2): 131-133. doi: 10.1038/nmeth.1296
  6. 4 |
  7. Zhang et al. Rational design of true monomeric and bright photoactivatable fluorescent proteins. Nat Meth 2012. 9(7): 727-729. doi: 10.1038/nmeth.2021
  8. 5 |
  9. Subach et al. A photoswitchable orange-to-far-red fluorescent protein, PSmOrange. Nat Meth 2011. 8(9): 771-777. doi: 10.1038/nmeth.1664
  10. 6 |
  11. Patterson A Photoactivatable GFP for Selective Photolabeling of Proteins and Cells. Science 2002. 297(5588): 1873-1877. doi: 10.1126/science.1074952
  12. 7 |
  13. Subach et al. Photoactivatable mCherry for high-resolution two-color fluorescence microscopy. Nat Meth 2009. 6(2): 153-159. doi: 10.1038/nmeth.1298
  14. 8 |
  15. Subach et al. Bright Monomeric Photoactivatable Red Fluorescent Protein for Two-Color Super-Resolution sptPALM of Live Cells. J. Am. Chem. Soc. 2010. 132(18): 6481-6491. doi: 10.1021/ja100906g
  16. 9 |
  17. McEvoy et al. mMaple: A Photoconvertible Fluorescent Protein for Use in Multiple Imaging Modalities. PLoS ONE 2012. 7(12): e51314. doi: 10.1371/journal.pone.0051314
  18. 10 |
  19. Brakemann et al. A reversibly photoswitchable GFP-like protein with fluorescence excitation decoupled from switching. Nat Biotechnol 2011. 29(10): 942-947. doi: 10.1038/nbt.1952
  20. 11 |
  21. Grotjohann et al. Diffraction-unlimited all-optical imaging and writing with a photochromic GFP. Nature 2011. 478(7368): 204-208. doi: 10.1038/nature10497
  22. 12 |
  23. Gunewardene et al. Superresolution Imaging of Multiple Fluorescent Proteins with Highly Overlapping Emission Spectra in Living Cells. Biophysical Journal 2011. 101(6): 1522-1528. doi: 10.1016/j.bpj.2011.07.049
  24. 13 |
  25. Subach et al. A FRET-Facilitated Photoswitching Using an Orange Fluorescent Protein with the Fast Photoconversion Kinetics. J. Am. Chem. Soc. 2012. 134(36): 14789-14799. doi: 10.1021/ja3034137
  26. 14 |
  27. Fuchs et al. A photoactivatable marker protein for pulse-chase imaging with superresolution. Nat Meth 2010. 7(8): 627-630. doi: 10.1038/nmeth.1477
  28. 15 |
  29. Hoi et al. A Monomeric Photoconvertible Fluorescent Protein for Imaging of Dynamic Protein Localization. Journal of Molecular Biology 2010. 401(5): 776-791. doi: 10.1016/j.jmb.2010.06.056
  30. 16 |
  31. Habuchi et al. mKikGR, a Monomeric Photoswitchable Fluorescent Protein. PLoS ONE 2008. 3(12): e3944. doi: 10.1371/journal.pone.0003944
  32. 17 |
  33. Ando Regulated Fast Nucleocytoplasmic Shuttling Observed by Reversible Protein Highlighting. Science 2004. 306(5700): 1370-1373. doi: 10.1126/science.1102506
  34. 18 |
  35. Chang et al. A unique series of reversibly switchable fluorescent proteins with beneficial properties for various applications. Proceedings of the National Academy of Sciences 2012. 109(12): 4455-4460. doi: 10.1073/pnas.1113770109
  36. 19 |
  37. Grotjohann et al. rsEGFP2 enables fast RESOLFT nanoscopy of living cells. eLife 2012. 1(0): e00248-e00248. doi: 10.7554/elife.00248
  38. 20 |
  39. Moeyaert et al. Green-to-Red Photoconvertible Dronpa Mutant for Multimodal Super-resolution Fluorescence Microscopy. ACS Nano 2014. 8(2): 1664-1673. doi: 10.1021/nn4060144
  40. 21 |
-------------------------------------------------------------------------------- /PSFP.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Fluorescent protein properties 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |

Photoswitchable Fluorescent Protein Properties

19 |
20 |
21 | 22 |
23 | 31 |
32 | 33 |
34 | 35 |
36 | 37 |
38 |
39 |

X Axis

40 |
41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 |
51 |
52 | 53 |
54 |

Y Axis

55 |
56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 |
66 |
67 |
68 | 69 |
70 |
71 |

Each fluorescent protein state is initially plotted with excitation wavelength on the x-axis and emission wavelength on the y-axis. The color is set 72 | based on its emission wavelength, and fades to gray as the brightness (product of exctinction coefficient and quantum yield) decreases. 73 | Photoconvertible proteins (e.g. green to red) are drawn as sqaures, with the different states connected by arrows. The color of the arrow corresponds to the switching wavelength. 74 | Photoactivatible proteins (e.g. off to on) are drawn as circles; the circle boundary is colored according to the switching wavelength. Dashed boundaries indicate 75 | proteins that are reversibly photoswitchable (e.g. off to on to off). 76 | Mouseover each circle to see info on that protein or click on any datapoint to see the corresponding reference on PubMed. You can zoom using the mouse scroll wheel and pan by clicking and dragging. Use the filter sliders at the top right to select a subset of fluorescent proteins based on certain criteria. Use the X and Y axis toggle boxes to change what is plotted on each axis.

77 |
78 |

Bibliography

79 |
80 | 84 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Fluorescent protein properties 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |

Fluorescent protein properties 

19 |
20 |
21 | 22 |
23 | 31 |
32 | 33 |
34 | 35 |
36 | 37 |
38 |
39 |

X Axis

40 |
41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 |
52 |
53 | 54 |
55 |

Y Axis

56 |
57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 |
68 |
69 |
70 | 71 |
72 |
73 |

Each fluorescent protein begins plotted with excitation wavelength on the x-axis and emission wavelength on the y-axis. The color is set 74 | based on its emission wavelength, and fades to gray as the brightness (product of exctinction coefficient and quantum yield) decreases. 75 | Intrinsically fluorescent proteins are shown as circles and proteins requiring an extrinisc cofactor are shown as squares. Dimeric proteins are 76 | indicated with a 2 inside the symbol; tandem dimeric proteins are shown with a t inside the symbol. 77 | Mouseover each circle to see info on that protein or click on any datapoint to see the corresponding reference on PubMed. You can zoom using the mouse scroll wheel and pan by clicking and dragging. Use the filter sliders at the top right to select a subset of fluorescent proteins based on certain criteria. Use the X and Y axis toggle boxes to change what is plotted on each axis.

78 |
79 |

Bibliography

80 |
81 | 86 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /css/sliders.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Theme for jQRangeSlider 3 | * Inspired by http://cssdeck.com/item/381/itunes-10-storage-bar 4 | * and http://cssdeck.com/item/276/pure-css-arrow-with-border-tooltip 5 | */ 6 | 7 | .ui-rangeSlider{ 8 | height: 30px; 9 | padding-top: 40px; 10 | } 11 | 12 | .ui-rangeSlider-withArrows .ui-rangeSlider-container{ 13 | margin: 0 15px; 14 | -webkit-box-shadow: inset 0px 4px 6px -2px RGBA(0,0,0,0.5); 15 | -moz-box-shadow: inset 0px 4px 6px -2px RGBA(0,0,0,0.5); 16 | box-shadow: inset 0px 4px 6px -2px RGBA(0,0,0,0.5); 17 | } 18 | 19 | .ui-rangeSlider-noArrow .ui-rangeSlider-container{ 20 | -moz-border-radius: 4px; 21 | border-radius: 4px; 22 | border-left: solid 1px #515862; 23 | border-right: solid 1px #515862; 24 | 25 | -webkit-box-shadow: inset 0px 4px 6px -2px RGBA(0,0,0,0.5); 26 | -moz-box-shadow: inset 0px 4px 6px -2px RGBA(0,0,0,0.5); 27 | box-shadow: inset 0px 4px 6px -2px RGBA(0,0,0,0.5); 28 | } 29 | 30 | .ui-rangeSlider-container{ 31 | height: 20px; 32 | border-top: solid 1px #232a32; 33 | border-bottom: solid 1px #6a7179; 34 | background: #67707F; 35 | background: -moz-linear-gradient(top, #67707F 0%, #888DA0 100%); 36 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#67707F), color-stop(100%,#888DA0)); 37 | } 38 | 39 | .ui-rangeSlider-arrow{ 40 | width:14px; 41 | height:20px; 42 | border-top: solid 1px #232a32; 43 | border-bottom: solid 1px #6a7179; 44 | background: #67707F; 45 | cursor:pointer; 46 | 47 | box-shadow: inset 0px 4px 6px -2px RGBA(0,0,0,0.5); 48 | -webkit-box-shadow: inset 0px 4px 6px -2px RGBA(0,0,0,0.5); 49 | -moz-box-shadow: inset 0px 4px 6px -2px RGBA(0,0,0,0.5); 50 | background: -moz-linear-gradient(top, #67707F 0%, #888DA0 100%); 51 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#67707F), color-stop(100%,#888DA0)); 52 | } 53 | 54 | .ui-rangeSlider-leftArrow{ 55 | border-radius:4px 0 0 4px; 56 | border-left: solid 1px #515862; 57 | } 58 | 59 | .ui-rangeSlider-rightArrow{ 60 | border-radius:0 4px 4px 0; 61 | border-right: solid 1px #515862; 62 | } 63 | 64 | .ui-rangeSlider-arrow-inner{ 65 | position: absolute; 66 | top: 50%; 67 | border: 10px solid transparent; 68 | width:0; 69 | height:0; 70 | 71 | margin-top: -10px; 72 | } 73 | 74 | .ui-rangeSlider-leftArrow .ui-rangeSlider-arrow-inner{ 75 | border-right:10px solid #a4a8b7; 76 | left: 0; 77 | margin-left: -8px; 78 | } 79 | 80 | .ui-rangeSlider-leftArrow:hover .ui-rangeSlider-arrow-inner{ 81 | border-right:10px solid #b3b6c2; 82 | } 83 | 84 | .ui-rangeSlider-rightArrow .ui-rangeSlider-arrow-inner{ 85 | border-left:10px solid #a4a8b7; 86 | right: 0; 87 | margin-right: -8px; 88 | } 89 | 90 | .ui-rangeSlider-rightArrow:hover .ui-rangeSlider-arrow-inner{ 91 | border-left:10px solid #b3b6c2; 92 | } 93 | 94 | .ui-rangeSlider-innerBar{ 95 | width: 110%; 96 | height: 100%; 97 | left: -10px; 98 | overflow: hidden; 99 | } 100 | 101 | 102 | .ui-rangeSlider-bar{ 103 | background: #68a1d6; 104 | height: 19px; 105 | margin:1px 0; 106 | -moz-border-radius: 4px; 107 | border-radius: 4px; 108 | cursor:move; 109 | cursor:grab; 110 | cursor: -moz-grab; 111 | 112 | -webkit-box-shadow: inset 0 1px 3px RGBA(0,0,0,0.5); 113 | -moz-box-shadow: inset 0 1px 3px RGBA(0,0,0,0.5); 114 | box-shadow: inset 0 1px 3px RGBA(0,0,0,0.5);; 115 | } 116 | /* Commenting out until we can fix alignment issues 117 | #lambda_ex .ui-rangeSlider-bar, #lambda_em .ui-rangeSlider-bar{ 118 | background-image: url("../spectra.png"); 119 | background-attachment:fixed; 120 | background-position: -11% 0%; 121 | } 122 | */ 123 | 124 | label.rangeSlider { 125 | float: left; 126 | position: relative; 127 | top: 15px; 128 | text-align: center; 129 | width: 100%; 130 | font-size: .9em; 131 | color:#555; 132 | } 133 | 134 | 135 | 136 | .ui-rangeSlider-handle{ 137 | width:10px; 138 | height:20px; 139 | background: transparent; 140 | cursor:col-resize; 141 | } 142 | 143 | .ui-rangeSlider-label{ 144 | background: #888DA0; 145 | background: -moz-linear-gradient(top, #67707F 0%, #888DA0 100%); 146 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#67707F), color-stop(100%,#888DA0)); 147 | padding: 5px 10px; 148 | bottom:40px; 149 | -moz-border-radius: 4px; 150 | border-radius: 4px; 151 | -webkit-box-shadow: 0px 1px 0px #c2c5d6; 152 | -moz-box-shadow: 0px 1px 0px #c2c5d6; 153 | box-shadow: 0px 1px 0px #c2c5d6; 154 | color:white; 155 | font-size:12px; 156 | cursor:col-resize; 157 | } 158 | 159 | .ui-editRangeSlider .ui-rangeSlider-label{ 160 | } 161 | 162 | .ui-rangeSlider-label-inner{ 163 | 164 | position: absolute; 165 | top: 100%; 166 | left: 50%; 167 | display: block; 168 | z-index:99; 169 | border-left: 10px solid transparent; 170 | border-right: 10px solid transparent; 171 | 172 | margin-left: -10px; 173 | border-top: 10px solid #888DA0; 174 | } 175 | 176 | .ui-editRangeSlider-inputValue{ 177 | width:2em; 178 | text-align:center; 179 | font-size:15px; 180 | } 181 | 182 | .ui-rangeSlider .ui-ruler-scale{ 183 | position:absolute; 184 | top:0; 185 | left:0; 186 | bottom:0; 187 | /* Handle width */ 188 | right:10px; 189 | } 190 | 191 | .ui-rangeSlider .ui-ruler-tick { 192 | float: left; 193 | } 194 | 195 | .ui-rangeSlider .ui-ruler-scale0 .ui-ruler-tick-inner{ 196 | color:white; 197 | margin-top:1px; 198 | border-left: 1px solid white; 199 | height:19px; 200 | padding-left:2px; 201 | position:relative; 202 | } 203 | 204 | .ui-rangeSlider .ui-ruler-scale0 .ui-ruler-tick-label{ 205 | position:absolute; 206 | bottom: 6px; 207 | } 208 | 209 | .ui-rangeSlider .ui-ruler-scale1 .ui-ruler-tick-inner{ 210 | border-left:1px solid white; 211 | margin-top: 25px; 212 | height: 5px; 213 | } -------------------------------------------------------------------------------- /FPs.csv: -------------------------------------------------------------------------------- 1 | Name,lambda_ex,lambda_em,stokes,E,QY,brightness,agg,type,pka,bleach,mature,lifetime,DOI 2 | Sirius,355,424,69,15000,0.24,3.6,m,i,3,,,,10.1038/nmeth.1317 3 | Azurite,383,450,67,26200,0.55,14.4,m,i,5,33,18,3.4,10.1038/nbt1264 10.1016/j.chembiol.2008.08.006 4 | EBFP2,383,448,65,32000,0.56,18,m,i,4.5,55,25,3,10.1021/bi700199g 10.1016/j.chembiol.2008.08.006 5 | mKalama1,385,456,71,36000,0.45,16,m,i,5.5,2.5,,,10.1021/bi700199g 6 | mTagBFP2,399,454,55,50600,0.64,32.4,m,i,2.7,53,,2.6,10.1371/journal.pone.0028674 7 | Sapphire,399,511,112,29000,0.64,18.6,m,i,,,,,10.1016/S0091-679X(08)61946-9 8 | T-Sapphire,399,511,112,44000,0.6,26.4,m,i,4.9,25,,,10.1186/1472-6750-3-5 9 | TagBFP,402,457,55,52000,0.63,32.8,m,i,2.7,34,,2.6,10.1016/j.chembiol.2008.08.006 10 | ECFP,433,475,42,32500,0.4,13,m,i,4.7,,,3,10.1073/pnas.91.26.12501 10.1038/nbt945 11 | Cerulean,433,475,42,43000,0.62,26.7,m,i,4.7,36,,3.3,10.1038/nbt945 12 | mCerulean3,433,475,42,40000,0.8,32,m,i,4.7,,,4.1,10.1371/journal.pone.0017896 13 | SCFP3A,433,474,41,30000,0.56,16.8,m,i,4.5,,,3.2,10.1021/bi0516273 14 | CyPet,435,477,42,35000,0.51,17.8,m,i,5.02,,,,10.1038/nbt1066 15 | mTurquoise,434,474,40,30000,0.84,25.2,m,i,,,,4.04,10.1038/nmeth.1415 10.1371/journal.pone.0017896 16 | mTurquoise2,434,474,40,30000,0.93,27.9,m,i,3.1,90,,4,10.1038/ncomms1738 17 | mKeima,440,620,180,14400,0.24,3.5,m,i,6.5,,,,10.1038/nbt1207 10.1371/journal.pone.0064849 18 | mBeRFP,446,611,165,65000,0.27,17.6,m,i,5.6,,,2,10.1371/journal.pone.0064849 19 | TagCFP,458,480,22,37000,0.57,21,m,i,4.7,,,, 20 | LSS-mKate2,460,605,145,26000,0.17,4.4,m,i,2.7,,,1.4,10.1073/pnas.0914365107 10.1371/journal.pone.0064849 21 | mTFP1,462,492,30,64000,0.85,54,m,i,4.3,163,,3.2,10.1042/BJ20060874 22 | LSS-mKate1,463,624,161,31200,0.08,2.5,m,i,3.2,,,,10.1073/pnas.0914365107 23 | monomeric Midoriishi-Cyan,470,496,26,22150,0.7,15.5,m,i,7,,,,10.1042/BJ20040321 24 | TurboGFP,482,502,20,70000,0.53,37.1,d,i,5.2,,,,10.1038/sj.embor.7400787 25 | TagGFP2,483,506,23,56500,0.6,33.9,m,i,4.7,,,,10.1016/j.chembiol.2008.08.006 26 | mUKG,483,499,16,60000,0.72,43.2,m,i,5.2,,,,10.1038/nmeth.1235 27 | Superfolder GFP,485,510,25,83300,0.65,54.1,m,i,,,,,10.1038/nbt1172 28 | Emerald,487,509,22,57500,0.68,37.3,m,i,6,101,,,10.1016/S0091-679X(08)61946-9 29 | EGFP,488,507,19,56000,0.6,33.6,m,i,6,174,25,2.6,10.1093/nar/24.22.4592 10.1016/j.bpj.2015.06.018 30 | Monomeric Azami Green,492,505,13,55000,0.74,40.7,m,i,5.8,,,,10.1074/jbc.M304063200 31 | mWasabi,493,509,16,70000,0.8,56,m,i,6,93,,,10.1186/1741-7007-6-13 32 | Clover,505,515,10,111000,0.76,84.4,m,i,6.1,50,30,3.2,10.1038/nmeth.2171 10.1038/nmeth.2413 33 | mNeonGreen,506,517,11,116000,0.8,92.8,m,i,5.7,158,10,3.1,10.1038/nmeth.2413 34 | TagYFP,508,524,16,64000,0.62,39.7,m,i,5.5,,,, 35 | EYFP,513,527,14,83400,0.61,50.9,m,i,6.9,60,,3.1,10.1126/science.273.5280.1392 10.1021/bi0516273 36 | Topaz,514,527,13,94500,0.6,56.7,m,i,,,,, 37 | Venus,515,528,13,92200,0.57,52.5,m,i,6,15,,3,10.1038/nbt0102-87 10.1021/bi0516273 38 | SYFP2,515,527,12,101000,0.68,68.7,m,i,6,,,3.1,10.1021/bi0516273 10.1021/bi0516273 39 | Citrine,516,529,13,77000,0.76,58.5,m,i,5.7,49,,3.6,10.1074/jbc.M102815200 10.1038/nbt945 40 | Ypet,517,530,13,104000,0.77,80.1,m,i,5.6,,,,10.1038/nbt1066 41 | Monomeric Kusabira-Orange,548,559,11,51600,0.6,31,m,i,5,,,,10.1042/BJ20040321 42 | mOrange,548,562,14,71000,0.69,49,m,i,6.5,9,150,,10.1038/nbt1037 43 | mOrange2,549,565,16,58000,0.6,34.8,m,i,6.5,,,2.7,10.1038/nmeth.1209 10.1021/acs.analchem.5b00607 44 | mKOκ,551,563,12,105000,0.61,64,m,i,4.2,,,,10.1038/nmeth.1235 45 | mKO2,551,565,14,63800,0.62,39.6,m,i,5.5,,,,10.1016/j.cell.2007.12.033 46 | tdTomato,554,581,27,138000,0.69,95.2,td,i,4.7,98,60,,10.1038/nbt1037 47 | TagRFP,555,584,29,100000,0.48,49,m,i,3.8,48,100,2.3,10.1038/nmeth1062 48 | TagRFP-T,555,584,29,81000,0.41,33.2,m,i,4.6,337,100,2.3,10.1038/nmeth.1209 10.1038/nmeth.4074 49 | mRuby,558,605,47,112000,0.35,39.2,m,i,4.4,,,2.6,10.1371/journal.pone.0004391 50 | mRuby2,559,600,41,113000,0.38,43,m,i,5.3,123,150,2.5,10.1038/nmeth.2171 10.1038/nmeth.4074 51 | mTangerine,568,585,17,38000,0.3,11.4,m,i,5.7,,,,10.1038/nbt1037 52 | mApple,568,592,24,75000,0.49,36.7,m,i,6.5,,,2.9,10.1038/nmeth.1209 10.1038/nmeth.4074 53 | mStrawberry,574,596,22,90000,0.29,26.1,m,i,4.5,15,50,,10.1038/nbt1037 54 | FusionRed,580,608,28,95000,0.19,18.1,m,i,4.6,150,130,,10.1038/ncomms2208 55 | mCherry,587,610,23,72000,0.22,15.8,m,i,4.5,96,40,1.4,10.1038/nbt1037 10.1038/nmeth1062 56 | mKate2,588,633,45,62500,0.4,25,m,i,5.4,84,20,2.5,10.1042/BJ20081949 10.1038/nmeth.4074 57 | HcRed-Tandem,590,637,47,160000,0.04,6.4,td,i,,,,, 58 | mPlum,590,649,59,41000,0.1,4.1,m,i,4.5,53,100,,10.1073/pnas.0407752101 59 | mRaspberry,598,625,27,86000,0.15,12.9,m,i,,,,,10.1073/pnas.0407752101 60 | mNeptune,600,650,50,67000,0.2,13.4,m,i,5.4,255,35,,10.1016/j.chembiol.2009.10.009 61 | NirFP,605,670,65,15700,0.06,0.9,d,i,4.5,,,,10.1038/nmeth.1501 62 | TagRFP657,611,657,46,34000,0.1,3.4,m,i,5,,,,10.1016/j.bpj.2010.04.025 63 | iFP1.4,684,708,24,92000,0.07,6.4,m,e,4.6,50,114,,10.1126/science.1168683 64 | iRFP713 (iRFP),690,713,23,105000,0.06,6.2,d,e,4,450,168,,10.1038/nbt.1918 65 | iRFP670,643,670,27,114000,0.11,12.5,d,e,4,,,,10.1038/NMETH.2521 66 | iRFP682,663,682,19,90000,0.11,9.9,d,e,4.5,,,0.95,10.1038/NMETH.2521 10.1364/CLEO_SI.2016.SW4G.1 67 | iRFP702,673,702,29,93000,0.08,7.4,d,e,4.5,,,,10.1038/NMETH.2521 68 | iRFP720,702,720,18,96000,0.06,5.8,d,e,4.5,,,,10.1038/NMETH.2521 69 | TagRFP675,598,675,77,46000,0.08,3.7,m,i,5.7,,25,0.9,10.1038/srep01847 70 | mAmetrine,406,526,120,45000,0.58,26.1,m,i,6,2.8,,,10.1038/NMETH.1207 71 | mNectarine,558,578,20,58000,0.45,26.1,m,i,6.9,11,30,,10.1074/jbc.M109.019042 72 | lanRFP-ΔS83,521,592,71,71000,0.1,7.1,d,i,4.7,,720,,10.1107/S0907444913015424 73 | LSSmOrange,437,572,135,52000,0.45,23.4,m,i,5.7,,138,,10.1021/ja3018972 74 | mPapaya1,530,541,11,43000,0.83,35.7,m,i,6.8,,,,10.1016/j.chembiol.2013.08.008 75 | Aquamarine,430,474,44,26000,0.89,23.1,m,i,3.3,,,4.1,10.1039/c2mb25303h 76 | mCardinal,604,659,55,87000,0.19,16.5,m,i,5.3,730,27,,10.1038/nmeth.2888 77 | iFP2.0,690,711,21,86000,0.08,6.9,m,e,,,,,10.1038/ncomms4626 78 | mIFP,683,704,21,82000,0.08,6.6,m,e,3.5,,,,10.1038/nmeth.3447 79 | NowGFP,494,502,8,56700,0.76,43,m,i,6.2,,,5.1,10.1016/j.bpj.2015.06.018 80 | mClover3,506,518,12,109000,0.78,85,m,i,6.5,80,,,10.1038/srep20889 81 | mRuby3,558,592,34,128000,0.45,57.6,m,i,4.8,349,,,10.1038/srep20889 82 | CyOFP1,497,589,92,40000,0.76,30.4,m,i,5.5,111,15,3.6,10.1038/nbt.3550 83 | TDsmURFP,642,670,28,170000,0.18,30.6,td,e,,190,,,10.1038/nmeth.3935 84 | miRFP670,642,670,28,71000,0.12,8.5,m,e,4.5,155,,,10.1038/ncomms12405 85 | mStable,597,633,36,45000,0.17,7.6,m,i,,1002,,,10.1021/acschembio.6b00579 86 | Sandercyanin,375,630,255,21000,0.016,0.3,t,e,,,,,10.1073/pnas.1525622113 87 | mCyRFP1,528,594,66,27000,0.65,18,m,i,5.6,45,,3.71,10.1038/nmeth.4046 88 | mMaroon1,609,657,48,80000,0.11,8.8,m,i,6.2,178,20,,10.1038/nmeth.4045 89 | mScarlet,569,594,25,100000,0.7,70,m,i,5.3,277,174,3.9,10.1038/nmeth.4074 90 | mScarlet-I,569,593,24,104000,0.54,56.2,m,i,5.4,225,36,3.1,10.1038/nmeth.4074 91 | mGarnet2,598,671,73,105000,0.087,9.1,m,i,6.8,,,0.76,10.1039/c6cc09081h 92 | -------------------------------------------------------------------------------- /FPs_processed.csv: -------------------------------------------------------------------------------- 1 | Name,lambda_ex,lambda_em,stokes,E,QY,brightness,agg,type,pka,bleach,mature,lifetime,DOI,RefNum 2 | Sirius,355,424,69,15000,0.24,3.6,m,i,3,,,,10.1038/nmeth.1317,1 3 | Azurite,383,450,67,26200,0.55,14.4,m,i,5,33,18,3.4,10.1038/nbt1264 10.1016/j.chembiol.2008.08.006,2 3 4 | EBFP2,383,448,65,32000,0.56,18,m,i,4.5,55,25,3,10.1021/bi700199g 10.1016/j.chembiol.2008.08.006,4 3 5 | mKalama1,385,456,71,36000,0.45,16,m,i,5.5,2.5,,,10.1021/bi700199g,4 6 | mTagBFP2,399,454,55,50600,0.64,32.4,m,i,2.7,53,,2.6,10.1371/journal.pone.0028674,5 7 | Sapphire,399,511,112,29000,0.64,18.6,m,i,,,,,10.1016/S0091-679X(08)61946-9,6 8 | T-Sapphire,399,511,112,44000,0.6,26.4,m,i,4.9,25,,,10.1186/1472-6750-3-5,7 9 | TagBFP,402,457,55,52000,0.63,32.8,m,i,2.7,34,,2.6,10.1016/j.chembiol.2008.08.006,3 10 | ECFP,433,475,42,32500,0.4,13,m,i,4.7,,,3,10.1073/pnas.91.26.12501 10.1038/nbt945,8 9 11 | Cerulean,433,475,42,43000,0.62,26.7,m,i,4.7,36,,3.3,10.1038/nbt945,9 12 | mCerulean3,433,475,42,40000,0.8,32,m,i,4.7,,,4.1,10.1371/journal.pone.0017896,10 13 | SCFP3A,433,474,41,30000,0.56,16.8,m,i,4.5,,,3.2,10.1021/bi0516273 ,11 14 | CyPet,435,477,42,35000,0.51,17.8,m,i,5.02,,,,10.1038/nbt1066,12 15 | mTurquoise,434,474,40,30000,0.84,25.2,m,i,,,,4.04,10.1038/nmeth.1415 10.1371/journal.pone.0017896,13 10 16 | mTurquoise2,434,474,40,30000,0.93,27.9,m,i,3.1,90,,4,10.1038/ncomms1738 ,14 17 | mKeima,440,620,180,14400,0.24,3.5,m,i,6.5,,,,10.1038/nbt1207 10.1371/journal.pone.0064849,15 16 18 | mBeRFP,446,611,165,65000,0.27,17.6,m,i,5.6,,,2,10.1371/journal.pone.0064849,16 19 | TagCFP,458,480,22,37000,0.57,21,m,i,4.7,,,,, 20 | LSS-mKate2,460,605,145,26000,0.17,4.4,m,i,2.7,,,1.4,10.1073/pnas.0914365107 10.1371/journal.pone.0064849,17 16 21 | mTFP1,462,492,30,64000,0.85,54,m,i,4.3,163,,3.2,10.1042/BJ20060874 ,18 22 | LSS-mKate1,463,624,161,31200,0.08,2.5,m,i,3.2,,,,10.1073/pnas.0914365107 ,17 23 | monomeric Midoriishi-Cyan,470,496,26,22150,0.7,15.5,m,i,7,,,,10.1042/BJ20040321,19 24 | TurboGFP,482,502,20,70000,0.53,37.1,d,i,5.2,,,,10.1038/sj.embor.7400787,20 25 | TagGFP2,483,506,23,56500,0.6,33.9,m,i,4.7,,,,10.1016/j.chembiol.2008.08.006,3 26 | mUKG,483,499,16,60000,0.72,43.2,m,i,5.2,,,,10.1038/nmeth.1235 ,21 27 | Superfolder GFP,485,510,25,83300,0.65,54.1,m,i,,,,,10.1038/nbt1172 ,22 28 | Emerald,487,509,22,57500,0.68,37.3,m,i,6,101,,,10.1016/S0091-679X(08)61946-9 ,6 29 | EGFP,488,507,19,56000,0.6,33.6,m,i,6,174,25,2.6,10.1093/nar/24.22.4592 10.1016/j.bpj.2015.06.018,23 24 30 | Monomeric Azami Green,492,505,13,55000,0.74,40.7,m,i,5.8,,,,10.1074/jbc.M304063200 ,25 31 | mWasabi,493,509,16,70000,0.8,56,m,i,6,93,,,10.1186/1741-7007-6-13,26 32 | Clover,505,515,10,111000,0.76,84.4,m,i,6.1,50,30,3.2,10.1038/nmeth.2171 10.1038/nmeth.2413,27 28 33 | mNeonGreen,506,517,11,116000,0.8,92.8,m,i,5.7,158,10,3.1,10.1038/nmeth.2413 ,28 34 | TagYFP,508,524,16,64000,0.62,39.7,m,i,5.5,,,,, 35 | EYFP,513,527,14,83400,0.61,50.9,m,i,6.9,60,,3.1,10.1126/science.273.5280.1392 10.1021/bi0516273,29 11 36 | Topaz,514,527,13,94500,0.6,56.7,m,i,,,,,, 37 | Venus,515,528,13,92200,0.57,52.5,m,i,6,15,,3,10.1038/nbt0102-87 10.1021/bi0516273,30 11 38 | SYFP2,515,527,12,101000,0.68,68.7,m,i,6,,,3.1,10.1021/bi0516273 10.1021/bi0516273,11 11 39 | Citrine,516,529,13,77000,0.76,58.5,m,i,5.7,49,,3.6,10.1074/jbc.M102815200 10.1038/nbt945,31 9 40 | Ypet,517,530,13,104000,0.77,80.1,m,i,5.6,,,,10.1038/nbt1066,12 41 | Monomeric Kusabira-Orange,548,559,11,51600,0.6,31,m,i,5,,,,10.1042/BJ20040321,19 42 | mOrange,548,562,14,71000,0.69,49,m,i,6.5,9,150,,10.1038/nbt1037 ,32 43 | mOrange2,549,565,16,58000,0.6,34.8,m,i,6.5,,,2.7,10.1038/nmeth.1209 10.1021/acs.analchem.5b00607,33 34 44 | mKOκ,551,563,12,105000,0.61,64,m,i,4.2,,,,10.1038/nmeth.1235 ,21 45 | mKO2,551,565,14,63800,0.62,39.6,m,i,5.5,,,,10.1016/j.cell.2007.12.033,35 46 | tdTomato,554,581,27,138000,0.69,95.2,td,i,4.7,98,60,,10.1038/nbt1037 ,32 47 | TagRFP,555,584,29,100000,0.48,49,m,i,3.8,48,100,2.3,10.1038/nmeth1062 ,36 48 | TagRFP-T,555,584,29,81000,0.41,33.2,m,i,4.6,337,100,2.3,10.1038/nmeth.1209 10.1038/nmeth.4074,33 37 49 | mRuby,558,605,47,112000,0.35,39.2,m,i,4.4,,,2.6,10.1371/journal.pone.0004391 ,38 50 | mRuby2,559,600,41,113000,0.38,43,m,i,5.3,123,150,2.5,10.1038/nmeth.2171 10.1038/nmeth.4074,27 37 51 | mTangerine,568,585,17,38000,0.3,11.4,m,i,5.7,,,,10.1038/nbt1037,32 52 | mApple,568,592,24,75000,0.49,36.7,m,i,6.5,,,2.9,10.1038/nmeth.1209 10.1038/nmeth.4074,33 37 53 | mStrawberry,574,596,22,90000,0.29,26.1,m,i,4.5,15,50,,10.1038/nbt1037 ,32 54 | FusionRed,580,608,28,95000,0.19,18.1,m,i,4.6,150,130,,10.1038/ncomms2208,39 55 | mCherry,587,610,23,72000,0.22,15.8,m,i,4.5,96,40,1.4,10.1038/nbt1037 10.1038/nmeth1062,32 36 56 | mKate2,588,633,45,62500,0.4,25,m,i,5.4,84,20,2.5,10.1042/BJ20081949 10.1038/nmeth.4074,40 37 57 | HcRed-Tandem,590,637,47,160000,0.04,6.4,td,i,,,,,, 58 | mPlum,590,649,59,41000,0.1,4.1,m,i,4.5,53,100,,10.1073/pnas.0407752101 ,41 59 | mRaspberry,598,625,27,86000,0.15,12.9,m,i,,,,,10.1073/pnas.0407752101 ,41 60 | mNeptune,600,650,50,67000,0.2,13.4,m,i,5.4,255,35,,10.1016/j.chembiol.2009.10.009 ,42 61 | NirFP,605,670,65,15700,0.06,0.9,d,i,4.5,,,,10.1038/nmeth.1501,43 62 | TagRFP657,611,657,46,34000,0.1,3.4,m,i,5,,,,10.1016/j.bpj.2010.04.025,44 63 | iFP1.4,684,708,24,92000,0.07,6.4,m,e,4.6,50,114,,10.1126/science.1168683,45 64 | iRFP713 (iRFP),690,713,23,105000,0.06,6.2,d,e,4,450,168,,10.1038/nbt.1918,46 65 | iRFP670,643,670,27,114000,0.11,12.5,d,e,4,,,,10.1038/NMETH.2521,47 66 | iRFP682,663,682,19,90000,0.11,9.9,d,e,4.5,,,0.95,10.1038/NMETH.2521 10.1364/CLEO_SI.2016.SW4G.1,47 48 67 | iRFP702,673,702,29,93000,0.08,7.4,d,e,4.5,,,,10.1038/NMETH.2521,47 68 | iRFP720,702,720,18,96000,0.06,5.8,d,e,4.5,,,,10.1038/NMETH.2521,47 69 | TagRFP675,598,675,77,46000,0.08,3.7,m,i,5.7,,25,0.9,10.1038/srep01847,49 70 | mAmetrine,406,526,120,45000,0.58,26.1,m,i,6,2.8,,,10.1038/NMETH.1207,50 71 | mNectarine,558,578,20,58000,0.45,26.1,m,i,6.9,11,30,,10.1074/jbc.M109.019042,51 72 | lanRFP-ΔS83,521,592,71,71000,0.1,7.1,d,i,4.7,,720,,10.1107/S0907444913015424,52 73 | LSSmOrange,437,572,135,52000,0.45,23.4,m,i,5.7,,138,,10.1021/ja3018972,53 74 | mPapaya1,530,541,11,43000,0.83,35.7,m,i,6.8,,,,10.1016/j.chembiol.2013.08.008,54 75 | Aquamarine,430,474,44,26000,0.89,23.1,m,i,3.3,,,4.1,10.1039/c2mb25303h,55 76 | mCardinal,604,659,55,87000,0.19,16.5,m,i,5.3,730,27,,10.1038/nmeth.2888 ,56 77 | iFP2.0,690,711,21,86000,0.08,6.9,m,e,,,,,10.1038/ncomms4626,57 78 | mIFP,683,704,21,82000,0.08,6.6,m,e,3.5,,,,10.1038/nmeth.3447,58 79 | NowGFP,494,502,8,56700,0.76,43,m,i,6.2,,,5.1,10.1016/j.bpj.2015.06.018,24 80 | mClover3,506,518,12,109000,0.78,85,m,i,6.5,80,,,10.1038/srep20889,59 81 | mRuby3,558,592,34,128000,0.45,57.6,m,i,4.8,349,,,10.1038/srep20889,59 82 | CyOFP1,497,589,92,40000,0.76,30.4,m,i,5.5,111,15,3.6,10.1038/nbt.3550,60 83 | TDsmURFP,642,670,28,170000,0.18,30.6,td,e,,190,,,10.1038/nmeth.3935,61 84 | miRFP670,642,670,28,71000,0.12,8.5,m,e,4.5,155,,,10.1038/ncomms12405,62 85 | mStable,597,633,36,45000,0.17,7.6,m,i,,1002,,,10.1021/acschembio.6b00579,63 86 | Sandercyanin,375,630,255,21000,0.016,0.3,t,e,,,,,10.1073/pnas.1525622113,64 87 | mCyRFP1,528,594,66,27000,0.65,18,m,i,5.6,45,,3.71,10.1038/nmeth.4046,65 88 | mMaroon1,609,657,48,80000,0.11,8.8,m,i,6.2,178,20,,10.1038/nmeth.4045,66 89 | mScarlet,569,594,25,100000,0.7,70,m,i,5.3,277,174,3.9,10.1038/nmeth.4074,37 90 | mScarlet-I,569,593,24,104000,0.54,56.2,m,i,5.4,225,36,3.1,10.1038/nmeth.4074,37 91 | mGarnet2,598,671,73,105000,0.087,9.1,m,i,6.8,,,0.76,10.1039/c6cc09081h,67 92 | -------------------------------------------------------------------------------- /css/jquery-ui-1.10.3.custom.min.css: -------------------------------------------------------------------------------- 1 | /*! jQuery UI - v1.10.3 - 2013-08-17 2 | * http://jqueryui.com 3 | * Includes: jquery.ui.core.css, jquery.ui.button.css 4 | * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=5px&bgColorHeader=%232191c0&bgTextureHeader=gloss_wave&bgImgOpacityHeader=75&borderColorHeader=%234297d7&fcHeader=%23eaf5f7&iconColorHeader=%23d8e7f3&bgColorContent=%23fcfdfd&bgTextureContent=inset_hard&bgImgOpacityContent=100&borderColorContent=%23a6c9e2&fcContent=%23222222&iconColorContent=%230078ae&bgColorDefault=%2368a1d6&bgTextureDefault=glass&bgImgOpacityDefault=15&borderColorDefault=%2377d5f7&fcDefault=%23ffffff&iconColorDefault=%23e0fdff&bgColorHover=%238bb7df&bgTextureHover=glass&bgImgOpacityHover=15&borderColorHover=%23a1c0e8&fcHover=%23ffffff&iconColorHover=%23056b93&bgColorActive=%23717988&bgTextureActive=gloss_wave&bgImgOpacityActive=15&borderColorActive=%234e545f&fcActive=%23ffffff&iconColorActive=%23717988&bgColorHighlight=%23f8da4e&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=%23fcd113&fcHighlight=%23915608&iconColorHighlight=%23f7a50d&bgColorError=%23e14f1c&bgTextureError=gloss_wave&bgImgOpacityError=45&borderColorError=%23cd0a0a&fcError=%23ffffff&iconColorError=%23fcd113&bgColorOverlay=%23aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=75&opacityOverlay=30&bgColorShadow=%23999999&bgTextureShadow=flat&bgImgOpacityShadow=55&opacityShadow=45&thicknessShadow=0px&offsetTopShadow=5px&offsetLeftShadow=5px&cornerRadiusShadow=5px 5 | * Copyright 2013 jQuery Foundation and other contributors Licensed MIT */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #a6c9e2;background:#fcfdfd url(images/ui-bg_inset-hard_100_fcfdfd_1x100.png) 50% bottom repeat-x;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #4297d7;background:#2191c0 url(images/ui-bg_gloss-wave_75_2191c0_500x100.png) 50% 50% repeat-x;color:#eaf5f7;font-weight:bold}.ui-widget-header a{color:#eaf5f7}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #4e545f;background:#68a1d6 url(images/ui-bg_glass_15_68a1d6_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#fff}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#fff;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #a1c0e8;background:#8bb7df url(images/ui-bg_glass_15_8bb7df_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#fff}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited{color:#fff;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #4e545f;background:#717988 url(images/ui-bg_gloss-wave_15_717988_500x100.png) 50% 50% repeat-x;font-weight:normal;color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcd113;background:#f8da4e url(images/ui-bg_glass_55_f8da4e_1x400.png) 50% 50% repeat-x;color:#915608}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#915608}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#e14f1c url(images/ui-bg_gloss-wave_45_e14f1c_500x100.png) 50% top repeat-x;color:#fff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#fff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url(images/ui-icons_0078ae_256x240.png)}.ui-widget-header .ui-icon{background-image:url(images/ui-icons_d8e7f3_256x240.png)}.ui-state-default .ui-icon{background-image:url(images/ui-icons_e0fdff_256x240.png)}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url(images/ui-icons_056b93_256x240.png)}.ui-state-active .ui-icon{background-image:url(images/ui-icons_717988_256x240.png)}.ui-state-highlight .ui-icon{background-image:url(images/ui-icons_f7a50d_256x240.png)}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(images/ui-icons_fcd113_256x240.png)}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:5px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:5px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:5px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:5px}.ui-widget-overlay{background:#aaa url(images/ui-bg_flat_75_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:5px 0 0 5px;padding:0;background:#999 url(images/ui-bg_flat_55_999999_40x100.png) 50% 50% repeat-x;opacity:.45;filter:Alpha(Opacity=45);border-radius:5px} -------------------------------------------------------------------------------- /FPs_bibliography.html: -------------------------------------------------------------------------------- 1 |
  1. Tomosugi et al. An ultramarine fluorescent protein with increased photostability and pH insensitivity. Nature Methods 2009. 6(5): 351-353. doi: 10.1038/nmeth.1317
  2. 2 |
  3. Mena et al. Blue fluorescent proteins with enhanced brightness and photostability from a structurally targeted library. Nature Biotechnology 2006. 24(12): 1569-1571. doi: 10.1038/nbt1264
  4. 3 |
  5. Subach et al. Conversion of Red Fluorescent Protein into a Bright Blue Probe. Chemistry & Biology 2008. 15(10): 1116-1124. doi: 10.1016/j.chembiol.2008.08.006
  6. 4 |
  7. Ai et al. Exploration of New Chromophore Structures Leads to the Identification of Improved Blue Fluorescent Proteins†. Biochemistry 2007. 46(20): 5904-5910. doi: 10.1021/bi700199g
  8. 5 |
  9. Subach et al. An Enhanced Monomeric Blue Fluorescent Protein with the High Chemical Stability of the Chromophore. PLoS ONE 2011. 6(12): e28674. doi: 10.1371/journal.pone.0028674
  10. 6 |
  11. Cubitt et al. Chapter 2: Understanding Structure—Function Relationships in the Aequorea victoria Green Fluorescent Protein. Methods in Cell Biology 1998.: 19-30. doi: 10.1016/s0091-679x(08)61946-9
  12. 7 |
  13. Zapata-Hommer et al. BMC Biotechnology 2003. 3(1): 5. doi: 10.1186/1472-6750-3-5
  14. 8 |
  15. Heim et al. Wavelength mutations and posttranslational autoxidation of green fluorescent protein.. Proceedings of the National Academy of Sciences 1994. 91(26): 12501-12504. doi: 10.1073/pnas.91.26.12501
  16. 9 |
  17. Rizzo et al. An improved cyan fluorescent protein variant useful for FRET. Nature Biotechnology 2004. 22(4): 445-449. doi: 10.1038/nbt945
  18. 10 |
  19. Markwardt et al. An Improved Cerulean Fluorescent Protein with Enhanced Brightness and Reduced Reversible Photoswitching. PLoS ONE 2011. 6(3): e17896. doi: 10.1371/journal.pone.0017896
  20. 11 |
  21. Kremers et al. Cyan and Yellow Super Fluorescent Proteins with Improved Brightness, Protein Folding, and FRET Förster Radius†,‡. Biochemistry 2006. 45(21): 6570-6580. doi: 10.1021/bi0516273
  22. 12 |
  23. Nguyen et al. Evolutionary optimization of fluorescent proteins for intracellular FRET. Nature Biotechnology 2005. 23(3): 355-360. doi: 10.1038/nbt1066
  24. 13 |
  25. Goedhart et al. Bright cyan fluorescent protein variants identified by fluorescence lifetime screening. Nature Methods 2010. 7(2): 137-139. doi: 10.1038/nmeth.1415
  26. 14 |
  27. Goedhart et al. Structure-guided evolution of cyan fluorescent proteins towards a quantum yield of 93%. Nature Communications 2012. 3: 751. doi: 10.1038/ncomms1738
  28. 15 |
  29. Kogure et al. A fluorescent variant of a protein from the stony coral Montipora facilitates dual-color single-laser fluorescence cross-correlation spectroscopy. Nature Biotechnology 2006. 24(5): 577-581. doi: 10.1038/nbt1207
  30. 16 |
  31. Yang et al. mBeRFP, an Improved Large Stokes Shift Red Fluorescent Protein. PLoS ONE 2013. 8(6): e64849. doi: 10.1371/journal.pone.0064849
  32. 17 |
  33. Piatkevich et al. Monomeric red fluorescent proteins with a large Stokes shift. Proceedings of the National Academy of Sciences 2010. 107(12): 5369-5374. doi: 10.1073/pnas.0914365107
  34. 18 |
  35. Ai et al. Directed evolution of a monomeric, bright and photostable version of Clavularia cyan fluorescent protein: structural characterization and applications in fluorescence imaging . Biochemical Journal 2006. 400(3): 531-540. doi: 10.1042/bj20060874
  36. 19 |
  37. KARASAWA et al. Cyan-emitting and orange-emitting fluorescent proteins as a donor/acceptor pair for fluorescence resonance energy transfer. Biochemical Journal 2004. 381(1): 307-312. doi: 10.1042/bj20040321
  38. 20 |
  39. Evdokimov et al. Structural basis for the fast maturation of Arthropoda green fluorescent protein. EMBO reports 2006. 7(10): 1006-1012. doi: 10.1038/sj.embor.7400787
  40. 21 |
  41. Tsutsui et al. Improving membrane voltage measurements using FRET with new fluorescent proteins. Nature Methods 2008. 5(8): 683-685. doi: 10.1038/nmeth.1235
  42. 22 |
  43. Pédelacq et al. Engineering and characterization of a superfolder green fluorescent protein. Nature Biotechnology 2005. 24(1): 79-88. doi: 10.1038/nbt1172
  44. 23 |
  45. Yang et al. Optimized Codon Usage and Chromophore Mutations Provide Enhanced Sensitivity with the Green Fluorescent Protein. Nucleic Acids Research 1996. 24(22): 4592-4593. doi: 10.1093/nar/24.22.4592
  46. 24 |
  47. Sarkisyan et al. Green Fluorescent Protein with Anionic Tryptophan-Based Chromophore and Long Fluorescence Lifetime. Biophysical Journal 2015. 109(2): 380-389. doi: 10.1016/j.bpj.2015.06.018
  48. 25 |
  49. Karasawa et al. A Green-emitting Fluorescent Protein from Galaxeidae Coral and Its Monomeric Version for Use in Fluorescent Labeling. Journal of Biological Chemistry 2003. 278(36): 34167-34171. doi: 10.1074/jbc.m304063200
  50. 26 |
  51. Ai et al. Hue-shifted monomeric variants of Clavularia cyan fluorescent protein: identification of the molecular determinants of color and applications in fluorescence imaging. BMC Biology 2008. 6(1): 13. doi: 10.1186/1741-7007-6-13
  52. 27 |
  53. Lam et al. Improving FRET dynamic range with bright green and red fluorescent proteins. Nature Methods 2012. 9(10): 1005-1012. doi: 10.1038/nmeth.2171
  54. 28 |
  55. Shaner et al. A bright monomeric green fluorescent protein derived from Branchiostoma lanceolatum. Nature Methods 2013. 10(5): 407-409. doi: 10.1038/nmeth.2413
  56. 29 |
  57. Orm  et al. Crystal Structure of the Aequorea victoria Green Fluorescent Protein. Science 1996. 273(5280): 1392-1395. doi: 10.1126/science.273.5280.1392
  58. 30 |
  59. Nagai et al. A variant of yellow fluorescent protein with fast and efficient maturation for cell-biological applications. Nature Biotechnology 2002. 20(1): 87-90. doi: 10.1038/nbt0102-87
  60. 31 |
  61. Griesbeck et al. Reducing the Environmental Sensitivity of Yellow Fluorescent Protein: MECHANISM AND APPLICATIONS. Journal of Biological Chemistry 2001. 276(31): 29188-29194. doi: 10.1074/jbc.m102815200
  62. 32 |
  63. Shaner et al. Improved monomeric red, orange and yellow fluorescent proteins derived from Discosoma sp. red fluorescent protein. Nature Biotechnology 2004. 22(12): 1567-1572. doi: 10.1038/nbt1037
  64. 33 |
  65. Shaner et al. Improving the photostability of bright monomeric orange and red fluorescent proteins. Nature Methods 2008. 5(6): 545-551. doi: 10.1038/nmeth.1209
  66. 34 |
  67. Dean et al. High-Speed Multiparameter Photophysical Analyses of Fluorophore Libraries. Analytical Chemistry 2015. 87(10): 5026-5030. doi: 10.1021/acs.analchem.5b00607
  68. 35 |
  69. Sakaue-Sawano et al. Visualizing Spatiotemporal Dynamics of Multicellular Cell-Cycle Progression. Cell 2008. 132(3): 487-498. doi: 10.1016/j.cell.2007.12.033
  70. 36 |
  71. Merzlyak et al. Bright monomeric red fluorescent protein with an extended fluorescence lifetime. Nature Methods 2007. 4(7): 555-557. doi: 10.1038/nmeth1062
  72. 37 |
  73. Bindels et al. mScarlet: a bright monomeric red fluorescent protein for cellular imaging. Nature Methods 2016. 14(1): 53-56. doi: 10.1038/nmeth.4074
  74. 38 |
  75. Kredel et al. mRuby, a Bright Monomeric Red Fluorescent Protein for Labeling of Subcellular Structures. PLoS ONE 2009. 4(2): e4391. doi: 10.1371/journal.pone.0004391
  76. 39 |
  77. Shemiakina et al. A monomeric red fluorescent protein with low cytotoxicity. Nature Communications 2012. 3: 1204. doi: 10.1038/ncomms2208
  78. 40 |
  79. Shcherbo et al. Far-red fluorescent tags for protein imaging in living tissues. Biochemical Journal 2009. 418(3): 567-574. doi: 10.1042/bj20081949
  80. 41 |
  81. Wang et al. Evolution of new nonantibody proteins via iterative somatic hypermutation. Proceedings of the National Academy of Sciences 2004. 101(48): 16745-16749. doi: 10.1073/pnas.0407752101
  82. 42 |
  83. Lin et al. Autofluorescent Proteins with Excitation in the Optical Window for Intravital Imaging in Mammals. Chemistry & Biology 2009. 16(11): 1169-1179. doi: 10.1016/j.chembiol.2009.10.009
  84. 43 |
  85. Shcherbo et al. Near-infrared fluorescent proteins. Nature Methods 2010. 7(10): 827-829. doi: 10.1038/nmeth.1501
  86. 44 |
  87. Morozova et al. Far-Red Fluorescent Protein Excitable with Red Lasers for Flow Cytometry and Superresolution STED Nanoscopy. Biophysical Journal 2010. 99(2): L13-L15. doi: 10.1016/j.bpj.2010.04.025
  88. 45 |
  89. Shu et al. Mammalian Expression of Infrared Fluorescent Proteins Engineered from a Bacterial Phytochrome. Science 2009. 324(5928): 804-807. doi: 10.1126/science.1168683
  90. 46 |
  91. Filonov et al. Bright and stable near-infrared fluorescent protein for in vivo imaging. Nature Biotechnology 2011. 29(8): 757-761. doi: 10.1038/nbt.1918
  92. 47 |
  93. Shcherbakova et al. Near-infrared fluorescent proteins for multicolor in vivo imaging. Nature Methods 2013. 10(8): 751-754. doi: 10.1038/nmeth.2521
  94. 48 |
  95. Yang et al. Time-resolved flow cytometry for lifetime measurements of near-infrared fluorescent proteins. Conference on Lasers and Electro-Optics 2016.doi: 10.1364/cleo_si.2016.sw4g.1
  96. 49 |
  97. Piatkevich et al. Extended Stokes Shift in Fluorescent Proteins: Chromophore–Protein Interactions in a Near-Infrared TagRFP675 Variant. Scientific Reports 2013. 3doi: 10.1038/srep01847
  98. 50 |
  99. Ai et al. Fluorescent protein FRET pairs for ratiometric imaging of dual biosensors. Nature Methods 2008. 5(5): 401-403. doi: 10.1038/nmeth.1207
  100. 51 |
  101. Johnson et al. Red Fluorescent Protein pH Biosensor to Detect Concentrative Nucleoside Transport. Journal of Biological Chemistry 2009. 284(31): 20499-20511. doi: 10.1074/jbc.m109.019042
  102. 52 |
  103. Pletnev et al. Structure of the red fluorescent protein from a lancelet (Branchiostoma lanceolatum): a novel GYG chromophore covalently bound to a nearby tyrosine. Acta Crystallographica Section D Biological Crystallography 2013. 69(9): 1850-1860. doi: 10.1107/s0907444913015424
  104. 53 |
  105. Shcherbakova et al. An Orange Fluorescent Protein with a Large Stokes Shift for Single-Excitation Multicolor FCCS and FRET Imaging. Journal of the American Chemical Society 2012. 134(18): 7913-7923. doi: 10.1021/ja3018972
  106. 54 |
  107. Hoi et al. An Engineered Monomeric Zoanthus sp. Yellow Fluorescent Protein. Chemistry & Biology 2013. 20(10): 1296-1304. doi: 10.1016/j.chembiol.2013.08.008
  108. 55 |
  109. Erard et al. Minimum set of mutations needed to optimize cyan fluorescent proteins for live cell imaging. Mol. BioSyst. 2013. 9(2): 258-267. doi: 10.1039/c2mb25303h
  110. 56 |
  111. Chu et al. Non-invasive intravital imaging of cellular differentiation with a bright red-excitable fluorescent protein. Nature Methods 2014. 11(5): 572-578. doi: 10.1038/nmeth.2888
  112. 57 |
  113. Yu et al. An improved monomeric infrared fluorescent protein for neuronal and tumour brain imaging. Nature Communications 2014. 5doi: 10.1038/ncomms4626
  114. 58 |
  115. Yu et al. A naturally monomeric infrared fluorescent protein for protein labeling in vivo. Nature Methods 2015. 12(8): 763-765. doi: 10.1038/nmeth.3447
  116. 59 |
  117. Bajar et al. Improving brightness and photostability of green and red fluorescent proteins for live cell imaging and FRET reporting. Scientific Reports 2016. 6: 20889. doi: 10.1038/srep20889
  118. 60 |
  119. Chu et al. A bright cyan-excitable orange fluorescent protein facilitates dual-emission microscopy and enhances bioluminescence imaging in vivo. Nature Biotechnology 2016. 34(7): 760-767. doi: 10.1038/nbt.3550
  120. 61 |
  121. Rodriguez et al. A far-red fluorescent protein evolved from a cyanobacterial phycobiliprotein. Nature Methods 2016. 13(9): 763-769. doi: 10.1038/nmeth.3935
  122. 62 |
  123. Shcherbakova et al. Bright monomeric near-infrared fluorescent proteins as tags and biosensors for multiscale imaging. Nature Communications 2016. 7: 12405. doi: 10.1038/ncomms12405
  124. 63 |
  125. Ren et al. Cysteine Sulfoxidation Increases the Photostability of Red Fluorescent Proteins. ACS Chemical Biology 2016. 11(10): 2679-2684. doi: 10.1021/acschembio.6b00579
  126. 64 |
  127. Ghosh et al. Blue protein with red fluorescence. Proceedings of the National Academy of Sciences 2016. 113(41): 11513-11518. doi: 10.1073/pnas.1525622113
  128. 65 |
  129. Laviv et al. Simultaneous dual-color fluorescence lifetime imaging with novel red-shifted fluorescent proteins. Nature Methods 2016. 13(12): 989-992. doi: 10.1038/nmeth.4046
  130. 66 |
  131. Bajar et al. Fluorescent indicators for simultaneous reporting of all four cell cycle phases. Nature Methods 2016. 13(12): 993-996. doi: 10.1038/nmeth.4045
  132. 67 |
  133. Matela et al. A far-red emitting fluorescent marker protein, mGarnet2, for microscopy and STED nanoscopy. Chem. Commun. 2017.doi: 10.1039/c6cc09081h
  134. 68 |
-------------------------------------------------------------------------------- /js/fpvis.js: -------------------------------------------------------------------------------- 1 | //global variables to hold the current variables plotted on each axis 2 | var currentX = "lambda_ex" 3 | var currentY = "lambda_em" 4 | var symbolsize = 8; //radius of circle 5 | var bigscale = 1.5; //how much to scale up on mouseover 6 | //global varable to set the ranges over which the data is filtered. 7 | var filters = { 8 | "lambda_ex" : [350,800,1], // array values represent [min range, max range, step (for the range slider)] 9 | "lambda_em" : [350,800,1], 10 | "E" : [10000,170000,1000], 11 | "QY" : [0,1,0.01], 12 | "brightness": [0,100,1] 13 | } 14 | //string variables for updating the axis labels 15 | var strings = { 16 | "lambda_em" : "Emission Wavelength (nm)", 17 | "lambda_ex" : "Excitation Wavelength (nm)", 18 | "stokes" : "Stokes Shift (nm)", 19 | "E" : "Extinction Coefficient", 20 | "QY" : "Quantum Yield", 21 | "brightness": "Brightness", 22 | "pka" : "pKa", 23 | "bleach" : "Bleaching Half-life (s)", 24 | "mature" : "Maturation Half-time (min)", 25 | "lifetime" : "Lifetime (ns)", 26 | } 27 | 28 | //shorter strings for the table 29 | var tableStrings = { 30 | "Name" : "Protein", 31 | "lambda_ex" : "λex (nm)", 32 | "lambda_em" : "λem (nm)", 33 | "E" : "EC", 34 | "QY" : "QY", 35 | "brightness": "Brightness", 36 | "pka" : "pKa", 37 | "bleach" : "Bleaching (s)", 38 | "mature" : "Maturation (min)", 39 | "lifetime" : "Lifetime (ns)", 40 | "RefNum" : "Reference" 41 | } 42 | 43 | //Protein classes for tables 44 | var FPgroups = [ 45 | {"Name" : "UV", "ex_min" : 0, "ex_max" : 380, "em_min" : 0, "em_max" : 1000, "color" : "#C080FF"}, 46 | {"Name" : "Blue", "ex_min" : 380, "ex_max" : 421, "em_min" : 0, "em_max" : 470, "color" : "#8080FF"}, 47 | {"Name" : "Cyan", "ex_min" : 421, "ex_max" : 473, "em_min" : 0, "em_max" : 530, "color" : "#80FFFF"}, 48 | {"Name" : "Green", "ex_min" : 473, "ex_max" : 507, "em_min" : 480, "em_max" : 530, "color" : "#80FF80"}, 49 | {"Name" : "Yellow", "ex_min" : 507, "ex_max" : 531, "em_min" : 500, "em_max" : 1000, "color" : "#FFFF80"}, 50 | {"Name" : "Orange", "ex_min" : 531, "ex_max" : 555, "em_min" : 530, "em_max" : 569, "color" : "#FFC080"}, 51 | {"Name" : "Red", "ex_min" : 555, "ex_max" : 600, "em_min" : 570, "em_max" : 620, "color" : "#FFA080"}, 52 | {"Name" : "Far Red", "ex_min" : 585, "ex_max" : 631, "em_min" : 620, "em_max" : 1000, "color" : "#FF8080"}, 53 | {"Name" : "Near IR", "ex_min" : 631, "ex_max" : 800, "em_min" : 661, "em_max" : 1000, "color" : "#B09090"}, 54 | {"Name" : "Sapphire-type", "ex_min" : 380, "ex_max" : 420, "em_min" : 480, "em_max" : 530, "color" : "#8080FF"}, 55 | {"Name" : "Long Stokes Shift", "ex_min" : 350, "ex_max" : 500, "em_min" : 560, "em_max" : 650, "color" : "#80A0FF"} 56 | ] 57 | 58 | //on page load, listen to slider events and respond by updating the filter ranges (and updating the ui) 59 | //this uses jQuery and jQuery UI which have been added to the head of the document. 60 | $(function() { 61 | 62 | //dynamically generate filter sliders based on "filters" object 63 | $.each(filters, function(i,v){ 64 | var label = $("").appendTo("#sliders"); 65 | var slider = $("
").appendTo("#sliders"); 66 | 67 | slider.rangeSlider({ 68 | bounds:{min: v[0], max: v[1]}, 69 | defaultValues:{min: v[0], max: v[1]}, 70 | step: v[2], 71 | arrows: false, 72 | formatter:function(val){ 73 | return (Math.round(val * 100) / 100); 74 | } 75 | }); 76 | }); 77 | 78 | // update filter settings when user changes slider 79 | $(".rangeSlider").on("valuesChanging", function(e, data){ 80 | var filtID = $(this).attr('id'); 81 | filters[filtID][0] = data.values.min; 82 | filters[filtID][1] = data.values.max; 83 | plot(); 84 | }); 85 | 86 | $("#Xradio").buttonsetv(); 87 | $("#Yradio").buttonsetv(); 88 | 89 | $( "#Xradio input" ).click(function() { 90 | currentX = $(this).val(); 91 | plot(); 92 | }); 93 | $( "#Yradio input" ).click(function() { 94 | currentY = $(this).val(); 95 | plot(); 96 | }); 97 | 98 | //easter egg 99 | $("#doalittledance").click(function(){doalittledance(1600);}); 100 | }); 101 | 102 | //load the bibliography 103 | $("#bibliography").load('FPs_bibliography.html'); 104 | 105 | // Chart dimensions. 106 | var margin = {top: 20, right: 30, bottom: 20, left: 50}, 107 | width = 700 - margin.right, 108 | height = 700 - margin.top - margin.bottom; 109 | 110 | //Scales and axes 111 | var xScale = d3.scale.linear() 112 | .range ([0, width]); 113 | 114 | var yScale = d3.scale.linear() 115 | .range ([height, 0]); 116 | 117 | //This scale will set the saturation (gray to saturated color). We will use it for mapping brightness. 118 | var saturationScale = d3.scale.linear() 119 | .range([0, 1]) 120 | .domain([0, 100]); 121 | 122 | //This scale will set the hue. We will use it for mapping emission wavelength. 123 | var hueScale = d3.scale.linear() 124 | .range([300, 300, 240, 0, 0]) 125 | .domain([200, 405, 440, 650, 850]); 126 | 127 | //X and Y axes 128 | var xAxis_bottom = d3.svg.axis().scale(xScale).tickSize(5).tickSubdivide(true); 129 | var yAxis_left = d3.svg.axis().scale(yScale).tickSize(5).orient("left").tickSubdivide(true); 130 | 131 | //top and right axes are identical but without tick labels 132 | var xAxis_top = d3.svg.axis().scale(xScale).tickSize(5).orient("top").tickSubdivide(true).tickFormat(function (d) { return ''; });;; 133 | var yAxis_right = d3.svg.axis().scale(yScale).tickSize(5).orient("right").tickSubdivide(true).tickFormat(function (d) { return ''; });; 134 | 135 | // Create the SVG container and set the origin. 136 | var svg = d3.select("#graph").append("svg") 137 | .attr("width", width + margin.left + margin.right) 138 | .attr("height", height + margin.top + margin.bottom) 139 | .append("g") 140 | .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); 141 | 142 | //Add the axes 143 | svg.append("g") 144 | .attr("class", "x axis bottom") 145 | .attr("transform", "translate(0," + height + ")") 146 | .call(xAxis_bottom); 147 | svg.append("g") 148 | .attr("class", "y axis left") 149 | .call(yAxis_left); 150 | svg.append("g") 151 | .attr("class", "x axis top") 152 | .call(xAxis_top); 153 | svg.append("svg:g") 154 | .attr("class", "y axis right") 155 | .attr("transform", "translate(" + width + ",0)") 156 | .call(yAxis_right); 157 | 158 | // Add an x-axis label. 159 | svg.append("text") 160 | .attr("class", "x label") 161 | .attr("text-anchor", "middle") 162 | .attr("x", width/2 ) 163 | .attr("y", height-10) 164 | .text("Excitation wavelength (nm)"); 165 | 166 | // Add a y-axis label. 167 | svg.append("text") 168 | .attr("class", "y label") 169 | .attr("text-anchor", "middle") 170 | .attr("x", -height/2) 171 | .attr("y", margin.left-30) 172 | .attr("transform", "rotate(-90)") 173 | .text("Emission wavelength (nm)"); 174 | 175 | //Add a clipping path so that data points don't go outside of frame 176 | svg.append("clipPath") //Make a new clipPath 177 | .attr("id", "chart-area") //Assign an ID 178 | .append("rect") 179 | .attr("width", width) 180 | .attr("height", height); 181 | 182 | //enable zooming 183 | var zoom = d3.behavior.zoom() 184 | .x(xScale) 185 | .y(yScale) 186 | .scaleExtent([1, 10]) 187 | .on("zoom", draw_graph); 188 | 189 | function plotcircle(sel){ 190 | circle = sel.append("circle") 191 | .attr("class", "FP") 192 | .attr("r", symbolsize) 193 | .attr("stroke", "#000") 194 | .attr("opacity", 0.7) 195 | .style("fill", function (d) { return d3.hsl(hueScale (d.lambda_em), saturationScale (d.brightness), 0.5)}); 196 | addactions(circle); 197 | } 198 | 199 | function plotsquare(sel){ 200 | square = sel.append("rect") 201 | .attr("class", "FP") 202 | .attr("width", symbolsize*2) 203 | .attr("height", symbolsize*2) 204 | .attr("stroke", "#000") 205 | .attr("opacity", 0.7) 206 | .style("fill", function (d) { return d3.hsl(hueScale (d.lambda_em), saturationScale (d.brightness), 0.5)}); 207 | addactions(square); 208 | } 209 | 210 | function plottext(sel){ 211 | text = sel.append("text") 212 | .attr("class", "FP") 213 | .text(function (d) { 214 | if (d["agg"] == "d") { return "2"} 215 | else if (d["agg"] == "td") { return "t"} 216 | else if (d["agg"] == "t") { return "4"} 217 | ;} ) 218 | } 219 | 220 | function addactions(sel){ 221 | // sel.on('click', function(e){ 222 | // if(e.DOI){window.location = "http://dx.doi.org/" + e.DOI;} 223 | // }) 224 | sel.on("mouseover", function(d) { 225 | //Get this bar's x/y values, then augment for the tooltip 226 | if (d3.select(this).attr("cx")){ //if circle 227 | d3.select(this).transition().duration(100).attr("r",symbolsize*bigscale); 228 | var xPosition = parseFloat(d3.select(this).attr("cx")) 229 | var yPosition = parseFloat(d3.select(this).attr("cy")) 230 | } else if (d3.select(this).attr("x")){ //if rectangle 231 | d3.select(this).transition().duration(100) 232 | .attr("x", function (d) { return xScale (d[currentX]) - symbolsize*bigscale; }) 233 | .attr("y", function (d) { return yScale (d[currentY]) - symbolsize*bigscale; }) 234 | .attr("width", symbolsize*2*bigscale) 235 | .attr("height", symbolsize*2*bigscale); 236 | var xPosition = parseFloat(d3.select(this).attr("x") ) 237 | var yPosition = parseFloat(d3.select(this).attr("y") ) 238 | } 239 | if (xPosition520){ 245 | yPosition =520; 246 | } 247 | //Update the tooltip position and value 248 | d3.select("#tooltip") 249 | .style("left", xPosition + "px") 250 | .style("top", yPosition + "px") 251 | .select("#exvalue") 252 | .text(d.lambda_ex) 253 | d3.select("#tooltip") 254 | .select("#emvalue") 255 | .text(d.lambda_em); 256 | d3.select("#tooltip") 257 | .select("#ecvalue") 258 | .text(d.E); 259 | d3.select("#tooltip") 260 | .select("#qyvalue") 261 | .text(d.QY); 262 | d3.select("#tooltip") 263 | .select("h3") 264 | .html(d.Name); 265 | d3.select("#tooltip") 266 | .select("#brightnessvalue") 267 | .text(d.brightness); 268 | 269 | //Show the tooltip 270 | d3.select("#tooltip").classed("hidden", false); 271 | }) 272 | 273 | .on("mouseout", function() { 274 | if (d3.select(this).attr("cx")){ //if circle 275 | d3.select(this).transition().duration(200).attr("r",symbolsize) 276 | } else if (d3.select(this).attr("x")){ //if circle 277 | d3.select(this).transition().duration(200) 278 | .attr("x", function (d) { return xScale (d[currentX]) - symbolsize; }) 279 | .attr("y", function (d) { return yScale (d[currentY]) - symbolsize; }) 280 | .attr("width", symbolsize*2) 281 | .attr("height", symbolsize*2); 282 | } 283 | //Hide the tooltip 284 | d3.select("#tooltip").classed("hidden", true); 285 | }) 286 | } 287 | 288 | svg.append("rect") 289 | .attr("class", "pane") 290 | .attr("width", width) 291 | .attr("height", height) 292 | .call(zoom); 293 | 294 | var FPdata = []; //Where the fluorescent protein data table will end up. 295 | 296 | // load the csv file and plot it 297 | d3.csv("FPs_processed.csv", function (data) { 298 | data.forEach(function(d){ 299 | d.lambda_em = +d.lambda_em; // typing these variables here for simplicity of code later on 300 | d.lambda_ex = +d.lambda_ex; 301 | d.E = +d.E; 302 | d.QY = +d.QY; 303 | d.brightness = +d.brightness; 304 | }) 305 | 306 | FPdata = data; 307 | 308 | //Only update max of saturation scale, so that gray corresponds to 0 brightness 309 | //Use 80th percentile as max saturation so that not everything is muddy gray 310 | saturationScale.domain([0, 311 | d3.quantile(FPdata.map(function(a) {return (+a.brightness)}).sort(function(a,b){return a-b}),0.8) 312 | ]); 313 | 314 | plot(); 315 | draw_table(); 316 | }); 317 | 318 | function draw_graph(){ 319 | //redraw axes with new domains 320 | svg.select(".x.axis.bottom").call(xAxis_bottom); 321 | svg.select(".y.axis.left").call(yAxis_left); 322 | svg.select(".x.axis.top").call(xAxis_top); 323 | svg.select(".y.axis.right").call(yAxis_right); 324 | 325 | svg.selectAll("circle.FP") 326 | .attr("cx", function (d) { return xScale (d[currentX]); }) 327 | .attr("cy", function (d) { return yScale (d[currentY]); }) 328 | 329 | svg.selectAll("rect.FP") 330 | .attr("x", function (d) { return xScale (d[currentX]) - symbolsize; }) 331 | .attr("y", function (d) { return yScale (d[currentY]) - symbolsize; }) 332 | 333 | svg.selectAll("text.FP") 334 | .attr("x", function (d) { return xScale (d[currentX]) - symbolsize/2; }) 335 | .attr("y", function (d) { return yScale (d[currentY]) + symbolsize/2; }) 336 | } 337 | 338 | //i added this more flexible plotting function to be able to plot different variables on each axis. It takes three optional parameters: the data array, and two axes variables. 339 | function plot(xvar,yvar,data){ 340 | //set default values... if plot() is called without arguments, these default values will be used. 341 | xvar = xvar || currentX; 342 | yvar = yvar || currentY; 343 | data = data || FPdata; 344 | 345 | //filter the data according to the user settings for EC, QY, and brightness range 346 | data = data.filter(function(d) { return filtercheck(d) ? d : null; }); 347 | 348 | // helper function to iterate through all of the data filters (without having to type them all out) 349 | function filtercheck(data){ 350 | for (f in filters){ 351 | v = filters[f]; 352 | if( data[f] < v[0] || data[f] > v[1] ) {return false;} 353 | } 354 | return true; 355 | } 356 | 357 | //filter out data with empty values 358 | data = data.filter(function(d) {return d[xvar] > 0 && d[yvar] > 0;}); 359 | 360 | //update scale domains based on data 361 | xScale.domain([ 362 | d3.min (data, function(d) { return .99 * d[xvar]; }), 363 | d3.max (data, function(d) { return 1.01 * d[xvar]; }) 364 | ]) 365 | .nice(); 366 | zoom.x(xScale); 367 | 368 | yScale.domain([ 369 | d3.min (data, function(d) { return .99 * d[yvar]; }), 370 | d3.max (data, function(d) { return 1.01 * d[yvar]; }) 371 | ]) 372 | .nice(); 373 | zoom.y(yScale); 374 | 375 | //relabel X and Y axes 376 | svg.select(".x.label").text(strings[xvar]) 377 | svg.select(".y.label").text(strings[yvar]) 378 | 379 | // Join new data with old elements, if any. 380 | var datagroup = svg.selectAll("g.FP").data(data, function (d){ return d.Name;}); 381 | entergroup = datagroup.enter().append("g") 382 | .attr("class", "FP") 383 | .attr("clip-path", "url(#chart-area)") 384 | .call(zoom); //so we can zoom while moused over elements 385 | 386 | entergroup.each(function(d, i) { 387 | //determine type of protein and whether to plot a circle or a square 388 | if (d["type"] =="i"){ 389 | //plot new circles 390 | plotcircle(d3.select(this)); 391 | } else if (d["type"] =="e"){ 392 | // plot new squares 393 | plotsquare(d3.select(this)); 394 | } 395 | //add text to markers 396 | plottext(d3.select(this)); 397 | }) 398 | 399 | // Remove old elements as needed. 400 | datagroup.exit().remove(); 401 | 402 | // move circles to their new positions (based on axes) with transition animation 403 | datagroup.each(function(d, i) { 404 | current = d3.select(this) 405 | current.selectAll("circle.FP") 406 | .transition() 407 | .attr("cx", function (d) { return xScale (d[xvar]); }) 408 | .attr("cy", function (d) { return yScale (d[yvar]); }) 409 | .duration(800); //change this number to speed up or slow down the animation 410 | current.selectAll("rect.FP") 411 | .transition() 412 | .attr("x", function (d) { return xScale (d[xvar]) - symbolsize; }) 413 | .attr("y", function (d) { return yScale (d[yvar]) - symbolsize; }) 414 | .duration(800); //change this number to speed up or slow down the animation 415 | current.selectAll("text.FP") 416 | .transition() 417 | .attr("x", function (d) { return xScale (d[xvar]) - symbolsize/2; }) 418 | .attr("y", function (d) { return yScale (d[yvar]) + symbolsize/2; }) 419 | .duration(800); //change this number to speed up or slow down the animation 420 | }) 421 | 422 | // these two lines cause the transition animation on the axes... they are also cause chopiness in the user interface when the user slides the range sliders on the right side... uncomment to see their effect. 423 | svg.select(".x.axis.bottom").call(xAxis_bottom); 424 | svg.select(".y.axis.left").call(yAxis_left); 425 | } 426 | 427 | function draw_table() { 428 | columns = Object.keys(tableStrings); //column names 429 | //split up fluorescent proteins by type and add the relevant tables 430 | FPgroups.forEach( function(FPtype) { 431 | function testfilt(element){ 432 | return element.lambda_ex >= FPtype.ex_min && element.lambda_ex < FPtype.ex_max 433 | && element.lambda_em >= FPtype.em_min && element.lambda_em < FPtype.em_max; 434 | } 435 | 436 | // var table = d3.select("#table").append("h4") 437 | // .attr("class", "tablename") 438 | // .text(FPtype.Name + " Proteins"); 439 | var table = d3.select("#table").append("table"); 440 | //add title row 441 | table.append("tr").append("th") 442 | .attr("colspan", columns.length) 443 | .attr("class", "tabletitle") 444 | .style("background-color", FPtype.color) 445 | .text(FPtype.Name + " Proteins"); 446 | 447 | tdata = FPdata.filter(testfilt); 448 | table.append("tr") 449 | .attr("class", "header") 450 | .selectAll("th") 451 | .data(columns) 452 | .enter().append("th") 453 | .html(function(d,i) { return tableStrings[columns[i]]; }) 454 | .attr("class", function(d,i) { return (d == "Name") ? "col head protein" : "col head numeric"; }); // conditional here to limit the use of unneccesary global variables 455 | 456 | //populate the table 457 | table.selectAll("tr.data") 458 | .data(tdata) 459 | .enter().append("tr") 460 | .attr("class", "data") 461 | .selectAll("td") 462 | .data(function(d) { 463 | return columns.map(function(column, colstyles) { 464 | var sty = (column == "Name") ? "col protein" : "col numeric"; // conditional here removes need for another "styles" table 465 | return {column: column, value: d[column], style: sty}; 466 | }); 467 | }) 468 | .enter().append("td") 469 | .html(function(d) { 470 | if (d.column == "RefNum"){ 471 | reflist = d.value.trim().split(" ") 472 | //add links to bibliography 473 | return reflist.reduce(function(out, r){ 474 | return out + "[" + r + "] "; 475 | }, ""); 476 | //return "" + d.value + ""; 477 | } 478 | else{ 479 | return d.value; 480 | } 481 | }) 482 | .attr("class", function(d) { return d.style; }); 483 | } 484 | ); 485 | } 486 | 487 | 488 | function doalittledance(int) { 489 | var s = ["QY","E","lambda_em","lambda_ex","brightness"]; 490 | setInterval(function() { 491 | var x = s[Math.floor(Math.random() * s.length)]; 492 | do{ 493 | var y = s[Math.floor(Math.random() * s.length)]; 494 | } while (x == y); 495 | plot(x,y); 496 | }, int); 497 | 498 | } 499 | 500 | 501 | //this bit is just a jQuery plugin to make the radio checkboxes on the right side vertical 502 | (function( $ ){ 503 | //plugin buttonset vertical 504 | $.fn.buttonsetv = function() { 505 | $(':radio, :checkbox', this).wrap('
'); 506 | $(this).buttonset(); 507 | $('label:first', this).removeClass('ui-corner-left').addClass('ui-corner-top'); 508 | $('label:last', this).removeClass('ui-corner-right').addClass('ui-corner-bottom'); 509 | mw = 0; // max witdh 510 | $('label', this).each(function(index){ 511 | w = $(this).width(); 512 | if (w > mw) mw = w; 513 | }) 514 | $('label', this).each(function(index){ 515 | $(this).width(mw); 516 | }) 517 | }; 518 | })( jQuery ); -------------------------------------------------------------------------------- /js/psfpvis.js: -------------------------------------------------------------------------------- 1 | //global variables to hold the current variables plotted on each axis 2 | var currentX = "lambda_ex" 3 | var currentY = "lambda_em" 4 | var symbolsize = 7; //radius of circle 5 | var bigsymbolsize = 11; //size to grow to on mouseover 6 | var mouseovertime = 150; //animation timing for mouseovers 7 | //global varable to set the ranges over which the data is filtered. 8 | var filters = { 9 | "lambda_ex" : [350,800,1], // array values represent [min range, max range, step (for the range slider)] 10 | "lambda_em" : [350,800,1], 11 | "E" : [10000,140000,1000], 12 | "QY" : [0,1,0.01], 13 | "brightness": [0,100,1] 14 | } 15 | //string variables for updating the axis labels 16 | var strings = { 17 | "lambda_em" : "Emission Wavelength (nm)", 18 | "lambda_ex" : "Excitation Wavelength (nm)", 19 | "stokes" : "Stokes Shift (nm)", 20 | "E" : "Extinction Coefficient", 21 | "QY" : "Quantum Yield", 22 | "brightness": "Brightness", 23 | "pka" : "pKa", 24 | "bleach" : "Bleaching Half-life (s)", 25 | "mature" : "Maturation Half-time (min)", 26 | "lifetime" : "Lifetime (ns)", 27 | } 28 | 29 | //shorter strings for the table 30 | var tableStrings = { 31 | "Name" : "Protein", 32 | "state" : "State", 33 | "lambda_ex" : "λex (nm)", 34 | "lambda_em" : "λem (nm)", 35 | "E" : "EC", 36 | "QY" : "QY", 37 | "brightness": "Brightness", 38 | "Aggregation" : "Aggregation", 39 | "pka" : "pKa", 40 | "bleach" : "tbleach (s)", 41 | "mature" : "tmature (min)", 42 | "transits" : "Transitions", 43 | "RefNum" : "Ref." 44 | } 45 | 46 | //Protein classes for tables 47 | var FPgroups = [ 48 | {"Name" : "Photoactivatible", "type" : "pa", "color" : "#808080"}, 49 | {"Name" : "Photoconvertible", "type" : "pc", "color" : "#808080"}, 50 | {"Name" : "Photoswitchable", "type" : "ps", "color" : "#808080"} 51 | ] 52 | 53 | //on page load, listen to slider events and respond by updating the filter ranges (and updating the ui) 54 | //this uses jQuery and jQuery UI which have been added to the head of the document. 55 | $(function() { 56 | 57 | //dynamically generate filter sliders based on "filters" object 58 | $.each(filters, function(i,v){ 59 | var label = $("").appendTo("#sliders"); 60 | var slider = $("
").appendTo("#sliders"); 61 | 62 | slider.rangeSlider({ 63 | bounds:{min: v[0], max: v[1]}, 64 | defaultValues:{min: v[0], max: v[1]}, 65 | step: v[2], 66 | arrows: false, 67 | formatter:function(val){ 68 | return (Math.round(val * 100) / 100); 69 | } 70 | }); 71 | }); 72 | 73 | // update filter settings when user changes slider 74 | $(".rangeSlider").on("valuesChanging", function(e, data){ 75 | var filtID = $(this).attr('id'); 76 | filters[filtID][0] = data.values.min; 77 | filters[filtID][1] = data.values.max; 78 | plot(); 79 | }); 80 | 81 | $("#Xradio").buttonsetv(); 82 | $("#Yradio").buttonsetv(); 83 | 84 | $( "#Xradio input" ).click(function() { 85 | currentX = $(this).val(); 86 | plot(); 87 | }); 88 | $( "#Yradio input" ).click(function() { 89 | currentY = $(this).val(); 90 | plot(); 91 | }); 92 | 93 | //easter egg 94 | $("#doalittledance").click(function(){doalittledance(1600);}); 95 | }); 96 | 97 | //load the bibliography 98 | $("#bibliography").load('PSFPs_bibliography.html'); 99 | 100 | // Chart dimensions. 101 | var margin = {top: 20, right: 30, bottom: 20, left: 50}, 102 | width = 700 - margin.right, 103 | height = 700 - margin.top - margin.bottom; 104 | 105 | //Scales and axes 106 | var xScale = d3.scale.linear() 107 | .range ([0, width]); 108 | 109 | var yScale = d3.scale.linear() 110 | .range ([height, 0]); 111 | 112 | //This scale will set the saturation (gray to saturated color). We will use it for mapping brightness. 113 | var saturationScale = d3.scale.linear() 114 | .range([0, 1]) 115 | .domain([0, 100]); 116 | 117 | //This scale will set the hue. We will use it for mapping emission wavelength. 118 | var hueScale = d3.scale.linear() 119 | .range([300, 300, 240, 0, 0]) 120 | .domain([200, 405, 440, 650, 850]); 121 | 122 | //X and Y axes 123 | var xAxis_bottom = d3.svg.axis().scale(xScale).tickSize(5).tickSubdivide(true); 124 | var yAxis_left = d3.svg.axis().scale(yScale).tickSize(5).orient("left").tickSubdivide(true); 125 | 126 | //top and right axes are identical but without tick labels 127 | var xAxis_top = d3.svg.axis().scale(xScale).tickSize(5).orient("top").tickSubdivide(true).tickFormat(function (d) { return ''; });;; 128 | var yAxis_right = d3.svg.axis().scale(yScale).tickSize(5).orient("right").tickSubdivide(true).tickFormat(function (d) { return ''; });; 129 | 130 | // Create the SVG container and set the origin. 131 | var svg = d3.select("#graph").append("svg") 132 | .attr("width", width + margin.left + margin.right) 133 | .attr("height", height + margin.top + margin.bottom) 134 | .append("g") 135 | .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); 136 | 137 | //Add the axes 138 | svg.append("g") 139 | .attr("class", "x axis bottom") 140 | .attr("transform", "translate(0," + height + ")") 141 | .call(xAxis_bottom); 142 | svg.append("g") 143 | .attr("class", "y axis left") 144 | .call(yAxis_left); 145 | svg.append("g") 146 | .attr("class", "x axis top") 147 | .call(xAxis_top); 148 | svg.append("svg:g") 149 | .attr("class", "y axis right") 150 | .attr("transform", "translate(" + width + ",0)") 151 | .call(yAxis_right); 152 | 153 | // Add an x-axis label. 154 | svg.append("text") 155 | .attr("class", "x label") 156 | .attr("text-anchor", "middle") 157 | .attr("x", width/2 ) 158 | .attr("y", height-10) 159 | .text("Excitation wavelength (nm)"); 160 | 161 | // Add a y-axis label. 162 | svg.append("text") 163 | .attr("class", "y label") 164 | .attr("text-anchor", "middle") 165 | .attr("x", -height/2) 166 | .attr("y", margin.left-30) 167 | .attr("transform", "rotate(-90)") 168 | .text("Emission wavelength (nm)"); 169 | 170 | //Add a clipping path so that data points don't go outside of frame 171 | svg.append("clipPath") //Make a new clipPath 172 | .attr("id", "chart-area") //Assign an ID 173 | .append("rect") 174 | .attr("width", width) 175 | .attr("height", height); 176 | 177 | // Create definition for arrowhead on lines 178 | defs = svg.append("defs"); //where marker definitions will go 179 | 180 | //enable zooming 181 | var zoom = d3.behavior.zoom() 182 | .x(xScale) 183 | .y(yScale) 184 | .scaleExtent([1, 10]) 185 | .on("zoom", draw_graph); 186 | 187 | svg.append("rect") 188 | .attr("class", "pane") 189 | .attr("width", width) 190 | .attr("height", height) 191 | .call(zoom); 192 | 193 | //a group to contain the clipping path that all out plots will go into. 194 | plotarea = svg.append("g") 195 | .attr("clip-path", "url(#chart-area)"); 196 | 197 | var FPdata = []; //Where the fluorescent protein data table will end up. 198 | var linkdata = []; //links between photoconvertible states 199 | 200 | // load the csv file and plot it 201 | d3.csv("PSFPs_processed.csv", function (data) { 202 | data.forEach(function(d){ 203 | d.lambda_em = +d.lambda_em; // typing these variables here for simplicity of code later on 204 | d.lambda_ex = +d.lambda_ex; 205 | d.E = +d.E; 206 | d.QY = +d.QY; 207 | d.brightness = +d.brightness; 208 | 209 | //caclulate Stokes shift 210 | d.stokes = d.lambda_em - d.lambda_ex; 211 | 212 | }); 213 | 214 | data.sort(function (a, b) { 215 | return a.lambda_ex - b.lambda_ex; 216 | }); 217 | 218 | FPdata = data; 219 | 220 | //Only update max of saturation scale, so that gray corresponds to 0 brightness 221 | //Use 80th percentile as max saturation so that not everything is muddy gray 222 | saturationScale.domain([0, 223 | d3.quantile(FPdata.map(function(a) {return (+a.brightness)}).sort(function(a,b){return a-b}),0.8) 224 | ]); 225 | 226 | d3.csv("links.csv", function (links) { 227 | links.forEach(function(link){ 228 | //populate link data with appropriate starting and ending coordinates 229 | link.lambda = +link.lambda; 230 | var startFP = $.grep(FPdata, function(e){ return e.UID == link.state1; }); 231 | var endFP = $.grep(FPdata, function(e){ return e.UID == link.state2; }); 232 | startFP = startFP[0]; 233 | endFP = endFP[0]; 234 | link.lambda_ex = [startFP.lambda_ex, endFP.lambda_ex]; 235 | link.lambda_em = [startFP.lambda_em, endFP.lambda_em]; 236 | link.E = [startFP.E, endFP.E]; 237 | link.QY= [startFP.QY, endFP.QY]; 238 | link.brightness = [startFP.brightness, endFP.brightness]; 239 | link.pka = [startFP.pka, endFP.pka]; 240 | link.stokes = [startFP.stokes, endFP.stokes] 241 | link.Name = startFP.Name; 242 | }); 243 | 244 | linkdata = links; 245 | 246 | //we have to generate separate markers for each line since markers can't inherit line color 247 | //do this here because we only have to do it once 248 | var markers = defs.selectAll("marker").data(links, function (d){ return d.state1;}); 249 | markers.enter().append("marker") 250 | .attr("stroke", function (d) { return d3.hsl(hueScale (d.lambda_sw), 1, 0.5)}) 251 | .attr("fill", function (d) { return d3.hsl(hueScale (d.lambda_sw), 1, 0.5)}) 252 | .attr("id", function (d){ return "arrowhead" + d.state1;}) 253 | .attr("viewBox", "0 -5 10 10") 254 | .attr("refX", 8) 255 | .attr("refY", 0) 256 | .attr("markerUnits", "strokeWidth") 257 | .attr("markerWidth", 5) 258 | .attr("markerHeight", 5) 259 | .attr("orient", "auto") 260 | .append("path") 261 | .attr("d", "M0,-5L10,0L0,5"); 262 | 263 | plot(); 264 | draw_table(); 265 | }); 266 | }); 267 | 268 | function draw_graph(){ 269 | //redraw axes with new domains 270 | svg.select(".x.axis.bottom").call(xAxis_bottom); 271 | svg.select(".y.axis.left").call(yAxis_left); 272 | svg.select(".x.axis.top").call(xAxis_top); 273 | svg.select(".y.axis.right").call(yAxis_right); 274 | 275 | svg.selectAll("circle.PSFP") 276 | .attr("cx", function (d) { return xScale (d[currentX]); }) 277 | .attr("cy", function (d) { return yScale (d[currentY]); }); 278 | 279 | svg.selectAll("rect.PSFP") 280 | .attr("x", function (d) { return xScale (d[currentX]) - symbolsize; }) 281 | .attr("y", function (d) { return yScale (d[currentY]) -symbolsize; }); 282 | 283 | svg.selectAll("line.PSFP") 284 | .attr("x1", function (d) { return xScale (d[currentX][0]); }) 285 | .attr("x2", function (d) { return xScale (d[currentX][1]); }) 286 | .attr("y1", function (d) { return yScale (d[currentY][0]); }) 287 | .attr("y2", function (d) { return yScale (d[currentY][1]); }); 288 | } 289 | 290 | //i added this more flexible plotting function to be able to plot different variables on each axis. It takes three optional parameters: the data array, and two axes variables. 291 | function plot(xvar,yvar,data,links){ 292 | //set default values... if plot() is called without arguments, these default values will be used. 293 | xvar = xvar || currentX; 294 | yvar = yvar || currentY; 295 | data = data || FPdata; 296 | links = links || linkdata; 297 | 298 | //filter the data according to the user settings for EC, QY, and brightness range 299 | //we want to keep proteins where any state satisfies the criteria and only remove proteins where all states fail 300 | 301 | var goodFPs = []; 302 | for (var i=0; i < data.length; i++){ 303 | //must pass filtercheck, be non-empty, and not previously recorded. 304 | d = data[i]; 305 | if (filtercheck(d) && d[xvar] > 0 && d[yvar] > 0 && goodFPs.indexOf(d.Name) == -1) { 306 | //add Name to keeplist 307 | goodFPs.push(d.Name); 308 | } 309 | } 310 | 311 | // helper function to iterate through all of the data filters (without having to type them all out) 312 | function filtercheck(data){ 313 | for (f in filters){ 314 | v = filters[f]; 315 | if( data[f] < v[0] || data[f] > v[1] ) {return false;} 316 | } 317 | return true; 318 | } 319 | data = data.filter(function(d) { return goodFPs.indexOf(d.Name) > -1; }); 320 | links = links.filter(function(d) { return goodFPs.indexOf(d.Name) > -1; }); 321 | 322 | //additionally remove off states from data; we don't need to show them. These are found by looking for lambda_ex = 0 323 | data = data.filter(function(d) { return d.lambda_ex > 0; }); 324 | 325 | //update scale domains based on data 326 | xScale.domain([ 327 | d3.min (data, function(d) { return .99 * d[xvar]; }), 328 | d3.max (data, function(d) { return 1.01 * d[xvar]; }) 329 | ]) 330 | .nice(); 331 | zoom.x(xScale); 332 | 333 | yScale.domain([ 334 | d3.min (data, function(d) { return .99 * d[yvar]; }), 335 | d3.max (data, function(d) { return 1.01 * d[yvar]; }) 336 | ]) 337 | .nice(); 338 | zoom.y(yScale); 339 | 340 | //relabel X and Y axes 341 | svg.select(".x.label").text(strings[xvar]) 342 | svg.select(".y.label").text(strings[yvar]) 343 | 344 | //filter out just photoactivatible proteins, plot them as circles 345 | PAdata = data.filter(function(d) {return d.type == "pa" || d.type =="ps"; }); 346 | // Join new data with old elements, if any. 347 | var circle = plotarea.selectAll("circle.PSFP").data(PAdata, function (d){ return d.UID;}); 348 | 349 | // Create new elements as needed. 350 | circle.enter().append("circle") 351 | .attr("class", function(d) { 352 | return d.type == "pa" ? "PSFP" : "PSFP ps";}) 353 | .attr("r", symbolsize) 354 | .attr("stroke", function (d) { return d3.hsl(hueScale (d.lambda_on), 1, 0.5)}) 355 | .style("fill", function (d) { return d3.hsl(hueScale (d.lambda_em), saturationScale (d.brightness), 0.5)}) 356 | .on('click', function(e){ 357 | if(e.DOI){window.location = "http://dx.doi.org/" + e.DOI;} 358 | }) 359 | .on("mouseover", function(d) { 360 | d3.select(this).transition().duration(mouseovertime).attr("r", bigsymbolsize); 361 | draw_tooltip(d, this);}) 362 | .on("mouseout", function() { 363 | d3.select(this).transition().duration(mouseovertime).attr("r", symbolsize) 364 | //Hide the tooltip 365 | d3.select("#tooltip").classed("hidden", true); 366 | }) 367 | .call(zoom) //so we can zoom while moused over circles as well 368 | 369 | // Remove old elements as needed. 370 | circle.exit().remove(); 371 | 372 | // move circles to their new positions (based on axes) with transition animation 373 | circle.transition() 374 | .attr("cx", function (d) { return xScale (d[xvar]); }) 375 | .attr("cy", function (d) { return yScale (d[yvar]); }) 376 | .duration(800); //change this number to speed up or slow down the animation 377 | 378 | //filter out just photoconvertible proteins, plot them as squares 379 | PCdata = data.filter(function(d) {return d.type == "pc"; }); 380 | // Join new data with old elements, if any. 381 | var square = plotarea.selectAll("rect.PSFP").data(PCdata, function (d){ return d.UID;}); 382 | 383 | 384 | // Create new elements as needed. 385 | square.enter().append("rect") 386 | .attr("class", "PSFP") 387 | .attr("width", symbolsize*2) 388 | .attr("height", symbolsize*2) 389 | .attr("stroke", "#000") 390 | .style("fill", function (d) { return d3.hsl(hueScale (d.lambda_em), saturationScale (d.brightness), 0.5)}) 391 | .on('click', function(e){ 392 | if(e.DOI){window.location = "http://dx.doi.org/" + e.DOI;} 393 | }) 394 | .on("mouseover", function(d) { 395 | d3.select(this).transition().duration(mouseovertime) 396 | .attr("height", bigsymbolsize*2) 397 | .attr("width", bigsymbolsize*2) 398 | // These lines are supposed to recenter squares so that they grow symmetrically around their center but 399 | // they currently don't work properly; it looks like xvar and yvar are not set properly when changing axes 400 | 401 | // hmmm... xvar and yvar appear to be getting set properly upon changing axis 402 | // confirm with alert(xvar) 403 | // however, when a square enters the DOM in this .append() function it seems to "stick" 404 | // with whatever the current xvar/yvar is at the moment and doesn't change it 405 | // later when the axis are changed. mousing over exposes this outdated databind... 406 | // and also explains why it works fine on whatever axis were set when the given square 407 | // entered the DOM. 408 | 409 | // changing xvar/yvar to currentX/currentY fixes the problem but it's worth leaving comments 410 | // here in case it breaks something later. 411 | // it's possible that creating the plot() function here with optional xvar and yvar arguments 412 | // was a bad idea, it might have been better to just use "global" currentX/currentY for everything. 413 | 414 | .attr("x", function (d) { return xScale (d[currentX]) - bigsymbolsize; }) 415 | .attr("y", function (d) { return yScale (d[currentY]) - bigsymbolsize; }); 416 | draw_tooltip(d, this);}) 417 | .on("mouseout", function() { 418 | d3.select(this).transition().duration(mouseovertime) 419 | .attr("height", symbolsize*2) 420 | .attr("width", symbolsize*2) 421 | .attr("x", function (d) { return xScale (d[currentX]) - symbolsize; }) 422 | .attr("y", function (d) { return yScale (d[currentY]) - symbolsize; }); 423 | //Hide the tooltip 424 | d3.select("#tooltip").classed("hidden", true); 425 | }) 426 | .call(zoom) //so we can zoom while moused over circles as well 427 | 428 | // Remove old elements as needed. 429 | square.exit().remove(); 430 | 431 | // move squares to their new positions (based on axes) with transition animation 432 | square.transition() 433 | .attr("x", function (d) { return xScale (d[currentX]) - symbolsize; }) 434 | .attr("y", function (d) { return yScale (d[currentY]) - symbolsize; }) 435 | .duration(800); //change this number to speed up or slow down the animation 436 | 437 | //Add links for photoconvertible proteins 438 | //remove links that go to proteins in the off state (those with lambda_ex = 0); 439 | 440 | links = links.filter(function(d) { return !d.lambda_ex.some( function(w) { return w == 0}) }); 441 | 442 | var line = plotarea.selectAll("line.PSFP").data(links, function (d){ return d.state1;}); 443 | line.enter().append("line") 444 | .attr("class", "PSFP") 445 | .attr("stroke", function (d) { return d3.hsl(hueScale (d.lambda_sw), 1, 0.5)}) 446 | .attr("marker-end", function (d){ return "url(#arrowhead" + d.state1 +")";}) 447 | .call(zoom); 448 | 449 | line.exit().remove(); 450 | 451 | line.transition() 452 | .attr("x1", function (d) { return xScale (d[currentX][0]); }) 453 | .attr("x2", function (d) { return xScale (d[currentX][1]); }) 454 | .attr("y1", function (d) { return yScale (d[currentY][0]); }) 455 | .attr("y2", function (d) { return yScale (d[currentY][1]); }) 456 | .duration(800); //change this number to speed up or slow down the animation 457 | 458 | // these two lines cause the transition animation on the axes... they are also cause chopiness in the user interface when the user slides the range sliders on the right side... uncomment to see their effect. 459 | svg.select(".x.axis.bottom").call(xAxis_bottom); 460 | svg.select(".y.axis.left").call(yAxis_left); 461 | } 462 | 463 | function draw_tooltip(d, target) { 464 | d3.select(target).text("hi") 465 | //Get target bar's x/y values, then augment for the tooltip 466 | var xPosition = parseFloat(d3.select(target).attr("cx") || d3.select(target).attr("x")) 467 | var yPosition = parseFloat(d3.select(target).attr("cy") || d3.select(target).attr("y")) 468 | if (xPosition520){ 474 | yPosition =520; 475 | } 476 | //Update the tooltip position and value 477 | d3.select("#tooltip") 478 | .style("left", xPosition + "px") 479 | .style("top", yPosition + "px") 480 | .select("#exvalue") 481 | .text(d.lambda_ex) 482 | d3.select("#tooltip") 483 | .select("#emvalue") 484 | .text(d.lambda_em); 485 | d3.select("#tooltip") 486 | .select("#ecvalue") 487 | .text(d.E); 488 | d3.select("#tooltip") 489 | .select("#qyvalue") 490 | .text(d.QY); 491 | d3.select("#tooltip") 492 | .select("h3") 493 | .text(d.Name); 494 | d3.select("#tooltip") 495 | .select("#brightnessvalue") 496 | .text(d.brightness); 497 | 498 | //Show the tooltip 499 | d3.select("#tooltip").classed("hidden", false); 500 | 501 | } 502 | 503 | function draw_table() { 504 | columns = Object.keys(tableStrings); //column names 505 | //split up fluorescent proteins by type and add the relevant tables 506 | FPgroups.forEach( function(FPtype) { 507 | function testfilt(element){ 508 | return element.type == FPtype.type; 509 | } 510 | 511 | var table = d3.select("#table").append("table"); 512 | //add title row 513 | table.append("tr").append("th") 514 | .attr("colspan", columns.length) 515 | .attr("class", "tabletitle") 516 | .style("background-color", FPtype.color) 517 | .text(FPtype.Name + " Proteins"); 518 | 519 | //filter table data 520 | //remove proteins with lambda_ex = 0 (off states) 521 | tdata = FPdata.filter(function(d) {return d.lambda_ex > 0;}); 522 | 523 | tdata = tdata.filter(testfilt); 524 | table.append("tr") 525 | .attr("class", "header") 526 | .selectAll("th") 527 | .data(columns) 528 | .enter().append("th") 529 | .html(function(d,i) { return tableStrings[columns[i]]; }) 530 | .attr("class", function(d,i) { return (d == "Name") ? "col head protein" : "col head numeric"; }); // conditional here to limit the use of unneccesary global variables 531 | 532 | //populate the table 533 | //Can't use d3's data binding because we want to group different states of 534 | //the same molecule as these in different rows of the data table. 535 | 536 | //Get list of all unique proteins from dataset 537 | var FPnames = d3.set(tdata.map(function (d) {return d.Name;})); 538 | FPnames.forEach( function(currprotein) { 539 | //Get all states for current protein 540 | var proteinData = tdata.filter(function(d) {return d.Name == currprotein;}); 541 | var nStates = proteinData.length; 542 | for (var i=0; i < nStates; i++){ 543 | //Add row 544 | var row = table.append("tr").attr("class", "data"); 545 | 546 | if (i == 0){ 547 | //First row, add protein name with rowspan 548 | row.append("td") 549 | .attr("class", "col protein") 550 | .attr("rowspan", nStates) 551 | .html(currprotein); 552 | } 553 | //loop over remaining data columns 554 | for (var key in tableStrings) { 555 | if (tableStrings.hasOwnProperty(key) && key != "Name") { 556 | //format text to print in table cell 557 | var text = ""; 558 | if (key == "RefNum"){ 559 | //add links to bibliography 560 | //make references rowspan to avoid duplication for each state 561 | if (i==0){ 562 | row.append("td") 563 | .attr("class", "col numeric") 564 | .attr("rowspan", nStates) 565 | .html("" + proteinData[i][key] + ""); 566 | } 567 | } 568 | else if (key == "transits"){ 569 | //add transitions table, in a rowspan 570 | if (i==0){ 571 | row.append("td") 572 | .attr("class", "col numeric") 573 | .attr("rowspan", nStates) 574 | .html(generate_transitions(currprotein)); 575 | } 576 | } 577 | else{ 578 | row.append("td") 579 | .attr("class", "col numeric") 580 | .html(proteinData[i][key]); 581 | } 582 | 583 | 584 | } 585 | } 586 | } 587 | }); 588 | }); 589 | }; 590 | 591 | function generate_transitions(name) { 592 | var outputHTML = ""; 593 | //get all states for the protein with the given name 594 | var proteinData = FPdata.filter(function(d) {return d.Name == name;}) 595 | var statesToProcess = new Array(); 596 | var statesProcessed = new Array(); 597 | 598 | //get initial state for protein 599 | var startState = proteinData.filter(function(d) {return d.initialState == 1;}); 600 | statesToProcess.push(startState[0].UID); 601 | while (statesToProcess.length > 0){ 602 | //pull next state off queue 603 | var nextState = statesToProcess.shift(); 604 | //check if we've processed it 605 | if (!statesProcessed.some(function(d) {return d == nextState;})) { 606 | var transitions = linkdata.filter(function(d) {return d.state1 == nextState}); 607 | outputHTML = print_transitions(transitions, outputHTML); 608 | //add destination states to list to process 609 | transitions.forEach(function (d){statesToProcess.push(d.state2);}); 610 | //add current state to processed list 611 | statesProcessed.push(nextState); 612 | } 613 | } 614 | return outputHTML; 615 | } 616 | 617 | function print_transitions(transitions, outputHTML){ 618 | transitions.forEach(function(transit) { 619 | //get name of state1 620 | startname = FPdata.filter(function(d) {return d.UID == transit.state1}); 621 | startname = startname[0].state; 622 | //get name of state2 623 | endname = FPdata.filter(function(d) {return d.UID == transit.state2}); 624 | endname = endname[0].state; 625 | outputHTML = outputHTML + startname + " → " + endname; 626 | outputHTML = outputHTML + ", " + transit.lambda_sw + " nm
\n"; 627 | return outputHTML; 628 | }) 629 | return outputHTML; 630 | } 631 | 632 | 633 | function doalittledance(int) { 634 | var s = ["QY","E","lambda_em","lambda_ex","brightness"]; 635 | setInterval(function() { 636 | var x = s[Math.floor(Math.random() * s.length)]; 637 | do{ 638 | var y = s[Math.floor(Math.random() * s.length)]; 639 | } while (x == y); 640 | plot(x,y); 641 | }, int); 642 | 643 | } 644 | 645 | 646 | //this bit is just a jQuery plugin to make the radio checkboxes on the right side vertical 647 | (function( $ ){ 648 | //plugin buttonset vertical 649 | $.fn.buttonsetv = function() { 650 | $(':radio, :checkbox', this).wrap('
'); 651 | $(this).buttonset(); 652 | $('label:first', this).removeClass('ui-corner-left').addClass('ui-corner-top'); 653 | $('label:last', this).removeClass('ui-corner-right').addClass('ui-corner-bottom'); 654 | mw = 0; // max witdh 655 | $('label', this).each(function(index){ 656 | w = $(this).width(); 657 | if (w > mw) mw = w; 658 | }) 659 | $('label', this).each(function(index){ 660 | $(this).width(mw); 661 | }) 662 | }; 663 | })( jQuery ); -------------------------------------------------------------------------------- /js/jQRangeSlider-min.js: -------------------------------------------------------------------------------- 1 | /*! jQRangeSlider 5.3.0 - 2013-07-12 - Copyright (C) Guillaume Gautreau 2012 - MIT and GPLv3 licenses.*/!function(a){"use strict";a.widget("ui.rangeSliderMouseTouch",a.ui.mouse,{enabled:!0,_mouseInit:function(){var b=this;a.ui.mouse.prototype._mouseInit.apply(this),this._mouseDownEvent=!1,this.element.bind("touchstart."+this.widgetName,function(a){return b._touchStart(a)})},_mouseDestroy:function(){a(document).unbind("touchmove."+this.widgetName,this._touchMoveDelegate).unbind("touchend."+this.widgetName,this._touchEndDelegate),a.ui.mouse.prototype._mouseDestroy.apply(this)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},destroy:function(){this._mouseDestroy(),a.ui.mouse.prototype.destroy.apply(this),this._mouseInit=null},_touchStart:function(b){if(!this.enabled)return!1;b.which=1,b.preventDefault(),this._fillTouchEvent(b);var c=this,d=this._mouseDownEvent;this._mouseDown(b),d!==this._mouseDownEvent&&(this._touchEndDelegate=function(a){c._touchEnd(a)},this._touchMoveDelegate=function(a){c._touchMove(a)},a(document).bind("touchmove."+this.widgetName,this._touchMoveDelegate).bind("touchend."+this.widgetName,this._touchEndDelegate))},_mouseDown:function(b){return this.enabled?a.ui.mouse.prototype._mouseDown.apply(this,[b]):!1},_touchEnd:function(b){this._fillTouchEvent(b),this._mouseUp(b),a(document).unbind("touchmove."+this.widgetName,this._touchMoveDelegate).unbind("touchend."+this.widgetName,this._touchEndDelegate),this._mouseDownEvent=!1,a(document).trigger("mouseup")},_touchMove:function(a){return a.preventDefault(),this._fillTouchEvent(a),this._mouseMove(a)},_fillTouchEvent:function(a){var b;b="undefined"==typeof a.targetTouches&&"undefined"==typeof a.changedTouches?a.originalEvent.targetTouches[0]||a.originalEvent.changedTouches[0]:a.targetTouches[0]||a.changedTouches[0],a.pageX=b.pageX,a.pageY=b.pageY}})}(jQuery),function(a){"use strict";a.widget("ui.rangeSliderDraggable",a.ui.rangeSliderMouseTouch,{cache:null,options:{containment:null},_create:function(){a.ui.rangeSliderMouseTouch.prototype._create.apply(this),setTimeout(a.proxy(this._initElementIfNotDestroyed,this),10)},destroy:function(){this.cache=null,a.ui.rangeSliderMouseTouch.prototype.destroy.apply(this)},_initElementIfNotDestroyed:function(){this._mouseInit&&this._initElement()},_initElement:function(){this._mouseInit(),this._cache()},_setOption:function(b,c){"containment"===b&&(this.options.containment=null===c||0===a(c).length?null:a(c))},_mouseStart:function(a){return this._cache(),this.cache.click={left:a.pageX,top:a.pageY},this.cache.initialOffset=this.element.offset(),this._triggerMouseEvent("mousestart"),!0},_mouseDrag:function(a){var b=a.pageX-this.cache.click.left;return b=this._constraintPosition(b+this.cache.initialOffset.left),this._applyPosition(b),this._triggerMouseEvent("sliderDrag"),!1},_mouseStop:function(){this._triggerMouseEvent("stop")},_constraintPosition:function(a){return 0!==this.element.parent().length&&null!==this.cache.parent.offset&&(a=Math.min(a,this.cache.parent.offset.left+this.cache.parent.width-this.cache.width.outer),a=Math.max(a,this.cache.parent.offset.left)),a},_applyPosition:function(a){var b={top:this.cache.offset.top,left:a};this.element.offset({left:a}),this.cache.offset=b},_cacheIfNecessary:function(){null===this.cache&&this._cache()},_cache:function(){this.cache={},this._cacheMargins(),this._cacheParent(),this._cacheDimensions(),this.cache.offset=this.element.offset()},_cacheMargins:function(){this.cache.margin={left:this._parsePixels(this.element,"marginLeft"),right:this._parsePixels(this.element,"marginRight"),top:this._parsePixels(this.element,"marginTop"),bottom:this._parsePixels(this.element,"marginBottom")}},_cacheParent:function(){if(null!==this.options.parent){var a=this.element.parent();this.cache.parent={offset:a.offset(),width:a.width()}}else this.cache.parent=null},_cacheDimensions:function(){this.cache.width={outer:this.element.outerWidth(),inner:this.element.width()}},_parsePixels:function(a,b){return parseInt(a.css(b),10)||0},_triggerMouseEvent:function(a){var b=this._prepareEventData();this.element.trigger(a,b)},_prepareEventData:function(){return{element:this.element,offset:this.cache.offset||null}}})}(jQuery),function(a,b){"use strict";a.widget("ui.rangeSlider",{options:{bounds:{min:0,max:100},defaultValues:{min:20,max:50},wheelMode:null,wheelSpeed:4,arrows:!0,valueLabels:"show",formatter:null,durationIn:0,durationOut:400,delayOut:200,range:{min:!1,max:!1},step:!1,scales:!1,enabled:!0},_values:null,_valuesChanged:!1,bar:null,leftHandle:null,rightHandle:null,innerBar:null,container:null,arrows:null,labels:null,changing:{min:!1,max:!1},changed:{min:!1,max:!1},ruler:null,_create:function(){this._setDefaultValues(),this.labels={left:null,right:null,leftDisplayed:!0,rightDisplayed:!0},this.arrows={left:null,right:null},this.changing={min:!1,max:!1},this.changed={min:!1,max:!1},this._createElements(),this._bindResize(),setTimeout(a.proxy(this.resize,this),1),setTimeout(a.proxy(this._initValues,this),1)},_setDefaultValues:function(){this._values={min:this.options.defaultValues.min,max:this.options.defaultValues.max}},_bindResize:function(){var b=this;this._resizeProxy=function(a){b.resize(a)},a(window).resize(this._resizeProxy)},_initWidth:function(){this.container.css("width",this.element.width()-this.container.outerWidth(!0)+this.container.width()),this.innerBar.css("width",this.container.width()-this.innerBar.outerWidth(!0)+this.innerBar.width())},_initValues:function(){this.values(this._values.min,this._values.max)},_setOption:function(a,b){this._setWheelOption(a,b),this._setArrowsOption(a,b),this._setLabelsOption(a,b),this._setLabelsDurations(a,b),this._setFormatterOption(a,b),this._setBoundsOption(a,b),this._setRangeOption(a,b),this._setStepOption(a,b),this._setScalesOption(a,b),this._setEnabledOption(a,b)},_validProperty:function(a,b,c){return null===a||"undefined"==typeof a[b]?c:a[b]},_setStepOption:function(a,b){"step"===a&&(this.options.step=b,this._leftHandle("option","step",b),this._rightHandle("option","step",b),this._changed(!0))},_setScalesOption:function(a,b){"scales"===a&&(b===!1||null===b?(this.options.scales=!1,this._destroyRuler()):b instanceof Array&&(this.options.scales=b,this._updateRuler()))},_setRangeOption:function(a,b){"range"===a&&(this._bar("option","range",b),this.options.range=this._bar("option","range"),this._changed(!0))},_setBoundsOption:function(a,b){"bounds"===a&&"undefined"!=typeof b.min&&"undefined"!=typeof b.max&&this.bounds(b.min,b.max)},_setWheelOption:function(a,b){("wheelMode"===a||"wheelSpeed"===a)&&(this._bar("option",a,b),this.options[a]=this._bar("option",a))},_setLabelsOption:function(a,b){if("valueLabels"===a){if("hide"!==b&&"show"!==b&&"change"!==b)return;this.options.valueLabels=b,"hide"!==b?(this._createLabels(),this._leftLabel("update"),this._rightLabel("update")):this._destroyLabels()}},_setFormatterOption:function(a,b){"formatter"===a&&null!==b&&"function"==typeof b&&(this.options.formatter=b,"hide"!==this.options.valueLabels&&(this._destroyLabels(),this._createLabels()))},_setArrowsOption:function(a,b){"arrows"!==a||b!==!0&&b!==!1||b===this.options.arrows||(b===!0?(this.element.removeClass("ui-rangeSlider-noArrow").addClass("ui-rangeSlider-withArrows"),this.arrows.left.css("display","block"),this.arrows.right.css("display","block"),this.options.arrows=!0):b===!1&&(this.element.addClass("ui-rangeSlider-noArrow").removeClass("ui-rangeSlider-withArrows"),this.arrows.left.css("display","none"),this.arrows.right.css("display","none"),this.options.arrows=!1),this._initWidth())},_setLabelsDurations:function(a,b){if("durationIn"===a||"durationOut"===a||"delayOut"===a){if(parseInt(b,10)!==b)return;null!==this.labels.left&&this._leftLabel("option",a,b),null!==this.labels.right&&this._rightLabel("option",a,b),this.options[a]=b}},_setEnabledOption:function(a,b){"enabled"===a&&this.toggle(b)},_createElements:function(){"absolute"!==this.element.css("position")&&this.element.css("position","relative"),this.element.addClass("ui-rangeSlider"),this.container=a("
").css("position","absolute").appendTo(this.element),this.innerBar=a("
").css("position","absolute").css("top",0).css("left",0),this._createHandles(),this._createBar(),this.container.prepend(this.innerBar),this._createArrows(),"hide"!==this.options.valueLabels?this._createLabels():this._destroyLabels(),this._updateRuler(),this.options.enabled||this._toggle(this.options.enabled)},_createHandle:function(b){return a("
")[this._handleType()](b).bind("sliderDrag",a.proxy(this._changing,this)).bind("stop",a.proxy(this._changed,this))},_createHandles:function(){this.leftHandle=this._createHandle({isLeft:!0,bounds:this.options.bounds,value:this._values.min,step:this.options.step}).appendTo(this.container),this.rightHandle=this._createHandle({isLeft:!1,bounds:this.options.bounds,value:this._values.max,step:this.options.step}).appendTo(this.container)},_createBar:function(){this.bar=a("
").prependTo(this.container).bind("sliderDrag scroll zoom",a.proxy(this._changing,this)).bind("stop",a.proxy(this._changed,this)),this._bar({leftHandle:this.leftHandle,rightHandle:this.rightHandle,values:{min:this._values.min,max:this._values.max},type:this._handleType(),range:this.options.range,wheelMode:this.options.wheelMode,wheelSpeed:this.options.wheelSpeed}),this.options.range=this._bar("option","range"),this.options.wheelMode=this._bar("option","wheelMode"),this.options.wheelSpeed=this._bar("option","wheelSpeed")},_createArrows:function(){this.arrows.left=this._createArrow("left"),this.arrows.right=this._createArrow("right"),this.options.arrows?this.element.addClass("ui-rangeSlider-withArrows"):(this.arrows.left.css("display","none"),this.arrows.right.css("display","none"),this.element.addClass("ui-rangeSlider-noArrow"))},_createArrow:function(b){var c,d=a("
").append("
").addClass("ui-rangeSlider-"+b+"Arrow").css("position","absolute").css(b,0).appendTo(this.element);return c="right"===b?a.proxy(this._scrollRightClick,this):a.proxy(this._scrollLeftClick,this),d.bind("mousedown touchstart",c),d},_proxy:function(a,b,c){var d=Array.prototype.slice.call(c);return a[b].apply(a,d)},_handleType:function(){return"rangeSliderHandle"},_barType:function(){return"rangeSliderBar"},_bar:function(){return this._proxy(this.bar,this._barType(),arguments)},_labelType:function(){return"rangeSliderLabel"},_leftLabel:function(){return this._proxy(this.labels.left,this._labelType(),arguments)},_rightLabel:function(){return this._proxy(this.labels.right,this._labelType(),arguments)},_leftHandle:function(){return this._proxy(this.leftHandle,this._handleType(),arguments)},_rightHandle:function(){return this._proxy(this.rightHandle,this._handleType(),arguments)},_getValue:function(a,b){return b===this.rightHandle&&(a-=b.outerWidth()),a*(this.options.bounds.max-this.options.bounds.min)/(this.container.innerWidth()-b.outerWidth(!0))+this.options.bounds.min},_trigger:function(a){var b=this;setTimeout(function(){b.element.trigger(a,{label:b.element,values:b.values()})},1)},_changing:function(){this._updateValues()&&(this._trigger("valuesChanging"),this._valuesChanged=!0)},_changed:function(a){(this._updateValues()||this._valuesChanged)&&(this._trigger("valuesChanged"),a!==!0&&this._trigger("userValuesChanged"),this._valuesChanged=!1)},_updateValues:function(){var a=this._leftHandle("value"),b=this._rightHandle("value"),c=this._min(a,b),d=this._max(a,b),e=c!==this._values.min||d!==this._values.max;return this._values.min=this._min(a,b),this._values.max=this._max(a,b),e},_min:function(a,b){return Math.min(a,b)},_max:function(a,b){return Math.max(a,b)},_createLabel:function(b,c){var d;return null===b?(d=this._getLabelConstructorParameters(b,c),b=a("
").appendTo(this.element)[this._labelType()](d)):(d=this._getLabelRefreshParameters(b,c),b[this._labelType()](d)),b},_getLabelConstructorParameters:function(a,b){return{handle:b,handleType:this._handleType(),formatter:this._getFormatter(),show:this.options.valueLabels,durationIn:this.options.durationIn,durationOut:this.options.durationOut,delayOut:this.options.delayOut}},_getLabelRefreshParameters:function(){return{formatter:this._getFormatter(),show:this.options.valueLabels,durationIn:this.options.durationIn,durationOut:this.options.durationOut,delayOut:this.options.delayOut}},_getFormatter:function(){return this.options.formatter===!1||null===this.options.formatter?this._defaultFormatter:this.options.formatter},_defaultFormatter:function(a){return Math.round(a)},_destroyLabel:function(a){return null!==a&&(a[this._labelType()]("destroy"),a.remove(),a=null),a},_createLabels:function(){this.labels.left=this._createLabel(this.labels.left,this.leftHandle),this.labels.right=this._createLabel(this.labels.right,this.rightHandle),this._leftLabel("pair",this.labels.right)},_destroyLabels:function(){this.labels.left=this._destroyLabel(this.labels.left),this.labels.right=this._destroyLabel(this.labels.right)},_stepRatio:function(){return this._leftHandle("stepRatio")},_scrollRightClick:function(a){return this.options.enabled?(a.preventDefault(),this._bar("startScroll"),this._bindStopScroll(),this._continueScrolling("scrollRight",4*this._stepRatio(),1),void 0):!1},_continueScrolling:function(a,b,c,d){if(!this.options.enabled)return!1;this._bar(a,c),d=d||5,d--;var e=this,f=16,g=Math.max(1,4/this._stepRatio());this._scrollTimeout=setTimeout(function(){0===d&&(b>f?b=Math.max(f,b/1.5):c=Math.min(g,2*c),d=5),e._continueScrolling(a,b,c,d)},b)},_scrollLeftClick:function(a){return this.options.enabled?(a.preventDefault(),this._bar("startScroll"),this._bindStopScroll(),this._continueScrolling("scrollLeft",4*this._stepRatio(),1),void 0):!1},_bindStopScroll:function(){var b=this;this._stopScrollHandle=function(a){a.preventDefault(),b._stopScroll()},a(document).bind("mouseup touchend",this._stopScrollHandle)},_stopScroll:function(){a(document).unbind("mouseup touchend",this._stopScrollHandle),this._stopScrollHandle=null,this._bar("stopScroll"),clearTimeout(this._scrollTimeout)},_createRuler:function(){this.ruler=a("
").appendTo(this.innerBar)},_setRulerParameters:function(){this.ruler.ruler({min:this.options.bounds.min,max:this.options.bounds.max,scales:this.options.scales})},_destroyRuler:function(){null!==this.ruler&&a.fn.ruler&&(this.ruler.ruler("destroy"),this.ruler.remove(),this.ruler=null)},_updateRuler:function(){this._destroyRuler(),this.options.scales!==!1&&a.fn.ruler&&(this._createRuler(),this._setRulerParameters())},values:function(a,b){var c=this._bar("values",a,b);return"undefined"!=typeof a&&"undefined"!=typeof b&&this._changed(!0),c},min:function(a){return this._values.min=this.values(a,this._values.max).min,this._values.min},max:function(a){return this._values.max=this.values(this._values.min,a).max,this._values.max},bounds:function(a,b){return this._isValidValue(a)&&this._isValidValue(b)&&b>a&&(this._setBounds(a,b),this._updateRuler(),this._changed(!0)),this.options.bounds},_isValidValue:function(a){return"undefined"!=typeof a&&parseFloat(a)===a},_setBounds:function(a,b){this.options.bounds={min:a,max:b},this._leftHandle("option","bounds",this.options.bounds),this._rightHandle("option","bounds",this.options.bounds),this._bar("option","bounds",this.options.bounds)},zoomIn:function(a){this._bar("zoomIn",a)},zoomOut:function(a){this._bar("zoomOut",a)},scrollLeft:function(a){this._bar("startScroll"),this._bar("scrollLeft",a),this._bar("stopScroll")},scrollRight:function(a){this._bar("startScroll"),this._bar("scrollRight",a),this._bar("stopScroll")},resize:function(){this._initWidth(),this._leftHandle("update"),this._rightHandle("update"),this._bar("update")},enable:function(){this.toggle(!0)},disable:function(){this.toggle(!1)},toggle:function(a){a===b&&(a=!this.options.enabled),this.options.enabled!==a&&this._toggle(a)},_toggle:function(a){this.options.enabled=a,this.element.toggleClass("ui-rangeSlider-disabled",!a);var b=a?"enable":"disable";this._bar(b),this._leftHandle(b),this._rightHandle(b),this._leftLabel(b),this._rightLabel(b)},destroy:function(){this.element.removeClass("ui-rangeSlider-withArrows ui-rangeSlider-noArrow ui-rangeSlider-disabled"),this._destroyWidgets(),this._destroyElements(),this.element.removeClass("ui-rangeSlider"),this.options=null,a(window).unbind("resize",this._resizeProxy),this._resizeProxy=null,this._bindResize=null,a.Widget.prototype.destroy.apply(this,arguments)},_destroyWidget:function(a){this["_"+a]("destroy"),this[a].remove(),this[a]=null},_destroyWidgets:function(){this._destroyWidget("bar"),this._destroyWidget("leftHandle"),this._destroyWidget("rightHandle"),this._destroyRuler(),this._destroyLabels()},_destroyElements:function(){this.container.remove(),this.container=null,this.innerBar.remove(),this.innerBar=null,this.arrows.left.remove(),this.arrows.right.remove(),this.arrows=null}})}(jQuery),function(a){"use strict";a.widget("ui.rangeSliderHandle",a.ui.rangeSliderDraggable,{currentMove:null,margin:0,parentElement:null,options:{isLeft:!0,bounds:{min:0,max:100},range:!1,value:0,step:!1},_value:0,_left:0,_create:function(){a.ui.rangeSliderDraggable.prototype._create.apply(this),this.element.css("position","absolute").css("top",0).addClass("ui-rangeSlider-handle").toggleClass("ui-rangeSlider-leftHandle",this.options.isLeft).toggleClass("ui-rangeSlider-rightHandle",!this.options.isLeft),this.element.append("
"),this._value=this._constraintValue(this.options.value)},destroy:function(){this.element.empty(),a.ui.rangeSliderDraggable.prototype.destroy.apply(this)},_setOption:function(b,c){"isLeft"!==b||c!==!0&&c!==!1||c===this.options.isLeft?"step"===b&&this._checkStep(c)?(this.options.step=c,this.update()):"bounds"===b?(this.options.bounds=c,this.update()):"range"===b&&this._checkRange(c)&&(this.options.range=c,this.update()):(this.options.isLeft=c,this.element.toggleClass("ui-rangeSlider-leftHandle",this.options.isLeft).toggleClass("ui-rangeSlider-rightHandle",!this.options.isLeft),this._position(this._value),this.element.trigger("switch",this.options.isLeft)),a.ui.rangeSliderDraggable.prototype._setOption.apply(this,[b,c])},_checkRange:function(a){return a===!1||!this._isValidValue(a.min)&&!this._isValidValue(a.max)},_isValidValue:function(a){return"undefined"!=typeof a&&a!==!1&&parseFloat(a)!==a},_checkStep:function(a){return a===!1||parseFloat(a)===a},_initElement:function(){a.ui.rangeSliderDraggable.prototype._initElement.apply(this),0===this.cache.parent.width||null===this.cache.parent.width?setTimeout(a.proxy(this._initElementIfNotDestroyed,this),500):(this._position(this._value),this._triggerMouseEvent("initialize"))},_bounds:function(){return this.options.bounds},_cache:function(){a.ui.rangeSliderDraggable.prototype._cache.apply(this),this._cacheParent()},_cacheParent:function(){var a=this.element.parent();this.cache.parent={element:a,offset:a.offset(),padding:{left:this._parsePixels(a,"paddingLeft")},width:a.width()}},_position:function(a){var b=this._getPositionForValue(a);this._applyPosition(b)},_constraintPosition:function(a){var b=this._getValueForPosition(a);return this._getPositionForValue(b)},_applyPosition:function(b){a.ui.rangeSliderDraggable.prototype._applyPosition.apply(this,[b]),this._left=b,this._setValue(this._getValueForPosition(b)),this._triggerMouseEvent("moving")},_prepareEventData:function(){var b=a.ui.rangeSliderDraggable.prototype._prepareEventData.apply(this);return b.value=this._value,b},_setValue:function(a){a!==this._value&&(this._value=a)},_constraintValue:function(a){if(a=Math.min(a,this._bounds().max),a=Math.max(a,this._bounds().min),a=this._round(a),this.options.range!==!1){var b=this.options.range.min||!1,c=this.options.range.max||!1;b!==!1&&(a=Math.max(a,this._round(b))),c!==!1&&(a=Math.min(a,this._round(c))),a=Math.min(a,this._bounds().max),a=Math.max(a,this._bounds().min)}return a},_round:function(a){return this.options.step!==!1&&this.options.step>0?Math.round(a/this.options.step)*this.options.step:a},_getPositionForValue:function(a){if(!this.cache||!this.cache.parent||null===this.cache.parent.offset)return 0;a=this._constraintValue(a);var b=(a-this.options.bounds.min)/(this.options.bounds.max-this.options.bounds.min),c=this.cache.parent.width-this.cache.width.outer,d=this.cache.parent.offset.left;return b*c+d},_getValueForPosition:function(a){var b=this._getRawValueForPositionAndBounds(a,this.options.bounds.min,this.options.bounds.max);return this._constraintValue(b)},_getRawValueForPositionAndBounds:function(a,b,c){var d=null===this.cache.parent.offset?0:this.cache.parent.offset.left,e=this.cache.parent.width-this.cache.width.outer,f=(a-d)/e;return f*(c-b)+b},value:function(a){return"undefined"!=typeof a&&(this._cache(),a=this._constraintValue(a),this._position(a)),this._value},update:function(){this._cache();var a=this._constraintValue(this._value),b=this._getPositionForValue(a);a!==this._value?(this._triggerMouseEvent("updating"),this._position(a),this._triggerMouseEvent("update")):b!==this.cache.offset.left&&(this._triggerMouseEvent("updating"),this._position(a),this._triggerMouseEvent("update"))},position:function(a){return"undefined"!=typeof a&&(this._cache(),a=this._constraintPosition(a),this._applyPosition(a)),this._left},add:function(a,b){return a+b},substract:function(a,b){return a-b},stepsBetween:function(a,b){return this.options.step===!1?b-a:(b-a)/this.options.step},multiplyStep:function(a,b){return a*b},moveRight:function(a){var b;return this.options.step===!1?(b=this._left,this.position(this._left+a),this._left-b):(b=this._value,this.value(this.add(b,this.multiplyStep(this.options.step,a))),this.stepsBetween(b,this._value))},moveLeft:function(a){return-this.moveRight(-a)},stepRatio:function(){if(this.options.step===!1)return 1;var a=(this.options.bounds.max-this.options.bounds.min)/this.options.step;return this.cache.parent.width/a}})}(jQuery),function(a){"use strict";a.widget("ui.rangeSliderBar",a.ui.rangeSliderDraggable,{options:{leftHandle:null,rightHandle:null,bounds:{min:0,max:100},type:"rangeSliderHandle",range:!1,drag:function(){},stop:function(){},values:{min:0,max:20},wheelSpeed:4,wheelMode:null},_values:{min:0,max:20},_waitingToInit:2,_wheelTimeout:!1,_create:function(){a.ui.rangeSliderDraggable.prototype._create.apply(this),this.element.css("position","absolute").css("top",0).addClass("ui-rangeSlider-bar"),this.options.leftHandle.bind("initialize",a.proxy(this._onInitialized,this)).bind("mousestart",a.proxy(this._cache,this)).bind("stop",a.proxy(this._onHandleStop,this)),this.options.rightHandle.bind("initialize",a.proxy(this._onInitialized,this)).bind("mousestart",a.proxy(this._cache,this)).bind("stop",a.proxy(this._onHandleStop,this)),this._bindHandles(),this._values=this.options.values,this._setWheelModeOption(this.options.wheelMode)},destroy:function(){this.options.leftHandle.unbind(".bar"),this.options.rightHandle.unbind(".bar"),this.options=null,a.ui.rangeSliderDraggable.prototype.destroy.apply(this)},_setOption:function(a,b){"range"===a?this._setRangeOption(b):"wheelSpeed"===a?this._setWheelSpeedOption(b):"wheelMode"===a&&this._setWheelModeOption(b)},_setRangeOption:function(a){if(("object"!=typeof a||null===a)&&(a=!1),a!==!1||this.options.range!==!1){if(a!==!1){var b="undefined"==typeof a.min?this.options.range.min||!1:a.min,c="undefined"==typeof a.max?this.options.range.max||!1:a.max;this.options.range={min:b,max:c}}else this.options.range=!1;this._setLeftRange(),this._setRightRange()}},_setWheelSpeedOption:function(a){"number"==typeof a&&a>0&&(this.options.wheelSpeed=a)},_setWheelModeOption:function(a){(null===a||a===!1||"zoom"===a||"scroll"===a)&&(this.options.wheelMode!==a&&this.element.parent().unbind("mousewheel.bar"),this._bindMouseWheel(a),this.options.wheelMode=a)},_bindMouseWheel:function(b){"zoom"===b?this.element.parent().bind("mousewheel.bar",a.proxy(this._mouseWheelZoom,this)):"scroll"===b&&this.element.parent().bind("mousewheel.bar",a.proxy(this._mouseWheelScroll,this))},_setLeftRange:function(){if(this.options.range===!1)return!1;var a=this._values.max,b={min:!1,max:!1};b.max=(this.options.range.min||!1)!==!1?this._leftHandle("substract",a,this.options.range.min):!1,b.min=(this.options.range.max||!1)!==!1?this._leftHandle("substract",a,this.options.range.max):!1,this._leftHandle("option","range",b)},_setRightRange:function(){var a=this._values.min,b={min:!1,max:!1};b.min=(this.options.range.min||!1)!==!1?this._rightHandle("add",a,this.options.range.min):!1,b.max=(this.options.range.max||!1)!==!1?this._rightHandle("add",a,this.options.range.max):!1,this._rightHandle("option","range",b)},_deactivateRange:function(){this._leftHandle("option","range",!1),this._rightHandle("option","range",!1)},_reactivateRange:function(){this._setRangeOption(this.options.range)},_onInitialized:function(){this._waitingToInit--,0===this._waitingToInit&&this._initMe()},_initMe:function(){this._cache(),this.min(this._values.min),this.max(this._values.max);var a=this._leftHandle("position"),b=this._rightHandle("position")+this.options.rightHandle.width();this.element.offset({left:a}),this.element.css("width",b-a)},_leftHandle:function(){return this._handleProxy(this.options.leftHandle,arguments)},_rightHandle:function(){return this._handleProxy(this.options.rightHandle,arguments)},_handleProxy:function(a,b){var c=Array.prototype.slice.call(b);return a[this.options.type].apply(a,c)},_cache:function(){a.ui.rangeSliderDraggable.prototype._cache.apply(this),this._cacheHandles()},_cacheHandles:function(){this.cache.rightHandle={},this.cache.rightHandle.width=this.options.rightHandle.width(),this.cache.rightHandle.offset=this.options.rightHandle.offset(),this.cache.leftHandle={},this.cache.leftHandle.offset=this.options.leftHandle.offset()},_mouseStart:function(b){a.ui.rangeSliderDraggable.prototype._mouseStart.apply(this,[b]),this._deactivateRange()},_mouseStop:function(b){a.ui.rangeSliderDraggable.prototype._mouseStop.apply(this,[b]),this._cacheHandles(),this._values.min=this._leftHandle("value"),this._values.max=this._rightHandle("value"),this._reactivateRange(),this._leftHandle().trigger("stop"),this._rightHandle().trigger("stop")},_onDragLeftHandle:function(a,b){return this._cacheIfNecessary(),this._switchedValues()?(this._switchHandles(),this._onDragRightHandle(a,b),void 0):(this._values.min=b.value,this.cache.offset.left=b.offset.left,this.cache.leftHandle.offset=b.offset,this._positionBar(),void 0)},_onDragRightHandle:function(a,b){return this._cacheIfNecessary(),this._switchedValues()?(this._switchHandles(),this._onDragLeftHandle(a,b),void 0):(this._values.max=b.value,this.cache.rightHandle.offset=b.offset,this._positionBar(),void 0)},_positionBar:function(){var a=this.cache.rightHandle.offset.left+this.cache.rightHandle.width-this.cache.leftHandle.offset.left;this.cache.width.inner=a,this.element.css("width",a).offset({left:this.cache.leftHandle.offset.left})},_onHandleStop:function(){this._setLeftRange(),this._setRightRange()},_switchedValues:function(){if(this.min()>this.max()){var a=this._values.min;return this._values.min=this._values.max,this._values.max=a,!0}return!1},_switchHandles:function(){var a=this.options.leftHandle;this.options.leftHandle=this.options.rightHandle,this.options.rightHandle=a,this._leftHandle("option","isLeft",!0),this._rightHandle("option","isLeft",!1),this._bindHandles(),this._cacheHandles()},_bindHandles:function(){this.options.leftHandle.unbind(".bar").bind("sliderDrag.bar update.bar moving.bar",a.proxy(this._onDragLeftHandle,this)),this.options.rightHandle.unbind(".bar").bind("sliderDrag.bar update.bar moving.bar",a.proxy(this._onDragRightHandle,this))},_constraintPosition:function(b){var c,d={};return d.left=a.ui.rangeSliderDraggable.prototype._constraintPosition.apply(this,[b]),d.left=this._leftHandle("position",d.left),c=this._rightHandle("position",d.left+this.cache.width.outer-this.cache.rightHandle.width),d.width=c-d.left+this.cache.rightHandle.width,d},_applyPosition:function(b){a.ui.rangeSliderDraggable.prototype._applyPosition.apply(this,[b.left]),this.element.width(b.width)},_mouseWheelZoom:function(b,c,d,e){var f=this._values.min+(this._values.max-this._values.min)/2,g={},h={};return this.options.range===!1||this.options.range.min===!1?(g.max=f,h.min=f):(g.max=f-this.options.range.min/2,h.min=f+this.options.range.min/2),this.options.range!==!1&&this.options.range.max!==!1&&(g.min=f-this.options.range.max/2,h.max=f+this.options.range.max/2),this._leftHandle("option","range",g),this._rightHandle("option","range",h),clearTimeout(this._wheelTimeout),this._wheelTimeout=setTimeout(a.proxy(this._wheelStop,this),200),this.zoomOut(e*this.options.wheelSpeed),!1},_mouseWheelScroll:function(b,c,d,e){return this._wheelTimeout===!1?this.startScroll():clearTimeout(this._wheelTimeout),this._wheelTimeout=setTimeout(a.proxy(this._wheelStop,this),200),this.scrollLeft(e*this.options.wheelSpeed),!1},_wheelStop:function(){this.stopScroll(),this._wheelTimeout=!1},min:function(a){return this._leftHandle("value",a)},max:function(a){return this._rightHandle("value",a)},startScroll:function(){this._deactivateRange()},stopScroll:function(){this._reactivateRange(),this._triggerMouseEvent("stop"),this._leftHandle().trigger("stop"),this._rightHandle().trigger("stop")},scrollLeft:function(a){return a=a||1,0>a?this.scrollRight(-a):(a=this._leftHandle("moveLeft",a),this._rightHandle("moveLeft",a),this.update(),this._triggerMouseEvent("scroll"),void 0)},scrollRight:function(a){return a=a||1,0>a?this.scrollLeft(-a):(a=this._rightHandle("moveRight",a),this._leftHandle("moveRight",a),this.update(),this._triggerMouseEvent("scroll"),void 0)},zoomIn:function(a){if(a=a||1,0>a)return this.zoomOut(-a);var b=this._rightHandle("moveLeft",a);a>b&&(b/=2,this._rightHandle("moveRight",b)),this._leftHandle("moveRight",b),this.update(),this._triggerMouseEvent("zoom")},zoomOut:function(a){if(a=a||1,0>a)return this.zoomIn(-a);var b=this._rightHandle("moveRight",a);a>b&&(b/=2,this._rightHandle("moveLeft",b)),this._leftHandle("moveLeft",b),this.update(),this._triggerMouseEvent("zoom")},values:function(a,b){if("undefined"!=typeof a&&"undefined"!=typeof b){var c=Math.min(a,b),d=Math.max(a,b);this._deactivateRange(),this.options.leftHandle.unbind(".bar"),this.options.rightHandle.unbind(".bar"),this._values.min=this._leftHandle("value",c),this._values.max=this._rightHandle("value",d),this._bindHandles(),this._reactivateRange(),this.update()}return{min:this._values.min,max:this._values.max}},update:function(){this._values.min=this.min(),this._values.max=this.max(),this._cache(),this._positionBar()}})}(jQuery),function(a){"use strict";function b(b,c,d,e){this.label1=b,this.label2=c,this.type=d,this.options=e,this.handle1=this.label1[this.type]("option","handle"),this.handle2=this.label2[this.type]("option","handle"),this.cache=null,this.left=b,this.right=c,this.moving=!1,this.initialized=!1,this.updating=!1,this.Init=function(){this.BindHandle(this.handle1),this.BindHandle(this.handle2),"show"===this.options.show?(setTimeout(a.proxy(this.PositionLabels,this),1),this.initialized=!0):setTimeout(a.proxy(this.AfterInit,this),1e3),this._resizeProxy=a.proxy(this.onWindowResize,this),a(window).resize(this._resizeProxy)},this.Destroy=function(){this._resizeProxy&&(a(window).unbind("resize",this._resizeProxy),this._resizeProxy=null,this.handle1.unbind(".positionner"),this.handle1=null,this.handle2.unbind(".positionner"),this.handle2=null,this.label1=null,this.label2=null,this.left=null,this.right=null),this.cache=null},this.AfterInit=function(){this.initialized=!0},this.Cache=function(){"none"!==this.label1.css("display")&&(this.cache={},this.cache.label1={},this.cache.label2={},this.cache.handle1={},this.cache.handle2={},this.cache.offsetParent={},this.CacheElement(this.label1,this.cache.label1),this.CacheElement(this.label2,this.cache.label2),this.CacheElement(this.handle1,this.cache.handle1),this.CacheElement(this.handle2,this.cache.handle2),this.CacheElement(this.label1.offsetParent(),this.cache.offsetParent)) 2 | },this.CacheIfNecessary=function(){null===this.cache?this.Cache():(this.CacheWidth(this.label1,this.cache.label1),this.CacheWidth(this.label2,this.cache.label2),this.CacheHeight(this.label1,this.cache.label1),this.CacheHeight(this.label2,this.cache.label2),this.CacheWidth(this.label1.offsetParent(),this.cache.offsetParent))},this.CacheElement=function(a,b){this.CacheWidth(a,b),this.CacheHeight(a,b),b.offset=a.offset(),b.margin={left:this.ParsePixels("marginLeft",a),right:this.ParsePixels("marginRight",a)},b.border={left:this.ParsePixels("borderLeftWidth",a),right:this.ParsePixels("borderRightWidth",a)}},this.CacheWidth=function(a,b){b.width=a.width(),b.outerWidth=a.outerWidth()},this.CacheHeight=function(a,b){b.outerHeightMargin=a.outerHeight(!0)},this.ParsePixels=function(a,b){return parseInt(b.css(a),10)||0},this.BindHandle=function(b){b.bind("updating.positionner",a.proxy(this.onHandleUpdating,this)),b.bind("update.positionner",a.proxy(this.onHandleUpdated,this)),b.bind("moving.positionner",a.proxy(this.onHandleMoving,this)),b.bind("stop.positionner",a.proxy(this.onHandleStop,this))},this.PositionLabels=function(){if(this.CacheIfNecessary(),null!==this.cache){var a=this.GetRawPosition(this.cache.label1,this.cache.handle1),b=this.GetRawPosition(this.cache.label2,this.cache.handle2);this.ConstraintPositions(a,b),this.PositionLabel(this.label1,a.left,this.cache.label1),this.PositionLabel(this.label2,b.left,this.cache.label2)}},this.PositionLabel=function(a,b,c){var d,e,f,g=this.cache.offsetParent.offset.left+this.cache.offsetParent.border.left;g-b>=0?(a.css("right",""),a.offset({left:b})):(d=g+this.cache.offsetParent.width,e=b+c.margin.left+c.outerWidth+c.margin.right,f=d-e,a.css("left",""),a.css("right",f))},this.ConstraintPositions=function(a,b){a.centerb.outerLeft?(a=this.getLeftPosition(a,b),b=this.getRightPosition(a,b)):a.center>b.center&&b.outerRight>a.outerLeft&&(b=this.getLeftPosition(b,a),a=this.getRightPosition(b,a))},this.getLeftPosition=function(a,b){var c=(b.center+a.center)/2,d=c-a.cache.outerWidth-a.cache.margin.right+a.cache.border.left;return a.left=d,a},this.getRightPosition=function(a,b){var c=(b.center+a.center)/2;return b.left=c+b.cache.margin.left+b.cache.border.left,b},this.ShowIfNecessary=function(){"show"===this.options.show||this.moving||!this.initialized||this.updating||(this.label1.stop(!0,!0).fadeIn(this.options.durationIn||0),this.label2.stop(!0,!0).fadeIn(this.options.durationIn||0),this.moving=!0)},this.HideIfNeeded=function(){this.moving===!0&&(this.label1.stop(!0,!0).delay(this.options.delayOut||0).fadeOut(this.options.durationOut||0),this.label2.stop(!0,!0).delay(this.options.delayOut||0).fadeOut(this.options.durationOut||0),this.moving=!1)},this.onHandleMoving=function(a,b){this.ShowIfNecessary(),this.CacheIfNecessary(),this.UpdateHandlePosition(b),this.PositionLabels()},this.onHandleUpdating=function(){this.updating=!0},this.onHandleUpdated=function(){this.updating=!1,this.cache=null},this.onHandleStop=function(){this.HideIfNeeded()},this.onWindowResize=function(){this.cache=null},this.UpdateHandlePosition=function(a){null!==this.cache&&(a.element[0]===this.handle1[0]?this.UpdatePosition(a,this.cache.handle1):this.UpdatePosition(a,this.cache.handle2))},this.UpdatePosition=function(a,b){b.offset=a.offset},this.GetRawPosition=function(a,b){var c=b.offset.left+b.outerWidth/2,d=c-a.outerWidth/2,e=d+a.outerWidth-a.border.left-a.border.right,f=d-a.margin.left-a.border.left,g=b.offset.top-a.outerHeightMargin;return{left:d,outerLeft:f,top:g,right:e,outerRight:f+a.outerWidth+a.margin.left+a.margin.right,cache:a,center:c}},this.Init()}a.widget("ui.rangeSliderLabel",a.ui.rangeSliderMouseTouch,{options:{handle:null,formatter:!1,handleType:"rangeSliderHandle",show:"show",durationIn:0,durationOut:500,delayOut:500,isLeft:!1},cache:null,_positionner:null,_valueContainer:null,_innerElement:null,_create:function(){this.options.isLeft=this._handle("option","isLeft"),this.element.addClass("ui-rangeSlider-label").css("position","absolute").css("display","block"),this._createElements(),this._toggleClass(),this.options.handle.bind("moving.label",a.proxy(this._onMoving,this)).bind("update.label",a.proxy(this._onUpdate,this)).bind("switch.label",a.proxy(this._onSwitch,this)),"show"!==this.options.show&&this.element.hide(),this._mouseInit()},destroy:function(){this.options.handle.unbind(".label"),this.options.handle=null,this._valueContainer=null,this._innerElement=null,this.element.empty(),this._positionner&&(this._positionner.Destroy(),this._positionner=null),a.ui.rangeSliderMouseTouch.prototype.destroy.apply(this)},_createElements:function(){this._valueContainer=a("
").appendTo(this.element),this._innerElement=a("
").appendTo(this.element)},_handle:function(){var a=Array.prototype.slice.apply(arguments);return this.options.handle[this.options.handleType].apply(this.options.handle,a)},_setOption:function(a,b){"show"===a?this._updateShowOption(b):("durationIn"===a||"durationOut"===a||"delayOut"===a)&&this._updateDurations(a,b)},_updateShowOption:function(a){this.options.show=a,"show"!==this.options.show?this.element.hide():(this.element.show(),this._display(this.options.handle[this.options.handleType]("value")),this._positionner.PositionLabels()),this._positionner.options.show=this.options.show},_updateDurations:function(a,b){parseInt(b,10)===b&&(this._positionner.options[a]=b,this.options[a]=b)},_display:function(a){this.options.formatter===!1?this._displayText(Math.round(a)):this._displayText(this.options.formatter(a))},_displayText:function(a){this._valueContainer.text(a)},_toggleClass:function(){this.element.toggleClass("ui-rangeSlider-leftLabel",this.options.isLeft).toggleClass("ui-rangeSlider-rightLabel",!this.options.isLeft)},_mouseDown:function(a){this.options.handle.trigger(a)},_mouseUp:function(a){this.options.handle.trigger(a)},_mouseMove:function(a){this.options.handle.trigger(a)},_onMoving:function(a,b){this._display(b.value)},_onUpdate:function(){"show"===this.options.show&&this.update()},_onSwitch:function(a,b){this.options.isLeft=b,this._toggleClass(),this._positionner.PositionLabels()},pair:function(a){null===this._positionner&&(this._positionner=new b(this.element,a,this.widgetName,{show:this.options.show,durationIn:this.options.durationIn,durationOut:this.options.durationOut,delayOut:this.options.delayOut}),a[this.widgetName]("positionner",this._positionner))},positionner:function(a){return"undefined"!=typeof a&&(this._positionner=a),this._positionner},update:function(){this._positionner.cache=null,this._display(this._handle("value")),"show"===this.options.show&&this._positionner.PositionLabels()}})}(jQuery); --------------------------------------------------------------------------------