├── .editorconfig ├── .github ├── ISSUE_TEMPLATE.md └── PULL_REQUEST_TEMPLATE.md ├── .gitignore ├── .travis.yml ├── AUTHORS ├── CITATION ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE.md ├── Makefile ├── README.md ├── _config.yml ├── _episodes ├── .gitkeep ├── 01-introduction.md ├── 02-file_parsing.md ├── 03-multiple_files.md ├── 04-tabular_data.md ├── 05-plotting.md ├── 06-functions.md ├── 07-command_line.md ├── 07-command_line_sys.md ├── 08-testing.md ├── 09-version-control.md └── 10-github.md ├── _episodes_rmd ├── .gitkeep └── data │ └── .gitkeep ├── _extras ├── .gitkeep ├── about.md ├── discuss.md ├── figures.md └── guide.md ├── _includes ├── aio-script.md ├── all_keypoints.html ├── base_path.html ├── dc │ ├── intro.html │ ├── schedule.html │ ├── syllabus.html │ └── who.html ├── episode_break.html ├── episode_keypoints.html ├── episode_navbar.html ├── episode_overview.html ├── episode_title.html ├── favicons.html ├── gh_variables.html ├── javascript.html ├── lc │ ├── intro.html │ ├── schedule.html │ ├── syllabus.html │ └── who.html ├── lesson_footer.html ├── life_cycle.html ├── links.md ├── main_title.html ├── molssi.html ├── navbar.html ├── sc │ ├── intro.html │ ├── schedule.html │ ├── syllabus.html │ └── who.html ├── syllabus.html ├── workshop_ad.html ├── workshop_calendar.html └── workshop_footer.html ├── _layouts ├── base.html ├── break.html ├── episode.html ├── lesson.html ├── page.html ├── reference.html └── workshop.html ├── aio.md ├── assets ├── css │ ├── bootstrap-theme.css │ ├── bootstrap-theme.css.map │ ├── bootstrap.css │ ├── bootstrap.css.map │ ├── lesson.scss │ └── syntax.css ├── favicons │ ├── cp │ │ ├── apple-touch-icon-114x114.png │ │ ├── apple-touch-icon-120x120.png │ │ ├── apple-touch-icon-144x144.png │ │ ├── apple-touch-icon-152x152.png │ │ ├── apple-touch-icon-57x57.png │ │ ├── apple-touch-icon-60x60.png │ │ ├── apple-touch-icon-72x72.png │ │ ├── apple-touch-icon-76x76.png │ │ ├── favicon-128.png │ │ ├── favicon-16x16.png │ │ ├── favicon-196x196.png │ │ ├── favicon-32x32.png │ │ ├── favicon-96x96.png │ │ ├── favicon.ico │ │ ├── mstile-144x144.png │ │ ├── mstile-150x150.png │ │ ├── mstile-310x150.png │ │ ├── mstile-310x310.png │ │ └── mstile-70x70.png │ ├── dc │ │ ├── apple-touch-icon-114x114.png │ │ ├── apple-touch-icon-120x120.png │ │ ├── apple-touch-icon-144x144.png │ │ ├── apple-touch-icon-152x152.png │ │ ├── apple-touch-icon-57x57.png │ │ ├── apple-touch-icon-60x60.png │ │ ├── apple-touch-icon-72x72.png │ │ ├── apple-touch-icon-76x76.png │ │ ├── favicon-128.png │ │ ├── favicon-16x16.png │ │ ├── favicon-196x196.png │ │ ├── favicon-32x32.png │ │ ├── favicon-96x96.png │ │ ├── favicon.ico │ │ ├── mstile-144x144.png │ │ ├── mstile-150x150.png │ │ ├── mstile-310x150.png │ │ ├── mstile-310x310.png │ │ └── mstile-70x70.png │ ├── lc │ │ ├── apple-touch-icon-114x114.png │ │ ├── apple-touch-icon-120x120.png │ │ ├── apple-touch-icon-144x144.png │ │ ├── apple-touch-icon-152x152.png │ │ ├── apple-touch-icon-57x57.png │ │ ├── apple-touch-icon-60x60.png │ │ ├── apple-touch-icon-72x72.png │ │ ├── apple-touch-icon-76x76.png │ │ ├── favicon-128.png │ │ ├── favicon-16x16.png │ │ ├── favicon-196x196.png │ │ ├── favicon-32x32.png │ │ ├── favicon-96x96.png │ │ ├── favicon.ico │ │ ├── mstile-144x144.png │ │ ├── mstile-150x150.png │ │ ├── mstile-310x150.png │ │ ├── mstile-310x310.png │ │ └── mstile-70x70.png │ ├── molssi │ │ ├── favicon-128.png │ │ ├── favicon-152x152.png │ │ ├── favicon-16x16.png │ │ ├── favicon-196x196.png │ │ ├── favicon-32x32.png │ │ ├── favicon-96x96.png │ │ └── molssi.jpg │ └── swc │ │ ├── apple-touch-icon-114x114.png │ │ ├── apple-touch-icon-120x120.png │ │ ├── apple-touch-icon-144x144.png │ │ ├── apple-touch-icon-152x152.png │ │ ├── apple-touch-icon-57x57.png │ │ ├── apple-touch-icon-60x60.png │ │ ├── apple-touch-icon-72x72.png │ │ ├── apple-touch-icon-76x76.png │ │ ├── favicon-128.png │ │ ├── favicon-16x16.png │ │ ├── favicon-196x196.png │ │ ├── favicon-32x32.png │ │ ├── favicon-96x96.png │ │ ├── favicon.ico │ │ ├── mstile-144x144.png │ │ ├── mstile-150x150.png │ │ ├── mstile-310x150.png │ │ ├── mstile-310x310.png │ │ └── mstile-70x70.png ├── fonts │ ├── glyphicons-halflings-regular.eot │ ├── glyphicons-halflings-regular.svg │ ├── glyphicons-halflings-regular.ttf │ ├── glyphicons-halflings-regular.woff │ └── glyphicons-halflings-regular.woff2 ├── img │ ├── cp-logo-blue.svg │ ├── dc-icon-black.svg │ ├── dc-logo-black.svg │ ├── lc-icon-black.png │ ├── lc-icon-black.svg │ ├── lc-logo-black.png │ ├── lc-logo-black.svg │ ├── molssi_main_logo.png │ ├── swc-icon-blue.svg │ ├── swc-logo-blue.png │ ├── swc-logo-blue.svg │ ├── swc-logo-white.png │ └── swc-logo-white.svg └── js │ ├── bootstrap.min.js │ ├── jquery.min.js │ ├── jquery.min.map │ └── lesson.js ├── bin ├── boilerplate │ ├── .travis.yml │ ├── AUTHORS │ ├── CITATION │ ├── CONTRIBUTING.md │ ├── README.md │ ├── _config.yml │ ├── _episodes │ │ └── 01-introduction.md │ ├── _extras │ │ ├── about.md │ │ ├── discuss.md │ │ ├── figures.md │ │ └── guide.md │ ├── index.md │ ├── reference.md │ └── setup.md ├── chunk-options.R ├── generate_md_episodes.R ├── knit_lessons.sh ├── lesson_check.py ├── lesson_initialize.py ├── markdown_ast.rb ├── repo_check.py ├── test_lesson_check.py ├── util.py └── workshop_check.py ├── code └── .gitkeep ├── data ├── .gitkeep ├── data.zip └── mdout.zip ├── fig ├── .gitkeep ├── episode09_fig1.png ├── lesson01_fig1.png ├── lesson01_fig2.png ├── plotting_allsamples.png ├── plotting_every100.png ├── plotting_every100challenge.png ├── plotting_every100combined.png ├── plotting_every100dashed.png ├── plotting_every100marker.png ├── plotting_firstplot.png ├── plotting_labeled.png ├── plotting_twosamples.png ├── setup_fig1.png └── subplots.png ├── files └── .gitkeep ├── index.md ├── paper.md ├── reference.md └── setup.md /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | insert_final_newline = true 6 | trim_trailing_whitespace = true 7 | 8 | [*.md] 9 | indent_size = 2 10 | indent_style = space 11 | max_line_length = 100 # Please keep this in sync with bin/lesson_check.py! 12 | 13 | [*.r] 14 | max_line_length = 80 15 | 16 | [*.py] 17 | indent_size = 4 18 | indent_style = space 19 | max_line_length = 79 20 | 21 | [*.sh] 22 | end_of_line = lf 23 | 24 | [Makefile] 25 | indent_style = tab 26 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | Please delete this line and the text below before submitting your contribution. 2 | 3 | --- 4 | 5 | Thanks for contributing! If this contribution is for instructor training, please send an email to checkout@carpentries.org with a link to this contribution so we can record your progress. You’ve completed your contribution step for instructor checkout just by submitting this contribution. 6 | 7 | If this issue is about a specific episode within a lesson, please provide its link or filename. 8 | 9 | Please keep in mind that lesson maintainers are volunteers and it may be some time before they can respond to your contribution. Although not all contributions can be incorporated into the lesson materials, we appreciate your time and effort to improve the curriculum. If you have any questions about the lesson maintenance process or would like to volunteer your time as a contribution reviewer, please contact The Carpentries Team at team@carpentries.org. 10 | 11 | --- 12 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | Please delete this line and the text below before submitting your contribution. 2 | 3 | --- 4 | 5 | Thanks for contributing! If this contribution is for instructor training, please send an email to checkout@carpentries.org with a link to this contribution so we can record your progress. You’ve completed your contribution step for instructor checkout just by submitting this contribution. 6 | 7 | Please keep in mind that lesson maintainers are volunteers and it may be some time before they can respond to your contribution. Although not all contributions can be incorporated into the lesson materials, we appreciate your time and effort to improve the curriculum. If you have any questions about the lesson maintenance process or would like to volunteer your time as a contribution reviewer, please contact The Carpentries Team at team@carpentries.org. 8 | 9 | --- 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | *~ 3 | .DS_Store 4 | .ipynb_checkpoints 5 | .sass-cache 6 | .jekyll-cache/ 7 | __pycache__ 8 | _site 9 | .Rproj.user 10 | .Rhistory 11 | .RData 12 | 13 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | # dist: trusty # Ubuntu 14.04 2 | language: python 3 | python: 3.7 4 | branches: 5 | only: 6 | - gh-pages 7 | - /.*/ 8 | before_install: 9 | - sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E084DAB9 10 | - echo "deb https://cran.rstudio.com/bin/linux/ubuntu trusty/" | sudo tee -a /etc/apt/sources.list 11 | - sudo apt-get update -y 12 | - sudo apt-get install -y r-base 13 | - sudo Rscript -e "install.packages('knitr', repos = 'https://', dependencies = TRUE)" 14 | - sudo Rscript -e "install.packages('stringr', repos = 'https://cran.rstudio.com', dependencies = TRUE)" 15 | - sudo Rscript -e "install.packages('checkpoint', repos = 'https://cran.rstudio.com', dependencies = TRUE)" 16 | - sudo Rscript -e "install.packages('ggplot2', repos = 'https://cran.rstudio.com', dependencies = TRUE)" 17 | - rvm default 18 | - gem install json kramdown jekyll 19 | install: 20 | - pip install pyyaml 21 | script: 22 | - make lesson-check-all 23 | - make --always-make site 24 | -------------------------------------------------------------------------------- /AUTHORS: -------------------------------------------------------------------------------- 1 | Ashley Ringer McDonald armcdona@calpoly.edu 2 | Jessica A. Nash janash@vt.edu 3 | -------------------------------------------------------------------------------- /CITATION: -------------------------------------------------------------------------------- 1 | Please cite as: 2 | 3 | Ringer McDonald, A., & Nash, J. (2019). Python Data and Scripting Workshop for Computational Molecular Scientists (Version 2020.06.01). 4 | The Molecular Sciences Software Institute. https://doi.org/10.34974/MXV2-EA38 5 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: "Contributor Code of Conduct" 4 | --- 5 | As contributors and maintainers of this project, 6 | we pledge to follow the [Carpentry Code of Conduct][coc]. 7 | 8 | Instances of abusive, harassing, or otherwise unacceptable behavior 9 | may be reported by following our [reporting guidelines][coc-reporting]. 10 | 11 | {% include links.md %} 12 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | *The Molecular Sciences Software Institute educational tutorials build on the 2 | work of [Software Carpentry]({{site.swc_site}}) and [Data 3 | Carpentry]({{site.dc_site}}). It uses the same contributing process as these 4 | projects. This can be found below.* 5 | 6 | # Contributing 7 | 8 | [The Carpentries][c-site] ([Software Carpentry][swc-site], [Data Carpentry][dc-site], and [Library Carpentry][lc-site]) are open source projects, 9 | and we welcome contributions of all kinds: 10 | new lessons, 11 | fixes to existing material, 12 | bug reports, 13 | and reviews of proposed changes are all welcome. 14 | 15 | ## Contributor Agreement 16 | 17 | By contributing, 18 | you agree that we may redistribute your work under [our license](LICENSE.md). 19 | In exchange, 20 | we will address your issues and/or assess your change proposal as promptly as we can, 21 | and help you become a member of our community. 22 | Everyone involved in [The Carpentries][c-site] 23 | agrees to abide by our [code of conduct](CODE_OF_CONDUCT.md). 24 | 25 | ## How to Contribute 26 | 27 | The easiest way to get started is to file an issue 28 | to tell us about a spelling mistake, 29 | some awkward wording, 30 | or a factual error. 31 | This is a good way to introduce yourself 32 | and to meet some of our community members. 33 | 34 | 1. If you do not have a [GitHub][github] account, 35 | you can [send us comments by email][email]. 36 | However, 37 | we will be able to respond more quickly if you use one of the other methods described below. 38 | 39 | 2. If you have a [GitHub][github] account, 40 | or are willing to [create one][github-join], 41 | but do not know how to use Git, 42 | you can report problems or suggest improvements by [creating an issue][issues]. 43 | This allows us to assign the item to someone 44 | and to respond to it in a threaded discussion. 45 | 46 | 3. If you are comfortable with Git, 47 | and would like to add or change material, 48 | you can submit a pull request (PR). 49 | Instructions for doing this are [included below](#using-github). 50 | 51 | ## Where to Contribute 52 | 53 | 1. If you wish to change this lesson, 54 | please work in , 55 | which can be viewed at . 56 | 57 | 2. If you wish to change the example lesson, 58 | please work in , 59 | which documents the format of our lessons 60 | and can be viewed at . 61 | 62 | 3. If you wish to change the template used for workshop websites, 63 | please work in . 64 | The home page of that repository explains how to set up workshop websites, 65 | while the extra pages in 66 | provide more background on our design choices. 67 | 68 | 4. If you wish to change CSS style files, tools, 69 | or HTML boilerplate for lessons or workshops stored in `_includes` or `_layouts`, 70 | please work in . 71 | 72 | ## What to Contribute 73 | 74 | There are many ways to contribute, 75 | from writing new exercises and improving existing ones 76 | to updating or filling in the documentation 77 | and submitting [bug reports][issues] 78 | about things that don't work, aren't clear, or are missing. 79 | If you are looking for ideas, please see the 'Issues' tab for 80 | a list of issues associated with this repository, 81 | or you may also look at the issues for [Data Carpentry][dc-issues], 82 | [Software Carpentry][swc-issues], and [Library Carpentry][lc-issues] projects. 83 | 84 | Comments on issues and reviews of pull requests are just as welcome: 85 | we are smarter together than we are on our own. 86 | Reviews from novices and newcomers are particularly valuable: 87 | it's easy for people who have been using these lessons for a while 88 | to forget how impenetrable some of this material can be, 89 | so fresh eyes are always welcome. 90 | 91 | ## What *Not* to Contribute 92 | 93 | Our lessons already contain more material than we can cover in a typical workshop, 94 | so we are usually *not* looking for more concepts or tools to add to them. 95 | As a rule, 96 | if you want to introduce a new idea, 97 | you must (a) estimate how long it will take to teach 98 | and (b) explain what you would take out to make room for it. 99 | The first encourages contributors to be honest about requirements; 100 | the second, to think hard about priorities. 101 | 102 | We are also not looking for exercises or other material that only run on one platform. 103 | Our workshops typically contain a mixture of Windows, macOS, and Linux users; 104 | in order to be usable, 105 | our lessons must run equally well on all three. 106 | 107 | ## Using GitHub 108 | 109 | If you choose to contribute via GitHub, you may want to look at 110 | [How to Contribute to an Open Source Project on GitHub][how-contribute]. 111 | To manage changes, we follow [GitHub flow][github-flow]. 112 | Each lesson has two maintainers who review issues and pull requests or encourage others to do so. 113 | The maintainers are community volunteers and have final say over what gets merged into the lesson. 114 | To use the web interface for contributing to a lesson: 115 | 116 | 1. Fork the originating repository to your GitHub profile. 117 | 2. Within your version of the forked repository, move to the `gh-pages` branch and 118 | create a new branch for each significant change being made. 119 | 3. Navigate to the file(s) you wish to change within the new branches and make revisions as required. 120 | 4. Commit all changed files within the appropriate branches. 121 | 5. Create individual pull requests from each of your changed branches 122 | to the `gh-pages` branch within the originating repository. 123 | 6. If you receive feedback, make changes using your issue-specific branches of the forked 124 | repository and the pull requests will update automatically. 125 | 7. Repeat as needed until all feedback has been addressed. 126 | 127 | When starting work, please make sure your clone of the originating `gh-pages` branch is up-to-date 128 | before creating your own revision-specific branch(es) from there. 129 | Additionally, please only work from your newly-created branch(es) and *not* 130 | your clone of the originating `gh-pages` branch. 131 | Lastly, published copies of all the lessons are available in the `gh-pages` branch of the originating 132 | repository for reference while revising. 133 | 134 | ## Other Resources 135 | 136 | General discussion of [Software Carpentry][swc-site] and [Data Carpentry][dc-site] 137 | happens on the [discussion mailing list][discuss-list], 138 | which everyone is welcome to join. 139 | You can also [reach us by email][email]. 140 | 141 | [email]: mailto:admin@software-carpentry.org 142 | [dc-issues]: https://github.com/issues?q=user%3Adatacarpentry 143 | [dc-lessons]: http://datacarpentry.org/lessons/ 144 | [dc-site]: http://datacarpentry.org/ 145 | [discuss-list]: http://lists.software-carpentry.org/listinfo/discuss 146 | [github]: https://github.com 147 | [github-flow]: https://guides.github.com/introduction/flow/ 148 | [github-join]: https://github.com/join 149 | [how-contribute]: https://egghead.io/series/how-to-contribute-to-an-open-source-project-on-github 150 | [issues]: https://guides.github.com/features/issues/ 151 | [swc-issues]: https://github.com/issues?q=user%3Aswcarpentry 152 | [swc-lessons]: https://software-carpentry.org/lessons/ 153 | [swc-site]: https://software-carpentry.org/ 154 | [c-site]: https://carpentries.org/ 155 | [lc-site]: https://librarycarpentry.org/ 156 | [lc-issues]: https://github.com/issues?q=user%3Alibrarycarpentry 157 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: "Licenses" 4 | root: . 5 | --- 6 | *The Molecular Sciences Software Institute educational tutorials build on the 7 | work of [Software Carpentry]({{site.swc_site}}) and [Data 8 | Carpentry]({{site.dc_site}}). It uses the same license as these projects. This 9 | can be found below.* 10 | 11 | ## Instructional Material 12 | 13 | All Software Carpentry, Data Carpentry, and Library Carpentry instructional material is 14 | made available under the [Creative Commons Attribution 15 | license][cc-by-human]. The following is a human-readable summary of 16 | (and not a substitute for) the [full legal text of the CC BY 4.0 17 | license][cc-by-legal]. 18 | 19 | You are free: 20 | 21 | * to **Share**---copy and redistribute the material in any medium or format 22 | * to **Adapt**---remix, transform, and build upon the material 23 | 24 | for any purpose, even commercially. 25 | 26 | The licensor cannot revoke these freedoms as long as you follow the 27 | license terms. 28 | 29 | Under the following terms: 30 | 31 | * **Attribution**---You must give appropriate credit (mentioning that 32 | your work is derived from work that is Copyright © Software 33 | Carpentry and, where practical, linking to 34 | http://software-carpentry.org/), provide a [link to the 35 | license][cc-by-human], and indicate if changes were made. You may do 36 | so in any reasonable manner, but not in any way that suggests the 37 | licensor endorses you or your use. 38 | 39 | **No additional restrictions**---You may not apply legal terms or 40 | technological measures that legally restrict others from doing 41 | anything the license permits. With the understanding that: 42 | 43 | Notices: 44 | 45 | * You do not have to comply with the license for elements of the 46 | material in the public domain or where your use is permitted by an 47 | applicable exception or limitation. 48 | * No warranties are given. The license may not give you all of the 49 | permissions necessary for your intended use. For example, other 50 | rights such as publicity, privacy, or moral rights may limit how you 51 | use the material. 52 | 53 | ## Software 54 | 55 | Except where otherwise noted, the example programs and other software 56 | provided by Software Carpentry and Data Carpentry are made available under the 57 | [OSI][osi]-approved 58 | [MIT license][mit-license]. 59 | 60 | Permission is hereby granted, free of charge, to any person obtaining 61 | a copy of this software and associated documentation files (the 62 | "Software"), to deal in the Software without restriction, including 63 | without limitation the rights to use, copy, modify, merge, publish, 64 | distribute, sublicense, and/or sell copies of the Software, and to 65 | permit persons to whom the Software is furnished to do so, subject to 66 | the following conditions: 67 | 68 | The above copyright notice and this permission notice shall be 69 | included in all copies or substantial portions of the Software. 70 | 71 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 72 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 73 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 74 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 75 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 76 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 77 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 78 | 79 | ## Trademark 80 | 81 | "Software Carpentry" and "Data Carpentry" and their respective logos 82 | are registered trademarks of [Community Initiatives][CI]. 83 | 84 | [cc-by-human]: https://creativecommons.org/licenses/by/4.0/ 85 | [cc-by-legal]: https://creativecommons.org/licenses/by/4.0/legalcode 86 | [mit-license]: https://opensource.org/licenses/mit-license.html 87 | [ci]: http://communityin.org/ 88 | [osi]: https://opensource.org 89 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | ## ======================================== 2 | ## Commands for both workshop and lesson websites. 3 | 4 | # Settings 5 | MAKEFILES=Makefile $(wildcard *.mk) 6 | JEKYLL=jekyll 7 | JEKYLL_VERSION=3.8.5 8 | PARSER=bin/markdown_ast.rb 9 | DST=_site 10 | 11 | # Controls 12 | .PHONY : commands clean files 13 | .NOTPARALLEL: 14 | all : commands 15 | 16 | ## commands : show all commands. 17 | commands : 18 | @grep -h -E '^##' ${MAKEFILES} | sed -e 's/## //g' 19 | 20 | ## docker-serve : use docker to build the site 21 | docker-serve : 22 | docker run --rm -it -v ${PWD}:/srv/jekyll -p 127.0.0.1:4000:4000 jekyll/jekyll:${JEKYLL_VERSION} make serve 23 | 24 | ## serve : run a local server. 25 | serve : lesson-md 26 | ${JEKYLL} serve 27 | 28 | ## site : build files but do not run a server. 29 | site : lesson-md 30 | ${JEKYLL} build 31 | 32 | # repo-check : check repository settings. 33 | repo-check : 34 | @bin/repo_check.py -s . 35 | 36 | ## clean : clean up junk files. 37 | clean : 38 | @rm -rf ${DST} 39 | @rm -rf .sass-cache 40 | @rm -rf bin/__pycache__ 41 | @find . -name .DS_Store -exec rm {} \; 42 | @find . -name '*~' -exec rm {} \; 43 | @find . -name '*.pyc' -exec rm {} \; 44 | 45 | ## clean-rmd : clean intermediate R files (that need to be committed to the repo). 46 | clean-rmd : 47 | @rm -rf ${RMD_DST} 48 | @rm -rf fig/rmd-* 49 | 50 | ## ---------------------------------------- 51 | ## Commands specific to workshop websites. 52 | 53 | .PHONY : workshop-check 54 | 55 | ## workshop-check : check workshop homepage. 56 | workshop-check : 57 | @bin/workshop_check.py . 58 | 59 | ## ---------------------------------------- 60 | ## Commands specific to lesson websites. 61 | 62 | .PHONY : lesson-check lesson-md lesson-files lesson-fixme 63 | 64 | # RMarkdown files 65 | RMD_SRC = $(wildcard _episodes_rmd/??-*.Rmd) 66 | RMD_DST = $(patsubst _episodes_rmd/%.Rmd,_episodes/%.md,$(RMD_SRC)) 67 | 68 | # Lesson source files in the order they appear in the navigation menu. 69 | MARKDOWN_SRC = \ 70 | index.md \ 71 | CODE_OF_CONDUCT.md \ 72 | setup.md \ 73 | $(sort $(wildcard _episodes/*.md)) \ 74 | reference.md \ 75 | $(sort $(wildcard _extras/*.md)) \ 76 | LICENSE.md 77 | 78 | # Generated lesson files in the order they appear in the navigation menu. 79 | HTML_DST = \ 80 | ${DST}/index.html \ 81 | ${DST}/conduct/index.html \ 82 | ${DST}/setup/index.html \ 83 | $(patsubst _episodes/%.md,${DST}/%/index.html,$(sort $(wildcard _episodes/*.md))) \ 84 | ${DST}/reference/index.html \ 85 | $(patsubst _extras/%.md,${DST}/%/index.html,$(sort $(wildcard _extras/*.md))) \ 86 | ${DST}/license/index.html 87 | 88 | ## lesson-md : convert Rmarkdown files to markdown 89 | lesson-md : ${RMD_DST} 90 | 91 | _episodes/%.md: _episodes_rmd/%.Rmd 92 | @bin/knit_lessons.sh $< $@ 93 | 94 | ## lesson-check : validate lesson Markdown. 95 | lesson-check : lesson-fixme 96 | @bin/lesson_check.py -s . -p ${PARSER} -r _includes/links.md 97 | 98 | ## lesson-check-all : validate lesson Markdown, checking line lengths and trailing whitespace. 99 | lesson-check-all : 100 | @bin/lesson_check.py -s . -p ${PARSER} -r _includes/links.md -l -w --permissive 101 | 102 | ## unittest : run unit tests on checking tools. 103 | unittest : 104 | @bin/test_lesson_check.py 105 | 106 | ## lesson-files : show expected names of generated files for debugging. 107 | lesson-files : 108 | @echo 'RMD_SRC:' ${RMD_SRC} 109 | @echo 'RMD_DST:' ${RMD_DST} 110 | @echo 'MARKDOWN_SRC:' ${MARKDOWN_SRC} 111 | @echo 'HTML_DST:' ${HTML_DST} 112 | 113 | ## lesson-fixme : show FIXME markers embedded in source files. 114 | lesson-fixme : 115 | @fgrep -i -n FIXME ${MARKDOWN_SRC} || true 116 | 117 | #------------------------------------------------------------------------------- 118 | # Include extra commands if available. 119 | #------------------------------------------------------------------------------- 120 | 121 | -include commands.mk 122 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Python Scripting for the Computational Molecular Sciences 2 | 3 | This is the GitHub repository for the Python Data and Scripting Workshop developed by [The Molecular Sciences Software Institute](https://molssi.org). This website template is based on a template developed by [The Software Carpentries](https://software-carpentry.org). You can find the rendered website for this material [here](https://molssi-education.github.io/python_scripting_cms/). 4 | 5 | The MolSSI Python Data and Scripting workshop is designed for students who are currently involved in, or planning to start computational chemistry research. This workshop is designed to help students develop practical programming skills that will benefit their undergraduate research, and will take students through introductory programming and scripting with Python to version control and sharing their code with others. NO prior programming experience is required. 6 | 7 | ### Workshop Topics 8 | - Basic Python syntax and control structures 9 | - Reading and writing files 10 | - File manipulation and parsing 11 | - Analyzing and graphing data 12 | - Writing functions 13 | - Creating command line programs from Python scripts 14 | - Basic testing using PyTest 15 | - Version control with git 16 | - Sharing code on GitHub 17 | 18 | ## Contributing 19 | 20 | We welcome all contributions to improve the lesson! Maintainers will do their best to help you if you have any 21 | questions, concerns, or experience any difficulties along the way. 22 | 23 | We'd like to ask you to familiarize yourself with our [Contribution Guide](CONTRIBUTING.md) and have a look at 24 | the [more detailed guidelines][lesson-example] on proper formatting, ways to render the lesson locally, and even 25 | how to write new episodes. 26 | 27 | ## Maintainer(s) 28 | 29 | * Jessica A. Nash (janash@vt.edu, GitHub: janash) 30 | * Ashley Ringer McDonald 31 | 32 | ## Authors 33 | 34 | A list of contributors to the lesson can be found in [AUTHORS](AUTHORS) 35 | 36 | ## Citation 37 | 38 | To cite this lesson, please consult with [CITATION](CITATION) 39 | 40 | [lesson-example]: https://carpentries.github.io/lesson-example 41 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | #------------------------------------------------------------ 2 | # Values for this lesson. 3 | #------------------------------------------------------------ 4 | 5 | # Which carpentry is this ("swc", "dc", "lc", or "cp")? 6 | # swc: Software Carpentry 7 | # dc: Data Carpentry 8 | # lc: Library Carpentry 9 | # cp: Carpentries (to use for instructor traning for instance) 10 | carpentry: "molssi" 11 | 12 | # Overall title for pages. 13 | title: "Python Scripting for Computational Molecular Science" 14 | 15 | # Life cycle stage of the lesson 16 | # possible values: "pre-alpha", "alpha", "beta", "stable" 17 | life_cycle: "stable" 18 | 19 | #------------------------------------------------------------ 20 | # Generic settings (should not need to change). 21 | #------------------------------------------------------------ 22 | 23 | # What kind of thing is this ("workshop" or "lesson")? 24 | kind: "lesson" 25 | 26 | # Magic to make URLs resolve both locally and on GitHub. 27 | # See https://help.github.com/articles/repository-metadata-on-github-pages/. 28 | # Please don't change it: / is correct. 29 | repository: MolSSI-Education/undergrad_workshop 30 | 31 | # Email address, no mailto: 32 | email: "education@molssi.org" 33 | 34 | # Sites. 35 | amy_site: "https://amy.software-carpentry.org/workshops" 36 | dc_site: "http://datacarpentry.org" 37 | swc_github: "https://github.com/swcarpentry" 38 | swc_site: "https://software-carpentry.org" 39 | swc_pages: "https://swcarpentry.github.io" 40 | lc_site: "http://librarycarpentry.github.io/" 41 | molssi_site: "http://molssi.org/" 42 | template_repo: "https://github.com/carpentries/styles" 43 | example_repo: "https://github.com/MolSSI-Education/CMS-Python-DevOps" 44 | example_site: "https://molssi-education.github.io/CMS-Python-DevOps/" 45 | workshop_repo: "https://github.com/MolSSI-Education/CMS-Python-DevOps" 46 | workshop_site: "https://molssi-education.github.io/CMS-Python-DevOps/" 47 | training_site: "https://carpentries.github.io/instructor-training" 48 | 49 | # Surveys. 50 | swc_pre_survey: "https://www.surveymonkey.com/r/swc_pre_workshop_v1?workshop_id=" 51 | swc_post_survey: "https://www.surveymonkey.com/r/swc_post_workshop_v1?workshop_id=" 52 | 53 | # Start time in minutes (0 to be clock-independent, 540 to show a start at 09:00 am). 54 | start_time: 0 55 | 56 | # Specify that things in the episodes collection should be output. 57 | collections: 58 | episodes: 59 | output: true 60 | permalink: /:path/index.html 61 | extras: 62 | output: true 63 | permalink: /:path/index.html 64 | 65 | # Set the default layout for things in the episodes collection. 66 | defaults: 67 | - values: 68 | root: . 69 | layout: page 70 | - scope: 71 | path: "" 72 | type: episodes 73 | values: 74 | root: .. 75 | layout: episode 76 | - scope: 77 | path: "" 78 | type: extras 79 | values: 80 | root: .. 81 | layout: page 82 | 83 | # Files and directories that are not to be copied. 84 | exclude: 85 | - Makefile 86 | - bin/ 87 | - .Rproj.user/ 88 | 89 | # Turn on built-in syntax highlighting. 90 | highlighter: rouge 91 | -------------------------------------------------------------------------------- /_episodes/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/_episodes/.gitkeep -------------------------------------------------------------------------------- /_episodes/07-command_line_sys.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Running code from the Linux Command Line" 3 | teaching: 15 4 | exercises: 10 5 | alternate: true 6 | questions: 7 | - "How do I move my code from the interactive Jupyter notebook to run from the Linux command line?" 8 | - "How do I make simple Python scripts with user inputs using sys.argv?" 9 | objectives: 10 | - "Make code executable from the Linux command line." 11 | - "Use sys.argv() to accept user inputs." 12 | keypoints: 13 | - "You must `import sys` in your code to accept user arguments." 14 | - "The name of the script itself is always `sys.argv[0]` so the first user input is normally `sys.argv[1]`." 15 | --- 16 | ## Creating and running a python input file 17 | 18 | We are now going to move our geometry analysis code out of the Jupyter notebook and into a format that can be run from the Linux command line. Open your favorite text editor and create a new file called "geom_analysis.py" (or choose another filename, just make sure the extension is .py). Paste in your geometry analysis code (the version with your functions) from your jupyter notebook and save your file. 19 | 20 | The best practice is to put all your functions at the top of the file, right after your import statements. Your file will look something like this. 21 | ``` 22 | import numpy 23 | import os 24 | 25 | def calculate_distance(atom1_coord, atom2_coord): 26 | x_distance = atom1_coord[0] - atom2_coord[0] 27 | y_distance = atom1_coord[1] - atom2_coord[1] 28 | z_distance = atom1_coord[2] - atom2_coord[2] 29 | bond_length_12 = numpy.sqrt(x_distance**2+y_distance**2+z_distance**2) 30 | return bond_length_12 31 | 32 | def bond_check(atom_distance, minimum_length=0, maximum_length=1.5): 33 | if atom_distance > minimum_length and atom_distance <= maximum_length: 34 | return True 35 | else: 36 | return False 37 | 38 | def open_xyz(filename): 39 | xyz_file = numpy.genfromtxt(fname=filename, skip_header=2, dtype='unicode') 40 | symbols = xyz_file[:,0] 41 | coord = (xyz_file[:,1:]) 42 | coord = coord.astype(numpy.float) 43 | return symbols, coord 44 | 45 | file_location = os.path.join('data', 'water.xyz') 46 | symbols, coord = open_xyz(file_location) 47 | num_atoms = len(symbols) 48 | for num1 in range(0,num_atoms): 49 | for num2 in range(0,num_atoms): 50 | if num1 98 | xyzfilename = sys.argv[1] 99 | IndexError: list index out of range 100 | ``` 101 | {: .error} 102 | The reason it says the list index is out of range is because `sys.argv[1]` does not exist. Since the user forgot to specify the name of the xyz file, the `sys.argv` list only has one element, `sys.argv[0]`. It would be better to print an error message and let the user know that they didn't enter the input correctly. Our code is expecting exactly two inputs: the script name and the xyz file name. The easiest way to add an error message is to check the length of the sys.argv list and print an error message and exit if it does not equal the expected length. 103 | 104 | While you have practiced coding, you have probably seen many error messages. We can actually raise errors in our code and write error messages to our users. 105 | ``` 106 | if len(sys.argv) < 2: 107 | raise NameError("Incorrect input! Please specify a file to analyze.") 108 | ``` 109 | {: .language-python} 110 | 111 | This will exit the code and print our error message if the user does not specify a filename. 112 | 113 | There are different types of errors you can raise. For example, you may want to raise a `TypeError` if you have data that is not the right type. If you want to learn more about raising errors, [see the official documenation from Python](https://docs.python.org/3/tutorial/errors.html) 114 | 115 | We need to add one more thing to our code. When you write a code that includes function definitions and a main script, you need to tell python which part is the main script. (This becomes very important later when we are talking about testing.) *After* your import statements and function definitions and *before* you check the length of the `sys.argv` list add this line to your code. 116 | ``` 117 | if __name__ == "__main__": 118 | ``` 119 | {: .language-python} 120 | 121 | Since this is an `if` statement, you now need to indent each line of your main script below this if statement. Be very careful with your indentation! Don't use a mixture of tabs and spaces! 122 | 123 | Save your code and run it again. It should work exactly as before. If you now get an error message, it is probably due to inconsistent indentation. 124 | 125 | ``` 126 | import os 127 | import numpy 128 | import sys 129 | 130 | def calculate_distance(atom1_coord, atom2_coord): 131 | x_distance = atom1_coord[0] - atom2_coord[0] 132 | y_distance = atom1_coord[1] - atom2_coord[1] 133 | z_distance = atom1_coord[2] - atom2_coord[2] 134 | bond_length_12 = numpy.sqrt(x_distance**2+y_distance**2+z_distance**2) 135 | return bond_length_12 136 | 137 | def bond_check(atom_distance, minimum_length=0, maximum_length=1.5): 138 | if atom_distance > minimum_length and atom_distance <= maximum_length: 139 | return True 140 | else: 141 | return False 142 | 143 | def open_xyz(filename): 144 | xyz_file = numpy.genfromtxt(fname=filename, skip_header=2, dtype='unicode') 145 | symbols = xyz_file[:,0] 146 | coord = (xyz_file[:,1:]) 147 | coord = coord.astype(numpy.float) 148 | return symbols, coord 149 | 150 | 151 | if __name__ == "__main__": 152 | 153 | if len(sys.argv) < 2: 154 | raise NameError("Incorrect input! Please specify a file to analyze.") 155 | 156 | 157 | xyz_file = sys.argv[1] 158 | symbols, coord = open_xyz(xyz_file) 159 | num_atoms = len(symbols) 160 | 161 | for num1 in range(0,num_atoms): 162 | for num2 in range(0,num_atoms): 163 | if num1 5 |
6 | MolSSI logo 7 |
8 |
9 |

The Molecular Sciences Software Institute serves as a nexus for science, education, and cooperation serving the worldwide community of computational molecular scientists – a broad field including of biomolecular simulation, quantum chemistry, and materials science. The Institute will spur significant advances in software infrastructure, education, standards, and best-practices that are needed to enable the molecular science community to open new windows on the next generation of scientific Grand Challenges, ranging from the simulation of intrinsically disordered proteins associated with a range of diseases to the design of new catalysts vital to the global chemical industry and climate change. The Institute will help the computational molecular science community to work together to leverage its diverse capabilities that will reduce or eliminate the gulf that currently delays by years the practical realization of theoretical innovations. Ultimately, the Institute will enable computational scientists to tackle problems that are orders of magnitude larger and more complex than those currently within our grasp, and will accelerate the translation of basic science into new technologies essential to the vitality of the economy and environment.

10 |
11 | 12 |
13 | {% include molssi.html %} 14 | {% include links.md %} 15 | -------------------------------------------------------------------------------- /_extras/discuss.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Discussion 3 | --- 4 | FIXME 5 | 6 | {% include links.md %} 7 | -------------------------------------------------------------------------------- /_extras/figures.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Figures 3 | --- 4 | 5 | {% include base_path.html %} 6 | 7 | 61 | {% comment %} 62 | Create anchor for each one of the episodes. 63 | {% endcomment %} 64 | {% for episode in site.episodes %} 65 |
66 | {% endfor %} 67 | 68 | {% include links.md %} 69 | -------------------------------------------------------------------------------- /_extras/guide.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Instructor Notes" 3 | --- 4 | FIXME 5 | 6 | {% include links.md %} 7 | -------------------------------------------------------------------------------- /_includes/aio-script.md: -------------------------------------------------------------------------------- 1 | {% comment %} 2 | As a maintainer, you don't need to edit this file. 3 | If you notice that something doesn't work, please 4 | open an issue: https://github.com/carpentries/styles/issues/new 5 | {% endcomment %} 6 | 7 | 33 | {% comment %} 34 | Create an anchor for every episode. 35 | {% endcomment %} 36 | {% for episode in site.episodes %} 37 |
38 | {% endfor %} 39 | -------------------------------------------------------------------------------- /_includes/all_keypoints.html: -------------------------------------------------------------------------------- 1 | {% comment %} 2 | Display key points of all episodes for reference. 3 | {% endcomment %} 4 | 5 | {% include base_path.html %} 6 | 7 |

Key Points

8 | 9 | {% for episode in site.episodes %} 10 | {% unless episode.break %} 11 | 12 | 15 | 22 | 23 | {% endunless %} 24 | {% endfor %} 25 |
13 | {{ episode.title }} 14 | 16 |
    17 | {% for keypoint in episode.keypoints %} 18 |
  • {{ keypoint|markdownify }}
  • 19 | {% endfor %} 20 |
21 |
26 | -------------------------------------------------------------------------------- /_includes/base_path.html: -------------------------------------------------------------------------------- 1 | {% comment %} 2 | This is adapted from: https://ricostacruz.com/til/relative-paths-in-jekyll 3 | 4 | `page.url` gives the URL of the current page with a leading /: 5 | 6 | - when the URL ends with the extension (e.g., /foo/bar.html) then we can get 7 | the depth by counting the number of / and remove - 1 8 | - when the URL ends with a / (e.g. /foo/bar/) then the number / gives the depth 9 | directly 10 | {% endcomment %} 11 | 12 | {% assign relative_root_path = '' %} 13 | 14 | {% assign last_char = page.url | slice: -1 %} 15 | 16 | {% if last_char == "/"} 17 | {% assign offset = 0 %} 18 | {% else %} 19 | {% assign offset = 1 %} 20 | {% endif %} 21 | 22 | {% assign depth = page.url | split: '/' | size | minus: offset %} 23 | {% if depth <= 1 %}{% assign relative_root_path = '.' %} 24 | {% elsif depth == 2 %}{% assign relative_root_path = '..' %} 25 | {% elsif depth == 3 %}{% assign relative_root_path = '../..' %} 26 | {% elsif depth == 4 %}{% assign relative_root_path = '../../..' %} 27 | {% endif %} 28 | -------------------------------------------------------------------------------- /_includes/dc/intro.html: -------------------------------------------------------------------------------- 1 |

2 | Data Carpentry 3 | aims to help researchers get their work done 4 | in less time and with less pain 5 | by teaching them basic research computing skills. 6 | This hands-on workshop will cover basic concepts and tools, 7 | including program design, version control, data management, 8 | and task automation. 9 | Participants will be encouraged to help one another 10 | and to apply what they have learned to their own research problems. 11 |

12 |

13 | 14 | For more information on what we teach and why, 15 | please see our paper 16 | "Best Practices for Scientific Computing". 17 | 18 |

19 | -------------------------------------------------------------------------------- /_includes/dc/schedule.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |

Day 1

4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
09:00 Automating tasks with the Unix shell
10:30 Coffee
12:00 Lunch break
13:00 Building programs with Python
14:30 Coffee
16:00 Wrap-up
12 |
13 |
14 |

Day 2

15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |
09:00 Version control with Git
10:30 Coffee
12:00 Lunch break
13:00 Managing data with SQL
14:30 Coffee
16:00 Wrap-up
23 |
24 |
25 | -------------------------------------------------------------------------------- /_includes/dc/syllabus.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |

The Unix Shell

4 |
    5 |
  • Files and directories
  • 6 |
  • History and tab completion
  • 7 |
  • Pipes and redirection
  • 8 |
  • Looping over files
  • 9 |
  • Creating and running shell scripts
  • 10 |
  • Finding things
  • 11 |
  • Reference...
  • 12 |
13 |
14 |
15 |

Programming in Python

16 |
    17 |
  • Using libraries
  • 18 |
  • Working with arrays
  • 19 |
  • Reading and plotting data
  • 20 |
  • Creating and using functions
  • 21 |
  • Loops and conditionals
  • 22 |
  • Defensive programming
  • 23 |
  • Using Python from the command line
  • 24 |
  • Reference...
  • 25 |
26 |
27 | 40 | 53 |
54 | 55 |
56 |
57 |

Version Control with Git

58 |
    59 |
  • Creating a repository
  • 60 |
  • Recording changes to files: add, commit, ...
  • 61 |
  • Viewing changes: status, diff, ...
  • 62 |
  • Ignoring files
  • 63 |
  • Working on the web: clone, pull, push, ...
  • 64 |
  • Resolving conflicts
  • 65 |
  • Open licenses
  • 66 |
  • Where to host work, and why
  • 67 |
  • Reference...
  • 68 |
69 |
70 | 86 |
87 |

Open Refine

88 |
    89 |
  • Introduction to OpenRefine
  • 90 |
  • Importing data
  • 91 |
  • Basic functions
  • 92 |
  • Advanced Functions
  • 93 |
  • Reference...
  • 94 |
95 |
96 |
97 | -------------------------------------------------------------------------------- /_includes/dc/who.html: -------------------------------------------------------------------------------- 1 |

2 | Who: 3 | The course is aimed at graduate students and other researchers. 4 | 5 | You don't need to have any previous knowledge of the tools 6 | that will be presented at the workshop. 7 | 8 |

9 | -------------------------------------------------------------------------------- /_includes/episode_break.html: -------------------------------------------------------------------------------- 1 | {% comment %} 2 | Display a break's timings in a box similar to a learning episode's. 3 | {% endcomment %} 4 |
5 |

Overview

6 | 7 |
8 |
9 | Break: {{ page.break }} min 10 |
11 |
12 |
13 |
14 | 15 |
16 | -------------------------------------------------------------------------------- /_includes/episode_keypoints.html: -------------------------------------------------------------------------------- 1 | {% comment %} 2 | Display key points for an episode. 3 | {% endcomment %} 4 |
5 |

Key Points

6 |
    7 | {% for keypoint in page.keypoints %} 8 |
  • {{ keypoint|markdownify }}
  • 9 | {% endfor %} 10 |
11 |
12 | -------------------------------------------------------------------------------- /_includes/episode_navbar.html: -------------------------------------------------------------------------------- 1 | {% comment %} 2 | For some reason, the relative_root_path seems out of scope in this file, so we 3 | need to re-assign it here 4 | {% endcomment %} 5 | 6 | {% include base_path.html %} 7 | 8 | {% comment %} 9 | Navigation bar for an episode. 10 | {% endcomment %} 11 | 12 |
13 |
14 |

15 | {% if page.previous.url %} 16 | previous episode 17 | {% else %} 18 | lesson home 19 | {% endif %} 20 |

21 |
22 |
23 | {% if include.episode_navbar_title %} 24 |

{{ site.title }}

25 | {% endif %} 26 |
27 |
28 |

29 | {% if page.next.url %} 30 | next episode 31 | {% else %} 32 | lesson home 33 | {% endif %} 34 |

35 |
36 |
37 | -------------------------------------------------------------------------------- /_includes/episode_overview.html: -------------------------------------------------------------------------------- 1 | {% comment %} 2 | Display an episode's timings and learning objectives. 3 | {% endcomment %} 4 |
5 |

Overview

6 | 7 |
8 |
9 | Teaching: {{ page.teaching }} min 10 |
11 | Exercises: {{ page.exercises }} min 12 |
13 |
14 | Questions 15 |
    16 | {% for question in page.questions %} 17 |
  • {{ question|markdownify }}
  • 18 | {% endfor %} 19 |
20 |
21 |
22 | 23 |
24 |
25 |
26 |
27 | Objectives 28 |
    29 | {% for objective in page.objectives %} 30 |
  • {{ objective|markdownify }}
  • 31 | {% endfor %} 32 |
33 |
34 |
35 | 36 |
37 | -------------------------------------------------------------------------------- /_includes/episode_title.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |

{{ page.title }}

6 |
7 |
8 |
9 |
10 | -------------------------------------------------------------------------------- /_includes/favicons.html: -------------------------------------------------------------------------------- 1 | {% assign favicon_url = site.baseurl | append: '/assets/favicons/' | append: site.carpentry | prepend: site.url %} 2 | 3 | {% if site.carpentry == 'swc' %} 4 | {% assign carpentry = 'Software Carpentry' %} 5 | {% elsif site.carpentry == 'dc' %} 6 | {% assign carpentry = 'Data Carpentry' %} 7 | {% elsif site.carpentry == 'lc' %} 8 | {% assign carpentry = 'Library Carpentry' %} 9 | {% elsif site.carpentry == 'cp' %} 10 | {% assign carpentry = 'The Carpentries' %} 11 | {% elsif site.carpentry == 'molssi' %} 12 | {% assign carpentry = 'The Molecular Sciences Software Institute' %} 13 | {% endif %} 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /_includes/gh_variables.html: -------------------------------------------------------------------------------- 1 | {% comment %} 2 | When rendering websites locally, `site.github.url` doesn't get resolved properly 3 | unless a GitHub Personal Access Token is set up and available in the 4 | environment. This leads to warnings and errors when trying to serve the site 5 | locally. To work around this, we use the `jekyll.environment` variable which is 6 | set to `development` when rendering the site locally, and set to `production` on 7 | GitHub where `site.github.url` is defined. 8 | {% endcomment %} 9 | 10 | {% if jekyll.environment == "production" %} 11 | 12 | {% comment %} 13 | First, get the name of the repository 14 | {% endcomment %} 15 | {% assign repo_name = site.github.repository_name %} 16 | 17 | {% comment %} 18 | `site.github.public_repositories` contains comprehensive information for all public repositories for the organization. We use `where` to extract the part 19 | of the metadata that is relevant to the present repository. 20 | {% endcomment %} 21 | {% assign repo_info = site.github.public_repositories | where: "name", repo_name %} 22 | 23 | {% comment %} 24 | Now, we can extract the default branch for the repo 25 | {% endcomment %} 26 | {% assign default_branch = repo_info[0].default_branch %} 27 | 28 | {% comment %} 29 | Other variables requested by the template 30 | {% endcomment %} 31 | {% assign repo_url = site.github.repository_url %} 32 | {% assign search_domain_url = site.github.url %} 33 | {% assign project_title = site.github.project_title %} 34 | {% assign source_branch = site.github.source.branch %} 35 | 36 | {% elsif jekyll.environment == "development" %} 37 | 38 | {% assign repo_name = "" %} 39 | {% assign repo_url = "" %} 40 | {% assign default_branch = "" %} 41 | {% assign search_domain_url = "" %} 42 | {% assign project_title = "" %} 43 | {% assign source_branch = "" %} 44 | 45 | {% endif %} 46 | -------------------------------------------------------------------------------- /_includes/javascript.html: -------------------------------------------------------------------------------- 1 | {% comment %} 2 | JavaScript used in lesson and workshop pages. 3 | {% endcomment %} 4 | 5 | 6 | 7 | 8 | 9 | 16 | -------------------------------------------------------------------------------- /_includes/lc/intro.html: -------------------------------------------------------------------------------- 1 |

2 | Library Carpentry 3 | is made by people working in library- and information-related roles to help you: 4 |

5 |
    6 |
  • automate repetitive, boring, error-prone tasks
  • 7 |
  • create, maintain and analyze sustainable and reusable data
  • 8 |
  • work effectively with IT and systems colleagues
  • 9 |
  • better understand the use of software in research
  • 10 |
  • and much more...
  • 11 |
12 |

13 | 14 | Library Carpentry introduces you to the fundamentals of computing 15 | and provides you with a platform for further self-directed learning. 16 | For more information on what we teach and why, please see our paper 17 | "Library Carpentry: software skills training for library professionals". 18 | 19 |

20 | -------------------------------------------------------------------------------- /_includes/lc/schedule.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |

Day 1

4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
09:00 Data Intro for Librarians
10:30 Coffee
12:00 Lunch break
13:00 Shell Lessons for Libraries
14:30 Coffee
16:00 Wrap-up
12 |
13 |
14 |

Day 2

15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |
09:00 Git Intro for Librarians
10:30 Coffee
12:00 Lunch break
13:00 OpenRefine for Librarians
14:30 Coffee
16:00 Wrap-up
23 |
24 |
25 | -------------------------------------------------------------------------------- /_includes/lc/syllabus.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |

Data Intro

4 |
    5 |
  • Intro to data
  • 6 |
  • Jargon busting
  • 7 |
  • Keyboard shortcuts
  • 8 |
  • Plain text formats
  • 9 |
  • Naming files
  • 10 |
  • Regular expressions
  • 11 |
  • Reference...
  • 12 |
13 |
14 |
15 |

The Unix Shell

16 |
    17 |
  • Files and directories
  • 18 |
  • History and tab completion
  • 19 |
  • Counting and sorting contents in files
  • 20 |
  • Pipes and redirection
  • 21 |
  • Mining or searching in files
  • 22 |
  • Reference...
  • 23 |
24 |
25 | 26 |
27 | 28 |
29 |
30 |

Version Control with Git

31 |
    32 |
  • Creating a repository
  • 33 |
  • Configuring git
  • 34 |
  • Recording changes to files: add, commit, ...
  • 35 |
  • Viewing state changes with status
  • 36 |
  • Working on the web: clone, pull, push, ...
  • 37 |
  • Where to host work, and why
  • 38 |
  • Reference...
  • 39 |
40 |
41 |
42 |
43 |

Open Refine

44 |
    45 |
  • Introduction to OpenRefine
  • 46 |
  • Importing data
  • 47 |
  • Basic functions
  • 48 |
  • Advanced Functions
  • 49 |
  • Reference...
  • 50 |
51 |
52 |
53 |
54 | 70 | -------------------------------------------------------------------------------- /_includes/lc/who.html: -------------------------------------------------------------------------------- 1 |

2 | Who: 3 | The course is for people working in library- and information-related roles. 4 | 5 | You don't need to have any previous knowledge of the tools that 6 | will be presented at the workshop. 7 | 8 |

9 | -------------------------------------------------------------------------------- /_includes/lesson_footer.html: -------------------------------------------------------------------------------- 1 | {% comment %} 2 | Footer for lesson pages. 3 | {% endcomment %} 4 | -------------------------------------------------------------------------------- /_includes/life_cycle.html: -------------------------------------------------------------------------------- 1 | 2 | {% if site.life_cycle == "pre-alpha" %} 3 | 4 |
5 |
6 | This lesson is still being designed and assembled (Pre-Alpha version) 7 |
8 |
9 | 10 | 11 | {% elsif site.life_cycle == "alpha" %} 12 | 13 |
14 |
15 | This lesson is in the early stages of development (Alpha version) 16 |
17 |
18 | 19 | 20 | {% elsif site.life_cycle == "beta" %} 21 | 22 |
23 |
24 | This lesson is being piloted (Beta version) 25 |
26 |
27 | 28 | {% elsif site.life_cycle == "stable" %} 29 | 30 | {% comment %} 31 | We don't do anything special for now 32 | {% endcomment %} 33 | 34 | {% endif %} 35 | -------------------------------------------------------------------------------- /_includes/links.md: -------------------------------------------------------------------------------- 1 | {% include base_path.html %} 2 | [cc-by-human]: https://creativecommons.org/licenses/by/4.0/ 3 | [cc-by-legal]: https://creativecommons.org/licenses/by/4.0/legalcode 4 | [ci]: http://communityin.org/ 5 | [coc-reporting]: https://docs.carpentries.org/topic_folders/policies/incident-reporting.html 6 | [coc]: https://docs.carpentries.org/topic_folders/policies/code-of-conduct.html 7 | [concept-maps]: https://carpentries.github.io/instructor-training/05-memory/ 8 | [contrib-covenant]: https://contributor-covenant.org/ 9 | [contributing]: {{ repo_url }}/blob/{{ source_branch }}/CONTRIBUTING.md 10 | [cran-checkpoint]: https://cran.r-project.org/package=checkpoint 11 | [cran-knitr]: https://cran.r-project.org/package=knitr 12 | [cran-stringr]: https://cran.r-project.org/package=stringr 13 | [dc-lessons]: http://www.datacarpentry.org/lessons/ 14 | [email]: mailto:team@carpentries.org 15 | [github-importer]: https://import.github.com/ 16 | [importer]: https://github.com/new/import 17 | [jekyll-collection]: https://jekyllrb.com/docs/collections/ 18 | [jekyll-install]: https://jekyllrb.com/docs/installation/ 19 | [jekyll-windows]: http://jekyll-windows.juthilo.com/ 20 | [jekyll]: https://jekyllrb.com/ 21 | [jupyter]: https://jupyter.org/ 22 | [kramdown]: https://kramdown.gettalong.org/ 23 | [lc-lessons]: https://librarycarpentry.org/lessons/ 24 | [lesson-aio]: {{ relative_root_path }}{% link aio.md %} 25 | [lesson-coc]: {{ relative_root_path }}{% link CODE_OF_CONDUCT.md %} 26 | [lesson-example]: https://carpentries.github.io/lesson-example/ 27 | [lesson-license]: {{ relative_root_path }}{% link LICENSE.md %} 28 | [lesson-mainpage]: {{ relative_root_path }}{% link index.md %} 29 | [lesson-reference]: {{ relative_root_path }}{% link reference.md %} 30 | [lesson-setup]: {{ relative_root_path }}{% link setup.md %} 31 | [mit-license]: https://opensource.org/licenses/mit-license.html 32 | [morea]: https://morea-framework.github.io/ 33 | [numfocus]: https://numfocus.org/ 34 | [osi]: https://opensource.org 35 | [pandoc]: https://pandoc.org/ 36 | [paper-now]: https://github.com/PeerJ/paper-now 37 | [python-gapminder]: https://swcarpentry.github.io/python-novice-gapminder/ 38 | [pyyaml]: https://pypi.python.org/pypi/PyYAML 39 | [r-markdown]: https://rmarkdown.rstudio.com/ 40 | [rstudio]: https://www.rstudio.com/ 41 | [ruby-install-guide]: https://www.ruby-lang.org/en/downloads/ 42 | [ruby-installer]: https://rubyinstaller.org/ 43 | [rubygems]: https://rubygems.org/pages/download/ 44 | [styles]: https://github.com/carpentries/styles/ 45 | [swc-lessons]: https://software-carpentry.org/lessons/ 46 | [swc-releases]: https://github.com/swcarpentry/swc-releases 47 | [training]: https://carpentries.github.io/instructor-training/ 48 | [workshop-repo]: {{ site.workshop_repo }} 49 | [yaml]: http://yaml.org/ 50 | -------------------------------------------------------------------------------- /_includes/main_title.html: -------------------------------------------------------------------------------- 1 | {% comment %} 2 | Main title for lesson pages. 3 | {% endcomment %} 4 | 5 | {% include base_path.html %} 6 | 7 |

{{ site.title }}{% if page.title %}: {{ page.title }}{% endif %}

8 | -------------------------------------------------------------------------------- /_includes/molssi.html: -------------------------------------------------------------------------------- 1 | {% comment %} 2 | General description of The Molecular Sciences Software Institute. 3 | {% endcomment %} 4 |
5 |
6 | MolSSI logo 7 |
8 |
9 | Since its launch in 2016, The Molecular Sciences Software Institute, has served as a nexus for the 10 | broad computational molecular sciences community by providing software expertise, community engagement and leadership, and education 11 | and training. Through a broad array of software infrastructure projects, teaching workshops, and community outreach, the MolSSI is 12 | catalyzing the scientific advances needed to solve emerging scientific computing Grand Challenges. 13 |
14 |
15 | 16 |
17 |
18 |

Education of students, post-docs, and faculty on programming and Best Practices in Software Development is a large part of MolSSI's mission. 19 | Our education program consists of our cohorts of Software Fellows, 20 | online training materials, 21 | and multiple workshops online or in-person at various locations each year. 22 |

23 |

MolSSI’s education techniques and practices are modeled after The Software Carpentries 24 | style to teaching novice software best practices. This approach teaches subjects that not only increase a student’s scientific 25 | capability and efficiency, but also his/her future marketability in both scientific and non-scientific fields. 26 |

27 |
28 |
29 | 30 | -------------------------------------------------------------------------------- /_includes/navbar.html: -------------------------------------------------------------------------------- 1 | {% comment %} 2 | Lesson navigation bar. 3 | {% endcomment %} 4 | 5 | {% include gh_variables.html %} 6 | 7 | 80 | -------------------------------------------------------------------------------- /_includes/sc/intro.html: -------------------------------------------------------------------------------- 1 |

2 | Software Carpentry 3 | aims to help researchers get their work done 4 | in less time and with less pain 5 | by teaching them basic research computing skills. 6 | This hands-on workshop will cover basic concepts and tools, 7 | including program design, version control, data management, 8 | and task automation. 9 | Participants will be encouraged to help one another 10 | and to apply what they have learned to their own research problems. 11 |

12 |

13 | 14 | For more information on what we teach and why, 15 | please see our paper 16 | "Best Practices for Scientific Computing". 17 | 18 |

19 | -------------------------------------------------------------------------------- /_includes/sc/schedule.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |

Day 1

4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
09:00 Automating tasks with the Unix shell
10:30 Coffee
12:00 Lunch break
13:00 Building programs with Python
14:30 Coffee
16:00 Wrap-up
12 |
13 |
14 |

Day 2

15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |
09:00 Version control with Git
10:30 Coffee
12:00 Lunch break
13:00 Managing data with SQL
14:30 Coffee
16:00 Wrap-up
23 |
24 |
25 | -------------------------------------------------------------------------------- /_includes/sc/syllabus.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |

The Unix Shell

4 |
    5 |
  • Files and directories
  • 6 |
  • History and tab completion
  • 7 |
  • Pipes and redirection
  • 8 |
  • Looping over files
  • 9 |
  • Creating and running shell scripts
  • 10 |
  • Finding things
  • 11 |
  • Reference...
  • 12 |
13 |
14 |
15 |

Programming in Python

16 |
    17 |
  • Using libraries
  • 18 |
  • Working with arrays
  • 19 |
  • Reading and plotting data
  • 20 |
  • Creating and using functions
  • 21 |
  • Loops and conditionals
  • 22 |
  • Defensive programming
  • 23 |
  • Using Python from the command line
  • 24 |
  • Reference...
  • 25 |
26 |
27 | 40 | 53 |
54 | 55 |
56 |
57 |

Version Control with Git

58 |
    59 |
  • Creating a repository
  • 60 |
  • Recording changes to files: add, commit, ...
  • 61 |
  • Viewing changes: status, diff, ...
  • 62 |
  • Ignoring files
  • 63 |
  • Working on the web: clone, pull, push, ...
  • 64 |
  • Resolving conflicts
  • 65 |
  • Open licenses
  • 66 |
  • Where to host work, and why
  • 67 |
  • Reference...
  • 68 |
69 |
70 | 86 |
87 |

Open Refine

88 |
    89 |
  • Introduction to OpenRefine
  • 90 |
  • Importing data
  • 91 |
  • Basic functions
  • 92 |
  • Advanced Functions
  • 93 |
  • Reference...
  • 94 |
95 |
96 |
97 | -------------------------------------------------------------------------------- /_includes/sc/who.html: -------------------------------------------------------------------------------- 1 |

2 | Who: 3 | The course is aimed at graduate students and other researchers. 4 | 5 | You don't need to have any previous knowledge of the tools 6 | that will be presented at the workshop. 7 | 8 |

9 | -------------------------------------------------------------------------------- /_includes/syllabus.html: -------------------------------------------------------------------------------- 1 | {% comment %} 2 | Display syllabus in tabular form. 3 | Days are displayed if at least one episode has 'start = true'. 4 | {% endcomment %} 5 |
6 |

Schedule

7 | 8 | {% assign lesson_number = 0 %} 9 | {% assign day = 0 %} 10 | {% assign multiday = false %} 11 | {% for episode in site.episodes %} 12 | {% if episode.start %}{% assign multiday = true %}{% break %}{% endif %} 13 | {% endfor %} 14 | {% assign current = site.start_time %} 15 | 16 | 17 | 18 | {% if multiday %}{% endif %} 19 | 20 | 21 | 22 | 23 | {% for episode in site.episodes %} 24 | {% if episode.legacy == None %} 25 | {% if episode.start %} {% comment %} Starting a new day? {% endcomment %} 26 | {% assign day = day | plus: 1 %} 27 | {% if day > 1 %} {% comment %} If about to start day 2 or later, show finishing time for previous day {% endcomment %} 28 | {% assign hours = current | divided_by: 60 %} 29 | {% assign minutes = current | modulo: 60 %} 30 | 31 | {% if multiday %}{% endif %} 32 | 33 | 34 | 35 | 36 | {% endif %} 37 | {% assign current = site.start_time %} {% comment %}Re-set start time of this episode to general daily start time {% endcomment %} 38 | {% endif %} 39 | {% assign hours = current | divided_by: 60 %} 40 | {% assign minutes = current | modulo: 60 %} 41 | 42 | {% if multiday %}{% endif %} 43 | 44 | 48 | 62 | 63 | {% assign current = current | plus: episode.teaching | plus: episode.exercises | plus: episode.break %} 64 | {% endif %} 65 | {% endfor %} 66 | {% assign hours = current | divided_by: 60 %} 67 | {% assign minutes = current | modulo: 60 %} 68 | 69 | {% if multiday %}{% endif %} 70 | 71 | 72 | 73 | 74 |
SetupDownload files required for the lesson
{% if hours < 10 %}0{% endif %}{{ hours }}:{% if minutes < 10 %}0{% endif %}{{ minutes }}Finish
{% if episode.start %}Day {{ day }}{% endif %}{% if hours < 10 %}0{% endif %}{{ hours }}:{% if minutes < 10 %}0{% endif %}{{ minutes }} 45 | {% assign lesson_number = lesson_number | plus: 1 %} 46 | {{ lesson_number }}. {{ episode.title }} 47 | 49 | {% if episode.break %} 50 | Break 51 | {% else %} 52 | {% if episode.questions %} 53 | {% for question in episode.questions %} 54 | {{question|markdownify|strip_html}} 55 | {% unless forloop.last %} 56 |
57 | {% endunless %} 58 | {% endfor %} 59 | {% endif %} 60 | {% endif %} 61 |
{% if hours < 10 %}0{% endif %}{{ hours }}:{% if minutes < 10 %}0{% endif %}{{ minutes }}Finish
75 | 76 |

77 | The actual schedule may vary slightly depending on the topics and exercises chosen by the instructor. 78 |

79 | 80 |

Alternate Lessons

81 | 82 |

83 | Alternate lessons are shown below. 84 |

85 | 86 | 87 | {% for episode in site.episodes %} 88 | {% if episode.alternate %} 89 | {% if episode.start %} {% comment %} Starting a new day? {% endcomment %} 90 | {% assign day = day | plus: 1 %} 91 | {% if day > 1 %} {% comment %} If about to start day 2 or later, show finishing time for previous day {% endcomment %} 92 | {% assign hours = current | divided_by: 60 %} 93 | {% assign minutes = current | modulo: 60 %} 94 | 95 | {% if multiday %}{% endif %} 96 | 97 | 98 | 99 | 100 | {% endif %} 101 | {% assign current = site.start_time %} {% comment %}Re-set start time of this episode to general daily start time {% endcomment %} 102 | {% endif %} 103 | {% assign hours = current | divided_by: 60 %} 104 | {% assign minutes = current | modulo: 60 %} 105 | 106 | {% if multiday %}{% endif %} 107 | 108 | 112 | 126 | 127 | {% assign current = current | plus: episode.teaching | plus: episode.exercises | plus: episode.break %} 128 | {% endif %} 129 | {% endfor %} 130 | {% assign hours = current | divided_by: 60 %} 131 | {% assign minutes = current | modulo: 60 %} 132 |
{% if hours < 10 %}0{% endif %}{{ hours }}:{% if minutes < 10 %}0{% endif %}{{ minutes }}Finish
{% if episode.start %}Day {{ day }}{% endif %} 109 | {% assign lesson_number = lesson_number | plus: 1 %} 110 | {{ episode.title }} 111 | 113 | {% if episode.break %} 114 | Break 115 | {% else %} 116 | {% if episode.questions %} 117 | {% for question in episode.questions %} 118 | {{question|markdownify|strip_html}} 119 | {% unless forloop.last %} 120 |
121 | {% endunless %} 122 | {% endfor %} 123 | {% endif %} 124 | {% endif %} 125 |
133 | 134 | 135 |
-------------------------------------------------------------------------------- /_includes/workshop_ad.html: -------------------------------------------------------------------------------- 1 | {% comment %} 2 | Advertising box at the top of a workshop website home page. 3 | {% endcomment %} 4 |
5 |
6 |
7 |

{{page.venue}}

8 |
9 |
10 |

{{page.humandate}}

11 |

{% if page.humantime %}{{page.humantime}}{% endif %}

12 |
13 |
14 |

15 | Instructors: 16 | {% if page.instructor %} 17 | {{page.instructor | join: ', ' %}} 18 | {% else %} 19 | to be announced. 20 | {% endif %} 21 |

22 | {% if page.helper %} 23 |

24 | Helpers: 25 | {{page.helper | join: ', ' %}} 26 |

27 | {% endif %} 28 |
29 |
30 |
31 |
32 |
33 | -------------------------------------------------------------------------------- /_includes/workshop_calendar.html: -------------------------------------------------------------------------------- 1 | Add to your Google Calendar. 2 | -------------------------------------------------------------------------------- /_includes/workshop_footer.html: -------------------------------------------------------------------------------- 1 | {% comment %} 2 | Footer for a standard workshop. 3 | {% endcomment %} 4 | 27 | -------------------------------------------------------------------------------- /_layouts/base.html: -------------------------------------------------------------------------------- 1 | --- 2 | --- 3 | {% include base_path.html %} 4 | {% include gh_variables.html %} 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | {% include favicons.html %} 21 | 22 | 23 | 24 | 28 | 29 | 30 | {% if page.title %}{{ page.title }}{% endif %}{% if page.title and site.title %} – {% endif %}{% if site.title %}{{ site.title }}{% endif %} 31 | 32 | 33 | 34 | 35 | 36 | {% include life_cycle.html %} 37 | 38 |
39 | {% include navbar.html %} 40 | {{ content }} 41 | {% if site.kind == "workshop" %} 42 | {% include workshop_footer.html %} 43 | {% else %} 44 | {% include lesson_footer.html %} 45 | {% endif %} 46 |
47 | {% include javascript.html %} 48 | 49 | 50 | -------------------------------------------------------------------------------- /_layouts/break.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: base 3 | --- 4 | {% include episode_navbar.html episode_navbar_title=true %} 5 |
6 | {% include episode_title.html %} 7 | {% include episode_break.html %} 8 | {{content}} 9 |
10 | {% include episode_navbar.html episode_navbar_title=false %} 11 | -------------------------------------------------------------------------------- /_layouts/episode.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: base 3 | --- 4 | {% include episode_navbar.html episode_navbar_title=true %} 5 |
6 | {% include episode_title.html %} 7 | {% include episode_overview.html %} 8 | {{content}} 9 | {% include episode_keypoints.html %} 10 |
11 | {% include episode_navbar.html episode_navbar_title=false %} 12 | -------------------------------------------------------------------------------- /_layouts/lesson.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: base 3 | --- 4 | {% include main_title.html %} 5 |
6 | {{ content }} 7 |
8 | {% include syllabus.html %} 9 | -------------------------------------------------------------------------------- /_layouts/page.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: base 3 | --- 4 | {% include main_title.html %} 5 |
6 | {{content}} 7 |
8 | -------------------------------------------------------------------------------- /_layouts/reference.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: "Reference" 4 | --- 5 | {% include all_keypoints.html %} 6 | {{content}} 7 | -------------------------------------------------------------------------------- /_layouts/workshop.html: -------------------------------------------------------------------------------- 1 | --- 2 | --- 3 | {% include base_path.html %} 4 | {% include gh_variables.html %} 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 26 | {% endif %} 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | {% include favicons.html %} 38 | 39 | 40 | 41 | 45 | {{ page.venue }}: {{ page.humandate }} 46 | 47 | 48 |
49 | {% include navbar.html %} 50 | {% include workshop_ad.html %} 51 | {{ content }} 52 | {% include workshop_footer.html %} 53 |
54 | {% include javascript.html %} 55 | 56 | 57 | -------------------------------------------------------------------------------- /aio.md: -------------------------------------------------------------------------------- 1 | --- 2 | permalink: /aio/index.html 3 | --- 4 | 5 | {% comment %} 6 | As a maintainer, you don't need to edit this file. 7 | If you notice that something doesn't work, please 8 | open an issue: https://github.com/carpentries/styles/issues/new 9 | {% endcomment %} 10 | 11 | {% include base_path.html %} 12 | 13 | {% include aio-script.md %} 14 | -------------------------------------------------------------------------------- /assets/css/lesson.scss: -------------------------------------------------------------------------------- 1 | --- 2 | --- 3 | 4 | //---------------------------------------- 5 | // Colors. 6 | //---------------------------------------- 7 | 8 | // branding 9 | $color-brand: #2b3990 !default; 10 | 11 | // code boxes 12 | $color-error: #bd2c00 !default; 13 | $color-warning: #cda01d !default; 14 | $color-output: #303030 !default; 15 | $color-source: #360084 !default; 16 | 17 | // blockquotes 18 | $color-callout: #f4fd9c !default; 19 | $color-challenge: #eec275 !default; 20 | $color-checklist: #dfd2a0 !default; 21 | $color-discussion: #eec275 !default; 22 | $color-keypoints: #7ae78e !default; 23 | $color-objectives: #daee84 !default; 24 | $color-prereq: #9cd6dc !default; 25 | $color-solution: #ded4b9 !default; 26 | $color-testimonial: #fc8dc1 !default; 27 | 28 | //---------------------------------------- 29 | // Specialized code blocks. 30 | //---------------------------------------- 31 | 32 | @mixin cdSetup($color) { 33 | color: $color; 34 | border: solid 1px $color; 35 | border-left: solid 5px $color; 36 | margin: 15px 5px 10px 0; 37 | border-radius: 4px 0 0 4px; 38 | } 39 | 40 | .error { @include cdSetup($color-error); } 41 | .warning { @include cdSetup($color-warning); } 42 | .output { @include cdSetup($color-output); } 43 | .source { @include cdSetup($color-source); } 44 | 45 | .bash, .language-bash { @include cdSetup($color-source); } 46 | .make, .language-make { @include cdSetup($color-source); } 47 | .matlab, .language-matlab { @include cdSetup($color-source); } 48 | .python, .language-python { @include cdSetup($color-source); } 49 | .r, .language-r { @include cdSetup($color-source); } 50 | .sql, .language-sql { @include cdSetup($color-source); } 51 | 52 | .error::before, 53 | .warning:before, 54 | .output::before, 55 | .source::before, 56 | .bash::before, .language-bash::before, 57 | .make::before, .language-make::before, 58 | .matlab::before, .language-matlab::before, 59 | .python::before, .language-python::before, 60 | .r::before, .language-r::before, 61 | .sql::before, .language-sql::before { 62 | background-color: #f2eff6; 63 | display: block; 64 | font-weight: bold; 65 | padding: 5px 10px; 66 | } 67 | 68 | .error::before { background-color: #ffebe6; content: "Error"; } 69 | .warning:before { background-color: #f8f4e8; content:" Warning"; } 70 | .output::before { background-color: #efefef; content: "Output"; } 71 | .source::before { content: "Code"; } 72 | .bash::before, .language-bash::before { content: "Bash"; } 73 | .make::before, .language-make::before { content: "Make"; } 74 | .matlab::before, .language-matlab::before { content: "Matlab"; } 75 | .python::before, .language-python::before { content: "Python"; } 76 | .r::before, .language-r::before { content: "R"; } 77 | .sql::before, .language-sql::before { content: "SQL"; } 78 | 79 | // Tab panels are used on Setup pages to show instructions for different Operating Systems 80 | .tab-pane { 81 | border: solid 1px #ddd; // #ddd == @nav-tabs-active-link-hover-border-color 82 | border-top: none; 83 | padding: 20px 20px 10px 20px; 84 | border-radius: 0 0 4px 4px; // 4px == @border-radius-base 85 | } 86 | 87 | // Stripe above tab panels where OS tabs are shown 88 | ul.nav.nav-tabs { 89 | background: #E1E1E1; 90 | border-radius: 4px 4px 0 0; // 4px == @border-radius-base 91 | } 92 | 93 | // This color provides better contrast ratio on most backgrounds used on Carpentries websites 94 | // 9.24 on FFFFFF: https://webaim.org/resources/contrastchecker/?fcolor=204A6F&bcolor=FFFFFF&api (body) 95 | // 8.78 on F9F9F9: https://webaim.org/resources/contrastchecker/?fcolor=204A6F&bcolor=F9F9F9&api (tables) 96 | // 7.07 on E1E1E1: https://webaim.org/resources/contrastchecker/?fcolor=204A6F&bcolor=E1E1E1&api (tab panels) 97 | a { color: #ed1c24FF; } 98 | a:hover{ color: #393536ff; } 99 | //---------------------------------------- 100 | // Specialized blockquote environments for learning objectives, callouts, etc. 101 | //---------------------------------------- 102 | 103 | $codeblock-padding: 5px !default; 104 | 105 | @mixin bkSetup($color, $glyph) { 106 | 107 | $gradientcolor1: $color; 108 | $gradientcolor2: scale-color($color, $lightness: 10%); 109 | 110 | padding: 0 0 $codeblock-padding $codeblock-padding; 111 | border: 1px solid; 112 | border-color: $color; 113 | border-radius: 4px; 114 | 115 | margin: 15px 5px 10px 0; 116 | 117 | h2 { 118 | padding-top: $codeblock-padding; 119 | padding-bottom: $codeblock-padding; 120 | font-size: 20px; 121 | background: linear-gradient(to bottom, $gradientcolor1, $gradientcolor2); 122 | border-color: $color; 123 | margin-top: 0px; 124 | margin-left: -$codeblock-padding; // to move back to the left margin of the enclosing blockquote 125 | } 126 | h2:before { 127 | font-family: 'Glyphicons Halflings'; 128 | content: $glyph; 129 | float: left; 130 | padding-left: $codeblock-padding; 131 | padding-right: $codeblock-padding; 132 | display: inline-block; 133 | -webkit-font-smoothing: antialiased; 134 | } 135 | 136 | } 137 | 138 | .callout{ @include bkSetup($color-callout, "\e146"); } 139 | .challenge{ @include bkSetup($color-challenge, "\270f"); } 140 | .checklist{ @include bkSetup($color-checklist, "\e067"); } 141 | .discussion{ @include bkSetup($color-discussion, "\e123"); } 142 | .keypoints{ @include bkSetup($color-keypoints, "\e101"); } 143 | .objectives{ @include bkSetup($color-objectives, "\e085"); } 144 | .prereq{ @include bkSetup($color-prereq, "\e124"); } 145 | .solution{ @include bkSetup($color-solution, "\e105"); } 146 | .testimonial{ @include bkSetup($color-testimonial, "\e143"); } 147 | 148 | .callout h3, 149 | .challenge h3, 150 | .checklist h3, 151 | .discussion h3, 152 | .keypoints h3, 153 | .objectives h3, 154 | .prereq h3, 155 | .solution h3, 156 | .testimonial h3 { 157 | font-size: 18px; 158 | } 159 | 160 | .challenge { background-color: #eec27520; } 161 | .callout { background-color: #f4fd9c20; } 162 | .challenge { background-color: #eec27520; } 163 | .checklist { background-color: #dfd2a020; } 164 | .discussion { background-color: #eec27520; } 165 | .keypoints { background-color: #7ae78e20; } 166 | .objectives { background-color: #daee8420; } 167 | .prereq { background-color: #9cd6dc20; } 168 | .solution { background-color: #ded4b94d; } 169 | .testimonial { background-color: #fc8dc120; } 170 | 171 | blockquote p { 172 | margin: 5px; 173 | } 174 | blockquote :not(h2) + p { 175 | padding-top: 1em; 176 | } 177 | 178 | //---------------------------------------- 179 | // Override Bootstrap settings. 180 | //---------------------------------------- 181 | 182 | blockquote { font-size: inherit; } 183 | 184 | code { 185 | white-space: nowrap; 186 | padding: 2px 5px; 187 | color: #006cad; 188 | background-color: #e7e7e7; 189 | } 190 | 191 | samp { hyphens: none; } 192 | 193 | dt { margin-top: 20px; } 194 | dd { margin-left: 2em; } 195 | 196 | article img { 197 | display: block; 198 | margin: 20px auto; 199 | max-width: 100%; 200 | } 201 | 202 | article h2 { 203 | margin: 48px 0 16px; 204 | border-bottom: solid 1px #eaecef; 205 | padding-bottom: 0.3em; 206 | line-height: 1.25; 207 | } 208 | 209 | article h3 { margin: 40px 0 16px; } 210 | 211 | article pre { 212 | margin: 0; 213 | border: 0; 214 | } 215 | 216 | //---------------------------------------- 217 | // Miscellaneous. 218 | //---------------------------------------- 219 | 220 | .figures h2 { margin-top: 100px; } 221 | 222 | .maintitle { 223 | text-align: center; 224 | } 225 | 226 | .footertext { 227 | text-align: center; 228 | } 229 | 230 | footer .license, 231 | footer .help-links 232 | { 233 | font-size: inherit; 234 | margin-top: 10px; 235 | margin-bottom: 10px; 236 | font-weight: 500; 237 | line-height: 1.1; 238 | } 239 | 240 | img.navbar-logo { 241 | height: 40px; // synchronize with height of navbar 242 | padding-top: 5px; 243 | padding-right: 10px; 244 | } 245 | 246 | div.branding { 247 | color: $color-brand; 248 | } 249 | 250 | ul, 251 | ol { 252 | padding-left: 2em; 253 | } 254 | 255 | span.fold-unfold { 256 | margin-left: 1em; 257 | opacity: 0.5; 258 | } 259 | 260 | 261 | //---------------------------------------- 262 | // Life cycle box 263 | //---------------------------------------- 264 | 265 | div.life-cycle { 266 | position: -webkit-sticky; /* Safari */ 267 | position: sticky; 268 | top: 0; 269 | z-index: 100; 270 | font-size: 1.2em; 271 | text-align: center; 272 | margin-bottom: -1px; 273 | border-radius: 0; 274 | } 275 | 276 | .pre-alpha { 277 | color: #a94442; 278 | background: #f2dede; 279 | } 280 | 281 | .alpha { 282 | color: #8a6d3b; 283 | background: #fcf8e3; 284 | } 285 | 286 | .beta { 287 | color: #31708f; 288 | background: #d9edf7; 289 | } 290 | 291 | 292 | //---------------------------------------- 293 | // keyboard key style, from StackExchange. 294 | //---------------------------------------- 295 | 296 | kbd { 297 | display: inline-block; 298 | margin: 0 .1em; 299 | padding: .1em .6em; 300 | font-family: Arial,"Helvetica Neue",Helvetica,sans-serif; 301 | font-size: 11px; 302 | line-height: 1.4; 303 | color: #242729; 304 | text-shadow: 0 1px 0 #FFF; 305 | background-color: #e1e3e5; 306 | border: 1px solid #adb3b9; 307 | border-radius: 3px; 308 | box-shadow: 0 1px 0 rgba(12,13,14,0.2), 0 0 0 2px #FFF inset; 309 | white-space: nowrap; 310 | font-style: normal; 311 | } -------------------------------------------------------------------------------- /assets/css/syntax.css: -------------------------------------------------------------------------------- 1 | .highlight .hll { background-color: #ffffcc } 2 | .highlight { background: #f8f8f8; } 3 | .highlight .c { color: #387d7d; font-style: italic } /* Comment */ 4 | .highlight .err { border: 1px solid #FF0000 } /* Error */ 5 | .highlight .k { color: #008000; font-weight: bold } /* Keyword */ 6 | .highlight .o { color: #666666 } /* Operator */ 7 | .highlight .ch { color: #387d7d; font-style: italic } /* Comment.Hashbang */ 8 | .highlight .cm { color: #387d7d; font-style: italic } /* Comment.Multiline */ 9 | .highlight .cp { color: #BC7A00 } /* Comment.Preproc */ 10 | .highlight .cpf { color: #387d7d; font-style: italic } /* Comment.PreprocFile */ 11 | .highlight .c1 { color: #387d7d; font-style: italic } /* Comment.Single */ 12 | .highlight .cs { color: #387d7d; font-style: italic } /* Comment.Special */ 13 | .highlight .gd { color: #A00000 } /* Generic.Deleted */ 14 | .highlight .ge { font-style: italic } /* Generic.Emph */ 15 | .highlight .gr { color: #FF0000 } /* Generic.Error */ 16 | .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ 17 | .highlight .gi { color: #00A000 } /* Generic.Inserted */ 18 | .highlight .go { color: #888888 } /* Generic.Output */ 19 | .highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ 20 | .highlight .gs { font-weight: bold } /* Generic.Strong */ 21 | .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ 22 | .highlight .gt { color: #0044DD } /* Generic.Traceback */ 23 | .highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ 24 | .highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ 25 | .highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ 26 | .highlight .kp { color: #008000 } /* Keyword.Pseudo */ 27 | .highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ 28 | .highlight .kt { color: #B00040 } /* Keyword.Type */ 29 | .highlight .m { color: #666666 } /* Literal.Number */ 30 | .highlight .s { color: #BA2121 } /* Literal.String */ 31 | .highlight .na { color: #7D9029 } /* Name.Attribute */ 32 | .highlight .nb { color: #008000 } /* Name.Builtin */ 33 | .highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ 34 | .highlight .no { color: #880000 } /* Name.Constant */ 35 | .highlight .nd { color: #AA22FF } /* Name.Decorator */ 36 | .highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */ 37 | .highlight .ne { color: #D2413A; font-weight: bold } /* Name.Exception */ 38 | .highlight .nf { color: #0000FF } /* Name.Function */ 39 | .highlight .nl { color: #A0A000 } /* Name.Label */ 40 | .highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ 41 | .highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ 42 | .highlight .nv { color: #19177C } /* Name.Variable */ 43 | .highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ 44 | .highlight .w { color: #bbbbbb } /* Text.Whitespace */ 45 | .highlight .mb { color: #666666 } /* Literal.Number.Bin */ 46 | .highlight .mf { color: #666666 } /* Literal.Number.Float */ 47 | .highlight .mh { color: #666666 } /* Literal.Number.Hex */ 48 | .highlight .mi { color: #666666 } /* Literal.Number.Integer */ 49 | .highlight .mo { color: #666666 } /* Literal.Number.Oct */ 50 | .highlight .sa { color: #BA2121 } /* Literal.String.Affix */ 51 | .highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ 52 | .highlight .sc { color: #BA2121 } /* Literal.String.Char */ 53 | .highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ 54 | .highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ 55 | .highlight .s2 { color: #BA2121 } /* Literal.String.Double */ 56 | .highlight .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */ 57 | .highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ 58 | .highlight .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */ 59 | .highlight .sx { color: #008000 } /* Literal.String.Other */ 60 | .highlight .sr { color: #BB6688 } /* Literal.String.Regex */ 61 | .highlight .s1 { color: #BA2121 } /* Literal.String.Single */ 62 | .highlight .ss { color: #19177C } /* Literal.String.Symbol */ 63 | .highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ 64 | .highlight .fm { color: #0000FF } /* Name.Function.Magic */ 65 | .highlight .vc { color: #19177C } /* Name.Variable.Class */ 66 | .highlight .vg { color: #19177C } /* Name.Variable.Global */ 67 | .highlight .vi { color: #19177C } /* Name.Variable.Instance */ 68 | .highlight .vm { color: #19177C } /* Name.Variable.Magic */ 69 | .highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ 70 | -------------------------------------------------------------------------------- /assets/favicons/cp/apple-touch-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/cp/apple-touch-icon-114x114.png -------------------------------------------------------------------------------- /assets/favicons/cp/apple-touch-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/cp/apple-touch-icon-120x120.png -------------------------------------------------------------------------------- /assets/favicons/cp/apple-touch-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/cp/apple-touch-icon-144x144.png -------------------------------------------------------------------------------- /assets/favicons/cp/apple-touch-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/cp/apple-touch-icon-152x152.png -------------------------------------------------------------------------------- /assets/favicons/cp/apple-touch-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/cp/apple-touch-icon-57x57.png -------------------------------------------------------------------------------- /assets/favicons/cp/apple-touch-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/cp/apple-touch-icon-60x60.png -------------------------------------------------------------------------------- /assets/favicons/cp/apple-touch-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/cp/apple-touch-icon-72x72.png -------------------------------------------------------------------------------- /assets/favicons/cp/apple-touch-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/cp/apple-touch-icon-76x76.png -------------------------------------------------------------------------------- /assets/favicons/cp/favicon-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/cp/favicon-128.png -------------------------------------------------------------------------------- /assets/favicons/cp/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/cp/favicon-16x16.png -------------------------------------------------------------------------------- /assets/favicons/cp/favicon-196x196.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/cp/favicon-196x196.png -------------------------------------------------------------------------------- /assets/favicons/cp/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/cp/favicon-32x32.png -------------------------------------------------------------------------------- /assets/favicons/cp/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/cp/favicon-96x96.png -------------------------------------------------------------------------------- /assets/favicons/cp/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/cp/favicon.ico -------------------------------------------------------------------------------- /assets/favicons/cp/mstile-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/cp/mstile-144x144.png -------------------------------------------------------------------------------- /assets/favicons/cp/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/cp/mstile-150x150.png -------------------------------------------------------------------------------- /assets/favicons/cp/mstile-310x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/cp/mstile-310x150.png -------------------------------------------------------------------------------- /assets/favicons/cp/mstile-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/cp/mstile-310x310.png -------------------------------------------------------------------------------- /assets/favicons/cp/mstile-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/cp/mstile-70x70.png -------------------------------------------------------------------------------- /assets/favicons/dc/apple-touch-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/dc/apple-touch-icon-114x114.png -------------------------------------------------------------------------------- /assets/favicons/dc/apple-touch-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/dc/apple-touch-icon-120x120.png -------------------------------------------------------------------------------- /assets/favicons/dc/apple-touch-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/dc/apple-touch-icon-144x144.png -------------------------------------------------------------------------------- /assets/favicons/dc/apple-touch-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/dc/apple-touch-icon-152x152.png -------------------------------------------------------------------------------- /assets/favicons/dc/apple-touch-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/dc/apple-touch-icon-57x57.png -------------------------------------------------------------------------------- /assets/favicons/dc/apple-touch-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/dc/apple-touch-icon-60x60.png -------------------------------------------------------------------------------- /assets/favicons/dc/apple-touch-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/dc/apple-touch-icon-72x72.png -------------------------------------------------------------------------------- /assets/favicons/dc/apple-touch-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/dc/apple-touch-icon-76x76.png -------------------------------------------------------------------------------- /assets/favicons/dc/favicon-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/dc/favicon-128.png -------------------------------------------------------------------------------- /assets/favicons/dc/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/dc/favicon-16x16.png -------------------------------------------------------------------------------- /assets/favicons/dc/favicon-196x196.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/dc/favicon-196x196.png -------------------------------------------------------------------------------- /assets/favicons/dc/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/dc/favicon-32x32.png -------------------------------------------------------------------------------- /assets/favicons/dc/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/dc/favicon-96x96.png -------------------------------------------------------------------------------- /assets/favicons/dc/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/dc/favicon.ico -------------------------------------------------------------------------------- /assets/favicons/dc/mstile-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/dc/mstile-144x144.png -------------------------------------------------------------------------------- /assets/favicons/dc/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/dc/mstile-150x150.png -------------------------------------------------------------------------------- /assets/favicons/dc/mstile-310x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/dc/mstile-310x150.png -------------------------------------------------------------------------------- /assets/favicons/dc/mstile-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/dc/mstile-310x310.png -------------------------------------------------------------------------------- /assets/favicons/dc/mstile-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/dc/mstile-70x70.png -------------------------------------------------------------------------------- /assets/favicons/lc/apple-touch-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/lc/apple-touch-icon-114x114.png -------------------------------------------------------------------------------- /assets/favicons/lc/apple-touch-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/lc/apple-touch-icon-120x120.png -------------------------------------------------------------------------------- /assets/favicons/lc/apple-touch-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/lc/apple-touch-icon-144x144.png -------------------------------------------------------------------------------- /assets/favicons/lc/apple-touch-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/lc/apple-touch-icon-152x152.png -------------------------------------------------------------------------------- /assets/favicons/lc/apple-touch-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/lc/apple-touch-icon-57x57.png -------------------------------------------------------------------------------- /assets/favicons/lc/apple-touch-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/lc/apple-touch-icon-60x60.png -------------------------------------------------------------------------------- /assets/favicons/lc/apple-touch-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/lc/apple-touch-icon-72x72.png -------------------------------------------------------------------------------- /assets/favicons/lc/apple-touch-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/lc/apple-touch-icon-76x76.png -------------------------------------------------------------------------------- /assets/favicons/lc/favicon-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/lc/favicon-128.png -------------------------------------------------------------------------------- /assets/favicons/lc/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/lc/favicon-16x16.png -------------------------------------------------------------------------------- /assets/favicons/lc/favicon-196x196.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/lc/favicon-196x196.png -------------------------------------------------------------------------------- /assets/favicons/lc/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/lc/favicon-32x32.png -------------------------------------------------------------------------------- /assets/favicons/lc/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/lc/favicon-96x96.png -------------------------------------------------------------------------------- /assets/favicons/lc/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/lc/favicon.ico -------------------------------------------------------------------------------- /assets/favicons/lc/mstile-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/lc/mstile-144x144.png -------------------------------------------------------------------------------- /assets/favicons/lc/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/lc/mstile-150x150.png -------------------------------------------------------------------------------- /assets/favicons/lc/mstile-310x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/lc/mstile-310x150.png -------------------------------------------------------------------------------- /assets/favicons/lc/mstile-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/lc/mstile-310x310.png -------------------------------------------------------------------------------- /assets/favicons/lc/mstile-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/lc/mstile-70x70.png -------------------------------------------------------------------------------- /assets/favicons/molssi/favicon-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/molssi/favicon-128.png -------------------------------------------------------------------------------- /assets/favicons/molssi/favicon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/molssi/favicon-152x152.png -------------------------------------------------------------------------------- /assets/favicons/molssi/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/molssi/favicon-16x16.png -------------------------------------------------------------------------------- /assets/favicons/molssi/favicon-196x196.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/molssi/favicon-196x196.png -------------------------------------------------------------------------------- /assets/favicons/molssi/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/molssi/favicon-32x32.png -------------------------------------------------------------------------------- /assets/favicons/molssi/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/molssi/favicon-96x96.png -------------------------------------------------------------------------------- /assets/favicons/molssi/molssi.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/molssi/molssi.jpg -------------------------------------------------------------------------------- /assets/favicons/swc/apple-touch-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/swc/apple-touch-icon-114x114.png -------------------------------------------------------------------------------- /assets/favicons/swc/apple-touch-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/swc/apple-touch-icon-120x120.png -------------------------------------------------------------------------------- /assets/favicons/swc/apple-touch-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/swc/apple-touch-icon-144x144.png -------------------------------------------------------------------------------- /assets/favicons/swc/apple-touch-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/swc/apple-touch-icon-152x152.png -------------------------------------------------------------------------------- /assets/favicons/swc/apple-touch-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/swc/apple-touch-icon-57x57.png -------------------------------------------------------------------------------- /assets/favicons/swc/apple-touch-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/swc/apple-touch-icon-60x60.png -------------------------------------------------------------------------------- /assets/favicons/swc/apple-touch-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/swc/apple-touch-icon-72x72.png -------------------------------------------------------------------------------- /assets/favicons/swc/apple-touch-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/swc/apple-touch-icon-76x76.png -------------------------------------------------------------------------------- /assets/favicons/swc/favicon-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/swc/favicon-128.png -------------------------------------------------------------------------------- /assets/favicons/swc/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/swc/favicon-16x16.png -------------------------------------------------------------------------------- /assets/favicons/swc/favicon-196x196.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/swc/favicon-196x196.png -------------------------------------------------------------------------------- /assets/favicons/swc/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/swc/favicon-32x32.png -------------------------------------------------------------------------------- /assets/favicons/swc/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/swc/favicon-96x96.png -------------------------------------------------------------------------------- /assets/favicons/swc/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/swc/favicon.ico -------------------------------------------------------------------------------- /assets/favicons/swc/mstile-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/swc/mstile-144x144.png -------------------------------------------------------------------------------- /assets/favicons/swc/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/swc/mstile-150x150.png -------------------------------------------------------------------------------- /assets/favicons/swc/mstile-310x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/swc/mstile-310x150.png -------------------------------------------------------------------------------- /assets/favicons/swc/mstile-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/swc/mstile-310x310.png -------------------------------------------------------------------------------- /assets/favicons/swc/mstile-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/favicons/swc/mstile-70x70.png -------------------------------------------------------------------------------- /assets/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /assets/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /assets/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /assets/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /assets/img/cp-logo-blue.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /assets/img/dc-icon-black.svg: -------------------------------------------------------------------------------- 1 | 2 | 16 | 18 | 19 | 21 | image/svg+xml 22 | 24 | 25 | 26 | 27 | 28 | 30 | 54 | 59 | 64 | 69 | 74 | 75 | -------------------------------------------------------------------------------- /assets/img/dc-logo-black.svg: -------------------------------------------------------------------------------- 1 | 2 | 16 | 18 | 19 | 21 | image/svg+xml 22 | 24 | 25 | 26 | 27 | 28 | 30 | 54 | 59 | 64 | 69 | 74 | 75 | -------------------------------------------------------------------------------- /assets/img/lc-icon-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/img/lc-icon-black.png -------------------------------------------------------------------------------- /assets/img/lc-logo-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/img/lc-logo-black.png -------------------------------------------------------------------------------- /assets/img/molssi_main_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/img/molssi_main_logo.png -------------------------------------------------------------------------------- /assets/img/swc-icon-blue.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /assets/img/swc-logo-blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/img/swc-logo-blue.png -------------------------------------------------------------------------------- /assets/img/swc-logo-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/assets/img/swc-logo-white.png -------------------------------------------------------------------------------- /assets/js/lesson.js: -------------------------------------------------------------------------------- 1 | // Make all tables striped by default. 2 | $("table").addClass("table table-striped"); 3 | 4 | 5 | // Handle foldable challenges and solutions (on click and at start). 6 | $(".solution").click(function(event) { 7 | var trigger = $(event.target).has(".fold-unfold").size() > 0 8 | || $(event.target).filter(".fold-unfold").size() > 0; 9 | if (trigger) { 10 | $(">*:not(h2)", this).toggle(400); 11 | $(">h2>span.fold-unfold", this).toggleClass("glyphicon-collapse-down glyphicon-collapse-up"); 12 | event.stopPropagation(); 13 | } 14 | }); 15 | $(".solution").each(function() { 16 | $(">*:not(h2)", this).toggle(); 17 | var h2 = $("h2:first", this); 18 | h2.append(""); 19 | }); 20 | 21 | 22 | // Handle searches. 23 | // Relies on document having 'meta' element with name 'search-domain'. 24 | function google_search() { 25 | var query = document.getElementById("google-search").value; 26 | var domain = $("meta[name=search-domain]").attr("value"); 27 | window.open("https://www.google.com/search?q=" + query + "+site:" + domain); 28 | } 29 | 30 | // function to shrink the life cycle bar when scrolling 31 | $(function(){ 32 | $('#life-cycle').data('size','big'); 33 | }); 34 | 35 | $(window).scroll(function(){ 36 | if($(document).scrollTop() > 0) 37 | { 38 | if($('#life-cycle').data('size') == 'big') 39 | { 40 | $('#life-cycle').data('size','small'); 41 | $('#life-cycle').stop().animate({ 42 | padding: '5px' 43 | },100); 44 | } 45 | } 46 | else 47 | { 48 | if($('#life-cycle').data('size') == 'small') 49 | { 50 | $('#life-cycle').data('size','big'); 51 | $('#life-cycle').stop().animate({ 52 | padding: '15px' 53 | },100); 54 | } 55 | } 56 | }); 57 | -------------------------------------------------------------------------------- /bin/boilerplate/.travis.yml: -------------------------------------------------------------------------------- 1 | dist: xenial # Ubuntu 16.04 (required for python 3.7) 2 | language: python 3 | python: 3.7 4 | branches: 5 | only: 6 | - gh-pages 7 | - /.*/ 8 | before_install: 9 | - sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E084DAB9 10 | - echo "deb https://cran.rstudio.com/bin/linux/ubuntu trusty/" | sudo tee -a /etc/apt/sources.list 11 | - sudo apt-get update -y 12 | - sudo apt-get install -y r-base 13 | - sudo Rscript -e "install.packages('knitr', repos = 'https://', dependencies = TRUE)" 14 | - sudo Rscript -e "install.packages('stringr', repos = 'https://cran.rstudio.com', dependencies = TRUE)" 15 | - sudo Rscript -e "install.packages('checkpoint', repos = 'https://cran.rstudio.com', dependencies = TRUE)" 16 | - sudo Rscript -e "install.packages('ggplot2', repos = 'https://cran.rstudio.com', dependencies = TRUE)" 17 | - rvm default 18 | - gem install json kramdown jekyll 19 | install: 20 | - pip install pyyaml 21 | script: 22 | - make lesson-check-all 23 | - make --always-make site 24 | -------------------------------------------------------------------------------- /bin/boilerplate/AUTHORS: -------------------------------------------------------------------------------- 1 | FIXME: list authors' names and email addresses. -------------------------------------------------------------------------------- /bin/boilerplate/CITATION: -------------------------------------------------------------------------------- 1 | FIXME: describe how to cite this lesson. -------------------------------------------------------------------------------- /bin/boilerplate/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | [The Carpentries][c-site] ([Software Carpentry][swc-site], [Data Carpentry][dc-site], and [Library Carpentry][lc-site]) are open source projects, 4 | and we welcome contributions of all kinds: 5 | new lessons, 6 | fixes to existing material, 7 | bug reports, 8 | and reviews of proposed changes are all welcome. 9 | 10 | ## Contributor Agreement 11 | 12 | By contributing, 13 | you agree that we may redistribute your work under [our license](LICENSE.md). 14 | In exchange, 15 | we will address your issues and/or assess your change proposal as promptly as we can, 16 | and help you become a member of our community. 17 | Everyone involved in [The Carpentries][c-site] 18 | agrees to abide by our [code of conduct](CODE_OF_CONDUCT.md). 19 | 20 | ## How to Contribute 21 | 22 | The easiest way to get started is to file an issue 23 | to tell us about a spelling mistake, 24 | some awkward wording, 25 | or a factual error. 26 | This is a good way to introduce yourself 27 | and to meet some of our community members. 28 | 29 | 1. If you do not have a [GitHub][github] account, 30 | you can [send us comments by email][email]. 31 | However, 32 | we will be able to respond more quickly if you use one of the other methods described below. 33 | 34 | 2. If you have a [GitHub][github] account, 35 | or are willing to [create one][github-join], 36 | but do not know how to use Git, 37 | you can report problems or suggest improvements by [creating an issue][issues]. 38 | This allows us to assign the item to someone 39 | and to respond to it in a threaded discussion. 40 | 41 | 3. If you are comfortable with Git, 42 | and would like to add or change material, 43 | you can submit a pull request (PR). 44 | Instructions for doing this are [included below](#using-github). 45 | 46 | ## Where to Contribute 47 | 48 | 1. If you wish to change this lesson, 49 | please work in , 50 | which can be viewed at . 51 | 52 | 2. If you wish to change the example lesson, 53 | please work in , 54 | which documents the format of our lessons 55 | and can be viewed at . 56 | 57 | 3. If you wish to change the template used for workshop websites, 58 | please work in . 59 | The home page of that repository explains how to set up workshop websites, 60 | while the extra pages in 61 | provide more background on our design choices. 62 | 63 | 4. If you wish to change CSS style files, tools, 64 | or HTML boilerplate for lessons or workshops stored in `_includes` or `_layouts`, 65 | please work in . 66 | 67 | ## What to Contribute 68 | 69 | There are many ways to contribute, 70 | from writing new exercises and improving existing ones 71 | to updating or filling in the documentation 72 | and submitting [bug reports][issues] 73 | about things that don't work, aren't clear, or are missing. 74 | If you are looking for ideas, please see the 'Issues' tab for 75 | a list of issues associated with this repository, 76 | or you may also look at the issues for [Data Carpentry][dc-issues], 77 | [Software Carpentry][swc-issues], and [Library Carpentry][lc-issues] projects. 78 | 79 | Comments on issues and reviews of pull requests are just as welcome: 80 | we are smarter together than we are on our own. 81 | Reviews from novices and newcomers are particularly valuable: 82 | it's easy for people who have been using these lessons for a while 83 | to forget how impenetrable some of this material can be, 84 | so fresh eyes are always welcome. 85 | 86 | ## What *Not* to Contribute 87 | 88 | Our lessons already contain more material than we can cover in a typical workshop, 89 | so we are usually *not* looking for more concepts or tools to add to them. 90 | As a rule, 91 | if you want to introduce a new idea, 92 | you must (a) estimate how long it will take to teach 93 | and (b) explain what you would take out to make room for it. 94 | The first encourages contributors to be honest about requirements; 95 | the second, to think hard about priorities. 96 | 97 | We are also not looking for exercises or other material that only run on one platform. 98 | Our workshops typically contain a mixture of Windows, macOS, and Linux users; 99 | in order to be usable, 100 | our lessons must run equally well on all three. 101 | 102 | ## Using GitHub 103 | 104 | If you choose to contribute via GitHub, you may want to look at 105 | [How to Contribute to an Open Source Project on GitHub][how-contribute]. 106 | To manage changes, we follow [GitHub flow][github-flow]. 107 | Each lesson has two maintainers who review issues and pull requests or encourage others to do so. 108 | The maintainers are community volunteers and have final say over what gets merged into the lesson. 109 | To use the web interface for contributing to a lesson: 110 | 111 | 1. Fork the originating repository to your GitHub profile. 112 | 2. Within your version of the forked repository, move to the `gh-pages` branch and 113 | create a new branch for each significant change being made. 114 | 3. Navigate to the file(s) you wish to change within the new branches and make revisions as required. 115 | 4. Commit all changed files within the appropriate branches. 116 | 5. Create individual pull requests from each of your changed branches 117 | to the `gh-pages` branch within the originating repository. 118 | 6. If you receive feedback, make changes using your issue-specific branches of the forked 119 | repository and the pull requests will update automatically. 120 | 7. Repeat as needed until all feedback has been addressed. 121 | 122 | When starting work, please make sure your clone of the originating `gh-pages` branch is up-to-date 123 | before creating your own revision-specific branch(es) from there. 124 | Additionally, please only work from your newly-created branch(es) and *not* 125 | your clone of the originating `gh-pages` branch. 126 | Lastly, published copies of all the lessons are available in the `gh-pages` branch of the originating 127 | repository for reference while revising. 128 | 129 | ## Other Resources 130 | 131 | General discussion of [Software Carpentry][swc-site] and [Data Carpentry][dc-site] 132 | happens on the [discussion mailing list][discuss-list], 133 | which everyone is welcome to join. 134 | You can also [reach us by email][email]. 135 | 136 | [email]: mailto:admin@software-carpentry.org 137 | [dc-issues]: https://github.com/issues?q=user%3Adatacarpentry 138 | [dc-lessons]: http://datacarpentry.org/lessons/ 139 | [dc-site]: http://datacarpentry.org/ 140 | [discuss-list]: http://lists.software-carpentry.org/listinfo/discuss 141 | [github]: https://github.com 142 | [github-flow]: https://guides.github.com/introduction/flow/ 143 | [github-join]: https://github.com/join 144 | [how-contribute]: https://egghead.io/series/how-to-contribute-to-an-open-source-project-on-github 145 | [issues]: https://guides.github.com/features/issues/ 146 | [swc-issues]: https://github.com/issues?q=user%3Aswcarpentry 147 | [swc-lessons]: https://software-carpentry.org/lessons/ 148 | [swc-site]: https://software-carpentry.org/ 149 | [c-site]: https://carpentries.org/ 150 | [lc-site]: https://librarycarpentry.org/ 151 | [lc-issues]: https://github.com/issues?q=user%3Alibrarycarpentry 152 | -------------------------------------------------------------------------------- /bin/boilerplate/README.md: -------------------------------------------------------------------------------- 1 | # FIXME Lesson title 2 | 3 | [![Create a Slack Account with us](https://img.shields.io/badge/Create_Slack_Account-The_Carpentries-071159.svg)](https://swc-slack-invite.herokuapp.com/) 4 | 5 | This repository generates the corresponding lesson website from [The Carpentries](https://carpentries.org/) repertoire of lessons. 6 | 7 | ## Contributing 8 | 9 | We welcome all contributions to improve the lesson! Maintainers will do their best to help you if you have any 10 | questions, concerns, or experience any difficulties along the way. 11 | 12 | We'd like to ask you to familiarize yourself with our [Contribution Guide](CONTRIBUTING.md) and have a look at 13 | the [more detailed guidelines][lesson-example] on proper formatting, ways to render the lesson locally, and even 14 | how to write new episodes. 15 | 16 | Please see the current list of [issues][FIXME] for ideas for contributing to this 17 | repository. For making your contribution, we use the GitHub flow, which is 18 | nicely explained in the chapter [Contributing to a Project](http://git-scm.com/book/en/v2/GitHub-Contributing-to-a-Project) in Pro Git 19 | by Scott Chacon. 20 | Look for the tag ![good_first_issue](https://img.shields.io/badge/-good%20first%20issue-gold.svg). This indicates that the mantainers will welcome a pull request fixing this issue. 21 | 22 | 23 | ## Maintainer(s) 24 | 25 | Current maintainers of this lesson are 26 | 27 | * FIXME 28 | * FIXME 29 | * FIXME 30 | 31 | 32 | ## Authors 33 | 34 | A list of contributors to the lesson can be found in [AUTHORS](AUTHORS) 35 | 36 | ## Citation 37 | 38 | To cite this lesson, please consult with [CITATION](CITATION) 39 | 40 | [lesson-example]: https://carpentries.github.io/lesson-example 41 | -------------------------------------------------------------------------------- /bin/boilerplate/_config.yml: -------------------------------------------------------------------------------- 1 | #------------------------------------------------------------ 2 | # Values for this lesson. 3 | #------------------------------------------------------------ 4 | 5 | # Which carpentry is this ("swc", "dc", "lc", or "cp")? 6 | # swc: Software Carpentry 7 | # dc: Data Carpentry 8 | # lc: Library Carpentry 9 | # cp: Carpentries (to use for instructor traning for instance) 10 | carpentry: "swc" 11 | 12 | # Overall title for pages. 13 | title: "Lesson Title" 14 | 15 | # Life cycle stage of the lesson 16 | # possible values: "pre-alpha", "alpha", "beta", "stable" 17 | life_cycle: "pre-alpha" 18 | 19 | #------------------------------------------------------------ 20 | # Generic settings (should not need to change). 21 | #------------------------------------------------------------ 22 | 23 | # What kind of thing is this ("workshop" or "lesson")? 24 | kind: "lesson" 25 | 26 | # Magic to make URLs resolve both locally and on GitHub. 27 | # See https://help.github.com/articles/repository-metadata-on-github-pages/. 28 | # Please don't change it: / is correct. 29 | repository: / 30 | 31 | # Email address, no mailto: 32 | email: "team@carpentries.org" 33 | 34 | # Sites. 35 | amy_site: "https://amy.software-carpentry.org/workshops" 36 | carpentries_github: "https://github.com/carpentries" 37 | carpentries_pages: "https://carpentries.github.io" 38 | carpentries_site: "https://carpentries.org/" 39 | dc_site: "http://datacarpentry.org" 40 | example_repo: "https://github.com/carpentries/lesson-example" 41 | example_site: "https://carpentries.github.io/lesson-example" 42 | lc_site: "https://librarycarpentry.org/" 43 | swc_github: "https://github.com/swcarpentry" 44 | swc_pages: "https://swcarpentry.github.io" 45 | swc_site: "https://software-carpentry.org" 46 | template_repo: "https://github.com/carpentries/styles" 47 | training_site: "https://carpentries.github.io/instructor-training" 48 | workshop_repo: "https://github.com/carpentries/workshop-template" 49 | workshop_site: "https://carpentries.github.io/workshop-template" 50 | cc_by_human: "https://creativecommons.org/licenses/by/4.0/" 51 | 52 | # Surveys. 53 | swc_pre_survey: "https://www.surveymonkey.com/r/swc_pre_workshop_v1?workshop_id=" 54 | swc_post_survey: "https://www.surveymonkey.com/r/swc_post_workshop_v1?workshop_id=" 55 | training_post_survey: "https://www.surveymonkey.com/r/post-instructor-training" 56 | dc_pre_survey: "https://www.surveymonkey.com/r/dcpreworkshopassessment?workshop_id=" 57 | dc_post_survey: "https://www.surveymonkey.com/r/dcpostworkshopassessment?workshop_id=" 58 | lc_pre_survey: "https://www.surveymonkey.com/r/lcpreworkshopsurvey?workshop_id=" 59 | lc_post_survey: "https://www.surveymonkey.com/r/lcpostworkshopsurvey?workshop_id=" 60 | instructor_pre_survey: "https://www.surveymonkey.com/r/instructor_training_pre_survey?workshop_id=" 61 | instructor_post_survey: "https://www.surveymonkey.com/r/instructor_training_post_survey?workshop_id=" 62 | 63 | 64 | # Start time in minutes (0 to be clock-independent, 540 to show a start at 09:00 am). 65 | start_time: 0 66 | 67 | # Specify that things in the episodes collection should be output. 68 | collections: 69 | episodes: 70 | output: true 71 | permalink: /:path/index.html 72 | extras: 73 | output: true 74 | permalink: /:path/index.html 75 | 76 | # Set the default layout for things in the episodes collection. 77 | defaults: 78 | - values: 79 | root: . 80 | layout: page 81 | - scope: 82 | path: "" 83 | type: episodes 84 | values: 85 | root: .. 86 | layout: episode 87 | - scope: 88 | path: "" 89 | type: extras 90 | values: 91 | root: .. 92 | layout: page 93 | 94 | # Files and directories that are not to be copied. 95 | exclude: 96 | - Makefile 97 | - bin/ 98 | - .Rproj.user/ 99 | 100 | # Turn on built-in syntax highlighting. 101 | highlighter: rouge 102 | -------------------------------------------------------------------------------- /bin/boilerplate/_episodes/01-introduction.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Introduction" 3 | teaching: 0 4 | exercises: 0 5 | questions: 6 | - "Key question (FIXME)" 7 | objectives: 8 | - "First learning objective. (FIXME)" 9 | keypoints: 10 | - "First key point. Brief Answer to questions. (FIXME)" 11 | --- 12 | FIXME 13 | 14 | {% include links.md %} 15 | 16 | -------------------------------------------------------------------------------- /bin/boilerplate/_extras/about.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: About 3 | --- 4 | {% include carpentries.html %} 5 | {% include links.md %} 6 | -------------------------------------------------------------------------------- /bin/boilerplate/_extras/discuss.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Discussion 3 | --- 4 | FIXME 5 | 6 | {% include links.md %} 7 | -------------------------------------------------------------------------------- /bin/boilerplate/_extras/figures.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Figures 3 | --- 4 | 5 | {% include base_path.html %} 6 | 7 | 61 | {% comment %} 62 | Create anchor for each one of the episodes. 63 | {% endcomment %} 64 | {% for episode in site.episodes %} 65 |
66 | {% endfor %} 67 | 68 | {% include links.md %} 69 | -------------------------------------------------------------------------------- /bin/boilerplate/_extras/guide.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Instructor Notes" 3 | --- 4 | FIXME 5 | 6 | {% include links.md %} 7 | -------------------------------------------------------------------------------- /bin/boilerplate/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: lesson 3 | root: . # Is the only page that doesn't follow the pattern /:path/index.html 4 | permalink: index.html # Is the only page that doesn't follow the pattern /:path/index.html 5 | --- 6 | FIXME: home page introduction 7 | 8 | 9 | 10 | {% comment %} This is a comment in Liquid {% endcomment %} 11 | 12 | > ## Prerequisites 13 | > 14 | > FIXME 15 | {: .prereq} 16 | 17 | {% include links.md %} 18 | -------------------------------------------------------------------------------- /bin/boilerplate/reference.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: reference 3 | --- 4 | 5 | ## Glossary 6 | 7 | FIXME 8 | 9 | {% include links.md %} 10 | -------------------------------------------------------------------------------- /bin/boilerplate/setup.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Setup 3 | --- 4 | FIXME 5 | 6 | 7 | {% include links.md %} 8 | -------------------------------------------------------------------------------- /bin/chunk-options.R: -------------------------------------------------------------------------------- 1 | # These settings control the behavior of all chunks in the novice R materials. 2 | # For example, to generate the lessons with all the output hidden, simply change 3 | # `results` from "markup" to "hide". 4 | # For more information on available chunk options, see 5 | # http://yihui.name/knitr/options#chunk_options 6 | 7 | library("knitr") 8 | 9 | fix_fig_path <- function(pth) file.path("..", pth) 10 | 11 | 12 | ## We set the path for the figures globally below, so if we want to 13 | ## customize it for individual episodes, we can append a prefix to the 14 | ## global path. For instance, if we call knitr_fig_path("01-") in the 15 | ## first episode of the lesson, it will generate the figures in 16 | ## `fig/rmd-01-` 17 | knitr_fig_path <- function(prefix) { 18 | new_path <- paste0(opts_chunk$get("fig.path"), 19 | prefix) 20 | opts_chunk$set(fig.path = new_path) 21 | } 22 | 23 | ## We use the rmd- prefix for the figures generated by the lessons so 24 | ## they can be easily identified and deleted by `make clean-rmd`. The 25 | ## working directory when the lessons are generated is the root so the 26 | ## figures need to be saved in fig/, but when the site is generated, 27 | ## the episodes will be one level down. We fix the path using the 28 | ## `fig.process` option. 29 | 30 | opts_chunk$set(tidy = FALSE, results = "markup", comment = NA, 31 | fig.align = "center", fig.path = "fig/rmd-", 32 | fig.process = fix_fig_path, 33 | fig.width = 8.5, fig.height = 8.5, 34 | fig.retina = 2) 35 | 36 | # The hooks below add html tags to the code chunks and their output so that they 37 | # are properly formatted when the site is built. 38 | 39 | hook_in <- function(x, options) { 40 | lg <- tolower(options$engine) 41 | style <- paste0(".language-", lg) 42 | 43 | stringr::str_c("\n\n~~~\n", 44 | paste0(x, collapse="\n"), 45 | "\n~~~\n{: ", style, "}\n\n") 46 | } 47 | 48 | hook_out <- function(x, options) { 49 | x <- gsub("\n$", "", x) 50 | stringr::str_c("\n\n~~~\n", 51 | paste0(x, collapse="\n"), 52 | "\n~~~\n{: .output}\n\n") 53 | } 54 | 55 | hook_error <- function(x, options) { 56 | x <- gsub("\n$", "", x) 57 | stringr::str_c("\n\n~~~\n", 58 | paste0(x, collapse="\n"), 59 | "\n~~~\n{: .error}\n\n") 60 | } 61 | 62 | knit_hooks$set(source = hook_in, output = hook_out, warning = hook_error, 63 | error = hook_error, message = hook_out) 64 | -------------------------------------------------------------------------------- /bin/generate_md_episodes.R: -------------------------------------------------------------------------------- 1 | generate_md_episodes <- function() { 2 | 3 | library("methods") 4 | 5 | if (!require("remotes", quietly = TRUE)) { 6 | install.packages("remotes", repos = c(CRAN = "https://cloud.r-project.org/")) 7 | } 8 | 9 | if (!require("requirements", quietly = TRUE)) { 10 | remotes::install_github("hadley/requirements") 11 | } 12 | 13 | required_pkgs <- unique(c( 14 | ## Packages for episodes 15 | requirements:::req_dir("_episodes_rmd"), 16 | ## Pacakges for tools 17 | requirements:::req_dir("bin") 18 | )) 19 | 20 | missing_pkgs <- setdiff(required_pkgs, rownames(installed.packages())) 21 | 22 | if (length(missing_pkgs)) { 23 | message("Installing missing required packages: ", 24 | paste(missing_pkgs, collapse=", ")) 25 | install.packages(missing_pkgs) 26 | } 27 | 28 | if (require("knitr") && packageVersion("knitr") < '1.9.19') 29 | stop("knitr must be version 1.9.20 or higher") 30 | 31 | ## get the Rmd file to process from the command line, and generate the path for their respective outputs 32 | args <- commandArgs(trailingOnly = TRUE) 33 | if (!identical(length(args), 2L)) { 34 | stop("input and output file must be passed to the script") 35 | } 36 | 37 | src_rmd <- args[1] 38 | dest_md <- args[2] 39 | 40 | ## knit the Rmd into markdown 41 | knitr::knit(src_rmd, output = dest_md) 42 | 43 | # Read the generated md files and add comments advising not to edit them 44 | vapply(dest_md, function(y) { 45 | con <- file(y) 46 | mdfile <- readLines(con) 47 | if (mdfile[1] != "---") 48 | stop("Input file does not have a valid header") 49 | mdfile <- append(mdfile, "# Please do not edit this file directly; it is auto generated.", after = 1) 50 | mdfile <- append(mdfile, paste("# Instead, please edit", 51 | basename(y), "in _episodes_rmd/"), after = 2) 52 | writeLines(mdfile, con) 53 | close(con) 54 | return(paste("Warning added to YAML header of", y)) 55 | }, 56 | character(1)) 57 | } 58 | 59 | generate_md_episodes() 60 | -------------------------------------------------------------------------------- /bin/knit_lessons.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Only try running R to translate files if there are some files present. 4 | # The Makefile passes in the names of files. 5 | 6 | if [ $# -eq 2 ] ; then 7 | Rscript -e "source('bin/generate_md_episodes.R')" "$@" 8 | fi 9 | -------------------------------------------------------------------------------- /bin/lesson_initialize.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | """Initialize a newly-created repository.""" 4 | 5 | 6 | import sys 7 | import os 8 | import shutil 9 | 10 | BOILERPLATE = ( 11 | '.travis.yml', 12 | 'AUTHORS', 13 | 'CITATION', 14 | 'CONTRIBUTING.md', 15 | 'README.md', 16 | '_config.yml', 17 | '_episodes/01-introduction.md', 18 | '_extras/about.md', 19 | '_extras/discuss.md', 20 | '_extras/figures.md', 21 | '_extras/guide.md', 22 | 'index.md', 23 | 'reference.md', 24 | 'setup.md', 25 | ) 26 | 27 | 28 | def main(): 29 | """Check for collisions, then create.""" 30 | 31 | # Check. 32 | errors = False 33 | for path in BOILERPLATE: 34 | if os.path.exists(path): 35 | print('Warning: {0} already exists.'.format(path), file=sys.stderr) 36 | errors = True 37 | if errors: 38 | print('**Exiting without creating files.**', file=sys.stderr) 39 | sys.exit(1) 40 | 41 | # Create. 42 | for path in BOILERPLATE: 43 | shutil.copyfile( 44 | "bin/boilerplate/{}".format(path), 45 | path 46 | ) 47 | 48 | 49 | if __name__ == '__main__': 50 | main() 51 | -------------------------------------------------------------------------------- /bin/markdown_ast.rb: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | # Use Kramdown parser to produce AST for Markdown document. 4 | 5 | require "kramdown" 6 | require "json" 7 | 8 | markdown = STDIN.read() 9 | doc = Kramdown::Document.new(markdown) 10 | tree = doc.to_hash_a_s_t 11 | puts JSON.pretty_generate(tree) 12 | -------------------------------------------------------------------------------- /bin/repo_check.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | """ 4 | Check repository settings. 5 | """ 6 | 7 | 8 | import sys 9 | import os 10 | from subprocess import Popen, PIPE 11 | import re 12 | from argparse import ArgumentParser 13 | 14 | from util import Reporter, require 15 | 16 | # Import this way to produce a more useful error message. 17 | try: 18 | import requests 19 | except ImportError: 20 | print('Unable to import requests module: please install requests', file=sys.stderr) 21 | sys.exit(1) 22 | 23 | 24 | # Pattern to match Git command-line output for remotes => (user name, project name). 25 | P_GIT_REMOTE = re.compile(r'upstream\s+[^:]+:([^/]+)/([^.]+)\.git\s+\(fetch\)') 26 | 27 | # Repository URL format string. 28 | F_REPO_URL = 'https://github.com/{0}/{1}/' 29 | 30 | # Pattern to match repository URLs => (user name, project name) 31 | P_REPO_URL = re.compile(r'https?://github\.com/([^.]+)/([^/]+)/?') 32 | 33 | # API URL format string. 34 | F_API_URL = 'https://api.github.com/repos/{0}/{1}/labels' 35 | 36 | # Expected labels and colors. 37 | EXPECTED = { 38 | 'help wanted': 'dcecc7', 39 | 'status:in progress': '9bcc65', 40 | 'status:changes requested': '679f38', 41 | 'status:wait': 'fff2df', 42 | 'status:refer to cac': 'ffdfb2', 43 | 'status:need more info': 'ee6c00', 44 | 'status:blocked': 'e55100', 45 | 'status:out of scope': 'eeeeee', 46 | 'status:duplicate': 'bdbdbd', 47 | 'type:typo text': 'f8bad0', 48 | 'type:bug': 'eb3f79', 49 | 'type:formatting': 'ac1357', 50 | 'type:template and tools': '7985cb', 51 | 'type:instructor guide': '00887a', 52 | 'type:discussion': 'b2e5fc', 53 | 'type:enhancement': '7fdeea', 54 | 'type:clarification': '00acc0', 55 | 'type:teaching example': 'ced8dc', 56 | 'good first issue': 'ffeb3a', 57 | 'high priority': 'd22e2e' 58 | } 59 | 60 | 61 | def main(): 62 | """ 63 | Main driver. 64 | """ 65 | 66 | args = parse_args() 67 | reporter = Reporter() 68 | repo_url = get_repo_url(args.repo_url) 69 | check_labels(reporter, repo_url) 70 | reporter.report() 71 | 72 | 73 | def parse_args(): 74 | """ 75 | Parse command-line arguments. 76 | """ 77 | 78 | parser = ArgumentParser(description="""Check repository settings.""") 79 | parser.add_argument('-r', '--repo', 80 | default=None, 81 | dest='repo_url', 82 | help='repository URL') 83 | parser.add_argument('-s', '--source', 84 | default=os.curdir, 85 | dest='source_dir', 86 | help='source directory') 87 | 88 | args, extras = parser.parse_known_args() 89 | require(not extras, 90 | 'Unexpected trailing command-line arguments "{0}"'.format(extras)) 91 | 92 | return args 93 | 94 | 95 | def get_repo_url(repo_url): 96 | """ 97 | Figure out which repository to query. 98 | """ 99 | 100 | # Explicitly specified. 101 | if repo_url is not None: 102 | return repo_url 103 | 104 | # Guess. 105 | cmd = 'git remote -v' 106 | p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, 107 | close_fds=True, universal_newlines=True) 108 | stdout_data, stderr_data = p.communicate() 109 | stdout_data = stdout_data.split('\n') 110 | matches = [P_GIT_REMOTE.match(line) for line in stdout_data] 111 | matches = [m for m in matches if m is not None] 112 | require(len(matches) == 1, 113 | 'Unexpected output from git remote command: "{0}"'.format(matches)) 114 | 115 | username = matches[0].group(1) 116 | require( 117 | username, 'empty username in git remote output {0}'.format(matches[0])) 118 | 119 | project_name = matches[0].group(2) 120 | require( 121 | username, 'empty project name in git remote output {0}'.format(matches[0])) 122 | 123 | url = F_REPO_URL.format(username, project_name) 124 | return url 125 | 126 | 127 | def check_labels(reporter, repo_url): 128 | """ 129 | Check labels in repository. 130 | """ 131 | 132 | actual = get_labels(repo_url) 133 | extra = set(actual.keys()) - set(EXPECTED.keys()) 134 | 135 | reporter.check(not extra, 136 | None, 137 | 'Extra label(s) in repository {0}: {1}', 138 | repo_url, ', '.join(sorted(extra))) 139 | 140 | missing = set(EXPECTED.keys()) - set(actual.keys()) 141 | reporter.check(not missing, 142 | None, 143 | 'Missing label(s) in repository {0}: {1}', 144 | repo_url, ', '.join(sorted(missing))) 145 | 146 | overlap = set(EXPECTED.keys()).intersection(set(actual.keys())) 147 | for name in sorted(overlap): 148 | reporter.check(EXPECTED[name].lower() == actual[name].lower(), 149 | None, 150 | 'Color mis-match for label {0} in {1}: expected {2}, found {3}', 151 | name, repo_url, EXPECTED[name], actual[name]) 152 | 153 | 154 | def get_labels(repo_url): 155 | """ 156 | Get actual labels from repository. 157 | """ 158 | 159 | m = P_REPO_URL.match(repo_url) 160 | require( 161 | m, 'repository URL {0} does not match expected pattern'.format(repo_url)) 162 | 163 | username = m.group(1) 164 | require(username, 'empty username in repository URL {0}'.format(repo_url)) 165 | 166 | project_name = m.group(2) 167 | require( 168 | username, 'empty project name in repository URL {0}'.format(repo_url)) 169 | 170 | url = F_API_URL.format(username, project_name) 171 | r = requests.get(url) 172 | require(r.status_code == 200, 173 | 'Request for {0} failed with {1}'.format(url, r.status_code)) 174 | 175 | result = {} 176 | for entry in r.json(): 177 | result[entry['name']] = entry['color'] 178 | return result 179 | 180 | 181 | if __name__ == '__main__': 182 | main() 183 | -------------------------------------------------------------------------------- /bin/test_lesson_check.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import unittest 4 | 5 | import lesson_check 6 | import util 7 | 8 | 9 | class TestFileList(unittest.TestCase): 10 | def setUp(self): 11 | self.reporter = util.Reporter() # TODO: refactor reporter class. 12 | 13 | def test_file_list_has_expected_entries(self): 14 | # For first pass, simply assume that all required files are present 15 | all_filenames = [filename.replace('%', '') 16 | for filename in lesson_check.REQUIRED_FILES] 17 | 18 | lesson_check.check_fileset('', self.reporter, all_filenames) 19 | self.assertEqual(len(self.reporter.messages), 0) 20 | 21 | 22 | if __name__ == "__main__": 23 | unittest.main() 24 | -------------------------------------------------------------------------------- /bin/util.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import os 3 | import json 4 | from subprocess import Popen, PIPE 5 | 6 | # Import this way to produce a more useful error message. 7 | try: 8 | import yaml 9 | except ImportError: 10 | print('Unable to import YAML module: please install PyYAML', file=sys.stderr) 11 | sys.exit(1) 12 | 13 | 14 | # Things an image file's name can end with. 15 | IMAGE_FILE_SUFFIX = { 16 | '.gif', 17 | '.jpg', 18 | '.png', 19 | '.svg' 20 | } 21 | 22 | # Files that shouldn't be present. 23 | UNWANTED_FILES = [ 24 | '.nojekyll' 25 | ] 26 | 27 | # Marker to show that an expected value hasn't been provided. 28 | # (Can't use 'None' because that might be a legitimate value.) 29 | REPORTER_NOT_SET = [] 30 | 31 | 32 | class Reporter: 33 | """Collect and report errors.""" 34 | 35 | def __init__(self): 36 | """Constructor.""" 37 | self.messages = [] 38 | 39 | def check_field(self, filename, name, values, key, expected=REPORTER_NOT_SET): 40 | """Check that a dictionary has an expected value.""" 41 | 42 | if key not in values: 43 | self.add(filename, '{0} does not contain {1}', name, key) 44 | elif expected is REPORTER_NOT_SET: 45 | pass 46 | elif type(expected) in (tuple, set, list): 47 | if values[key] not in expected: 48 | self.add( 49 | filename, '{0} {1} value {2} is not in {3}', name, key, values[key], expected) 50 | elif values[key] != expected: 51 | self.add(filename, '{0} {1} is {2} not {3}', 52 | name, key, values[key], expected) 53 | 54 | def check(self, condition, location, fmt, *args): 55 | """Append error if condition not met.""" 56 | 57 | if not condition: 58 | self.add(location, fmt, *args) 59 | 60 | def add(self, location, fmt, *args): 61 | """Append error unilaterally.""" 62 | 63 | self.messages.append((location, fmt.format(*args))) 64 | 65 | @staticmethod 66 | def pretty(item): 67 | location, message = item 68 | if isinstance(location, type(None)): 69 | return message 70 | elif isinstance(location, str): 71 | return location + ': ' + message 72 | elif isinstance(location, tuple): 73 | return '{0}:{1}: '.format(*location) + message 74 | 75 | print('Unknown item "{0}"'.format(item), file=sys.stderr) 76 | return NotImplemented 77 | 78 | @staticmethod 79 | def key(item): 80 | location, message = item 81 | if isinstance(location, type(None)): 82 | return ('', -1, message) 83 | elif isinstance(location, str): 84 | return (location, -1, message) 85 | elif isinstance(location, tuple): 86 | return (location[0], location[1], message) 87 | 88 | print('Unknown item "{0}"'.format(item), file=sys.stderr) 89 | return NotImplemented 90 | 91 | def report(self, stream=sys.stdout): 92 | """Report all messages in order.""" 93 | 94 | if not self.messages: 95 | return 96 | 97 | for m in sorted(self.messages, key=self.key): 98 | print(self.pretty(m), file=stream) 99 | 100 | 101 | def read_markdown(parser, path): 102 | """ 103 | Get YAML and AST for Markdown file, returning 104 | {'metadata':yaml, 'metadata_len':N, 'text':text, 'lines':[(i, line, len)], 'doc':doc}. 105 | """ 106 | 107 | # Split and extract YAML (if present). 108 | with open(path, 'r') as reader: 109 | body = reader.read() 110 | metadata_raw, metadata_yaml, body = split_metadata(path, body) 111 | 112 | # Split into lines. 113 | metadata_len = 0 if metadata_raw is None else metadata_raw.count('\n') 114 | lines = [(metadata_len+i+1, line, len(line)) 115 | for (i, line) in enumerate(body.split('\n'))] 116 | 117 | # Parse Markdown. 118 | cmd = 'ruby {0}'.format(parser) 119 | p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, 120 | close_fds=True, universal_newlines=True) 121 | stdout_data, stderr_data = p.communicate(body) 122 | doc = json.loads(stdout_data) 123 | 124 | return { 125 | 'metadata': metadata_yaml, 126 | 'metadata_len': metadata_len, 127 | 'text': body, 128 | 'lines': lines, 129 | 'doc': doc 130 | } 131 | 132 | 133 | def split_metadata(path, text): 134 | """ 135 | Get raw (text) metadata, metadata as YAML, and rest of body. 136 | If no metadata, return (None, None, body). 137 | """ 138 | 139 | metadata_raw = None 140 | metadata_yaml = None 141 | 142 | pieces = text.split('---', 2) 143 | if len(pieces) == 3: 144 | metadata_raw = pieces[1] 145 | text = pieces[2] 146 | try: 147 | metadata_yaml = yaml.load(metadata_raw, Loader=yaml.FullLoader) 148 | except yaml.YAMLError as e: 149 | print('Unable to parse YAML header in {0}:\n{1}'.format( 150 | path, e), file=sys.stderr) 151 | sys.exit(1) 152 | 153 | return metadata_raw, metadata_yaml, text 154 | 155 | 156 | def load_yaml(filename): 157 | """ 158 | Wrapper around YAML loading so that 'import yaml' is only needed 159 | in one file. 160 | """ 161 | 162 | try: 163 | with open(filename, 'r') as reader: 164 | return yaml.load(reader, Loader=yaml.FullLoader) 165 | except (yaml.YAMLError, IOError) as e: 166 | print('Unable to load YAML file {0}:\n{1}'.format( 167 | filename, e), file=sys.stderr) 168 | sys.exit(1) 169 | 170 | 171 | def check_unwanted_files(dir_path, reporter): 172 | """ 173 | Check that unwanted files are not present. 174 | """ 175 | 176 | for filename in UNWANTED_FILES: 177 | path = os.path.join(dir_path, filename) 178 | reporter.check(not os.path.exists(path), 179 | path, 180 | "Unwanted file found") 181 | 182 | 183 | def require(condition, message): 184 | """Fail if condition not met.""" 185 | 186 | if not condition: 187 | print(message, file=sys.stderr) 188 | sys.exit(1) 189 | -------------------------------------------------------------------------------- /code/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/code/.gitkeep -------------------------------------------------------------------------------- /data/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/data/.gitkeep -------------------------------------------------------------------------------- /data/data.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/data/data.zip -------------------------------------------------------------------------------- /data/mdout.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/data/mdout.zip -------------------------------------------------------------------------------- /fig/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/fig/.gitkeep -------------------------------------------------------------------------------- /fig/episode09_fig1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/fig/episode09_fig1.png -------------------------------------------------------------------------------- /fig/lesson01_fig1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/fig/lesson01_fig1.png -------------------------------------------------------------------------------- /fig/lesson01_fig2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/fig/lesson01_fig2.png -------------------------------------------------------------------------------- /fig/plotting_allsamples.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/fig/plotting_allsamples.png -------------------------------------------------------------------------------- /fig/plotting_every100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/fig/plotting_every100.png -------------------------------------------------------------------------------- /fig/plotting_every100challenge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/fig/plotting_every100challenge.png -------------------------------------------------------------------------------- /fig/plotting_every100combined.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/fig/plotting_every100combined.png -------------------------------------------------------------------------------- /fig/plotting_every100dashed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/fig/plotting_every100dashed.png -------------------------------------------------------------------------------- /fig/plotting_every100marker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/fig/plotting_every100marker.png -------------------------------------------------------------------------------- /fig/plotting_firstplot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/fig/plotting_firstplot.png -------------------------------------------------------------------------------- /fig/plotting_labeled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/fig/plotting_labeled.png -------------------------------------------------------------------------------- /fig/plotting_twosamples.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/fig/plotting_twosamples.png -------------------------------------------------------------------------------- /fig/setup_fig1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/fig/setup_fig1.png -------------------------------------------------------------------------------- /fig/subplots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/fig/subplots.png -------------------------------------------------------------------------------- /files/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MolSSI-Education/python_scripting_cms/ec845b4c5a658b1e7bb917c2b1666de183f75868/files/.gitkeep -------------------------------------------------------------------------------- /index.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: lesson 3 | root: . # Is the only page that doesn't follow the pattern /:path/index.html 4 | permalink: index.html # Is the only page that doesn't follow the pattern /:path/index.html 5 | --- 6 | This lesson by the [Molecular Sciences Software Institute]({{ site.molssi_site }}) (MolSSI) teaches users fundamentals of scientific programming used in computational molecular sciences. The material is designed for undergraduate students, or other early career students, who have no prior programming experience. 7 | To see the full MolSSI's education mission statement, please see 8 | [here](http://molssi.org/education/education-mission-statement/). 9 | 10 | **This lesson is under development, please report issues to the [GitHub 11 | repository](https://github.com/MolSSI-Education/undergrad_workshop)** 12 | 13 | > ## Prerequisites 14 | > 15 | > Students should be familiar with opening the Terminal window and creating and navigating files in bash. 16 | {: .prereq} 17 | 18 | {% include links.md %} 19 | -------------------------------------------------------------------------------- /paper.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: '' 3 | tags: 4 | - Python 5 | - introduction 6 | - molecular dynamics 7 | - computational chemistry 8 | authors: 9 | - name: Ashley Ringer McDonald 10 | orcid: 11 | affiliation: "1, 2" # (Multiple affiliations must be quoted) 12 | - name: Jessica A. Nash 13 | orcid: 0000-0003-1967-5094 14 | affiliation: 1 15 | affiliations: 16 | - name: California Polytechnic State University 17 | index: 1 18 | - name: The Molecular Sciences Software Institute 19 | index: 2 20 | date: 20 November 2019 21 | bibliography: paper.bib 22 | --- 23 | 24 | ## Summary 25 | 26 | Computational molecular science is a field which encompasses a number of disciplines including computational chemistry, physics, materials science, and chemical engineering. In order for students to successfully contribute to this field, they must not only build understanding of theoretical aspects of their research, they must also have relevant computer skills including use of the terminal and scripting and programming. We have prepared this module focusing on introducing students to Python programming using Anaconda and the Jupyter notebook, with applications relevant to computational molecular sciences. The workshop teaches practical skills that enable a student to immediately participate in meaningful research. The materials can be presented in a live 1-2 day workshop, or students can work through the lessons online, at their own pace. The target audience for the materials are undergraduate or other early career students who have limited prior programming experience, and are designed to be accessible to those with no programming experience. 27 | 28 | The workshop begins by introducing basic python programming syntax and control structures using chemically motivated examples. It discusses techniques for extracting data from files and working with multiple data files, using electronic structure output files as an example. Analyzing tabular data, using the `NumPy` library, and plotting using the `Matplotlib` library are introduced using molecular dynamics data. 29 | 30 | Central to the design of this workshop is the assignment of project. In an in-person workshop, this is given as a homework assignment to the students to attempt between the first and second day. For this project, students must apply the skills which have been covered in the first part of the workshop to parse an `xyz` file (a common file format in computational molecular science giving the cartesian coordinates of atoms) and measure the distances between atoms. 31 | 32 | After these basics, the workshop introduces the concept of functions and writing function documentation. The students refactor their geometry analysis code with functions, and learn how to create a command line script. An introduction to unit testing, and collaboration with git and GitHub is presented. All concepts presented in this workshop slowly build on one another to help students master basic concepts. 33 | 34 | This workshop was developed by the Molecular Sciences Software Institute (MolSSI), as part of its mission to enhance software, education, and training in the computational molecular sciences. MolSSI works to improve software practices in CMS, and this workshop gives a light introduction to several topics we advocate as best practices (version control, testing, and documentation). MolSSI's educational mission builds on and uses strategies from the work of Software Carpentry and Data Carpentry. 35 | 36 | ## Statement of Need 37 | Within chemistry, and many other fields related to CMS, the amount of structured programming training students receive as part of their undergraduate education varies widely. Students may have a stand-alone programming course or no instruction at all. Further, most chemists, even computational chemists who use programming regularly in their research, are rarely trained on teaching programming and often lack resources to provide students this type of training. Thus, most programming training for chemists is ad-hoc, through interactions with mentors and research advisors, or self-taught by learning what they need to know to solve problems in research. The Molecular Sciences Software Institute aims to address this problem by providing resources, training, and workshops to teach students best practices in software development. This workshops introduces basics concepts related to Python program to provide a foundation for software best practices advocated by MolSSI for larger software projects. 38 | 39 | ## Learning Objectives and Contents 40 | 41 | ### Python Basics for Computational Molecular Science 42 | 43 | - **Introduction** This lesson introduces basic python programming syntax and control structures like assigning variables, arrays, for loops, and logic. Data types and recasting are discussed. 44 | 45 | - **File Parsing and Multiple File Parsing** These two lessons focus on extracting data from complex text-based output files. Students learn to read in information from text files and output information to text files. Print formatting is discussed. 46 | 47 | - **Working with Tabular Data** This lesson introduces the `NumPy` library. Students learn to read in data from comma separated value (csv) files and organize data in `NumPy` arrays. A project is given at the end of this lesson where the students must apply concepts from the introduction and file parsing lessons. 48 | 49 | - **Plotting and Data Visualization** This lesson introduces the `Matplotlib` library. Students learn to create, modify, and save plots. 50 | 51 | - **Writing Functions** - This lesson introduces functions, and why they are useful in programming. Students practice by reformatting their geometry analysis project to contain functions. 52 | 53 | - **Running code from the Command Line** - This lessons covers moving from the Jupyter notebook to a text editor and running a python script from the command line. Students are taught how to take user input from the command line using the `argparse` module. 54 | 55 | - **Testing Code with pytest** - This lesson gives a very light introduction and unit testing using the `pytest` framework. 56 | 57 | - **Version Control and Sharing Code** - This lesson gives an overview of version control using git and hosting code on GitHub. 58 | 59 | ## Sample Teaching Schedule 60 | 61 | ### 1.5 Day Workshop 62 | 63 | #### Day 1 64 | 65 | | Time | Topic | 66 | |-------------------|---------------------------------------| 67 | 11:00 am - 12:00 pm | Help with computer set-up (optional) 68 | 1:00 pm - 2:00 pm | Introduction 69 | 2:00 pm - 2:45 pm | File parsing 70 | 2:45 pm - 3:00 pm | Break 71 | 3:00 pm - 3:45 pm | Multiple File Parsing 72 | 3:45 pm - 4:45 pm | Working with Tabular Data 73 | 4:45 pm - 5:00 pm | Introduce homework assignment 74 | 75 | #### Day 2 76 | | Time | Topic | 77 | |-------------------|---------------------------------------| 78 | 9:00 am - 9:45 am | Homework Solution 79 | 9:45 am - 10:45 am | Plotting and Data Visualization 80 | 10:45 am - 11:00 am | Break 81 | 11:00 am - 12:00 pm | Writing Functions 82 | 12:00 pm - 1:00 pm | Lunch 83 | 1:00 pm - 2:00 pm | Moving to the command line 84 | 2:00 pm - 3:00 pm | Testing with pytest 85 | 3:00 pm - 3:15 pm | Coffee Break 86 | 3:15 pm - 4:30 pm | Version control and sharing code 87 | 4:30 pm - 5:00 pm | Questions and Feedback 88 | 89 | ## Future Work 90 | 91 | ## Acknowledgements 92 | This work was supported by The Molecular Sciences Software Institute under NSF grant ACI-1547580. 93 | 94 | ## References 95 | -------------------------------------------------------------------------------- /reference.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: reference 3 | --- 4 | 5 | ## Glossary 6 | 7 | FIXME 8 | 9 | {% include links.md %} 10 | -------------------------------------------------------------------------------- /setup.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Setup 3 | --- 4 | ## Installing Python through Anaconda 5 | [Python](https://python.org/) is a popular language for scientific computing, and great for general-purpose programming as well. Installing all of its scientific packages individually can be a bit difficult, however, so we recommend the all-in-one installer Anaconda. 6 | 7 | 1. Navigate to the [download page](https://www.anaconda.com/products/individual) for Anaconda. 8 | 2. Download the appropriate installer for your operating system. **Make sure you get the installer listed under Python 3** (not 2.7). 9 | 3. Double click the installer icon and follow the set-up instructions, keeping most of the default options. If you are Windows, make sure to choose to choose the option **Make Anaconda the default Python** during installation. 10 | 11 | ## Installing a Text Editor 12 | 13 | You will need a text editor for this workshop. If you do not have a preferred text editor for writing code, we recommend [Visual Studio Code]([https://atom.io](https://code.visualstudio.com/)). Download Atom at the link and install on your computer. 14 | 15 | ## Obtain lesson materials 16 | 1. Download the files needed for these lessons [here](./data/data.zip) 17 | 2. Create a folder called `cms-workshop` on your Desktop. 18 | 3. Move the downloaded materials to the new folder. 19 | 4. Unzip the file. 20 | 21 | ## Start a Jupyter notebook 22 | From Finder or Spotlight (Mac OS) or the Start Menu (Windows) find the Anaconda Navigator. The icon looks like a green circle. Click Launch under Jupyter Notebook. It may take a few seconds to load the page, especially if it is the first time you have ever used the jupyter notebook, so don't panic if nothing loads for a few seconds. Then a new window should open in your default internet browser. Use the file navigation window to navigate to `Desktop` and then to the `cms-workshop` folder. In the upper right hand corner, click New, then choose Python 3 from the dropdown list (shown below) 23 | 24 | 25 | 26 | This will start a new Jupyter notebook using Python 3. You're ready to go! 27 | 28 | 29 | {% include links.md %} 30 | --------------------------------------------------------------------------------