diff --git a/.github/workflows/cgatapps_python.yml b/.github/workflows/cgatapps_python.yml index 115bc011b..44dde74b3 100644 --- a/.github/workflows/cgatapps_python.yml +++ b/.github/workflows/cgatapps_python.yml @@ -47,3 +47,4 @@ jobs: pip install nose nosetests -v tests/test_style.py nosetests -v tests/test_scripts.py + nosetests -v tests/test_import.py \ No newline at end of file diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 000000000..e41dd8d21 --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,73 @@ +name: Publish cgat-apps wheels to PyPI and TestPyPI + +on: + push: + branches: + - v[0-9]+.[0-9]+.x + tags: + - v* + release: + types: + - published + +jobs: + + build_sdist: + + runs-on: ${{ matrix.os }}-latest + strategy: + matrix: + os: [ubuntu, macos] + python-version: [3.10] + + steps: + - name: Checkout cgat-apps + uses: actions/checkout@v2 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + + - name: Install prerequisite Python libraries + run: | + python -m pip install --upgrade pip + pip install wheel + + - name: Create source distribution + run: python setup.py sdist bdist_wheel + + - uses: actions/upload-artifact@v2 + with: + path: dist/*.tar.gz + + - uses: actions/upload-artifact@v2 + with: + path: dist/*.whl + + upload_pypi: + + needs: [build_sdist] + runs-on: ubuntu-latest + + steps: + - name: Get Artifacts + uses: actions/download-artifact@v2 + with: + name: artifact + path: dist + + - name: Publish distribution to Test PyPI + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') + uses: pypa/gh-action-pypi-publish@master + with: + user: __token__ + password: ${{ secrets.TEST_PYPI_API_TOKEN }} + repository_url: https://test.pypi.org/legacy/ + + - name: Publish distribution to PyPI + if: github.event_name == 'release' && github.event.action == 'published' + uses: pypa/gh-action-pypi-publish@master + with: + password: ${{ secrets.PYPI_API_TOKEN }} + diff --git a/COPYING b/COPYING deleted file mode 100644 index e38022ec0..000000000 --- a/COPYING +++ /dev/null @@ -1,25 +0,0 @@ -Copyright 2010-2011 The Medical Research Council (MRC). All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE MRC ``AS IS'' AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE MRC OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER -IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - diff --git a/PKG-INFO b/PKG-INFO deleted file mode 100644 index 583ea0cc1..000000000 --- a/PKG-INFO +++ /dev/null @@ -1,22 +0,0 @@ -Metadata-Version: 1.1 -Name: SphinxReport -Version: 2.0 -Summary: SphinxReport : a report generator in python based on Sphinx and matplotlib -Home-page: http://code.google.com/p/sphinx-report/ -Author: Andreas Heger -Author-email: andreas.heger@gmail.com -License: BSD -Description: SphinxReport : a report generator in python based on Sphinx and matplotlib -Keywords: report generator sphinx matplotlib sql -Platform: any -Classifier: Development Status :: 3 - Alpha -Classifier: Intended Audience :: Science/Research -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved -Classifier: Programming Language :: Python -Classifier: Topic :: Software Development -Classifier: Topic :: Scientific/Engineering -Classifier: Operating System :: Microsoft :: Windows -Classifier: Operating System :: POSIX -Classifier: Operating System :: Unix -Classifier: Operating System :: MacOS diff --git a/cgat/AGP.py b/cgat/AGP.py index 305b1b16b..809b3366a 100644 --- a/cgat/AGP.py +++ b/cgat/AGP.py @@ -9,7 +9,22 @@ """ +import functools + +def deprecated_class(cls): + orig_init = cls.__init__ + + @functools.wraps(orig_init) + def new_init(self, *args, **kwargs): + warnings.warn(f"{cls.__name__} is deprecated and will be removed in the next release.", DeprecationWarning) + orig_init(self, *args, **kwargs) + + cls.__init__ = new_init + return cls + + +@deprecated_class class ObjectPosition(object): def map(self, start, end): @@ -19,6 +34,7 @@ def map(self, start, end): return end + self.start, start + self.start +@deprecated_class class AGP(object): """Parser for AGP formatted files.""" diff --git a/cgat/CBioPortal.py b/cgat/CBioPortal.py deleted file mode 100644 index f85f47115..000000000 --- a/cgat/CBioPortal.py +++ /dev/null @@ -1,1038 +0,0 @@ -'''CBioPortal.py - Interface with the Sloan-Kettering cBioPortal webservice -======================================================================== - -The Sloan Kettering cBioPortal webservice provides access to a -database of results of genomics experiments on various cancers. The -database is organised into studies, each study contains a number of -case lists, where each list contains the ids of a set of patients, and -genetic profiles, each of which represents an assay conducted on the -patients in the case list as part of the study. - -The main class here is the CBioPortal class representing a connection -to the cBioPortal Database. Query's are represented as methods of the -class. Study ids or names or case lists can be provided to the -constructor to the object, via the setDefaultStudy and -setDefaultCaseList methods or to the indevidual query methods. Where -ever possible the validity of parameters is checked *before* the query -is executed. - -Whenever a query requires a genetic profile id or a list of such ids, -but none are given, the list of all profiles for which the -show_in_analysis flag is set will be used. - -All of the commands provided in the webservice are implemented here -and as far as possible the name, syntax and paramter names of the -query are identical to the raw commands to the webservice. These -queries are: - -* getCancerStudies, -* getCaseLists, -* getProfileData, -* getMutationData, -* getClinicalData, -* getProteinArrayInfo, -* getProteinArrayData, -* getLink, -* getOncoprintHTML. - -In addition two new queries are implememented that are not part of the -webservice: - -* getPercentAltered and -* getTotalAltered - -These emulate the function of the website where the percent of cases -that show any alteration for the gene and profiles given are returned -(getPercentAltered, or the percent of cases that show an alteration in -any of the genes (getTotalAltered) is returned. - -examples:: - - gene_list = [ "TP53", - "BCL2", - "MYC" ] - portal = CBioPortal() - portal.setDefaultStudy(study = "prad_mskcc") - portal.setDefaultCaseList(case_set_id = "prad_all_complete") - portal.getPercentAltered(gene_list = gene_list) - -or more tersely:: - - portal.CBioProtal() - portal.getPercentAltered(study = "prad_mskcc", case_set_id = "prad_all_complete", - gene_list = ["TP53","BCL2","MYC"], - genetic_profile_id =["prad_mskcc_mrna"]) - -Any warnings returned by the query are stored in CBioPortal.last_warnings. - -Query's that would give too long an URL are split into smaller querys -and the results combined transparently. - -A commandline interface is provided for convenience, syntax:: - - python CBioPortal.py [options] command(s) - -Reference ---------- - -''' -from urllib.request import urlopen -import re -import optparse -import sys -from cgatcore import iotools as iotools -from collections import OrderedDict as odict -from cgatcore import experiment as E - - -class CBioPortal(): - """connect to the cBioPortal Database. - - If no url is specified the default url is used. A list of of valid - study ids is retrieved from the database. This both confirms that - the datavase is reachable, and provides cached checking for the - ids provided. If a study or study name is provided then this is - set as the defualt study for this session and the details of the - availible profiles and cases is retrieved. 'Study' is the study - id. If both study and study_name are specified then the study id - is used. - """ - - url = "http://www.cbioportal.org/public-portal/webservice.do" - - def __init__(self, url=None, study=None, study_name=None, - case_list_id=None): - - if url: - self.url = url - - self.getCancerStudies() - self.study = None - self.case_list = None - - if study: - - if study in self._valid_study_ids: - self.study = study - - self.profiles = self.getGeneticProfiles(study) - self.cases = self.getCaseLists(study) - else: - raise ValueError("%s is not a valid study id" % study) - - elif study_name: - if study_name in [x['name'] for x in cancer_studies]: - study = [x['cancer_study_id'] - for x in cancer_studies if x['name'] == study_name][0] - self.study = study - self.profiles = self.getGeneticProfiles(study) - self.cases = self.getCaseLists(study) - - else: - raise ValueError("%s is not a valid study name" % study_name) - - if case_list_id: - self.setDefaultCaseList(case_list_id) - - def _executeQuery(self, command, args=None): - """execute the provided command on the database. - - args are specified as a dictionary. error checking on the - results is performed here and the returned value is a list of - lists with each list representing a row of the returned table. - """ - try: - argument_string = "&".join(["%s=%s" % (x, args[x]) for x in args]) - command_string = "&".join([command, argument_string]) - except TypeError: - command_string = command - - query = "%s?cmd=%s" % (self.url, command_string) - - if len(query) > 2048: - if "gene_list" in args: - genes = args['gene_list'].split(",") - - if len(genes) < 2: - raise ValueError("Request too long") - - args['gene_list'] = ",".join(genes[(len(genes) / 2):]) - query1 = self._executeQuery(command, args) - warnings = self.last_warnings - - args['gene_list'] = ",".join(genes[:(len(genes) / 2)]) - query2 = self._executeQuery(command, args) - self.last_warnings = warnings + self.last_warnings - - return query1 + query2 - - data = urlopen(query) - - line = data.readline() - self.last_query = query - self.last_status = line - self.last_warnings = [] - self.last_header = [self.last_status] - return_table = [] - - while re.match("^#", line): - - if re.match("^# Warning: (.+)", line): - self.last_warnings.append( - re.match("^# Warning: (.+)", line).groups(1)[0]) - self.last_header.append(line) - line = data.readline() - continue - - elif re.match("^#", line): - self.last_header.append(line) - line = data.readline() - continue - - if re.match("^Error: (.+)", line): - self.last_header.append(line) - raise CDGSError(re.match("^Error: (.+)", line).groups(1)[0], query) - line = line.strip() - headers = line.split("\t") - - for line in data: - if re.match("^# Warning: (.+)", line): - self.last_warnings.append( - re.match("^# Warning: (.+)", line).groups(1)[0]) - self.last_header.append(line) - line = data.readline() - continue - line = line.strip() - return_table.append(odict(list(zip(headers, line.split("\t"))))) - - return return_table - - def _getStudyId(self, study, study_name): - - if study: - if study in self._valid_study_ids: - return study - else: - raise ValueError("%s is not a valid study id" % study) - - elif study_name: - name_lookup = [x['study'] - for x in self.cancer_studies if x['name'] == study_name] - if len(name_lookup) == 1: - return name_lookup[0] - else: - raise ValueError( - "Cannot find study id for study '%s'" % study_name) - - elif self.study: - return self.study - - else: - return None - - def getCancerStudies(self): - """Fetches the list of cancer studies currently in the database. - - Returns list of dictionaries with three entries - 'cancer_study_id','name' and 'description'. Also caches this - data to verify the validity of later calls - """ - cancer_studies = self._executeQuery("getCancerStudies") - self.cancer_studies = cancer_studies - self._valid_study_ids = [x['cancer_study_id'] for x in cancer_studies] - - return self.cancer_studies - - def getGeneticProfiles(self, study=None, study_name=None): - """Fetches the valid genetic profiles for a particular study. - - study is the study id. If both study and study_name are - specified, study is used. If neither study nor study name is - specified then the default study is used if set, if not a - value error is raised. - Returns a list of dictionaries - """ - - study = self._getStudyId(study, study_name) - - if not study: - raise ValueError("A study must be specified if no default is set") - - genetic_studies = self._executeQuery(command="getGeneticProfiles", - args=dict(cancer_study_id=study)) - return genetic_studies - - def getCaseLists(self, study=None, study_name=None): - """Retrieves meta-data regarding all case lists stored about a - specific cancer study. - - For example, a within a particular study, only some cases may - have sequence data, and another subset of cases may have been - sequenced and treated with a specific therapeutic - protocol. Multiple case lists may be associated with each - cancer study, and this method enables you to retrieve - meta-data regarding all of these case lists. - - Data is returned as a list of dictionaries with the following - entries: - - * case_list_id: a unique ID used to identify the case list ID - in subsequent interface calls. This is a human readable - ID. For example, "gbm_all" identifies all cases profiles in - the TCGA GBM study. - - * case_list_name: short name for the case list. - - * case_list_description: short description of the case list. - - * cancer_study_id: cancer study ID tied to this genetic - profile. Will match the input cancer_study_id. - - * case_ids: space delimited list of all case IDs that make up - this case list. - """ - - study = self._getStudyId(study, study_name) - - if not study: - raise ValueError("A study must be specified if no default is set") - - case_lists = self._executeQuery( - command="getCaseLists", - args=dict - ({'cancer_study_id': study})) - return case_lists - - def getProfileData(self, gene_list, case_set_id=None, - genetic_profile_id=None, study=None, study_name=None): - """Retrieves genomic profile data for one or more genes. - - You can specify one gene and many profiles or one profile and - many genes. If you specify no genetic profiles then all - genetic profiles for the specified or default study are used - if the case_set_id is from that study otherwise a ValueError - is raised. - - Return value depends on the parameters. If you specify a - single genetic profile and multiple genes a list of ordered - dictionaries with the following entries:: - - gene_id: Entrez Gene ID - common: HUGO Gene Symbol - entries 3 - N: Data for each case - - If you specify multi genetic profiles and a single gene, a - list of ordered dictoraries with the following entries is - returned:: - - genetic_profile_id: The Genetic Profile ID. - alteration_type: The Genetic Alteration Type, e.g. MUTATION, MUTATION_EXTENDED, COPY_NUMBER_ALTERATION, or MRNA_EXPRESSION. - gene_id: Entrez Gene ID. - common: HUGO Gene Symbol. - Columns 5 - N: Data for each case. - - """ - - # Do some pre-query checking. - - if len(gene_list) > 1 and len(genetic_profile_id) > 1: - raise ValueError( - "%i genes and %i profiles specified\n.Please " - "specify either one gene many profiles or one " - "profile many genes" % ( - len(gene_list), len(genetic_profile_id))) - - study_id = self._getStudyId(study, study_name) - case_set_id = self._getCaseListId(case_set_id, study_id) - - genetic_profile_id = self._getAndCheckGeneticProfiles( - genetic_profile_id=genetic_profile_id, study=study) - - gene_list = ",".join(gene_list) - genetic_profile_id = ",".join(genetic_profile_id) - - profile_data = self._executeQuery( - command="getProfileData", - args={'case_set_id': case_set_id, - 'genetic_profile_id': genetic_profile_id, - 'gene_list': gene_list}) - - return profile_data - - def getMutationData(self, gene_list, genetic_profile_id, case_set_id=None, - study=None, study_name=None): - '''For data of type EXTENDED_MUTATION, you can request the full set of - annotated extended mutation data. - - This enables you to, for example, determine which sequencing - center sequenced the mutation, the amino acid change that - results from the mutation, or gather links to predicted - functional consequences of the mutation. - - Query Format - - - case_set_id= [case set ID] (required) - genetic_profile_id= [a single genetic profile IDs] (required). - gene_list= [one or more genes, specified as HUGO Gene Symbols or - Entrez Gene IDs](required) - - Response Format - - A list of dictionaries with the following entires - - entrez_gene_id: Entrez Gene ID. - gene_symbol: HUGO Gene Symbol. - case_id: Case ID. - sequencing_center: Sequencer Center responsible for identifying - this mutation. - For example: broad.mit.edu. - mutation_status: somatic or germline mutation status. all mutations - returned will be of type somatic. - mutation_type: mutation type, such as nonsense, missense, or frameshift_ins. - validation_status: validation status. Usually valid, invalid, or unknown. - amino_acid_change: amino acid change resulting from the mutation. - - functional_impact_score: predicted functional impact score, - as predicted by: Mutation Assessor. - xvar_link: Link to the Mutation Assessor web site. - xvar_link_pdb: Link to the Protein Data Bank (PDB) View within - Mutation Assessor web site. - xvar_link_msa: Link the Multiple Sequence Alignment (MSA) view - within the Mutation Assessor web site. - chr: chromosome where mutation occurs. - start_position: start position of mutation. - end_position: end position of mutation. - - If a default study is set then a check will be performed to - set if the supplied case id is from the specified study. The - study can be over written using the study and study_name - parameters - - ''' - - study_id = self._getStudyId(study, study_name) - - case_set_id = self._getCaseListId(case_set_id, study_id) - - if study_id: - if not study_id == self.study: - profiles = getGeneticProfiles(study_id) - else: - profiles = self.profiles - - if genetic_profile_id not in proiles: - raise ValueError( - "%s not a valid genetic profile for study %s" % - (genetic_profile_id, gene_id)) - genetic_profile_id = ",".join(genetic_profile_id) - gene_list = ",".join(gene_list) - mutation_data = self._executeQuery( - command="getMutationData", - args=dict({"case_set_id": case_set_id, - "genetic_profile_id": genetic_profile_id, - "gene_list": gene_list})) - return mutation_data - - def getClinicalData(self, case_set_id=None, study=None, study_name=None): - '''Retrieves overall survival, disease free survival and age at - diagnosis for specified cases. - - Due to patient privacy restrictions, no other clinical data is - available. - - Query Format - ------------ - - case_set_id= [case set ID] (required) - - Response Format - --------------- - - A list of dictionaries with the following entries: - - case_id: Unique Case Identifier. - overall_survival_months: Overall survival, in months. - overall_survival_status: Overall survival status, usually - indicated as "LIVING" or "DECEASED". - disease_free_survival_months: Disease free survival, in months. - disease_free_survival_status: Disease free survival status, - usually indicated as "DiseaseFree" or "Recurred/Progressed". - age_at_diagnosis: Age at diagnosis. - - If a study is specified or a defualt study is set, then the - case_set_id will be tested to check if it exists for that - study. - - ''' - - study_id = self._getStudyId(study, study_name) - - case_set_id = self._getCaseListId(case_set_id, study_id) - - clincal_data = self._executeQuery( - command="getClinicalData", - args=dict({'case_set_id': case_set_id})) - return clincal_data - - def getProteinArrayInfo(self, protein_array_type=None, gene_list=None, - study=None, study_name=None): - '''Retrieves information on antibodies used by reverse-phase protein - arrays (RPPA) to measure protein/phosphoprotein levels. - - Query Format - ------------ - - cancer_study_id= [cancer study ID] (required) - protein_array_type= [protein_level or phosphorylation] - gene_list= [one or more genes, specified as HUGO Gene - Symbols or Entrez Gene IDs]. - - Response Format - --------------- - - A list of dictionaries with the following entires: - - ARRAY_ID: The protein array ID. - ARRAY_TYPE: The protein array antibody type, i.e. protein_level - or phosphorylation. - GENE: The targeted gene name (HUGO gene symbol). - RESIDUE: The targeted resdue(s). - - If no study is specified the default study is used. If that is - not specified an error is raised. - - ''' - - study = self._getStudyId(study, study_name) - args = dict({'cancer_study_id': study}) - - if gene_list: - args['gene_list'] = ",".join(gene_list) - - if protein_array_type: - args['protein_array_type'] = protein_array_type - - protein_array_info = self._executeQuery( - command="getProteinArrayInfo", args=args) - - return protein_array_info - - def getProteinArrayData(self, protein_array_id=None, case_set_id=None, - array_info=0, study=None, study_name=None): - '''Retrieves protein and/or phosphoprotein levels measured by - reverse-phase protein arrays (RPPA). - - Query Format - ------------ - - case_set_id= [case set ID] - protein_array_id= [one or more protein array IDs] as list. - array_info= [1 or 0]. If 1, antibody information will also be exported. - - Response Format 1 - ----------------- - - If the parameter of array_info is not specified or it is not - 1, returns a list of dictionaries with the following columns. - - ARRAY_ID: The protein array ID. - Columns 2 - N: Data for each case. - - Response Format 2 - ----------------- - - If the parameter of array_info is 1, you will receive a list - of ordered dictionaries with the following entires: - - ARRAY_ID: The protein array ID. - ARRAY_TYPE: The protein array antibody type, i.e. protein_level or - phosphorylation. - GENE: The targeted gene name (HUGO gene symbol). - RESIDUE: The targeted resdue(s). - Columns 5 - N: Data for each case. - - If the defualt study is set then the case_set_id will be - check. The default study can be overidden using the study or - study_name parameters. - - ''' - - study_id = self._getStudyId(study, study_name) - - case_set_id = self._getCaseListId(case_set_id, study_id) - args = dict({"case_set_id": case_set_id, - "array_info": array_info}) - - if protein_array_id: - args['protein_array_id'] = ",".join(protein_array_id) - - protein_array_data = self._executeQuery( - command="getProteinArrayData", args=args) - - return protein_array_data - - def getLink(self, gene_list, study=None, study_name=None, report="full"): - '''return a perminant link to the cBioPortal report for the gene_list - cancer_study_id=[cancer study ID] gene_list=[a comma - separated list of HUGO gene symbols] (required) - report=[report to display; can be one of: full (default), - oncoprint_html] - ''' - - study = self._getStudyId(study, study_name) - if not study: - raise ValueError("Study must be specified") - if report not in ["full", "oncoprint_html"]: - raise ValueError("%s is not a valid report" % report) - - url = "/".join(self.url.split("/")[:-1]) - - gene_list = ",".join(gene_list) - return "%s/link.do?cancer_study_id=%s&gene_list=%s&report=%s" %\ - (url, study, gene_list, report) - - def getOncoprintHTML(self, gene_list, study=None, study_name=None): - '''returns the HTML for the oncoprint report for the specified gene - list and study''' - - url = "/".join(self.url.split("/")[0:-1]) - gene_list = ",".join(gene_list) - command = "%s/link.do?cancer_study_id=%s&gene_list=%s&report=oncoprint_html" % ( - url, study, gene_list) - return urlopen(command).read() - - def setDefaultStudy(self, study=None, study_name=None): - '''sets a new study as the default study. Will check that the study - id is valid''' - study = self._getStudyId(study, study_name) - self.study = study - self.profiles = self.getGeneticProfiles() - self.cases = self.getCaseLists() - - all_case_list = [x['case_list_id'] - for x in self.cases - if x['case_list_name'] == "All Tumours"] - - if len(all_case_list) == 1: - self.setDefaultCaseList(all_case_list) - - def setDefaultCaseList(self, case_set_id, study=None, study_name=None): - '''set the default case list. If study is not specified the default - study will be used. - - The study will be used to check that the case_set exists. - ''' - - study = self._getStudyId(study, study_name) - case_list = self._getCaseListId(case_set_id, study=study) - - if not study == self.study: - self.setDefaultStudy(study) - - self.case_list = case_list - - def _getCaseListId(self, case_set_id=None, study=None, strict=True): - ''' checking is only done if study is specified or a default is set ''' - - study_id = self._getStudyId(study, None) - - if case_set_id: - if study_id: - if not study_id == self.study: - case_lists = [x['case_list_id'] - for x in self.getCaseLists(study_id)] - else: - case_lists = [x['case_list_id'] for x in self.cases] - - if case_set_id not in case_lists: - raise ValueError( - "%s is not a valid case list for study %s" % (case_set_id, study_id)) - return case_set_id - - else: - if self.case_list: - return self.case_list - else: - raise ValueError("No case_set_id provided and no default set") - - def _getAndCheckGeneticProfiles(self, genetic_profile_id=None, study=None): - - study_id = self._getStudyId(study, None) - if not genetic_profile_id: - if not study_id: - raise ValueError( - "Either genetic_profile_id or study must be specified") - - if study_id == self.study: - genetic_profile_id = [x['genetic_profile_id'] - for x in self.profiles - if x['show_profile_in_analysis_tab'] == "true"] - else: - genetic_profile_id = [x['genetic_profile_id'] - for x in self.getGeneticProfiles(study_id) - if x['show_profile_in_analysis_tab'] == "true"] - - return genetic_profile_id - - else: - - if not study_id: - return genetic_profile_id - - if study_id == self.study: - genetic_profile_id = [x['genetic_profile_id'] for x in self.profiles - if x['genetic_profile_id'] in genetic_profile_id] - else: - genetic_profile_id = [x['genetic_profile_id'] for x in self.getGeneticProfiles(study_id) - if x['genetic_profile_id'] in genetic_profile_id] - - if len(genetic_profile_id) == 0: - raise ValueError("no valid genetic_profile_ids found") - - return genetic_profile_id - - def getPercentAltered(self, gene_list, study=None, study_name=None, - case_set_id=None, genetic_profile_id=None, - threshold=2): - '''Get the percent of cases that have one or more of the specified - alterations for each gene - - Query Format - ------------ - - study = [cancer_study_id] The study to use. - - study_name = [cancer_study_name] The name of the study to - use. If neither this nor study are specified, - then the default is used. - - case_set_id = [case_set_id] The case list to use. If not - specified, the default case list is used. - - gene_list = [one or more genes, specified as HUGO Gene Symobls - or ENtrez Gene IDs] (require) - - genetic_profile_id = [one or more genetic profile IDs] If none - specified all genetic profiles for the specified study are - used.. - - threhold = [z_score_threshold] the numeric threshold at which - a mrna expression z-score is said to be significant. - - Response Format - --------------- - - A list of dictionaries with the following entries - gene_id: The Entrez Gene ID - common: The Hugo Gene Symbol - altered_in: The percent of cases in which the gene is altered - - One implementation note is that a guess must be made as to - wether a returned profile value represents a alteration or - not. Currently guesses are only made for copy number - variation, mrna expression and mutionation - - ''' - - study = self._getStudyId(study, study_name) - case_set_id = self._getCaseListId(case_set_id, study) - genetic_profile_id = self._getAndCheckGeneticProfiles( - genetic_profile_id, study) - - if study and study == self.study: - profiles = self.profiles - case_list = [x['case_ids'] - for x in self.cases - if x['case_list_id'] == case_set_id][0] - - else: - profiles = self.getGeneticProfiles(study) - case_list = [x['case_ids'] for x in self.getCaseLists( - study) if x['case_list_id'] == case_set_id][0] - - return_table = [] - case_list = case_list.split(" ") - - data = [] - warnings = [] - for profile in genetic_profile_id: - - data.append(self.getProfileData( - gene_list=gene_list, case_set_id=case_set_id, - genetic_profile_id=[profile])) - warnings.extend(self.last_warnings) - - # data[profile][gene][case] - for gene in range(len(data[0])): - cases_altered = 0.0 - - geneProfile = [x[gene] for x in data] - - for case in (set(geneProfile[0]) - set(["gene_id", "common"])): - if len([geneProfile[x][case] for x in range(len(geneProfile)) - if self._guessAlteration( - geneProfile[x][case], - genetic_profile_id[x], profiles)]) > 0: - - cases_altered += 1 - - return_table.append( - dict({'gene_id': geneProfile[0]['GENE_ID'], - 'common': geneProfile[0]['COMMON'], - 'altered_in': cases_altered * 100 / len(case_list)})) - - self.last_warnings = warnings - return return_table - - def getTotalAltered(self, gene_list, study=None, study_name=None, case_set_id=None, genetic_profile_id=None, threshold=2): - ''' Calculate the percent of cases in which any one of the specified genes are altered ''' - - study = self._getStudyId(study, study_name) - case_set_id = self._getCaseListId(case_set_id, study) - genetic_profile_id = self._getAndCheckGeneticProfiles( - genetic_profile_id, study) - - if study == self.study: - profiles = self.profiles - case_list = [x['case_ids'] - for x in self.cases if x['case_list_id'] == case_set_id][0] - else: - profiles = self.getGeneticProfiles(study) - case_list = [x['case_ids'] for x in self.getCaseLists( - study) if x['case_list_id'] == case_set_id][0] - case_list = case_list.split(" ") - - data = [] - - # data[gene][profile][case] - cases_altered = 0.0 - for gene in gene_list: - data.append(self.getProfileData( - gene_list=[gene], case_set_id=case_set_id, - genetic_profile_id=genetic_profile_id)) - # catch special case where only a single - # genetic_profile_id is passed in, so the query is single - # gene and single profile and returns genes as columns - # format. - if len(genetic_profile_id) == 1 and len(data[0]) == 1: - data[0][0]['GENETIC_PROFILE_ID'] = genetic_profile_id[0] - - for case_id in set(data[0][0]) - set( - ["GENETIC_PROFILE_ID", "ALTERATION_TYPE", - "GENE_ID", "COMMON"]): - - case_altered = False - for gene in data: - - altered = len([x for x in gene - if self._guessAlteration(x[case_id], - x['GENETIC_PROFILE_ID'], - profiles, threshold)]) - if (altered > 0): - case_altered = True - - if case_altered is True: - cases_altered += 1.0 - - return cases_altered * 100 / len(case_list) - - def _guessAlteration(self, value, genetic_profile_id, genetic_profiles, - threshold=2): - - alteration_type = [x['genetic_alteration_type'] - for x in genetic_profiles - if x['genetic_profile_id'] == genetic_profile_id][0] - - # print alteration_type - if alteration_type == "COPY_NUMBER_ALTERATION": - if value == "0" or value == "-1" or value == "1": - return False - elif value == "NaN": - return False - else: - return True - - elif alteration_type == "MRNA_EXPRESSION": - if re.search("[^0-9\.\-]", value): - # is character string - return False - elif re.search("[0-9]+\.[0-9]+", value): - # is float - value = float(value) - if abs(value) > threshold: - return True - else: - return False - else: # must be int? - # print value - if value == "0": - return False - else: - return True - - elif alteration_type == "METHYLATION": - return False - - elif (alteration_type == "MUTATION" or - alteration_type == "MUTATION_EXTENDED"): - if value == "NaN": - return False - else: - return True - else: - return False - - -class CDGSError(Exception): - - '''exception that handles errors returned by querys in the database''' - - def __init__(self, error, request): - self.error = error - self.request = request - - def __str__(self): - return "Request %s return error:\n%s" % (self.request, self.error) - - -def tableToString(intable): - - headers = "\t".join([x for x in intable[0]]) - - line_list = [] - for line in intable: - - line_list.append("\t".join([str(line[x]) for x in line])) - - outTable = "\n".join(line_list) - outTable = headers + "\n" + outTable - - return outTable - - -def main(argv=None): - - parser = E.OptionParser( - version="%prog version: $Id$", - usage=globals()["__doc__"]) - - parser.add_option("-o", "--output_file", type="string", default=None, - help="[Optional] Filename to output results to. [default=STDOUT]") - parser.add_option("-u", "--url", type="string", default="http://www.cbioportal.org/public-portal/webservice.do", - help="[Optional] Url to the cBioPortal webservice [default=%default]") - - cqueryopts = optparse.OptionGroup( - parser, "Common parameters", "Common arguments to the query") - cqueryopts.add_option("-s", "--study_id", dest="study_id", type="string", default=None, - help="[Required/OPtional] cBioPortal ID for study [default=%default].\n This or study_name required for: getGeneticProfiles, getCaseLists, getProteinArrayInfo, getLink,getOncoprintHTML, getPercentAltered, getTotalAltered") - cqueryopts.add_option("-n", "--study_name", dest="study_name", type="string", default=None, - help="[Required/Optional] cBioPortal Name for study [defualt=%default].\n See above for which commands require this.") - cqueryopts.add_option("-c", "--case_set_id", dest="case_set_id", type="string", default=None, - help="[Required for some] cBioPortal case_set_id specifying the case list to use.\nRequired for getProfileData, getMutationData, getClincalData, getProteinArrayData, getPercentAltered, getTotalAltered. Default is case_set_id for case list 'All Tumours' ") - cqueryopts.add_option("-g", "--gene_list", dest="gene_list", type="string", default=None, - help="[Required for some] Comma seperated list of HUGO gene symbols or Entrez gene IDs.\nRequired for getProfileData, getMutationData, getLink, getOncoprintHTML") - cqueryopts.add_option("-f", "--gene_list_file", dest="gene_list_file", type="string", default=None, - help="[Optional] Filename to read in gene_list from") - cqueryopts.add_option("-p", "--profile_id", dest="profile_id", type="string", - help="[Optional] Comma seperated list of cBioPortal genetic_profile_ids. If none are specified then the list of profiles for the study where display in analysis is True is used.") - - squeryopts = optparse.OptionGroup( - parser, "Query specific parameters", "Arguments specific to a particular query") - squeryopts.add_option("--protein_array_type", dest="protein_array_type", type="string", default="protein_level", - help="[Optional] Either protein_level or phosphorylation [default=%default]") - squeryopts.add_option("--protein_array_id", dest="protein_array_id", type="string", - help="[Required for some] comma seperated list of one or more protein array IDs") - squeryopts.add_option("--array_info", dest="protein_array_info", type="int", default=0, - help="[Optional] If 1, antibody infomation will also be exported in a getProteinArrayData query [default=%default]") - squeryopts.add_option("--output-report", dest="report", type="string", default="full", - help="[Optional] Report type to display for getLink. Either full or oncoprint_html [default=%default] ") - squeryopts.add_option("--threshold", dest="threshold", type="int", default=2, - help="[Optional] Threshold for deciding if an alteration is significant for continuous metrics [default=%default]") - - parser.add_option_group(cqueryopts) - parser.add_option_group(squeryopts) - - (options, args) = E.Start( - parser, add_pipe_options=False, add_output_options=False, argv=argv) - - portal = CBioPortal(url=options.url, study=options.study_id, - study_name=options.study_name, case_list_id=options.case_set_id) - - results = [] - - if options.gene_list_file: - infile = iotools.open_file(options.gene_list_file) - gene_list = [x.strip() for x in infile] - elif options.gene_list: - gene_list = options.gene_list.split(",") - - if options.profile_id: - profile_id = options.profile_id.split(",") - else: - profile_id = None - - if "getCancerStudies" in args: - results.append(portal.getCancerStudies()) - - if "getGeneticProfiles" in args: - results.append(portal.getGeneticProfiles()) - - if "getCaseLists" in args: - results.append(portal.getCaseLists()) - - if "getProfileData" in args: - results.append( - portal.getProfileData(gene_list=gene_list, - genetic_profile_id=profile_id)) - - if "getMutationData" in args: - results.append( - portal.getMutationData(gene_list=gene_list, - genetic_profile_id=profile_id)) - - if "getClinicalData" in args: - results.append(portal.getClinicalData()) - - if "getProteinArrayInfo" in args: - results.append(portal.getProteinArrayInfo( - gene_list=gene_list, - protein_array_type=options.protein_array_type)) - - if "getProteinArrayData" in args: - results.append(portal.getProteinArrayData( - protein_array_id=options.protein_array_id, - array_info=options.array_info)) - - if "getPercentAltered" in args: - results.append(portal.getPercentAltered( - gene_list=gene_list, genetic_profile_id=profile_id, - threshold=options.threshold)) - - if "getLink" in args: - results.append( - portal.getLink(gene_list=gene_list, report=options.report)) - - if "getOncoprintHTML" in args: - results.append(portal.getOncoprintHTML(gene_list=gene_list)) - - if len(results) == 0: - sys.stderr.write("No recognised query commands provided") - sys.exit() - - if options.output_file: - outf = iotools.open_file(options.output_file, "w") - else: - outf = sys.stdout - - for result in results: - try: - outf.write(tableToString(result)) - except: - outf.write(result) - - E.Stop() - - -if __name__ == "__main__": - sys.exit(main(sys.argv)) diff --git a/cgat/IGV.py b/cgat/IGV.py deleted file mode 100644 index ebf5053e8..000000000 --- a/cgat/IGV.py +++ /dev/null @@ -1,169 +0,0 @@ -''' -IGV.py - Simple wrapper to the IGV socket interface -==================================================== - -:Tags: Python - -This code was written by Brent Pedersen. - -Downloaded from https://github.com/brentp/bio-playground/blob/master/igv/igv.py -on Nov.30 2011. - -''' - -import socket -import os.path as op -import os -import subprocess -import time - - -def startIGV(command="igv.sh", port=None): - """start IGV on a specific port.""" - args = [command] - if port is not None: - args.extend(['-p', str(port)]) - process = subprocess.Popen(args, - stdout=subprocess.PIPE) - time.sleep(10) - return process - - -class IGV(object): - r""" - Simple wrapper to the IGV (http://www.broadinstitute.org/software/igv/home) - socket interface (http://www.broadinstitute.org/software/igv/PortCommands) - - requires: - - 1) you have IGV running on your machine (launch with webstart here: - http://www.broadinstitute.org/software/igv/download) - - 2) you have enabled port communication in - View -> Preferences... -> Advanced - - Successful commands return 'OK' - - example usage: - - >>> igv = IGV() - >>> igv.genome('hg19') - 'OK' - - >>> igv.load('http://www.broadinstitute.org/igvdata/1KG/pilot2Bams/NA12878.SLX.bam') - 'OK' - >>> igv.go('chr1:45,600-45,800') - 'OK' - - #save as svg, png, or jpg - >>> igv.save('/tmp/r/region.svg') - 'OK' - >>> igv.save('/tmp/r/region.png') - 'OK' - - # go to a gene name. - >>> igv.go('muc5b') - 'OK' - >>> igv.sort() - 'OK' - >>> igv.save('muc5b.png') - 'OK' - - # get a list of commands that will work as an IGV batch script. - >>> print "\n".join(igv.commands) - snapshotDirectory /tmp/igv - genome hg19 - goto chr1:45,600-45,800 - snapshotDirectory /tmp/r - snapshot region.svg - snapshot region.png - goto muc5b - sort base - snapshot muc5b.png - - Note, there will be some delay as the browser has to load the annotations - at each step. - - """ - _socket = None - _path = None - - def __init__(self, host='127.0.0.1', port=60151, snapshot_dir='/tmp/igv'): - self.host = host - self.port = port - self.commands = [] - self.connect() - self.set_path(snapshot_dir) - - @classmethod - def start(cls, jnlp="igv.jnlp", - url="http://www.broadinstitute.org/igv/projects/current/"): - import subprocess - p = subprocess.Popen("/usr/bin/javaws -Xnosplash %s%s" % (url, jnlp), - shell=True, stdout=subprocess.PIPE) - p.wait() - return p.returncode - - def connect(self): - if self._socket: - self._socket.close() - self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self._socket.connect((self.host, self.port)) - - def go(self, position): - return self.send('goto ' + position) - goto = go - - def genome(self, name): - return self.send('genome ' + name) - - def load(self, url): - return self.send('load ' + url) - - def sort(self, option='base'): - """ - options is one of: base, position, strand, quality, sample, and - readGroup. - """ - assert option in ("base", "position", "strand", "quality", "sample", - "readGroup") - return self.send('sort ' + option) - - def set_path(self, snapshot_dir): - if snapshot_dir == self._path: - return - if not op.exists(snapshot_dir): - os.makedirs(snapshot_dir) - - self.send('snapshotDirectory %s' % snapshot_dir) - self._path = snapshot_dir - - def expand(self, track): - self.send('expand %s' % track) - - def collapse(self, track): - self.send('collapse %s' % track) - - def clear(self): - self.send('clear') - - def send(self, cmd): - self.commands.append(cmd) - self._socket.send(cmd + '\n') - return self._socket.recv(10).rstrip('\n') - - def save(self, path=None): - if path is not None: - # igv assumes the path is just a single filename, but - # we can set the snapshot dir. then just use the filename. - dirname = op.dirname(path) - if dirname: - self.set_path(dirname) - return self.send('snapshot ' + op.basename(path)) - else: - return self.send('snapshot') - snapshot = save - -if __name__ == "__main__": - import doctest - doctest.testmod() diff --git a/cgat/SVGdraw.py b/cgat/SVGdraw.py deleted file mode 100644 index aee891935..000000000 --- a/cgat/SVGdraw.py +++ /dev/null @@ -1,1155 +0,0 @@ -''' -SVGdraw.py - generate SVG drawings -====================================================== - -:Tags: Python - -This module has been copied from 3rd party resources. - -SVGdraw uses an object model drawing and a method toXML to create SVG graphics -by using easy to use classes and methods usualy you start by creating a drawing eg - - d=drawing() - #then you create a SVG root element - s=svg() - #then you add some elements eg a circle and add it to the svg root element - c=circle() - #you can supply attributes by using named arguments. - c=circle(fill='red',stroke='blue') - #or by updating the attributes attribute: - c.attributes['stroke-width']=1 - s.addElement(c) - #then you add the svg root element to the drawing - d.setSVG(s) - #and finaly you xmlify the drawing - d.toXml() - - -this results in the svg source of the drawing, which consists of a circle -on a white background. Its as easy as that;) -This module was created using the SVG specification of www.w3c.org and the -O'Reilly (www.oreilly.com) python books as information sources. A svg viewer -is available from www.adobe.com -''' - -from io import StringIO -import sys - -__version__ = "1.0" - -use_dom_implementation = 0 - -if use_dom_implementation != 0: - try: - from xml.dom import implementation - from xml.dom.ext import PrettyPrint - except: - raise ImportError("PyXML is required for using the dom implementation") - - -sys.setrecursionlimit = 50 - - -def _escape(data, entities={}): - """Escape &, <, and > in a string of data. - - You can escape other strings of data by passing a dictionary as - the optional entities parameter. The keys and values must all be - strings; each key will be replaced with its corresponding value. - """ - data = data.replace("&", "&") - data = data.replace("<", "<") - data = data.replace(">", ">") - for chars, entity in list(entities.items()): - data = data.replace(chars, entity) - return data - - -def _quoteattr(data, entities={}): - """Escape and quote an attribute value. - - Escape &, <, and > in a string of data, then quote it for use as - an attribute value. The \" character will be escaped as well, if - necessary. - - You can escape other strings of data by passing a dictionary as - the optional entities parameter. The keys and values must all be - strings; each key will be replaced with its corresponding value. - """ - data = _escape(data, entities) - if '"' in data: - if "'" in data: - data = '"%s"' % data.replace('"', """) - else: - data = "'%s'" % data - else: - data = '"%s"' % data - return data - - -def _xypointlist(a): - """formats a list of xy pairs""" - s = '' - for e in a: # this could be done more elegant - s += str(e)[1:-1] + ' ' - return s - - -def _viewboxlist(a): - """formats a tuple""" - s = '' - for e in a: - s += str(e) + ' ' - return s - - -def _pointlist(a): - """formats a list of numbers""" - return str(a)[1:-1] - - -class pathdata: - - """class used to create a pathdata object which can be used for a path. - although most methods are pretty straightforward it might be useful to look at the SVG specification.""" - # I didn't test the methods below. - - def __init__(self, x=None, y=None): - self.path = [] - if x is not None and y is not None: - self.path.append('M ' + str(x) + ' ' + str(y)) - - def closepath(self): - """ends the path""" - self.path.append('z') - - def move(self, x, y): - """move to absolute""" - self.path.append('M ' + str(x) + ' ' + str(y)) - - def relmove(self, x, y): - """move to relative""" - self.path.append('m ' + str(x) + ' ' + str(y)) - - def line(self, x, y): - """line to absolute""" - self.path.append('L ' + str(x) + ' ' + str(y)) - - def relline(self, x, y): - """line to relative""" - self.path.append('l ' + str(x) + ' ' + str(y)) - - def hline(self, x): - """horizontal line to absolute""" - self.path.append('H' + str(x)) - - def relhline(self, x): - """horizontal line to relative""" - self.path.append('h' + str(x)) - - def vline(self, y): - """verical line to absolute""" - self.path.append('V' + str(y)) - - def relvline(self, y): - """vertical line to relative""" - self.path.append('v' + str(y)) - - def bezier(self, x1, y1, x2, y2, x, y): - """bezier with xy1 and xy2 to xy absolut""" - self.path.append('C' + str(x1) + ',' + str(y1) + ' ' + - str(x2) + ',' + str(y2) + ' ' + str(x) + ',' + str(y)) - - def relbezier(self, x1, y1, x2, y2, x, y): - """bezier with xy1 and xy2 to xy relative""" - self.path.append('c' + str(x1) + ',' + str(y1) + ' ' + - str(x2) + ',' + str(y2) + ' ' + str(x) + ',' + str(y)) - - def smbezier(self, x2, y2, x, y): - """smooth bezier with xy2 to xy absolut""" - self.path.append( - 'S' + str(x2) + ',' + str(y2) + ' ' + str(x) + ',' + str(y)) - - def relsmbezier(self, x2, y2, x, y): - """smooth bezier with xy2 to xy relative""" - self.path.append( - 's' + str(x2) + ',' + str(y2) + ' ' + str(x) + ',' + str(y)) - - def qbezier(self, x1, y1, x, y): - """quadratic bezier with xy1 to xy absolut""" - self.path.append( - 'Q' + str(x1) + ',' + str(y1) + ' ' + str(x) + ',' + str(y)) - - def relqbezier(self, x1, y1, x, y): - """quadratic bezier with xy1 to xy relative""" - self.path.append( - 'q' + str(x1) + ',' + str(y1) + ' ' + str(x) + ',' + str(y)) - - def smqbezier(self, x, y): - """smooth quadratic bezier to xy absolut""" - self.path.append('T' + str(x) + ',' + str(y)) - - def relsmqbezier(self, x, y): - """smooth quadratic bezier to xy relative""" - self.path.append('t' + str(x) + ',' + str(y)) - - def ellarc(self, rx, ry, xrot, laf, sf, x, y): - """elliptival arc with rx and ry rotating with xrot using large-arc-flag and sweep-flag to xy absolut""" - self.path.append('A' + str(rx) + ',' + str(ry) + ' ' + str(xrot) + - ' ' + str(laf) + ' ' + str(sf) + ' ' + str(x) + ' ' + str(y)) - - def relellarc(self, rx, ry, xrot, laf, sf, x, y): - """elliptival arc with rx and ry rotating with xrot using large-arc-flag and sweep-flag to xy relative""" - self.path.append('a' + str(rx) + ',' + str(ry) + ' ' + str(xrot) + - ' ' + str(laf) + ' ' + str(sf) + ' ' + str(x) + ' ' + str(y)) - - def __repr__(self): - return ' '.join(self.path) - - -class SVGelement: - - """SVGelement(type,attributes,elements,text,namespace,**args) - Creates a arbitrary svg element and is intended to be subclassed not used on its own. - This element is the base of every svg element it defines a class which resembles - a xml-element. The main advantage of this kind of implementation is that you don't - have to create a toXML method for every different graph object. Every element - consists of a type, attribute, optional subelements, optional text and an optional - namespace. Note the elements==None, if elements = None:self.elements=[] construction. - This is done because if you default to elements=[] every object has a reference - to the same empty list.""" - - def __init__(self, type='', attributes=None, elements=None, text='', namespace='', cdata=None, **args): - self.type = type - if attributes is None: - self.attributes = {} - else: - self.attributes = attributes - if elements is None: - self.elements = [] - else: - self.elements = elements - self.text = text - self.namespace = namespace - self.cdata = cdata - for arg in list(args.keys()): - self.attributes[arg] = args[arg] - - def addElement(self, SVGelement): - """adds an element to a SVGelement - - SVGelement.addElement(SVGelement) - """ - self.elements.append(SVGelement) - - def toXml(self, level, f): - f.write('\t' * level) - f.write('<' + self.type) - for attkey in list(self.attributes.keys()): - f.write(' ' + _escape(str(attkey)) + '=' + - _quoteattr(str(self.attributes[attkey]))) - if self.namespace: - f.write(' xmlns="' + _escape(str(self.namespace)) + '" ') - # added by Andreas Heger - f.write( - ' xmlns:xlink="' + _escape(str("http://www.w3.org/1999/xlink")) + '" ') - if self.elements or self.text or self.cdata: - f.write('>') - if self.elements: - f.write('\n') - for element in self.elements: - element.toXml(level + 1, f) - if self.cdata: - f.write('\n' + '\t' * (level + 1) + '\n') - if self.text: - if isinstance(self.text, str): # If the text is only text - f.write(_escape(str(self.text))) - else: # If the text is a spannedtext class - f.write(str(self.text)) - if self.elements: - f.write('\t' * level + '\n') - elif self.text: - f.write('\n') - elif self.cdata: - f.write('\t' * level + '\n') - else: - f.write('/>\n') - - -class tspan(SVGelement): - - """ts=tspan(text='',**args) - - a tspan element can be used for applying formatting to a textsection - usage: - ts=tspan('this text is bold') - ts.attributes['font-weight']='bold' - st=spannedtext() - st.addtspan(ts) - t=text(3,5,st) - """ - - def __init__(self, text=None, **args): - SVGelement.__init__(self, 'tspan', **args) - if self.text is not None: - self.text = text - - def __repr__(self): - s = "\n") - xml.write( - "\n") - self.svg.toXml(0, xml) - if not filename: - if compress: - import gzip - f = StringIO() - zf = gzip.GzipFile(fileobj=f, mode='wb') - zf.write(xml.getvalue()) - zf.close() - f.seek(0) - return f.read() - else: - return xml.getvalue() - else: - if filename[-4:] == 'svgz': - import gzip - f = gzip.GzipFile( - filename=filename, mode="wb", compresslevel=9) - f.write(xml.getvalue()) - f.close() - else: - f = file(filename, 'w') - f.write(xml.getvalue()) - f.close() - - else: - def toXml(self, filename='', compress=False): - """drawing.toXml() ---->to the screen - drawing.toXml(filename)---->to the file - writes a svg drawing to the screen or to a file - compresses if filename ends with svgz or if compress is true - """ - doctype = implementation.createDocumentType( - 'svg', "-//W3C//DTD SVG 1.0//EN""", 'http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd ') - - global root - # root is defined global so it can be used by the appender. Its also possible to use it as an arugument but - # that is a bit messy. - root = implementation.createDocument(None, None, doctype) - # Create the xml document. - global appender - - def appender(element, elementroot): - """This recursive function appends elements to an element and sets the attributes - and type. It stops when alle elements have been appended""" - if element.namespace: - e = root.createElementNS(element.namespace, element.type) - else: - e = root.createElement(element.type) - if element.text: - textnode = root.createTextNode(element.text) - e.appendChild(textnode) - # in element.attributes is supported from python 2.2 - for attribute in list(element.attributes.keys()): - e.setAttribute( - attribute, str(element.attributes[attribute])) - if element.elements: - for el in element.elements: - e = appender(el, e) - elementroot.appendChild(e) - return elementroot - root = appender(self.svg, root) - if not filename: - xml = StringIO() - PrettyPrint(root, xml) - if compress: - import gzip - f = StringIO() - zf = gzip.GzipFile(fileobj=f, mode='wb') - zf.write(xml.getvalue()) - zf.close() - f.seek(0) - return f.read() - else: - return xml.getvalue() - else: - try: - if filename[-4:] == 'svgz': - import gzip - xml = StringIO() - PrettyPrint(root, xml) - f = gzip.GzipFile( - filename=filename, mode='wb', compresslevel=9) - f.write(xml.getvalue()) - f.close() - else: - f = open(filename, 'w') - PrettyPrint(root, f) - f.close() - except: - print("Cannot write SVG file: " + filename) - - def validate(self): - try: - import xml.parsers.xmlproc.xmlval - except: - raise ImportError('PyXml is required for validating SVG') - svg = self.toXml() - xv = xml.parsers.xmlproc.xmlval.XMLValidator() - try: - xv.feed(svg) - except: - raise ValueError("SVG is not well formed, see messages above") - else: - print("SVG well formed") - - -if __name__ == '__main__': - - d = drawing() - s = svg((0, 0, 100, 100)) - r = rect(-100, -100, 300, 300, 'cyan') - s.addElement(r) - - t = title('SVGdraw Demo') - s.addElement(t) - g = group('animations') - e = ellipse(0, 0, 5, 2) - g.addElement(e) - c = circle(0, 0, 1, 'red') - g.addElement(c) - pd = pathdata(0, -10) - for i in range(6): - pd.relsmbezier(10, 5, 0, 10) - pd.relsmbezier(-10, 5, 0, 10) - an = animateMotion(pd, 10) - an.attributes['rotate'] = 'auto-reverse' - an.attributes['repeatCount'] = "indefinite" - g.addElement(an) - s.addElement(g) - for i in range(20, 120, 20): - u = use('#animations', i, 0) - s.addElement(u) - for i in range(0, 120, 20): - for j in range(5, 105, 10): - c = circle(i, j, 1, 'red', 'black', .5) - s.addElement(c) - d.setSVG(s) - - print(d.toXml()) diff --git a/cgat/tools/gff2gff.py b/cgat/tools/gff2gff.py index d44a8e6af..426773e79 100644 --- a/cgat/tools/gff2gff.py +++ b/cgat/tools/gff2gff.py @@ -3,6 +3,8 @@ :Tags: Genomics Intervals GFF Manipulation +Note: The script can parse AGP files but this functionality +is scheduled for deprecation in the next release. Purpose ------- diff --git a/cgat/version.py b/cgat/version.py index 49e0fc1e0..a5f830a2c 100644 --- a/cgat/version.py +++ b/cgat/version.py @@ -1 +1 @@ -__version__ = "0.7.0" +__version__ = "0.7.1" diff --git a/dependency_graph/Makefile b/dependency_graph/Makefile deleted file mode 100644 index 10856d2ab..000000000 --- a/dependency_graph/Makefile +++ /dev/null @@ -1,42 +0,0 @@ -NAME = cgat -ROOT = ../scripts ../CGAT ../../CGATPipelines/CGATPipelines -PDFS = $(NAME)_raw.pdf -SVGS = $(NAME)_raw.svg -CHECK = $(NAME).check - - -FOOD_FLAGS?=--internal --follow - -.SUFFIXES: .deps .dot .pdf .svg .clusters - -all: $(PDFS) $(SVGS) - -check: $(CHECK) - -raw.deps: $(ROOT) - sfood $(FOOD_FLAGS) $(ROOT) > $@ - -$(NAME).clusters: $(ROOT) - cd $(ROOT) ; ls -1d * > $(shell pwd)/$@ - -$(NAME).deps: $(NAME).clusters raw.deps - cat raw.deps | sfood-cluster -f $< > $@ - -$(NAME)_raw.deps: raw.deps - cp $< $@ - -.deps.pdf: - cat $< | python graph.py | dot -Tps | ps2pdf - $@ - -.deps.svg: - cat $< | python graph.py | dot -Tsvg > $@ - -$(NAME).check: - sfood-checker $(ROOT) >& $@ - -clean: - rm -f *.clusters *.dot *.pdf *.svg - ls -1 *.deps | grep -v ^raw.deps | xargs rm -f - -realclean: clean - rm -f raw.deps diff --git a/dependency_graph/cgat_raw.svg b/dependency_graph/cgat_raw.svg deleted file mode 100644 index 53ba6e9c1..000000000 --- a/dependency_graph/cgat_raw.svg +++ /dev/null @@ -1,8203 +0,0 @@ - - - - - - -dependencies - - -CGATPipelines - -CGATPipelines - - -CGATPipelines/Pipeline - -CGATPipelines/Pipeline - - -CGATPipelines/Pipeline/Control.py - -CGATPipelines/Pipeline/Control.py - - -CGATPipelines/Pipeline->CGATPipelines/Pipeline/Control.py - - - - -CGATPipelines/Pipeline/Database.py - -CGATPipelines/Pipeline/Database.py - - -CGATPipelines/Pipeline->CGATPipelines/Pipeline/Database.py - - - - -CGATPipelines/Pipeline/Execution.py - -CGATPipelines/Pipeline/Execution.py - - -CGATPipelines/Pipeline->CGATPipelines/Pipeline/Execution.py - - - - -CGATPipelines/Pipeline/Files.py - -CGATPipelines/Pipeline/Files.py - - -CGATPipelines/Pipeline->CGATPipelines/Pipeline/Files.py - - - - -CGATPipelines/Pipeline/Local.py - -CGATPipelines/Pipeline/Local.py - - -CGATPipelines/Pipeline->CGATPipelines/Pipeline/Local.py - - - - -CGATPipelines/Pipeline/Parameters.py - -CGATPipelines/Pipeline/Parameters.py - - -CGATPipelines/Pipeline->CGATPipelines/Pipeline/Parameters.py - - - - -CGATPipelines/Pipeline/Utils.py - -CGATPipelines/Pipeline/Utils.py - - -CGATPipelines/Pipeline->CGATPipelines/Pipeline/Utils.py - - - - -CGAT/Experiment.py - -CGAT/Experiment.py - - -CGATPipelines/Pipeline->CGAT/Experiment.py - - - - -CGAT/IOTools.py - -CGAT/IOTools.py - - -CGATPipelines/Pipeline->CGAT/IOTools.py - - - - -CGATPipelines/Pipeline/Control.py->CGATPipelines/Pipeline/Execution.py - - - - -CGATPipelines/Pipeline/Control.py->CGATPipelines/Pipeline/Local.py - - - - -CGATPipelines/Pipeline/Control.py->CGATPipelines/Pipeline/Utils.py - - - - -CGATPipelines/Pipeline/Control.py->CGAT/Experiment.py - - - - -CGATPipelines/Pipeline/Control.py->CGAT/IOTools.py - - - - -CGAT/Requirements.py - -CGAT/Requirements.py - - -CGATPipelines/Pipeline/Control.py->CGAT/Requirements.py - - - - -CGATPipelines/Pipeline/Database.py->CGATPipelines/Pipeline/Execution.py - - - - -CGATPipelines/Pipeline/Database.py->CGAT/Experiment.py - - - - -CGATPipelines/Pipeline/Database.py->CGAT/IOTools.py - - - - -CGAT/Database.py - -CGAT/Database.py - - -CGATPipelines/Pipeline/Database.py->CGAT/Database.py - - - - -CGATPipelines/Pipeline/Execution.py->CGATPipelines/Pipeline/Files.py - - - - -CGATPipelines/Pipeline/Execution.py->CGATPipelines/Pipeline/Parameters.py - - - - -CGATPipelines/Pipeline/Execution.py->CGATPipelines/Pipeline/Utils.py - - - - -CGATPipelines/Pipeline/Execution.py->CGAT/Experiment.py - - - - -CGATPipelines/Pipeline/Execution.py->CGAT/IOTools.py - - - - -CGATPipelines/Pipeline/Files.py->CGAT/IOTools.py - - - - -CGATPipelines/Pipeline/Local.py->CGAT/Experiment.py - - - - -CGATPipelines/Pipeline/Local.py->CGAT/IOTools.py - - - - -CGATPipelines/PipelineUCSC.py - -CGATPipelines/PipelineUCSC.py - - -CGATPipelines/Pipeline/Local.py->CGATPipelines/PipelineUCSC.py - - - - -CGATPipelines/Pipeline/Parameters.py->CGATPipelines/Pipeline/Utils.py - - - - -CGATPipelines/Pipeline/Parameters.py->CGAT/Experiment.py - - - - -CGATPipelines/Pipeline/Parameters.py->CGAT/IOTools.py - - - - -CGAT/Requirements.py->CGAT/Experiment.py - - - - -CGAT/Requirements.py->CGAT/IOTools.py - - - - -CGATPipelines/PipelineUCSC.py->CGATPipelines/Pipeline - - - - -CGATPipelines/PipelineUCSC.py->CGAT/Experiment.py - - - - -CGATPipelines/PipelineUCSC.py->CGAT/IOTools.py - - - - -CGAT/GTF.py - -CGAT/GTF.py - - -CGATPipelines/PipelineUCSC.py->CGAT/GTF.py - - - - -CGATPipelines/PipelineChipseq.py - -CGATPipelines/PipelineChipseq.py - - -CGATPipelines/PipelineChipseq.py->CGATPipelines/Pipeline - - - - -CGATPipelines/PipelineChipseq.py->CGAT/Experiment.py - - - - -CGATPipelines/PipelineChipseq.py->CGAT/IOTools.py - - - - -CGAT/BamTools.py - -CGAT/BamTools.py - - -CGATPipelines/PipelineChipseq.py->CGAT/BamTools.py - - - - -CGAT/Bed.py - -CGAT/Bed.py - - -CGATPipelines/PipelineChipseq.py->CGAT/Bed.py - - - - -CGAT/IndexedGenome.py - -CGAT/IndexedGenome.py - - -CGATPipelines/PipelineChipseq.py->CGAT/IndexedGenome.py - - - - -CGAT/WrapperMACS.py - -CGAT/WrapperMACS.py - - -CGATPipelines/PipelineChipseq.py->CGAT/WrapperMACS.py - - - - -CGAT/WrapperZinba.py - -CGAT/WrapperZinba.py - - -CGATPipelines/PipelineChipseq.py->CGAT/WrapperZinba.py - - - - -CGAT/Bed.py->CGAT/IOTools.py - - - - -CGAT/NCL - -CGAT/NCL - - -CGAT/Bed.py->CGAT/NCL - - - - -CGAT/IndexedGenome.py->CGAT/NCL - - - - -CGAT/CSV.py - -CGAT/CSV.py - - -CGAT/WrapperMACS.py->CGAT/CSV.py - - - - -CGATPipelines/PipelineEnrichment.py - -CGATPipelines/PipelineEnrichment.py - - -CGATPipelines/PipelineEnrichment.py->CGATPipelines/Pipeline - - - - -CGATPipelines/PipelineEnrichment.py->CGAT/Experiment.py - - - - -CGATPipelines/PipelineExome.py - -CGATPipelines/PipelineExome.py - - -CGATPipelines/PipelineExome.py->CGATPipelines/Pipeline - - - - -CGATPipelines/PipelineExome.py->CGAT/IOTools.py - - - - -CGATPipelines/PipelineExome.py->CGAT/CSV.py - - - - -CGAT/VCF.py - -CGAT/VCF.py - - -CGATPipelines/PipelineExome.py->CGAT/VCF.py - - - - -CGATPipelines/PipelineGO.py - -CGATPipelines/PipelineGO.py - - -CGATPipelines/PipelineGO.py->CGATPipelines/Pipeline - - - - -CGATPipelines/PipelineGO.py->CGAT/Experiment.py - - - - -CGATPipelines/PipelineGO.py->CGAT/IOTools.py - - - - -CGATPipelines/PipelineGO.py->CGAT/CSV.py - - - - -CGAT/Stats.py - -CGAT/Stats.py - - -CGATPipelines/PipelineGO.py->CGAT/Stats.py - - - - -CGATPipelines/PipelineGeneset.py - -CGATPipelines/PipelineGeneset.py - - -CGATPipelines/PipelineGeneset.py->CGATPipelines/Pipeline - - - - -CGATPipelines/PipelineGeneset.py->CGAT/Experiment.py - - - - -CGATPipelines/PipelineGeneset.py->CGAT/IOTools.py - - - - -CGATPipelines/PipelineGeneset.py->CGAT/GTF.py - - - - -CGAT/IndexedFasta.py - -CGAT/IndexedFasta.py - - -CGATPipelines/PipelineGeneset.py->CGAT/IndexedFasta.py - - - - -CGAT/GTF.py->CGAT/IOTools.py - - - - -CGAT/GTF.py->CGAT/IndexedGenome.py - - - - -CGAT/Intervals.py - -CGAT/Intervals.py - - -CGAT/GTF.py->CGAT/Intervals.py - - - - -CGAT/Genomics.py - -CGAT/Genomics.py - - -CGAT/GTF.py->CGAT/Genomics.py - - - - -CGAT/IndexedFasta.py->CGAT/Experiment.py - - - - -CGAT/AString.py - -CGAT/AString.py - - -CGAT/IndexedFasta.py->CGAT/AString.py - - - - -CGAT/RLE.py - -CGAT/RLE.py - - -CGAT/IndexedFasta.py->CGAT/RLE.py - - - - -CGAT/dictzip.py - -CGAT/dictzip.py - - -CGAT/IndexedFasta.py->CGAT/dictzip.py - - - - -CGATPipelines/PipelineIDR.py - -CGATPipelines/PipelineIDR.py - - -CGATPipelines/PipelineIDR.py->CGATPipelines/Pipeline - - - - -CGATPipelines/PipelineIDR.py->CGAT/IOTools.py - - - - -CGATPipelines/PipelineTracks.py - -CGATPipelines/PipelineTracks.py - - -CGATPipelines/PipelineIDR.py->CGATPipelines/PipelineTracks.py - - - - -CGATPipelines/PipelineIntervalAnnotation.py - -CGATPipelines/PipelineIntervalAnnotation.py - - -CGATPipelines/PipelineIntervalAnnotation.py->CGATPipelines/Pipeline - - - - -CGATPipelines/PipelineIntervalAnnotation.py->CGAT/IOTools.py - - - - -CGATPipelines/PipelineIntervalAnnotation.py->CGAT/Bed.py - - - - -CGATPipelines/PipelineIntervalAnnotation.py->CGAT/IndexedGenome.py - - - - -CGATPipelines/PipelineKEGG.py - -CGATPipelines/PipelineKEGG.py - - -CGATPipelines/PipelineKEGG.py->CGAT/Experiment.py - - - - -CGATPipelines/PipelineKEGG.py->CGAT/IOTools.py - - - - -CGAT/Biomart.py - -CGAT/Biomart.py - - -CGATPipelines/PipelineKEGG.py->CGAT/Biomart.py - - - - -CGAT/Biomart.py->CGAT/IOTools.py - - - - -CGATPipelines/PipelineLncRNA.py - -CGATPipelines/PipelineLncRNA.py - - -CGATPipelines/PipelineLncRNA.py->CGATPipelines/Pipeline - - - - -CGATPipelines/PipelineLncRNA.py->CGAT/Experiment.py - - - - -CGATPipelines/PipelineLncRNA.py->CGAT/IOTools.py - - - - -CGATPipelines/PipelineLncRNA.py->CGAT/IndexedGenome.py - - - - -CGATPipelines/PipelineLncRNA.py->CGAT/GTF.py - - - - -CGATPipelines/PipelineLncRNA.py->CGAT/IndexedFasta.py - - - - -CGATPipelines/PipelineMapping.py - -CGATPipelines/PipelineMapping.py - - -CGATPipelines/PipelineMapping.py->CGATPipelines/Pipeline - - - - -CGATPipelines/PipelineMapping.py->CGAT/Experiment.py - - - - -CGATPipelines/PipelineMapping.py->CGAT/IOTools.py - - - - -CGATPipelines/PipelineMapping.py->CGATPipelines/PipelineGeneset.py - - - - -CGATPipelines/PipelineMapping.py->CGAT/GTF.py - - - - -CGATPipelines/PipelineMapping.py->CGAT/IndexedFasta.py - - - - -CGAT/Fastq.py - -CGAT/Fastq.py - - -CGATPipelines/PipelineMapping.py->CGAT/Fastq.py - - - - -CGAT/Sra.py - -CGAT/Sra.py - - -CGATPipelines/PipelineMapping.py->CGAT/Sra.py - - - - -CGAT/Fastq.py->CGAT/Experiment.py - - - - -CGAT/Fastq.py->CGAT/IOTools.py - - - - -CGAT/Sra.py->CGAT/Experiment.py - - - - -CGAT/Sra.py->CGAT/IOTools.py - - - - -CGAT/Sra.py->CGAT/Fastq.py - - - - -CGATPipelines/PipelineMappingQC.py - -CGATPipelines/PipelineMappingQC.py - - -CGATPipelines/PipelineMappingQC.py->CGATPipelines/Pipeline - - - - -CGATPipelines/PipelineMappingQC.py->CGAT/Experiment.py - - - - -CGATPipelines/PipelineMappingQC.py->CGAT/IOTools.py - - - - -CGATPipelines/PipelineMappingQC.py->CGAT/BamTools.py - - - - -CGATPipelines/PipelineMedip.py - -CGATPipelines/PipelineMedip.py - - -CGATPipelines/PipelineMedip.py->CGATPipelines/Pipeline - - - - -CGATPipelines/PipelineMedip.py->CGAT/Experiment.py - - - - -CGATPipelines/PipelineMedip.py->CGAT/IOTools.py - - - - -CGATPipelines/PipelineMedip.py->CGAT/Database.py - - - - -CGATPipelines/PipelineMetagenomeBenchmark.py - -CGATPipelines/PipelineMetagenomeBenchmark.py - - -CGATPipelines/PipelineMetagenomeBenchmark.py->CGATPipelines/Pipeline - - - - -CGATPipelines/PipelineMetagenomeBenchmark.py->CGAT/Experiment.py - - - - -CGATPipelines/PipelineMetagenomeBenchmark.py->CGAT/IOTools.py - - - - -CGATPipelines/PipelineMetagenomeBenchmark.py->CGAT/Fastq.py - - - - -CGAT/FastaIterator.py - -CGAT/FastaIterator.py - - -CGATPipelines/PipelineMetagenomeBenchmark.py->CGAT/FastaIterator.py - - - - -CGATPipelines/PipelineMetagenomeCommunities.py - -CGATPipelines/PipelineMetagenomeCommunities.py - - -CGATPipelines/PipelineMetagenomeCommunities.py->CGATPipelines/Pipeline - - - - -CGATPipelines/PipelineMetagenomeCommunities.py->CGAT/Experiment.py - - - - -CGATPipelines/PipelineMetagenomeCommunities.py->CGAT/IOTools.py - - - - -CGATPipelines/PipelineMetagenomeCommunities.py->CGAT/GTF.py - - - - -CGATPipelines/PipelineMotifs.py - -CGATPipelines/PipelineMotifs.py - - -CGATPipelines/PipelineMotifs.py->CGATPipelines/Pipeline - - - - -CGATPipelines/PipelineMotifs.py->CGAT/Experiment.py - - - - -CGATPipelines/PipelineMotifs.py->CGAT/IOTools.py - - - - -CGATPipelines/PipelineMotifs.py->CGAT/Bed.py - - - - -CGATPipelines/PipelineMotifs.py->CGAT/IndexedFasta.py - - - - -CGATPipelines/PipelineMotifs.py->CGAT/FastaIterator.py - - - - -CGAT/Bioprospector.py - -CGAT/Bioprospector.py - - -CGATPipelines/PipelineMotifs.py->CGAT/Bioprospector.py - - - - -CGAT/Glam2Scan.py - -CGAT/Glam2Scan.py - - -CGATPipelines/PipelineMotifs.py->CGAT/Glam2Scan.py - - - - -CGAT/MAST.py - -CGAT/MAST.py - - -CGATPipelines/PipelineMotifs.py->CGAT/MAST.py - - - - -CGAT/Masker.py - -CGAT/Masker.py - - -CGATPipelines/PipelineMotifs.py->CGAT/Masker.py - - - - -CGAT/Bioprospector.py->CGAT/MAST.py - - - - -CGAT/Masker.py->CGAT/Experiment.py - - - - -CGAT/Masker.py->CGAT/FastaIterator.py - - - - -CGAT/Masker.py->CGAT/Genomics.py - - - - -CGATPipelines/PipelinePeakcalling.py - -CGATPipelines/PipelinePeakcalling.py - - -CGATPipelines/PipelinePeakcalling.py->CGATPipelines/Pipeline - - - - -CGATPipelines/PipelinePeakcalling.py->CGAT/Experiment.py - - - - -CGATPipelines/PipelinePeakcalling.py->CGAT/IOTools.py - - - - -CGATPipelines/PipelinePeakcalling.py->CGAT/BamTools.py - - - - -CGATPipelines/PipelinePeakcalling.py->CGAT/Bed.py - - - - -CGATPipelines/PipelinePeakcalling.py->CGAT/IndexedGenome.py - - - - -CGATPipelines/PipelinePeakcalling.py->CGAT/WrapperMACS.py - - - - -CGATPipelines/PipelinePreprocess.py - -CGATPipelines/PipelinePreprocess.py - - -CGATPipelines/PipelinePreprocess.py->CGATPipelines/Pipeline - - - - -CGATPipelines/PipelinePreprocess.py->CGAT/IOTools.py - - - - -CGATPipelines/PipelinePreprocess.py->CGATPipelines/PipelineTracks.py - - - - -CGATPipelines/PipelinePreprocess.py->CGATPipelines/PipelineMapping.py - - - - -CGATPipelines/PipelinePreprocess.py->CGAT/Fastq.py - - - - -CGATPipelines/PipelinePreprocess.py->CGAT/Sra.py - - - - -CGATPipelines/PipelineReadqc.py - -CGATPipelines/PipelineReadqc.py - - -CGATPipelines/PipelineReadqc.py->CGATPipelines/Pipeline - - - - -CGATPipelines/PipelineReadqc.py->CGAT/IOTools.py - - - - -CGAT/CSV2DB.py - -CGAT/CSV2DB.py - - -CGATPipelines/PipelineReadqc.py->CGAT/CSV2DB.py - - - - -CGAT/CSV2DB.py->CGAT/Experiment.py - - - - -CGAT/CSV2DB.py->CGAT/IOTools.py - - - - -CGAT/CSV2DB.py->CGAT/CSV.py - - - - -CGATPipelines/PipelineRnaseq.py - -CGATPipelines/PipelineRnaseq.py - - -CGATPipelines/PipelineRnaseq.py->CGATPipelines/Pipeline - - - - -CGATPipelines/PipelineRnaseq.py->CGAT/Experiment.py - - - - -CGATPipelines/PipelineRnaseq.py->CGAT/IOTools.py - - - - -CGATPipelines/PipelineRnaseq.py->CGAT/Database.py - - - - -CGATPipelines/PipelineRnaseq.py->CGAT/BamTools.py - - - - -CGATPipelines/PipelineRnaseq.py->CGAT/CSV.py - - - - -CGATPipelines/PipelineRnaseq.py->CGAT/GTF.py - - - - -CGAT/Expression.py - -CGAT/Expression.py - - -CGATPipelines/PipelineRnaseq.py->CGAT/Expression.py - - - - -CGAT/Expression.py->CGAT/Experiment.py - - - - -CGAT/Expression.py->CGAT/IOTools.py - - - - -CGAT/Expression.py->CGAT/Stats.py - - - - -CGATPipelines/PipelineRrbs.py - -CGATPipelines/PipelineRrbs.py - - -CGATPipelines/PipelineRrbs.py->CGATPipelines/Pipeline - - - - -CGATPipelines/PipelineRrbs.py->CGAT/Experiment.py - - - - -CGATPipelines/PipelineRrbs.py->CGAT/IOTools.py - - - - -CGATPipelines/PipelineRrbs.py->CGAT/FastaIterator.py - - - - -CGATPipelines/PipelineTimeseries.py - -CGATPipelines/PipelineTimeseries.py - - -CGATPipelines/PipelineTimeseries.py->CGAT/Experiment.py - - - - -CGAT/Timeseries - -CGAT/Timeseries - - -CGATPipelines/PipelineTimeseries.py->CGAT/Timeseries - - - - -CGAT/Timeseries->CGAT/Experiment.py - - - - -CGAT/Timeseries/cmetrics.so - -CGAT/Timeseries/cmetrics.so - - -CGAT/Timeseries->CGAT/Timeseries/cmetrics.so - - - - -CGATPipelines/PipelineTranscriptDiffExpression.py - -CGATPipelines/PipelineTranscriptDiffExpression.py - - -CGATPipelines/PipelineTranscriptDiffExpression.py->CGATPipelines/Pipeline - - - - -CGATPipelines/PipelineTranscriptDiffExpression.py->CGAT/Experiment.py - - - - -CGATPipelines/PipelineTranscriptDiffExpression.py->CGAT/IOTools.py - - - - -CGATPipelines/PipelineTranscriptDiffExpression.py->CGAT/Expression.py - - - - -CGAT/Counts.py - -CGAT/Counts.py - - -CGATPipelines/PipelineTranscriptDiffExpression.py->CGAT/Counts.py - - - - -CGAT/Counts.py->CGAT/Experiment.py - - - - -CGAT/Counts.py->CGAT/IOTools.py - - - - -CGATPipelines/PipelineTransfacMatch.py - -CGATPipelines/PipelineTransfacMatch.py - - -CGATPipelines/PipelineTransfacMatch.py->CGATPipelines/Pipeline - - - - -CGATPipelines/PipelineTransfacMatch.py->CGAT/Experiment.py - - - - -CGATPipelines/PipelineTransfacMatch.py->CGAT/IOTools.py - - - - -CGATPipelines/PipelineTransfacMatch.py->CGAT/FastaIterator.py - - - - -CGATPipelines/PipelineWindows.py - -CGATPipelines/PipelineWindows.py - - -CGATPipelines/PipelineWindows.py->CGATPipelines/Pipeline - - - - -CGATPipelines/PipelineWindows.py->CGAT/Experiment.py - - - - -CGATPipelines/PipelineWindows.py->CGAT/IOTools.py - - - - -CGATPipelines/PipelineWindows.py->CGAT/BamTools.py - - - - -CGATPipelines/PipelineWindows.py->CGAT/Bed.py - - - - -CGATPipelines/PipelineWindows.py->CGAT/Expression.py - - - - -CGATPipelines/metapipeline_medip.py - -CGATPipelines/metapipeline_medip.py - - -CGATPipelines/metapipeline_medip.py->CGATPipelines/Pipeline - - - - -CGATPipelines/metapipeline_medip.py->CGAT/Experiment.py - - - - -CGATPipelines/metapipeline_medip.py->CGATPipelines/PipelineTracks.py - - - - -CGATPipelines/pipeline_ancestral_repeats.py - -CGATPipelines/pipeline_ancestral_repeats.py - - -CGATPipelines/pipeline_ancestral_repeats.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_ancestral_repeats.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_annotations.py - -CGATPipelines/pipeline_annotations.py - - -CGATPipelines/pipeline_annotations.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_annotations.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_annotations.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_annotations.py->CGAT/Database.py - - - - -CGATPipelines/pipeline_annotations.py->CGATPipelines/PipelineUCSC.py - - - - -CGATPipelines/pipeline_annotations.py->CGATPipelines/PipelineGO.py - - - - -CGATPipelines/pipeline_annotations.py->CGATPipelines/PipelineGeneset.py - - - - -CGATPipelines/pipeline_annotations.py->CGAT/GTF.py - - - - -CGATPipelines/pipeline_annotations.py->CGAT/IndexedFasta.py - - - - -CGATPipelines/pipeline_annotations.py->CGATPipelines/PipelineKEGG.py - - - - -CGATPipelines/pipeline_annotations.py->CGAT/Biomart.py - - - - -CGATPipelines/pipeline_annotations.py->CGAT/Intervals.py - - - - -CGATPipelines/pipeline_benchmark_rnaseqmappers.py - -CGATPipelines/pipeline_benchmark_rnaseqmappers.py - - -CGATPipelines/pipeline_benchmark_rnaseqmappers.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_benchmark_rnaseqmappers.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_benchmark_rnaseqmappers.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_benchmark_rnaseqmappers.py->CGAT/Database.py - - - - -CGATPipelines/pipeline_benchmark_rnaseqmappers.py->CGATPipelines/PipelineTracks.py - - - - -CGATPipelines/pipeline_capseq.py - -CGATPipelines/pipeline_capseq.py - - -CGATPipelines/pipeline_capseq.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_capseq.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_capseq.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_capseq.py->CGATPipelines/PipelineChipseq.py - - - - -CGATPipelines/pipeline_capseq.py->CGAT/Bed.py - - - - -CGATPipelines/pipeline_capseq.py->CGAT/IndexedGenome.py - - - - -CGATPipelines/pipeline_capseq.py->CGAT/GTF.py - - - - -CGATPipelines/pipeline_capseq.py->CGAT/IndexedFasta.py - - - - -CGATPipelines/pipeline_capseq.py->CGATPipelines/PipelineTracks.py - - - - -CGATPipelines/pipeline_capseq.py->CGATPipelines/PipelineMapping.py - - - - -CGATPipelines/pipeline_capseq.py->CGAT/FastaIterator.py - - - - -CGATPipelines/pipeline_capseq.py->CGAT/MAST.py - - - - -CGATPipelines/pipeline_capseq.py->CGAT/Masker.py - - - - -CGATPipelines/pipeline_capseq.py->CGAT/Genomics.py - - - - -CGAT/Genomics.py->CGAT/AString.py - - - - -CGATPipelines/pipeline_chains.py - -CGATPipelines/pipeline_chains.py - - -CGATPipelines/pipeline_chains.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_chains.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_chains.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_chains.py->CGAT/IndexedFasta.py - - - - -CGATPipelines/pipeline_chipseq.py - -CGATPipelines/pipeline_chipseq.py - - -CGATPipelines/pipeline_chipseq.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_chipseq.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_chipseq.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_chipseq.py->CGAT/Database.py - - - - -CGATPipelines/pipeline_chipseq.py->CGATPipelines/PipelineChipseq.py - - - - -CGATPipelines/pipeline_chipseq.py->CGAT/Bed.py - - - - -CGATPipelines/pipeline_chipseq.py->CGAT/IndexedGenome.py - - - - -CGATPipelines/pipeline_chipseq.py->CGATPipelines/PipelineTracks.py - - - - -CGATPipelines/pipeline_chipseq.py->CGATPipelines/PipelineMapping.py - - - - -CGATPipelines/pipeline_chipseq.py->CGATPipelines/PipelineMotifs.py - - - - -CGATPipelines/pipeline_cufflinks_optimization.py - -CGATPipelines/pipeline_cufflinks_optimization.py - - -CGATPipelines/pipeline_cufflinks_optimization.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_cufflinks_optimization.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_cufflinks_optimization.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_cufflinks_optimization.py->CGAT/GTF.py - - - - -CGATPipelines/pipeline_docs - -CGATPipelines/pipeline_docs - - -CGATPipelines/pipeline_docs/pipeline_ancestral_repeats - -CGATPipelines/pipeline_docs/pipeline_ancestral_repeats - - -CGATPipelines/pipeline_docs/pipeline_ancestral_repeats/trackers - -CGATPipelines/pipeline_docs/pipeline_ancestral_repeats/trackers - - -CGATPipelines/pipeline_docs/pipeline_ancestral_repeats->CGATPipelines/pipeline_docs/pipeline_ancestral_repeats/trackers - - - - -CGATPipelines/pipeline_docs/pipeline_ancestral_repeats/trackers/TemplateReport.py - -CGATPipelines/pipeline_docs/pipeline_ancestral_repeats/trackers/TemplateReport.py - - -CGATPipelines/pipeline_docs/pipeline_annotations - -CGATPipelines/pipeline_docs/pipeline_annotations - - -CGATPipelines/pipeline_docs/pipeline_annotations/trackers - -CGATPipelines/pipeline_docs/pipeline_annotations/trackers - - -CGATPipelines/pipeline_docs/pipeline_annotations->CGATPipelines/pipeline_docs/pipeline_annotations/trackers - - - - -CGATPipelines/pipeline_docs/pipeline_annotations/trackers/AnnotationReport.py - -CGATPipelines/pipeline_docs/pipeline_annotations/trackers/AnnotationReport.py - - -CGATPipelines/pipeline_docs/pipeline_annotations/trackers/Status.py - -CGATPipelines/pipeline_docs/pipeline_annotations/trackers/Status.py - - -CGATPipelines/pipeline_docs/pipeline_annotations/trackers/Status.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_docs/pipeline_annotations/trackers/Status.py->CGATPipelines/pipeline_docs/pipeline_annotations/trackers/AnnotationReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_benchmark_rnaseqmappers - -CGATPipelines/pipeline_docs/pipeline_benchmark_rnaseqmappers - - -CGATPipelines/pipeline_docs/pipeline_benchmark_rnaseqmappers/trackers - -CGATPipelines/pipeline_docs/pipeline_benchmark_rnaseqmappers/trackers - - -CGATPipelines/pipeline_docs/pipeline_benchmark_rnaseqmappers->CGATPipelines/pipeline_docs/pipeline_benchmark_rnaseqmappers/trackers - - - - -CGATPipelines/pipeline_docs/pipeline_benchmark_rnaseqmappers/trackers/BenchmarkReport.py - -CGATPipelines/pipeline_docs/pipeline_benchmark_rnaseqmappers/trackers/BenchmarkReport.py - - -CGATPipelines/pipeline_docs/pipeline_benchmark_rnaseqmappers/trackers/Mapping.py - -CGATPipelines/pipeline_docs/pipeline_benchmark_rnaseqmappers/trackers/Mapping.py - - -CGATPipelines/pipeline_docs/pipeline_benchmark_rnaseqmappers/trackers/Mapping.py->CGATPipelines/pipeline_docs/pipeline_benchmark_rnaseqmappers/trackers/BenchmarkReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_chains - -CGATPipelines/pipeline_docs/pipeline_chains - - -CGATPipelines/pipeline_docs/pipeline_chains/trackers - -CGATPipelines/pipeline_docs/pipeline_chains/trackers - - -CGATPipelines/pipeline_docs/pipeline_chains->CGATPipelines/pipeline_docs/pipeline_chains/trackers - - - - -CGATPipelines/pipeline_docs/pipeline_chains/trackers/TemplateReport.py - -CGATPipelines/pipeline_docs/pipeline_chains/trackers/TemplateReport.py - - -CGATPipelines/pipeline_docs/pipeline_chipseq - -CGATPipelines/pipeline_docs/pipeline_chipseq - - -CGATPipelines/pipeline_docs/pipeline_genesets - -CGATPipelines/pipeline_docs/pipeline_genesets - - -CGATPipelines/pipeline_docs/pipeline_genesets/trackers - -CGATPipelines/pipeline_docs/pipeline_genesets/trackers - - -CGATPipelines/pipeline_docs/pipeline_genesets->CGATPipelines/pipeline_docs/pipeline_genesets/trackers - - - - -CGATPipelines/pipeline_docs/pipeline_genesets/trackers/Biases.py - -CGATPipelines/pipeline_docs/pipeline_genesets/trackers/Biases.py - - -CGATPipelines/pipeline_docs/pipeline_genesets/trackers/GeneSetsReport.py - -CGATPipelines/pipeline_docs/pipeline_genesets/trackers/GeneSetsReport.py - - -CGATPipelines/pipeline_docs/pipeline_genesets/trackers/Biases.py->CGATPipelines/pipeline_docs/pipeline_genesets/trackers/GeneSetsReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_genesets/trackers/Genelists.py - -CGATPipelines/pipeline_docs/pipeline_genesets/trackers/Genelists.py - - -CGATPipelines/pipeline_docs/pipeline_genesets/trackers/Genelists.py->CGATPipelines/pipeline_docs/pipeline_genesets/trackers/GeneSetsReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_genesets/trackers/Hypergeometric.py - -CGATPipelines/pipeline_docs/pipeline_genesets/trackers/Hypergeometric.py - - -CGATPipelines/pipeline_docs/pipeline_genesets/trackers/Hypergeometric.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_docs/pipeline_genesets/trackers/Hypergeometric.py->CGATPipelines/pipeline_docs/pipeline_genesets/trackers/GeneSetsReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_genesets/trackers/Status.py - -CGATPipelines/pipeline_docs/pipeline_genesets/trackers/Status.py - - -CGATPipelines/pipeline_docs/pipeline_genesets/trackers/Status.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_docs/pipeline_genesets/trackers/Status.py->CGATPipelines/pipeline_docs/pipeline_genesets/trackers/GeneSetsReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_idr - -CGATPipelines/pipeline_docs/pipeline_idr - - -CGATPipelines/pipeline_docs/pipeline_intervals - -CGATPipelines/pipeline_docs/pipeline_intervals - - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers - - -CGATPipelines/pipeline_docs/pipeline_intervals->CGATPipelines/pipeline_docs/pipeline_intervals/trackers - - - - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/Annotations.py - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/Annotations.py - - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/IntervalReport.py - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/IntervalReport.py - - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/Annotations.py->CGATPipelines/pipeline_docs/pipeline_intervals/trackers/IntervalReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/IntervalReport.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/IntervalReport.py->CGAT/Stats.py - - - - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/Binding.py - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/Binding.py - - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/Binding.py->CGATPipelines/pipeline_docs/pipeline_intervals/trackers/IntervalReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/Context.py - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/Context.py - - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/Context.py->CGATPipelines/pipeline_docs/pipeline_intervals/trackers/IntervalReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/Gat.py - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/Gat.py - - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/Gat.py->CGATPipelines/pipeline_docs/pipeline_intervals/trackers/IntervalReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/GeneProfile.py - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/GeneProfile.py - - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/GeneProfile.py->CGATPipelines/pipeline_docs/pipeline_intervals/trackers/Annotations.py - - - - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/GeneProfile.py->CGATPipelines/pipeline_docs/pipeline_intervals/trackers/IntervalReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/Intervals.py - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/Intervals.py - - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/Intervals.py->CGATPipelines/pipeline_docs/pipeline_intervals/trackers/IntervalReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/Motifs.py - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/Motifs.py - - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/Motifs.py->CGATPipelines/pipeline_docs/pipeline_intervals/trackers/IntervalReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/Nucleotide.py - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/Nucleotide.py - - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/Nucleotide.py->CGATPipelines/pipeline_docs/pipeline_intervals/trackers/Annotations.py - - - - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/Nucleotide.py->CGATPipelines/pipeline_docs/pipeline_intervals/trackers/IntervalReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/Overlaps.py - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/Overlaps.py - - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/Overlaps.py->CGATPipelines/pipeline_docs/pipeline_intervals/trackers/IntervalReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/Peaks.py - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/Peaks.py - - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/Peaks.py->CGATPipelines/pipeline_docs/pipeline_intervals/trackers/IntervalReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/TSS.py - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/TSS.py - - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/TSS.py->CGATPipelines/pipeline_docs/pipeline_intervals/trackers/Annotations.py - - - - -CGATPipelines/pipeline_docs/pipeline_intervals/trackers/TSS.py->CGATPipelines/pipeline_docs/pipeline_intervals/trackers/IntervalReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_mapping - -CGATPipelines/pipeline_docs/pipeline_mapping - - -CGATPipelines/pipeline_docs/pipeline_mapping/trackers - -CGATPipelines/pipeline_docs/pipeline_mapping/trackers - - -CGATPipelines/pipeline_docs/pipeline_mapping->CGATPipelines/pipeline_docs/pipeline_mapping/trackers - - - - -CGATPipelines/pipeline_docs/pipeline_mapping/trackers/Mapping.py - -CGATPipelines/pipeline_docs/pipeline_mapping/trackers/Mapping.py - - -CGATPipelines/pipeline_docs/pipeline_mapping/trackers/MappingReport.py - -CGATPipelines/pipeline_docs/pipeline_mapping/trackers/MappingReport.py - - -CGATPipelines/pipeline_docs/pipeline_mapping/trackers/Mapping.py->CGATPipelines/pipeline_docs/pipeline_mapping/trackers/MappingReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_mapping/trackers/QC.py - -CGATPipelines/pipeline_docs/pipeline_mapping/trackers/QC.py - - -CGATPipelines/pipeline_docs/pipeline_mapping/trackers/QC.py->CGATPipelines/pipeline_docs/pipeline_mapping/trackers/MappingReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_mapping/trackers/Reference.py - -CGATPipelines/pipeline_docs/pipeline_mapping/trackers/Reference.py - - -CGATPipelines/pipeline_docs/pipeline_mapping/trackers/Reference.py->CGATPipelines/pipeline_docs/pipeline_mapping/trackers/MappingReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_mapping/trackers/Status.py - -CGATPipelines/pipeline_docs/pipeline_mapping/trackers/Status.py - - -CGATPipelines/pipeline_docs/pipeline_mapping/trackers/Validation.py - -CGATPipelines/pipeline_docs/pipeline_mapping/trackers/Validation.py - - -CGATPipelines/pipeline_docs/pipeline_mapping/trackers/Validation.py->CGATPipelines/pipeline_docs/pipeline_mapping/trackers/MappingReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_motifs - -CGATPipelines/pipeline_docs/pipeline_motifs - - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers - - -CGATPipelines/pipeline_docs/pipeline_motifs->CGATPipelines/pipeline_docs/pipeline_motifs/trackers - - - - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers/Annotations.py - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers/Annotations.py - - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers/IntervalReport.py - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers/IntervalReport.py - - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers/Annotations.py->CGATPipelines/pipeline_docs/pipeline_motifs/trackers/IntervalReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers/Binding.py - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers/Binding.py - - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers/Binding.py->CGATPipelines/pipeline_docs/pipeline_motifs/trackers/IntervalReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers/Context.py - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers/Context.py - - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers/Context.py->CGATPipelines/pipeline_docs/pipeline_motifs/trackers/IntervalReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers/Gat.py - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers/Gat.py - - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers/Gat.py->CGATPipelines/pipeline_docs/pipeline_motifs/trackers/IntervalReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers/GeneProfile.py - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers/GeneProfile.py - - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers/GeneProfile.py->CGATPipelines/pipeline_docs/pipeline_motifs/trackers/Annotations.py - - - - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers/GeneProfile.py->CGATPipelines/pipeline_docs/pipeline_motifs/trackers/IntervalReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers/Intervals.py - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers/Intervals.py - - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers/Intervals.py->CGATPipelines/pipeline_docs/pipeline_motifs/trackers/IntervalReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers/Motifs.py - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers/Motifs.py - - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers/Motifs.py->CGATPipelines/pipeline_docs/pipeline_motifs/trackers/IntervalReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers/Nucleotide.py - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers/Nucleotide.py - - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers/Nucleotide.py->CGATPipelines/pipeline_docs/pipeline_motifs/trackers/Annotations.py - - - - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers/Nucleotide.py->CGATPipelines/pipeline_docs/pipeline_motifs/trackers/IntervalReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers/Peaks.py - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers/Peaks.py - - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers/Peaks.py->CGATPipelines/pipeline_docs/pipeline_motifs/trackers/IntervalReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers/TSS.py - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers/TSS.py - - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers/TSS.py->CGATPipelines/pipeline_docs/pipeline_motifs/trackers/Annotations.py - - - - -CGATPipelines/pipeline_docs/pipeline_motifs/trackers/TSS.py->CGATPipelines/pipeline_docs/pipeline_motifs/trackers/IntervalReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_peakcalling - -CGATPipelines/pipeline_docs/pipeline_peakcalling - - -CGATPipelines/pipeline_docs/pipeline_readqc - -CGATPipelines/pipeline_docs/pipeline_readqc - - -CGATPipelines/pipeline_docs/pipeline_readqc/trackers - -CGATPipelines/pipeline_docs/pipeline_readqc/trackers - - -CGATPipelines/pipeline_docs/pipeline_readqc->CGATPipelines/pipeline_docs/pipeline_readqc/trackers - - - - -CGATPipelines/pipeline_docs/pipeline_readqc/trackers/ReadQuality.py - -CGATPipelines/pipeline_docs/pipeline_readqc/trackers/ReadQuality.py - - -CGATPipelines/pipeline_docs/pipeline_readqc/trackers/ReadqcReport.py - -CGATPipelines/pipeline_docs/pipeline_readqc/trackers/ReadqcReport.py - - -CGATPipelines/pipeline_docs/pipeline_readqc/trackers/ReadQuality.py->CGATPipelines/pipeline_docs/pipeline_readqc/trackers/ReadqcReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_readqc/trackers/ReadqcReport.py->CGATPipelines/PipelineTracks.py - - - - -CGATPipelines/pipeline_docs/pipeline_readqc/trackers/Status.py - -CGATPipelines/pipeline_docs/pipeline_readqc/trackers/Status.py - - -CGATPipelines/pipeline_docs/pipeline_rnaseq - -CGATPipelines/pipeline_docs/pipeline_rnaseq - - -CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers - -CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers - - -CGATPipelines/pipeline_docs/pipeline_rnaseq->CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers - - - - -CGATPipelines/pipeline_docs/pipeline_rnaseq/conf.py - -CGATPipelines/pipeline_docs/pipeline_rnaseq/conf.py - - -CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/DifferentialExpression.py - -CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/DifferentialExpression.py - - -CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/RnaseqReport.py - -CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/RnaseqReport.py - - -CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/DifferentialExpression.py->CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/RnaseqReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/Expression.py - -CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/Expression.py - - -CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/Expression.py->CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/RnaseqReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/Genemodels.py - -CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/Genemodels.py - - -CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/Genemodels.py->CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/RnaseqReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/Lincrna.py - -CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/Lincrna.py - - -CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/Lincrna.py->CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/RnaseqReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/Mapping.py - -CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/Mapping.py - - -CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/Mapping.py->CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/RnaseqReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/QC.py - -CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/QC.py - - -CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/QC.py->CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/RnaseqReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/Reference.py - -CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/Reference.py - - -CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/Reference.py->CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/RnaseqReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/Status.py - -CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/Status.py - - -CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/Status.py->CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/RnaseqReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/Validation.py - -CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/Validation.py - - -CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/Validation.py->CGATPipelines/pipeline_docs/pipeline_rnaseq/trackers/RnaseqReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_rnaseqdiffexpression - -CGATPipelines/pipeline_docs/pipeline_rnaseqdiffexpression - - -CGATPipelines/pipeline_docs/pipeline_rnaseqdiffexpression/trackers - -CGATPipelines/pipeline_docs/pipeline_rnaseqdiffexpression/trackers - - -CGATPipelines/pipeline_docs/pipeline_rnaseqdiffexpression->CGATPipelines/pipeline_docs/pipeline_rnaseqdiffexpression/trackers - - - - -CGATPipelines/pipeline_docs/pipeline_rnaseqdiffexpression/trackers/DifferentialExpression.py - -CGATPipelines/pipeline_docs/pipeline_rnaseqdiffexpression/trackers/DifferentialExpression.py - - -CGATPipelines/pipeline_docs/pipeline_rnaseqdiffexpression/trackers/RnaseqDiffExpressionReport.py - -CGATPipelines/pipeline_docs/pipeline_rnaseqdiffexpression/trackers/RnaseqDiffExpressionReport.py - - -CGATPipelines/pipeline_docs/pipeline_rnaseqdiffexpression/trackers/DifferentialExpression.py->CGATPipelines/pipeline_docs/pipeline_rnaseqdiffexpression/trackers/RnaseqDiffExpressionReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_rnaseqdiffexpression/trackers/RnaseqDiffExpressionReport.py->CGATPipelines/PipelineGeneset.py - - - - -CGATPipelines/pipeline_docs/pipeline_rnaseqdiffexpression/trackers/RnaseqDiffExpressionReport.py->CGATPipelines/PipelineTracks.py - - - - -CGATPipelines/pipeline_docs/pipeline_rnaseqdiffexpression/trackers/Expression.py - -CGATPipelines/pipeline_docs/pipeline_rnaseqdiffexpression/trackers/Expression.py - - -CGATPipelines/pipeline_docs/pipeline_rnaseqdiffexpression/trackers/Expression.py->CGATPipelines/pipeline_docs/pipeline_rnaseqdiffexpression/trackers/RnaseqDiffExpressionReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_rnaseqdiffexpression/trackers/Genelists.py - -CGATPipelines/pipeline_docs/pipeline_rnaseqdiffexpression/trackers/Genelists.py - - -CGATPipelines/pipeline_docs/pipeline_rnaseqdiffexpression/trackers/Genelists.py->CGATPipelines/pipeline_docs/pipeline_rnaseqdiffexpression/trackers/RnaseqDiffExpressionReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_rnaseqdiffexpression/trackers/Status.py - -CGATPipelines/pipeline_docs/pipeline_rnaseqdiffexpression/trackers/Status.py - - -CGATPipelines/pipeline_docs/pipeline_rnaseqdiffexpression/trackers/Status.py->CGATPipelines/pipeline_docs/pipeline_rnaseqdiffexpression/trackers/RnaseqDiffExpressionReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_rnaseqdiffexpression/trackers/TagCounting.py - -CGATPipelines/pipeline_docs/pipeline_rnaseqdiffexpression/trackers/TagCounting.py - - -CGATPipelines/pipeline_docs/pipeline_rnaseqdiffexpression/trackers/TagCounting.py->CGATPipelines/pipeline_docs/pipeline_rnaseqdiffexpression/trackers/RnaseqDiffExpressionReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_rnaseqqc - -CGATPipelines/pipeline_docs/pipeline_rnaseqqc - - -CGATPipelines/pipeline_docs/pipeline_rnaseqqc/trackers - -CGATPipelines/pipeline_docs/pipeline_rnaseqqc/trackers - - -CGATPipelines/pipeline_docs/pipeline_rnaseqqc->CGATPipelines/pipeline_docs/pipeline_rnaseqqc/trackers - - - - -CGATPipelines/pipeline_docs/pipeline_rnaseqqc/trackers/RnaseqqcReport.py - -CGATPipelines/pipeline_docs/pipeline_rnaseqqc/trackers/RnaseqqcReport.py - - -CGATPipelines/pipeline_docs/pipeline_rnaseqqc/trackers/RnaseqqcReport.py->CGATPipelines/PipelineTracks.py - - - - -CGATPipelines/pipeline_docs/pipeline_rnaseqtranscripts - -CGATPipelines/pipeline_docs/pipeline_rnaseqtranscripts - - -CGATPipelines/pipeline_docs/pipeline_rnaseqtranscripts/trackers - -CGATPipelines/pipeline_docs/pipeline_rnaseqtranscripts/trackers - - -CGATPipelines/pipeline_docs/pipeline_rnaseqtranscripts->CGATPipelines/pipeline_docs/pipeline_rnaseqtranscripts/trackers - - - - -CGATPipelines/pipeline_docs/pipeline_rnaseqtranscripts/trackers/Expression.py - -CGATPipelines/pipeline_docs/pipeline_rnaseqtranscripts/trackers/Expression.py - - -CGATPipelines/pipeline_docs/pipeline_rnaseqtranscripts/trackers/Genemodels.py - -CGATPipelines/pipeline_docs/pipeline_rnaseqtranscripts/trackers/Genemodels.py - - -CGATPipelines/pipeline_docs/pipeline_rnaseqtranscripts/trackers/RnaseqTranscriptsReport.py - -CGATPipelines/pipeline_docs/pipeline_rnaseqtranscripts/trackers/RnaseqTranscriptsReport.py - - -CGATPipelines/pipeline_docs/pipeline_rnaseqtranscripts/trackers/Genemodels.py->CGATPipelines/pipeline_docs/pipeline_rnaseqtranscripts/trackers/RnaseqTranscriptsReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_rnaseqtranscripts/trackers/RnaseqTranscriptsReport.py->CGATPipelines/PipelineTracks.py - - - - -CGATPipelines/pipeline_docs/pipeline_rnaseqtranscripts/trackers/Lincrna.py - -CGATPipelines/pipeline_docs/pipeline_rnaseqtranscripts/trackers/Lincrna.py - - -CGATPipelines/pipeline_docs/pipeline_rnaseqtranscripts/trackers/Lincrna.py->CGATPipelines/pipeline_docs/pipeline_rnaseqtranscripts/trackers/RnaseqTranscriptsReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_rnaseqtranscripts/trackers/QC.py - -CGATPipelines/pipeline_docs/pipeline_rnaseqtranscripts/trackers/QC.py - - -CGATPipelines/pipeline_docs/pipeline_rnaseqtranscripts/trackers/QC.py->CGATPipelines/pipeline_docs/pipeline_rnaseqtranscripts/trackers/RnaseqTranscriptsReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_rnaseqtranscripts/trackers/Reference.py - -CGATPipelines/pipeline_docs/pipeline_rnaseqtranscripts/trackers/Reference.py - - -CGATPipelines/pipeline_docs/pipeline_rnaseqtranscripts/trackers/Reference.py->CGAT/Stats.py - - - - -CGATPipelines/pipeline_docs/pipeline_rnaseqtranscripts/trackers/Reference.py->CGATPipelines/pipeline_docs/pipeline_rnaseqtranscripts/trackers/RnaseqTranscriptsReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_rnaseqtranscripts/trackers/Status.py - -CGATPipelines/pipeline_docs/pipeline_rnaseqtranscripts/trackers/Status.py - - -CGATPipelines/pipeline_docs/pipeline_rnaseqtranscripts/trackers/Status.py->CGATPipelines/pipeline_docs/pipeline_rnaseqtranscripts/trackers/RnaseqTranscriptsReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_rnaseqtranscripts/trackers/Validation.py - -CGATPipelines/pipeline_docs/pipeline_rnaseqtranscripts/trackers/Validation.py - - -CGATPipelines/pipeline_docs/pipeline_rnaseqtranscripts/trackers/Validation.py->CGATPipelines/pipeline_docs/pipeline_rnaseqtranscripts/trackers/RnaseqTranscriptsReport.py - - - - -CGATPipelines/pipeline_docs/pipeline_template - -CGATPipelines/pipeline_docs/pipeline_template - - -CGATPipelines/pipeline_docs/pipeline_template/trackers - -CGATPipelines/pipeline_docs/pipeline_template/trackers - - -CGATPipelines/pipeline_docs/pipeline_template->CGATPipelines/pipeline_docs/pipeline_template/trackers - - - - -CGATPipelines/pipeline_docs/pipeline_template/trackers/TemplateReport.py - -CGATPipelines/pipeline_docs/pipeline_template/trackers/TemplateReport.py - - -CGATPipelines/pipeline_docs/pipeline_testing - -CGATPipelines/pipeline_docs/pipeline_testing - - -CGATPipelines/pipeline_docs/pipeline_testing/trackers - -CGATPipelines/pipeline_docs/pipeline_testing/trackers - - -CGATPipelines/pipeline_docs/pipeline_testing->CGATPipelines/pipeline_docs/pipeline_testing/trackers - - - - -CGATPipelines/pipeline_docs/pipeline_testing/trackers/Status.py - -CGATPipelines/pipeline_docs/pipeline_testing/trackers/Status.py - - -CGATPipelines/pipeline_docs/pipeline_testing/trackers/TestingReport.py - -CGATPipelines/pipeline_docs/pipeline_testing/trackers/TestingReport.py - - -CGATPipelines/pipeline_docs/pipeline_transcriptome - -CGATPipelines/pipeline_docs/pipeline_transcriptome - - -CGATPipelines/pipeline_docs/pipeline_transcriptome/conf.py - -CGATPipelines/pipeline_docs/pipeline_transcriptome/conf.py - - -CGATPipelines/pipeline_exome.py - -CGATPipelines/pipeline_exome.py - - -CGATPipelines/pipeline_exome.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_exome.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_exome.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_exome.py->CGATPipelines/PipelineExome.py - - - - -CGATPipelines/pipeline_exome.py->CGATPipelines/PipelineMapping.py - - - - -CGATPipelines/pipeline_exome.py->CGATPipelines/PipelineMappingQC.py - - - - -CGATPipelines/pipeline_exome_cancer.py - -CGATPipelines/pipeline_exome_cancer.py - - -CGATPipelines/pipeline_exome_cancer.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_exome_cancer.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_exome_cancer.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_exome_cancer.py->CGATPipelines/PipelineExome.py - - - - -CGATPipelines/pipeline_exome_cancer.py->CGATPipelines/PipelineMapping.py - - - - -CGATPipelines/pipeline_exome_cancer.py->CGATPipelines/PipelineMappingQC.py - - - - -CGATPipelines/pipeline_expression.py - -CGATPipelines/pipeline_expression.py - - -CGATPipelines/pipeline_expression.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_expression.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_expression.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_expression.py->CGAT/Bed.py - - - - -CGATPipelines/pipeline_expression.py->CGAT/IndexedGenome.py - - - - -CGATPipelines/pipeline_expression.py->CGAT/Stats.py - - - - -CGATPipelines/pipeline_expression.py->CGAT/GTF.py - - - - -CGATPipelines/pipeline_expression.py->CGAT/IndexedFasta.py - - - - -CGATPipelines/pipeline_expression.py->CGAT/FastaIterator.py - - - - -CGATPipelines/pipeline_expression.py->CGAT/MAST.py - - - - -CGATPipelines/pipeline_expression.py->CGAT/Expression.py - - - - -CGATPipelines/pipeline_expression.py->CGAT/Genomics.py - - - - -CGATPipelines/pipeline_fastqToBigWig.py - -CGATPipelines/pipeline_fastqToBigWig.py - - -CGATPipelines/pipeline_fastqToBigWig.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_fastqToBigWig.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_fastqToBigWig.py->CGATPipelines/PipelineChipseq.py - - - - -CGATPipelines/pipeline_fastqToBigWig.py->CGATPipelines/PipelineTracks.py - - - - -CGATPipelines/pipeline_fastqToBigWig.py->CGATPipelines/PipelineMapping.py - - - - -CGATPipelines/pipeline_fusion.py - -CGATPipelines/pipeline_fusion.py - - -CGATPipelines/pipeline_fusion.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_fusion.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_fusion.py->CGATPipelines/PipelineTracks.py - - - - -CGATPipelines/pipeline_fusion.py->CGATPipelines/PipelineMapping.py - - - - -CGATPipelines/pipeline_genesets.py - -CGATPipelines/pipeline_genesets.py - - -CGATPipelines/pipeline_genesets.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_genesets.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_genesets.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_genesets.py->CGAT/Database.py - - - - -CGATPipelines/pipeline_genesets.py->CGATPipelines/PipelineGO.py - - - - -CGAT/SetTools.py - -CGAT/SetTools.py - - -CGATPipelines/pipeline_genesets.py->CGAT/SetTools.py - - - - -CGATPipelines/pipeline_idr.py - -CGATPipelines/pipeline_idr.py - - -CGATPipelines/pipeline_idr.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_idr.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_idr.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_idr.py->CGAT/Database.py - - - - -CGATPipelines/pipeline_idr.py->CGATPipelines/PipelineIDR.py - - - - -CGATPipelines/pipeline_idr.py->CGATPipelines/PipelineTracks.py - - - - -CGATPipelines/pipeline_intervals.py - -CGATPipelines/pipeline_intervals.py - - -CGATPipelines/pipeline_intervals.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_intervals.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_intervals.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_intervals.py->CGAT/Bed.py - - - - -CGATPipelines/pipeline_intervals.py->CGATPipelines/PipelineTracks.py - - - - -CGATPipelines/pipeline_intervals.py->CGATPipelines/PipelineMotifs.py - - - - -CGATPipelines/pipeline_intervals.py->CGATPipelines/PipelinePeakcalling.py - - - - -CGATPipelines/pipeline_intervals.py->CGATPipelines/PipelineWindows.py - - - - -CGAT/MatrixTools.py - -CGAT/MatrixTools.py - - -CGATPipelines/pipeline_intervals.py->CGAT/MatrixTools.py - - - - -CGAT/MatrixTools.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_liftover.py - -CGATPipelines/pipeline_liftover.py - - -CGATPipelines/pipeline_liftover.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_liftover.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_liftover.py->CGATPipelines/PipelineTracks.py - - - - -CGATPipelines/pipeline_mappability.py - -CGATPipelines/pipeline_mappability.py - - -CGATPipelines/pipeline_mappability.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_mappability.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_mapping.py - -CGATPipelines/pipeline_mapping.py - - -CGATPipelines/pipeline_mapping.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_mapping.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_mapping.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_mapping.py->CGAT/BamTools.py - - - - -CGATPipelines/pipeline_mapping.py->CGATPipelines/PipelineGeneset.py - - - - -CGATPipelines/pipeline_mapping.py->CGAT/GTF.py - - - - -CGATPipelines/pipeline_mapping.py->CGATPipelines/PipelineMapping.py - - - - -CGATPipelines/pipeline_mapping.py->CGATPipelines/PipelineMappingQC.py - - - - -CGATPipelines/pipeline_mapping.py->CGATPipelines/PipelineWindows.py - - - - -CGATPipelines/pipeline_mapping_benchmark.py - -CGATPipelines/pipeline_mapping_benchmark.py - - -CGATPipelines/pipeline_mapping_benchmark.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_mapping_benchmark.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_mapping_benchmark.py->CGATPipelines/PipelineMapping.py - - - - -CGATPipelines/pipeline_medip.py - -CGATPipelines/pipeline_medip.py - - -CGATPipelines/pipeline_medip.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_medip.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_medip.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_medip.py->CGATPipelines/PipelineTracks.py - - - - -CGATPipelines/pipeline_medip.py->CGATPipelines/PipelineMapping.py - - - - -CGATPipelines/pipeline_medip.py->CGATPipelines/PipelineMappingQC.py - - - - -CGATPipelines/pipeline_medip.py->CGATPipelines/PipelineMedip.py - - - - -CGATPipelines/pipeline_metagenomecommunities.py - -CGATPipelines/pipeline_metagenomecommunities.py - - -CGATPipelines/pipeline_metagenomecommunities.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_metagenomecommunities.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_metagenomecommunities.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_metagenomecommunities.py->CGAT/Database.py - - - - -CGATPipelines/pipeline_metagenomecommunities.py->CGAT/CSV.py - - - - -CGATPipelines/pipeline_metagenomecommunities.py->CGAT/GTF.py - - - - -CGATPipelines/pipeline_metagenomecommunities.py->CGAT/IndexedFasta.py - - - - -CGATPipelines/pipeline_metagenomecommunities.py->CGATPipelines/PipelineMapping.py - - - - -CGATPipelines/pipeline_metagenomecommunities.py->CGAT/Fastq.py - - - - -CGATPipelines/pipeline_metagenomecommunities.py->CGATPipelines/PipelineMappingQC.py - - - - -CGATPipelines/pipeline_metagenomecommunities.py->CGAT/FastaIterator.py - - - - -CGATPipelines/pipeline_metagenomecommunities.py->CGATPipelines/PipelineMetagenomeCommunities.py - - - - -CGAT/Metaphlan.py - -CGAT/Metaphlan.py - - -CGATPipelines/pipeline_metagenomecommunities.py->CGAT/Metaphlan.py - - - - -CGATPipelines/pipeline_motifs.py - -CGATPipelines/pipeline_motifs.py - - -CGATPipelines/pipeline_motifs.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_motifs.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_motifs.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_motifs.py->CGATPipelines/PipelineTracks.py - - - - -CGATPipelines/pipeline_motifs.py->CGATPipelines/PipelineMotifs.py - - - - -CGATPipelines/pipeline_peakcalling.py - -CGATPipelines/pipeline_peakcalling.py - - -CGATPipelines/pipeline_peakcalling.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_peakcalling.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_peakcalling.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_peakcalling.py->CGAT/Database.py - - - - -CGATPipelines/pipeline_peakcalling.py->CGAT/BamTools.py - - - - -CGATPipelines/pipeline_peakcalling.py->CGAT/Bed.py - - - - -CGATPipelines/pipeline_peakcalling.py->CGATPipelines/PipelineTracks.py - - - - -CGATPipelines/pipeline_peakcalling.py->CGATPipelines/PipelineMappingQC.py - - - - -CGATPipelines/pipeline_peakcalling.py->CGATPipelines/PipelinePeakcalling.py - - - - -CGATPipelines/pipeline_promotors.py - -CGATPipelines/pipeline_promotors.py - - -CGATPipelines/pipeline_promotors.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_promotors.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_promotors.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_promotors.py->CGAT/Bed.py - - - - -CGATPipelines/pipeline_promotors.py->CGATPipelines/PipelineGeneset.py - - - - -CGATPipelines/pipeline_promotors.py->CGAT/FastaIterator.py - - - - -CGATPipelines/pipeline_readqc.py - -CGATPipelines/pipeline_readqc.py - - -CGATPipelines/pipeline_readqc.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_readqc.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_readqc.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_readqc.py->CGATPipelines/PipelineMapping.py - - - - -CGATPipelines/pipeline_readqc.py->CGATPipelines/PipelinePreprocess.py - - - - -CGATPipelines/pipeline_readqc.py->CGATPipelines/PipelineReadqc.py - - - - -CGATPipelines/pipeline_rnaseq.py - -CGATPipelines/pipeline_rnaseq.py - - -CGATPipelines/pipeline_rnaseq.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_rnaseq.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_rnaseq.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_rnaseq.py->CGAT/Database.py - - - - -CGATPipelines/pipeline_rnaseq.py->CGAT/Stats.py - - - - -CGATPipelines/pipeline_rnaseq.py->CGATPipelines/PipelineGeneset.py - - - - -CGATPipelines/pipeline_rnaseq.py->CGAT/GTF.py - - - - -CGATPipelines/pipeline_rnaseq.py->CGAT/IndexedFasta.py - - - - -CGATPipelines/pipeline_rnaseq.py->CGATPipelines/PipelineTracks.py - - - - -CGATPipelines/pipeline_rnaseq.py->CGATPipelines/PipelineMapping.py - - - - -CGATPipelines/pipeline_rnaseq.py->CGATPipelines/PipelineMappingQC.py - - - - -CGATPipelines/pipeline_rnaseq.py->CGATPipelines/PipelineRnaseq.py - - - - -CGATPipelines/pipeline_rnaseq.py->CGAT/Expression.py - - - - -CGAT/Tophat.py - -CGAT/Tophat.py - - -CGATPipelines/pipeline_rnaseq.py->CGAT/Tophat.py - - - - -CGAT/Tophat.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_rnaseqdiffexpression.py - -CGATPipelines/pipeline_rnaseqdiffexpression.py - - -CGATPipelines/pipeline_rnaseqdiffexpression.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_rnaseqdiffexpression.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_rnaseqdiffexpression.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_rnaseqdiffexpression.py->CGAT/Database.py - - - - -CGATPipelines/pipeline_rnaseqdiffexpression.py->CGAT/BamTools.py - - - - -CGATPipelines/pipeline_rnaseqdiffexpression.py->CGATPipelines/PipelineGeneset.py - - - - -CGATPipelines/pipeline_rnaseqdiffexpression.py->CGAT/GTF.py - - - - -CGATPipelines/pipeline_rnaseqdiffexpression.py->CGATPipelines/PipelineTracks.py - - - - -CGATPipelines/pipeline_rnaseqdiffexpression.py->CGATPipelines/PipelineRnaseq.py - - - - -CGATPipelines/pipeline_rnaseqdiffexpression.py->CGAT/Expression.py - - - - -CGATPipelines/pipeline_rnaseqlncrna.py - -CGATPipelines/pipeline_rnaseqlncrna.py - - -CGATPipelines/pipeline_rnaseqlncrna.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_rnaseqlncrna.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_rnaseqlncrna.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_rnaseqlncrna.py->CGAT/GTF.py - - - - -CGATPipelines/pipeline_rnaseqlncrna.py->CGATPipelines/PipelineLncRNA.py - - - - -CGATPipelines/pipeline_rnaseqqc.py - -CGATPipelines/pipeline_rnaseqqc.py - - -CGATPipelines/pipeline_rnaseqqc.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_rnaseqqc.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_rnaseqqc.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_rnaseqqc.py->CGATPipelines/PipelineMapping.py - - - - -CGATPipelines/pipeline_rnaseqqc.py->CGAT/CSV2DB.py - - - - -CGATPipelines/pipeline_rnaseqtranscripts.py - -CGATPipelines/pipeline_rnaseqtranscripts.py - - -CGATPipelines/pipeline_rnaseqtranscripts.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_rnaseqtranscripts.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_rnaseqtranscripts.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_rnaseqtranscripts.py->CGAT/Database.py - - - - -CGATPipelines/pipeline_rnaseqtranscripts.py->CGAT/Stats.py - - - - -CGATPipelines/pipeline_rnaseqtranscripts.py->CGATPipelines/PipelineGeneset.py - - - - -CGATPipelines/pipeline_rnaseqtranscripts.py->CGAT/GTF.py - - - - -CGATPipelines/pipeline_rnaseqtranscripts.py->CGAT/IndexedFasta.py - - - - -CGATPipelines/pipeline_rnaseqtranscripts.py->CGATPipelines/PipelineTracks.py - - - - -CGATPipelines/pipeline_rnaseqtranscripts.py->CGATPipelines/PipelineRnaseq.py - - - - -CGATPipelines/pipeline_rnaseqtranscripts.py->CGAT/Tophat.py - - - - -CGATPipelines/pipeline_rrbs.py - -CGATPipelines/pipeline_rrbs.py - - -CGATPipelines/pipeline_rrbs.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_rrbs.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_rrbs.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_rrbs.py->CGATPipelines/PipelineTracks.py - - - - -CGATPipelines/pipeline_rrbs.py->CGATPipelines/PipelineMapping.py - - - - -CGATPipelines/pipeline_rrbs.py->CGATPipelines/PipelineRrbs.py - - - - -CGATPipelines/pipeline_template.py - -CGATPipelines/pipeline_template.py - - -CGATPipelines/pipeline_template.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_template.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_template_data - -CGATPipelines/pipeline_template_data - - -CGATPipelines/pipeline_template_data/TemplateReport.py - -CGATPipelines/pipeline_template_data/TemplateReport.py - - -CGATPipelines/pipeline_template_data/conf.py - -CGATPipelines/pipeline_template_data/conf.py - - -CGATPipelines/pipeline_template_data/conf.py->CGATPipelines - - - - -CGATPipelines/pipeline_template_data/conf.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_template_data/pipeline_template_full.py - -CGATPipelines/pipeline_template_data/pipeline_template_full.py - - -CGATPipelines/pipeline_template_data/pipeline_template_full.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_template_data/pipeline_template_full.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_template_data/pipeline_template_minimal.py - -CGATPipelines/pipeline_template_data/pipeline_template_minimal.py - - -CGATPipelines/pipeline_template_data/pipeline_template_minimal.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_template_data/pipeline_template_minimal.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_testing.py - -CGATPipelines/pipeline_testing.py - - -CGATPipelines/pipeline_testing.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_testing.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_testing.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_timeseries.py - -CGATPipelines/pipeline_timeseries.py - - -CGATPipelines/pipeline_timeseries.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_timeseries.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_timeseries.py->CGATPipelines/PipelineTracks.py - - - - -CGATPipelines/pipeline_timeseries.py->CGAT/Timeseries - - - - -CGATPipelines/pipeline_transcriptdiffexpression.py - -CGATPipelines/pipeline_transcriptdiffexpression.py - - -CGATPipelines/pipeline_transcriptdiffexpression.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_transcriptdiffexpression.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_transcriptdiffexpression.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_transcriptdiffexpression.py->CGATPipelines/PipelineTracks.py - - - - -CGATPipelines/pipeline_transcriptdiffexpression.py->CGATPipelines/PipelineMapping.py - - - - -CGATPipelines/pipeline_transcriptdiffexpression.py->CGAT/Expression.py - - - - -CGATPipelines/pipeline_transcriptdiffexpression.py->CGATPipelines/PipelineTranscriptDiffExpression.py - - - - -CGATPipelines/pipeline_transcriptdiffexpression.py->CGAT/Counts.py - - - - -CGATPipelines/pipeline_transcriptome.py - -CGATPipelines/pipeline_transcriptome.py - - -CGATPipelines/pipeline_transcriptome.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_transcriptome.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_transcriptome.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_transcriptome.py->CGAT/Database.py - - - - -CGATPipelines/pipeline_transcriptome.py->CGAT/GTF.py - - - - -CGATPipelines/pipeline_transcriptome.py->CGATPipelines/PipelineTracks.py - - - - -CGATPipelines/pipeline_transfacmatch.py - -CGATPipelines/pipeline_transfacmatch.py - - -CGATPipelines/pipeline_transfacmatch.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_transfacmatch.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_transfacmatch.py->CGATPipelines/PipelineTransfacMatch.py - - - - -CGATPipelines/pipeline_variant_annotation.py - -CGATPipelines/pipeline_variant_annotation.py - - -CGATPipelines/pipeline_variant_annotation.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_variant_annotation.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_variant_annotation.py->CGAT/Database.py - - - - -CGATPipelines/pipeline_variant_annotation.py->CGAT/Stats.py - - - - -CGATPipelines/pipeline_variant_annotation.py->CGATPipelines/PipelineTracks.py - - - - -CGATPipelines/pipeline_variants.py - -CGATPipelines/pipeline_variants.py - - -CGATPipelines/pipeline_variants.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_variants.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_variants.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_variants.py->CGAT/Database.py - - - - -CGATPipelines/pipeline_variants.py->CGATPipelines/PipelineUCSC.py - - - - -CGATPipelines/pipeline_variants.py->CGATPipelines/PipelineEnrichment.py - - - - -CGATPipelines/pipeline_variants.py->CGAT/CSV.py - - - - -CGATPipelines/pipeline_variants.py->CGAT/Stats.py - - - - -CGATPipelines/pipeline_variants.py->CGAT/GTF.py - - - - -CGATPipelines/pipeline_variants.py->CGATPipelines/PipelineTracks.py - - - - -CGATPipelines/pipeline_variants.py->CGAT/Biomart.py - - - - -CGATPipelines/pipeline_variants.py->CGAT/FastaIterator.py - - - - -CGATPipelines/pipeline_windows.py - -CGATPipelines/pipeline_windows.py - - -CGATPipelines/pipeline_windows.py->CGATPipelines/Pipeline - - - - -CGATPipelines/pipeline_windows.py->CGAT/Experiment.py - - - - -CGATPipelines/pipeline_windows.py->CGAT/IOTools.py - - - - -CGATPipelines/pipeline_windows.py->CGATPipelines/PipelineTracks.py - - - - -CGATPipelines/pipeline_windows.py->CGATPipelines/PipelineMappingQC.py - - - - -CGATPipelines/pipeline_windows.py->CGATPipelines/PipelineWindows.py - - - - -CGAT - -CGAT - - -CGAT/.#Genomics.py - -CGAT/.#Genomics.py - - -CGAT/AGP.py - -CGAT/AGP.py - - -CGAT/NCL/cnestedlist.so - -CGAT/NCL/cnestedlist.so - - -CGAT/NCL->CGAT/NCL/cnestedlist.so - - - - -CGAT/Blat.py - -CGAT/Blat.py - - -CGAT/Blat.py->CGAT/Experiment.py - - - - -CGAT/Components.so - -CGAT/Components.so - - -CGAT/Blat.py->CGAT/Components.so - - - - -CGAT/CBioPortal.py - -CGAT/CBioPortal.py - - -CGAT/CBioPortal.py->CGAT/Experiment.py - - - - -CGAT/CBioPortal.py->CGAT/IOTools.py - - - - -CGAT/CorrespondenceAnalysis.py - -CGAT/CorrespondenceAnalysis.py - - -CGAT/Diamond.py - -CGAT/Diamond.py - - -CGAT/GFF3.py - -CGAT/GFF3.py - - -CGAT/GFF3.py->CGAT/GTF.py - - - - -CGAT/GO.py - -CGAT/GO.py - - -CGAT/GO.py->CGAT/Experiment.py - - - - -CGAT/GO.py->CGAT/IOTools.py - - - - -CGAT/GO.py->CGAT/Database.py - - - - -CGAT/GO.py->CGAT/CSV.py - - - - -CGAT/GO.py->CGAT/Stats.py - - - - -CGAT/Glam2.py - -CGAT/Glam2.py - - -CGAT/Histogram.py - -CGAT/Histogram.py - - -CGAT/Histogram2D.py - -CGAT/Histogram2D.py - - -CGAT/IGV.py - -CGAT/IGV.py - - -CGAT/Iterators.py - -CGAT/Iterators.py - - -CGAT/LCA.py - -CGAT/LCA.py - - -CGAT/Logfile.py - -CGAT/Logfile.py - - -CGAT/Mali.py - -CGAT/Mali.py - - -CGAT/Maq.py - -CGAT/Maq.py - - -CGAT/MatlabTools.py - -CGAT/MatlabTools.py - - -CGAT/Motifs.py - -CGAT/Motifs.py - - -CGAT/Motifs.py->CGAT/FastaIterator.py - - - - -CGAT/Motifs.py->CGAT/Genomics.py - - - - -CGAT/RateEstimation.py - -CGAT/RateEstimation.py - - -CGAT/RateEstimation.py->CGAT/Genomics.py - - - - -CGAT/SVGdraw.py - -CGAT/SVGdraw.py - - -CGAT/SequencePairProperties.py - -CGAT/SequencePairProperties.py - - -CGAT/SequencePairProperties.py->CGAT/Mali.py - - - - -CGAT/WrapperCodeML.py - -CGAT/WrapperCodeML.py - - -CGAT/SequencePairProperties.py->CGAT/WrapperCodeML.py - - - - -CGAT/WrapperCodeML.py->CGAT/Experiment.py - - - - -CGAT/WrapperCodeML.py->CGAT/IOTools.py - - - - -CGAT/WrapperCodeML.py->CGAT/Genomics.py - - - - -CGAT/WrapperCodeML.py->CGAT/Mali.py - - - - -CGAT/WrapperCodeML.py->CGAT/RateEstimation.py - - - - -CGAT/Tree.py - -CGAT/Tree.py - - -CGAT/WrapperCodeML.py->CGAT/Tree.py - - - - -CGAT/TreeTools.py - -CGAT/TreeTools.py - - -CGAT/WrapperCodeML.py->CGAT/TreeTools.py - - - - -CGAT/SequenceProperties.py - -CGAT/SequenceProperties.py - - -CGAT/SequenceProperties.py->CGAT/Genomics.py - - - - -CGAT/Style.py - -CGAT/Style.py - - -CGAT/TreeTools.py->CGAT/Tree.py - - - - -CGAT/Variants.py - -CGAT/Variants.py - - -CGAT/Variants.py->CGAT/Experiment.py - - - - -CGAT/Variants.py->CGAT/Genomics.py - - - - -CGAT/Variants.py->CGAT/NCL - - - - -CGAT/WrapperIDR.py - -CGAT/WrapperIDR.py - - -CGAT/WrapperIDR.py->CGAT/Experiment.py - - - - -CGAT/WrapperMuscle.py - -CGAT/WrapperMuscle.py - - -CGAT/WrapperMuscle.py->CGAT/Experiment.py - - - - -CGAT/WrapperMuscle.py->CGAT/Mali.py - - - - -CGAT/_bam2bam.so - -CGAT/_bam2bam.so - - -CGAT/_bam2bed.so - -CGAT/_bam2bed.so - - -CGAT/_bam2geneprofile.so - -CGAT/_bam2geneprofile.so - - -CGAT/_bam2peakshape.so - -CGAT/_bam2peakshape.so - - -CGAT/_bam2stats.so - -CGAT/_bam2stats.so - - -CGAT/_bams2bam.so - -CGAT/_bams2bam.so - - -CGAT/_gtf2table.so - -CGAT/_gtf2table.so - - -CGAT/flycheck_Genomics.py - -CGAT/flycheck_Genomics.py - - -scripts - -scripts - - -scripts/add_random_reads_to_bam.py - -scripts/add_random_reads_to_bam.py - - -scripts/add_random_reads_to_bam.py->CGAT/Experiment.py - - - - -scripts/analyze_readpositions.py - -scripts/analyze_readpositions.py - - -scripts/analyze_readpositions.py->CGAT/Experiment.py - - - - -scripts/analyze_readpositions.py->CGAT/CSV.py - - - - -scripts/annotator_distance.py - -scripts/annotator_distance.py - - -scripts/annotator_distance.py->CGAT/Experiment.py - - - - -scripts/annotator_distance.py->CGAT/IOTools.py - - - - -scripts/annotator_distance.py->CGAT/Bed.py - - - - -scripts/annotator_distance.py->CGAT/GTF.py - - - - -scripts/annotator_distance.py->CGAT/Intervals.py - - - - -scripts/bam2UniquePairs.py - -scripts/bam2UniquePairs.py - - -scripts/bam2UniquePairs.py->CGAT/Experiment.py - - - - -scripts/bam2bam.py - -scripts/bam2bam.py - - -scripts/bam2bam.py->CGAT/Experiment.py - - - - -scripts/bam2bam.py->CGAT/IOTools.py - - - - -scripts/bam2bam.py->CGAT/_bam2bam.so - - - - -scripts/bam2bed.py - -scripts/bam2bed.py - - -scripts/bam2bed.py->CGAT/Experiment.py - - - - -scripts/bam2bed.py->CGAT/_bam2bed.so - - - - -scripts/bam2bidirectionaltranscription.py - -scripts/bam2bidirectionaltranscription.py - - -scripts/bam2bidirectionaltranscription.py->CGAT/Experiment.py - - - - -scripts/bam2bidirectionaltranscription.py->CGAT/IOTools.py - - - - -scripts/bam2bidirectionaltranscription.py->CGAT/GTF.py - - - - -scripts/bam2fastq.py - -scripts/bam2fastq.py - - -scripts/bam2fastq.py->CGAT/Experiment.py - - - - -scripts/bam2fastq.py->CGAT/IOTools.py - - - - -scripts/bam2geneprofile.py - -scripts/bam2geneprofile.py - - -scripts/bam2geneprofile.py->CGAT/Experiment.py - - - - -scripts/bam2geneprofile.py->CGAT/IOTools.py - - - - -scripts/bam2geneprofile.py->CGAT/GTF.py - - - - -scripts/bam2geneprofile.py->CGAT/_bam2geneprofile.so - - - - -scripts/bam2peakshape.py - -scripts/bam2peakshape.py - - -scripts/bam2peakshape.py->CGAT/Experiment.py - - - - -scripts/bam2peakshape.py->CGAT/IOTools.py - - - - -scripts/bam2peakshape.py->CGAT/Bed.py - - - - -scripts/bam2peakshape.py->CGAT/_bam2peakshape.so - - - - -scripts/bam2profile.py - -scripts/bam2profile.py - - -scripts/bam2profile.py->CGAT/Experiment.py - - - - -scripts/bam2species_map.py - -scripts/bam2species_map.py - - -scripts/bam2species_map.py->CGAT/Experiment.py - - - - -scripts/bam2species_map.py->CGAT/FastaIterator.py - - - - -scripts/bam2stats.py - -scripts/bam2stats.py - - -scripts/bam2stats.py->CGAT/Experiment.py - - - - -scripts/bam2stats.py->CGAT/IOTools.py - - - - -scripts/bam2stats.py->CGAT/GTF.py - - - - -scripts/bam2stats.py->CGAT/_bam2stats.so - - - - -scripts/bam2transcriptContribution.py - -scripts/bam2transcriptContribution.py - - -scripts/bam2transcriptContribution.py->CGAT/Experiment.py - - - - -scripts/bam2transcriptContribution.py->CGAT/IOTools.py - - - - -scripts/bam2wiggle.py - -scripts/bam2wiggle.py - - -scripts/bam2wiggle.py->CGAT/Experiment.py - - - - -scripts/bam2wiggle.py->CGAT/IOTools.py - - - - -scripts/bam2wiggle.py->CGAT/_bam2bed.so - - - - -scripts/bam_vs_bam.py - -scripts/bam_vs_bam.py - - -scripts/bam_vs_bam.py->CGAT/Experiment.py - - - - -scripts/bam_vs_bed.py - -scripts/bam_vs_bed.py - - -scripts/bam_vs_bed.py->CGAT/Experiment.py - - - - -scripts/bam_vs_bed.py->CGAT/IOTools.py - - - - -scripts/bam_vs_bed.py->CGAT/Bed.py - - - - -scripts/bam_vs_gtf.py - -scripts/bam_vs_gtf.py - - -scripts/bam_vs_gtf.py->CGAT/Experiment.py - - - - -scripts/bam_vs_gtf.py->CGAT/IOTools.py - - - - -scripts/bam_vs_gtf.py->CGAT/GTF.py - - - - -scripts/bams2bam.py - -scripts/bams2bam.py - - -scripts/bams2bam.py->CGAT/Experiment.py - - - - -scripts/bams2bam.py->CGAT/IOTools.py - - - - -scripts/bams2bam.py->CGAT/Bed.py - - - - -scripts/bams2bam.py->CGAT/IndexedGenome.py - - - - -scripts/bams2bam.py->CGAT/GTF.py - - - - -scripts/bams2bam.py->CGAT/_bams2bam.so - - - - -scripts/barplotGo.py - -scripts/barplotGo.py - - -scripts/barplotGo.py->CGAT/Experiment.py - - - - -scripts/bed2annotator.py - -scripts/bed2annotator.py - - -scripts/bed2annotator.py->CGAT/Experiment.py - - - - -scripts/bed2annotator.py->CGAT/Bed.py - - - - -scripts/bed2annotator.py->CGAT/IndexedFasta.py - - - - -scripts/bed2bed.py - -scripts/bed2bed.py - - -scripts/bed2bed.py->CGAT/Experiment.py - - - - -scripts/bed2bed.py->CGAT/Bed.py - - - - -scripts/bed2bed.py->CGAT/IndexedFasta.py - - - - -scripts/bed2bed.py->CGAT/Intervals.py - - - - -scripts/bed2fasta.py - -scripts/bed2fasta.py - - -scripts/bed2fasta.py->CGAT/Experiment.py - - - - -scripts/bed2fasta.py->CGAT/Bed.py - - - - -scripts/bed2fasta.py->CGAT/IndexedFasta.py - - - - -scripts/bed2fasta.py->CGAT/Masker.py - - - - -scripts/bed2gff.py - -scripts/bed2gff.py - - -scripts/bed2gff.py->CGAT/Experiment.py - - - - -scripts/bed2gff.py->CGAT/Bed.py - - - - -scripts/bed2gff.py->CGAT/GTF.py - - - - -scripts/bed2graph.py - -scripts/bed2graph.py - - -scripts/bed2graph.py->CGAT/Experiment.py - - - - -scripts/bed2graph.py->CGAT/IOTools.py - - - - -scripts/bed2graph.py->CGAT/Bed.py - - - - -scripts/bed2plot.py - -scripts/bed2plot.py - - -scripts/bed2plot.py->CGAT/Experiment.py - - - - -scripts/bed2plot.py->CGAT/Bed.py - - - - -scripts/bed2plot.py->CGAT/IGV.py - - - - -scripts/bed2psl.py - -scripts/bed2psl.py - - -scripts/bed2psl.py->CGAT/Experiment.py - - - - -scripts/bed2psl.py->CGAT/Bed.py - - - - -scripts/bed2psl.py->CGAT/IndexedFasta.py - - - - -scripts/bed2psl.py->CGAT/Blat.py - - - - -scripts/bed2stats.py - -scripts/bed2stats.py - - -scripts/bed2stats.py->CGAT/Experiment.py - - - - -scripts/bed2stats.py->CGAT/Bed.py - - - - -scripts/bed2stats.py->CGAT/IndexedFasta.py - - - - -scripts/bed2table.py - -scripts/bed2table.py - - -scripts/bed2table.py->CGAT/Experiment.py - - - - -scripts/bed2table.py->CGAT/IOTools.py - - - - -scripts/bed2table.py->CGAT/Bed.py - - - - -scripts/bed2table.py->CGAT/GTF.py - - - - -scripts/bed2table.py->CGAT/IndexedFasta.py - - - - -scripts/bed2table.py->CGAT/Intervals.py - - - - -scripts/bed2table.py->CGAT/SequenceProperties.py - - - - -scripts/gtf2table.py - -scripts/gtf2table.py - - -scripts/bed2table.py->scripts/gtf2table.py - - - - -scripts/gtf2table.py->CGAT/Experiment.py - - - - -scripts/gtf2table.py->CGAT/IOTools.py - - - - -scripts/gtf2table.py->CGAT/Bed.py - - - - -scripts/gtf2table.py->CGAT/IndexedGenome.py - - - - -scripts/gtf2table.py->CGAT/Stats.py - - - - -scripts/gtf2table.py->CGAT/GTF.py - - - - -scripts/gtf2table.py->CGAT/IndexedFasta.py - - - - -scripts/gtf2table.py->CGAT/Intervals.py - - - - -scripts/gtf2table.py->CGAT/Genomics.py - - - - -scripts/gtf2table.py->CGAT/SequenceProperties.py - - - - -scripts/gtf2table.py->CGAT/_gtf2table.so - - - - -scripts/bed_vs_bed.py - -scripts/bed_vs_bed.py - - -scripts/bed_vs_bed.py->CGAT/Experiment.py - - - - -scripts/bed_vs_bed.py->CGAT/IOTools.py - - - - -scripts/bed_vs_bed.py->CGAT/Bed.py - - - - -scripts/beds2beds.py - -scripts/beds2beds.py - - -scripts/beds2beds.py->CGAT/Experiment.py - - - - -scripts/beds2beds.py->CGAT/IOTools.py - - - - -scripts/beds2beds.py->CGAT/Intervals.py - - - - -scripts/beds2counts.py - -scripts/beds2counts.py - - -scripts/beds2counts.py->CGAT/Experiment.py - - - - -scripts/beds2counts.py->CGAT/IOTools.py - - - - -scripts/beds2counts.py->CGAT/Bed.py - - - - -scripts/beds2counts.py->CGAT/IndexedGenome.py - - - - -scripts/bigwig2hilbert.py - -scripts/bigwig2hilbert.py - - -scripts/bigwig2hilbert.py->CGAT/Experiment.py - - - - -scripts/blast2table.py - -scripts/blast2table.py - - -scripts/blast2table.py->CGAT/Experiment.py - - - - -scripts/calculate_histogram_2D.py - -scripts/calculate_histogram_2D.py - - -scripts/calculate_histogram_2D.py->CGAT/Experiment.py - - - - -scripts/calculate_histogram_2D.py->CGAT/Histogram2D.py - - - - -scripts/cat_tables.py - -scripts/cat_tables.py - - -scripts/cat_tables.py->CGAT/Experiment.py - - - - -scripts/cgat.py - -scripts/cgat.py - - -scripts/cgat2dot.py - -scripts/cgat2dot.py - - -scripts/cgat2dot.py->CGAT/Experiment.py - - - - -scripts/cgat2rdf.py - -scripts/cgat2rdf.py - - -scripts/cgat2rdf.py->CGAT/Experiment.py - - - - -scripts/cgat_add_preamble.py - -scripts/cgat_add_preamble.py - - -scripts/cgat_add_preamble.py->CGAT/Experiment.py - - - - -scripts/cgat_galaxy_wrapper.py - -scripts/cgat_galaxy_wrapper.py - - -scripts/cgat_get_options.py - -scripts/cgat_get_options.py - - -scripts/cgat_get_options.py->CGAT/Experiment.py - - - - -scripts/cgat_get_options.py->CGAT/IOTools.py - - - - -scripts/cgat_list_dependencies.py - -scripts/cgat_list_dependencies.py - - -scripts/cgat_list_dependencies.py->CGAT/Experiment.py - - - - -scripts/cgat_list_dependencies.py->CGAT/Requirements.py - - - - -scripts/cgat_pep8_code_quality.py - -scripts/cgat_pep8_code_quality.py - - -scripts/cgat_pep8_code_quality.py->CGAT/Experiment.py - - - - -scripts/cgat_pep8_code_quality.py->CGAT/Style.py - - - - -scripts/cgat_rebuild_extensions.py - -scripts/cgat_rebuild_extensions.py - - -scripts/cgat_rebuild_extensions.py->CGAT/Experiment.py - - - - -scripts/cgat_scan_email.py - -scripts/cgat_scan_email.py - - -scripts/cgat_scan_email.py->CGAT/Experiment.py - - - - -scripts/cgat_script_template.py - -scripts/cgat_script_template.py - - -scripts/cgat_script_template.py->CGAT/Experiment.py - - - - -scripts/chain2psl.py - -scripts/chain2psl.py - - -scripts/chain2psl.py->CGAT/Experiment.py - - - - -scripts/chain2psl.py->CGAT/Blat.py - - - - -scripts/chain2stats.py - -scripts/chain2stats.py - - -scripts/chain2stats.py->CGAT/Experiment.py - - - - -scripts/chain2stats.py->CGAT/IndexedFasta.py - - - - -scripts/clean.py - -scripts/clean.py - - -scripts/clean.py->CGAT/Experiment.py - - - - -scripts/clusters2metrics.py - -scripts/clusters2metrics.py - - -scripts/clusters2metrics.py->CGAT/Experiment.py - - - - -scripts/clusters2metrics.py->CGAT/IOTools.py - - - - -scripts/clusters2metrics.py->CGAT/GTF.py - - - - -scripts/clusters2metrics.py->CGAT/Timeseries - - - - -scripts/combine_files.py - -scripts/combine_files.py - - -scripts/combine_files.py->CGAT/Experiment.py - - - - -scripts/combine_files.py->CGAT/IOTools.py - - - - -scripts/combine_gff.py - -scripts/combine_gff.py - - -scripts/combine_gff.py->CGAT/Experiment.py - - - - -scripts/combine_histograms.py - -scripts/combine_histograms.py - - -scripts/combine_histograms.py->CGAT/Experiment.py - - - - -scripts/combine_histograms.py->CGAT/Histogram.py - - - - -scripts/combine_tables.py - -scripts/combine_tables.py - - -scripts/combine_tables.py->CGAT/Experiment.py - - - - -scripts/combine_tables.py->CGAT/IOTools.py - - - - -scripts/compare_clusters.py - -scripts/compare_clusters.py - - -scripts/compare_clusters.py->CGAT/Experiment.py - - - - -scripts/compare_clusters.py->CGAT/IOTools.py - - - - -scripts/compare_histograms.py - -scripts/compare_histograms.py - - -scripts/compare_histograms.py->CGAT/Experiment.py - - - - -scripts/compare_histograms.py->CGAT/IOTools.py - - - - -scripts/contigs2random_sample.py - -scripts/contigs2random_sample.py - - -scripts/contigs2random_sample.py->CGAT/Experiment.py - - - - -scripts/contigs2random_sample.py->CGAT/IOTools.py - - - - -scripts/contigs2random_sample.py->CGAT/FastaIterator.py - - - - -scripts/contigs2stats.py - -scripts/contigs2stats.py - - -scripts/contigs2stats.py->CGAT/Experiment.py - - - - -scripts/contigs2stats.py->CGAT/FastaIterator.py - - - - -scripts/convert_time2seconds.py - -scripts/convert_time2seconds.py - - -scripts/convert_time2seconds.py->CGAT/Experiment.py - - - - -scripts/counts2counts.py - -scripts/counts2counts.py - - -scripts/counts2counts.py->CGAT/Experiment.py - - - - -scripts/counts2counts.py->CGAT/IOTools.py - - - - -scripts/counts2counts.py->CGAT/Expression.py - - - - -scripts/counts2counts.py->CGAT/Counts.py - - - - -scripts/counts2table.py - -scripts/counts2table.py - - -scripts/counts2table.py->CGAT/Experiment.py - - - - -scripts/counts2table.py->CGAT/IOTools.py - - - - -scripts/counts2table.py->CGAT/Expression.py - - - - -scripts/counts2table.py->CGAT/Counts.py - - - - -scripts/coverage2stats.py - -scripts/coverage2stats.py - - -scripts/coverage2stats.py->CGAT/Experiment.py - - - - -scripts/coverage2stats.py->CGAT/IOTools.py - - - - -scripts/csv2csv.py - -scripts/csv2csv.py - - -scripts/csv2csv.py->CGAT/Experiment.py - - - - -scripts/csv2csv.py->CGAT/IOTools.py - - - - -scripts/csv2db.py - -scripts/csv2db.py - - -scripts/csv2db.py->CGAT/Experiment.py - - - - -scripts/csv2db.py->CGAT/CSV2DB.py - - - - -scripts/csv2xls.py - -scripts/csv2xls.py - - -scripts/csv2xls.py->CGAT/Experiment.py - - - - -scripts/csv2xls.py->CGAT/IOTools.py - - - - -scripts/csv_cut.py - -scripts/csv_cut.py - - -scripts/csv_cut.py->CGAT/Experiment.py - - - - -scripts/csv_cut.py->CGAT/CSV.py - - - - -scripts/csv_intersection.py - -scripts/csv_intersection.py - - -scripts/csv_intersection.py->CGAT/Experiment.py - - - - -scripts/csv_intersection.py->CGAT/IOTools.py - - - - -scripts/csv_intersection.py->CGAT/CSV.py - - - - -scripts/csv_rename.py - -scripts/csv_rename.py - - -scripts/csv_rename.py->CGAT/Experiment.py - - - - -scripts/csv_select.py - -scripts/csv_select.py - - -scripts/csv_select.py->CGAT/Experiment.py - - - - -scripts/csv_select.py->CGAT/CSV.py - - - - -scripts/csv_set.py - -scripts/csv_set.py - - -scripts/csv_set.py->CGAT/Experiment.py - - - - -scripts/csv_set.py->CGAT/CSV.py - - - - -scripts/csvs2csv.py - -scripts/csvs2csv.py - - -scripts/csvs2csv.py->CGAT/Experiment.py - - - - -scripts/data2bins.py - -scripts/data2bins.py - - -scripts/data2bins.py->CGAT/Experiment.py - - - - -scripts/data2bins.py->CGAT/CSV.py - - - - -scripts/data2histogram.py - -scripts/data2histogram.py - - -scripts/data2histogram.py->CGAT/Experiment.py - - - - -scripts/data2histogram.py->CGAT/Histogram.py - - - - -scripts/data2multiple_anova.py - -scripts/data2multiple_anova.py - - -scripts/data2multiple_anova.py->CGAT/Experiment.py - - - - -scripts/data2multiple_anova.py->CGAT/IOTools.py - - - - -scripts/data2resamples.py - -scripts/data2resamples.py - - -scripts/data2resamples.py->CGAT/Experiment.py - - - - -scripts/data2resamples.py->CGAT/Timeseries - - - - -scripts/data2roc.py - -scripts/data2roc.py - - -scripts/data2roc.py->CGAT/Experiment.py - - - - -scripts/data2spike.py - -scripts/data2spike.py - - -scripts/data2spike.py->CGAT/Experiment.py - - - - -scripts/data2stats.py - -scripts/data2stats.py - - -scripts/data2stats.py->CGAT/Experiment.py - - - - -scripts/diamond2counts.py - -scripts/diamond2counts.py - - -scripts/diamond2counts.py->CGAT/Experiment.py - - - - -scripts/diamond2counts.py->CGAT/IOTools.py - - - - -scripts/diamond2counts.py->CGAT/Diamond.py - - - - -scripts/diff_bam.py - -scripts/diff_bam.py - - -scripts/diff_bam.py->CGAT/Experiment.py - - - - -scripts/diff_bed.py - -scripts/diff_bed.py - - -scripts/diff_bed.py->CGAT/Experiment.py - - - - -scripts/diff_bed.py->CGAT/IOTools.py - - - - -scripts/diff_bed.py->CGAT/Bed.py - - - - -scripts/diff_chains.py - -scripts/diff_chains.py - - -scripts/diff_chains.py->CGAT/Experiment.py - - - - -scripts/diff_chains.py->CGAT/IOTools.py - - - - -scripts/diff_fasta.py - -scripts/diff_fasta.py - - -scripts/diff_fasta.py->CGAT/Experiment.py - - - - -scripts/diff_fasta.py->CGAT/IOTools.py - - - - -scripts/diff_fasta.py->CGAT/Genomics.py - - - - -scripts/diff_gtf.py - -scripts/diff_gtf.py - - -scripts/diff_gtf.py->CGAT/Experiment.py - - - - -scripts/diff_gtf.py->CGAT/IOTools.py - - - - -scripts/diff_gtf.py->CGAT/GTF.py - - - - -scripts/diff_gtf.py->CGAT/NCL - - - - -scripts/diff_transcript_sets.py - -scripts/diff_transcript_sets.py - - -scripts/diff_transcript_sets.py->CGAT/Experiment.py - - - - -scripts/diff_transcript_sets.py->CGAT/IOTools.py - - - - -scripts/diffgene2venn.py - -scripts/diffgene2venn.py - - -scripts/diffgene2venn.py->CGAT/Experiment.py - - - - -scripts/diffgene2venn.py->CGAT/Timeseries - - - - -scripts/distance2clusters.py - -scripts/distance2clusters.py - - -scripts/distance2clusters.py->CGAT/Experiment.py - - - - -scripts/distance2clusters.py->CGAT/Timeseries - - - - -scripts/distance2merge.py - -scripts/distance2merge.py - - -scripts/distance2merge.py->CGAT/Experiment.py - - - - -scripts/distance2merge.py->CGAT/Timeseries - - - - -scripts/ena2table.py - -scripts/ena2table.py - - -scripts/ena2table.py->CGAT/Experiment.py - - - - -scripts/ena2table.py->CGAT/IOTools.py - - - - -scripts/expression2distance.py - -scripts/expression2distance.py - - -scripts/expression2distance.py->CGAT/Experiment.py - - - - -scripts/expression2distance.py->CGAT/Timeseries - - - - -scripts/expression2expression.py - -scripts/expression2expression.py - - -scripts/expression2expression.py->CGAT/Experiment.py - - - - -scripts/expression2expression.py->CGAT/Timeseries - - - - -scripts/extractseq.py - -scripts/extractseq.py - - -scripts/extractseq.py->CGAT/Experiment.py - - - - -scripts/extractseq.py->CGAT/IndexedFasta.py - - - - -scripts/fasta2bed.py - -scripts/fasta2bed.py - - -scripts/fasta2bed.py->CGAT/Experiment.py - - - - -scripts/fasta2bed.py->CGAT/FastaIterator.py - - - - -scripts/fasta2distances.py - -scripts/fasta2distances.py - - -scripts/fasta2distances.py->CGAT/Experiment.py - - - - -scripts/fasta2distances.py->CGAT/FastaIterator.py - - - - -scripts/fasta2distances.py->CGAT/Genomics.py - - - - -scripts/fasta2fasta.py - -scripts/fasta2fasta.py - - -scripts/fasta2fasta.py->CGAT/Experiment.py - - - - -scripts/fasta2fasta.py->CGAT/IOTools.py - - - - -scripts/fasta2fasta.py->CGAT/FastaIterator.py - - - - -scripts/fasta2fasta.py->CGAT/Masker.py - - - - -scripts/fasta2fasta.py->CGAT/Genomics.py - - - - -scripts/fasta2gff.py - -scripts/fasta2gff.py - - -scripts/fasta2gff.py->CGAT/Experiment.py - - - - -scripts/fasta2gff.py->CGAT/GTF.py - - - - -scripts/fasta2gff.py->CGAT/IndexedFasta.py - - - - -scripts/fasta2kmercontent.py - -scripts/fasta2kmercontent.py - - -scripts/fasta2kmercontent.py->CGAT/Experiment.py - - - - -scripts/fasta2kmercontent.py->CGAT/FastaIterator.py - - - - -scripts/fasta2nj.py - -scripts/fasta2nj.py - - -scripts/fasta2nj.py->CGAT/Experiment.py - - - - -scripts/fasta2nj.py->CGAT/IOTools.py - - - - -scripts/fasta2table.py - -scripts/fasta2table.py - - -scripts/fasta2table.py->CGAT/Experiment.py - - - - -scripts/fasta2table.py->CGAT/IOTools.py - - - - -scripts/fasta2table.py->CGAT/FastaIterator.py - - - - -scripts/fasta2table.py->CGAT/Genomics.py - - - - -scripts/fasta2table.py->CGAT/SequenceProperties.py - - - - -scripts/fasta2variants.py - -scripts/fasta2variants.py - - -scripts/fasta2variants.py->CGAT/Experiment.py - - - - -scripts/fasta2variants.py->CGAT/FastaIterator.py - - - - -scripts/fasta2variants.py->CGAT/Genomics.py - - - - -scripts/fastas2fasta.py - -scripts/fastas2fasta.py - - -scripts/fastas2fasta.py->CGAT/Experiment.py - - - - -scripts/fastas2fasta.py->CGAT/IOTools.py - - - - -scripts/fastas2fasta.py->CGAT/FastaIterator.py - - - - -scripts/fastq2N.py - -scripts/fastq2N.py - - -scripts/fastq2N.py->CGAT/Experiment.py - - - - -scripts/fastq2N.py->CGAT/Fastq.py - - - - -scripts/fastq2fastq.py - -scripts/fastq2fastq.py - - -scripts/fastq2fastq.py->CGAT/Experiment.py - - - - -scripts/fastq2fastq.py->CGAT/IOTools.py - - - - -scripts/fastq2fastq.py->CGAT/Fastq.py - - - - -scripts/fastq2solid.py - -scripts/fastq2solid.py - - -scripts/fastq2solid.py->CGAT/Experiment.py - - - - -scripts/fastq2solid.py->CGAT/IOTools.py - - - - -scripts/fastq2solid.py->CGAT/Fastq.py - - - - -scripts/fastq2summary.py - -scripts/fastq2summary.py - - -scripts/fastq2summary.py->CGAT/Experiment.py - - - - -scripts/fastq2summary.py->CGAT/Fastq.py - - - - -scripts/fastq2table.py - -scripts/fastq2table.py - - -scripts/fastq2table.py->CGAT/Experiment.py - - - - -scripts/fastq2table.py->CGAT/Stats.py - - - - -scripts/fastq2table.py->CGAT/Fastq.py - - - - -scripts/fastqs2fasta.py - -scripts/fastqs2fasta.py - - -scripts/fastqs2fasta.py->CGAT/Experiment.py - - - - -scripts/fastqs2fasta.py->CGAT/IOTools.py - - - - -scripts/fastqs2fasta.py->CGAT/Fastq.py - - - - -scripts/fastqs2fastq.py - -scripts/fastqs2fastq.py - - -scripts/fastqs2fastq.py->CGAT/Experiment.py - - - - -scripts/fastqs2fastq.py->CGAT/IOTools.py - - - - -scripts/fastqs2fastq.py->CGAT/Fastq.py - - - - -scripts/fastqs2fastq.py->CGAT/Genomics.py - - - - -scripts/fastqs2fastqs.py - -scripts/fastqs2fastqs.py - - -scripts/fastqs2fastqs.py->CGAT/Experiment.py - - - - -scripts/fastqs2fastqs.py->CGAT/IOTools.py - - - - -scripts/filter_reads.py - -scripts/filter_reads.py - - -scripts/filter_reads.py->CGAT/Experiment.py - - - - -scripts/filter_tokens.py - -scripts/filter_tokens.py - - -scripts/filter_tokens.py->CGAT/Experiment.py - - - - -scripts/formatMetagenemark.py - -scripts/formatMetagenemark.py - - -scripts/formatMetagenemark.py->CGAT/Experiment.py - - - - -scripts/genelist_analysis.py - -scripts/genelist_analysis.py - - -scripts/genelist_analysis.py->CGAT/Experiment.py - - - - -scripts/genelist_analysis.py->CGAT/IOTools.py - - - - -scripts/genelist_analysis.py->CGAT/Stats.py - - - - -scripts/genelist_analysis.py->CGAT/GO.py - - - - -scripts/genes2genes.py - -scripts/genes2genes.py - - -scripts/genes2genes.py->CGAT/Experiment.py - - - - -scripts/genes2genes.py->CGAT/Biomart.py - - - - -scripts/genome_bed.py - -scripts/genome_bed.py - - -scripts/genome_bed.py->CGAT/Experiment.py - - - - -scripts/genome_bed.py->CGAT/IndexedFasta.py - - - - -scripts/geo2table.py - -scripts/geo2table.py - - -scripts/geo2table.py->CGAT/Experiment.py - - - - -scripts/geo2table.py->CGAT/IOTools.py - - - - -scripts/gff2bed.py - -scripts/gff2bed.py - - -scripts/gff2bed.py->CGAT/Experiment.py - - - - -scripts/gff2bed.py->CGAT/Bed.py - - - - -scripts/gff2bed.py->CGAT/GTF.py - - - - -scripts/gff2coverage.py - -scripts/gff2coverage.py - - -scripts/gff2coverage.py->CGAT/Experiment.py - - - - -scripts/gff2coverage.py->CGAT/GTF.py - - - - -scripts/gff2coverage.py->CGAT/IndexedFasta.py - - - - -scripts/gff2fasta.py - -scripts/gff2fasta.py - - -scripts/gff2fasta.py->CGAT/Experiment.py - - - - -scripts/gff2fasta.py->CGAT/GTF.py - - - - -scripts/gff2fasta.py->CGAT/IndexedFasta.py - - - - -scripts/gff2fasta.py->CGAT/Masker.py - - - - -scripts/gff2fasta.py->CGAT/Intervals.py - - - - -scripts/gff2fasta.py->CGAT/Genomics.py - - - - -scripts/gff2gff.py - -scripts/gff2gff.py - - -scripts/gff2gff.py->CGAT/Experiment.py - - - - -scripts/gff2gff.py->CGAT/IOTools.py - - - - -scripts/gff2gff.py->CGAT/GTF.py - - - - -scripts/gff2gff.py->CGAT/IndexedFasta.py - - - - -scripts/gff2gff.py->CGAT/Intervals.py - - - - -scripts/gff2gff.py->CGAT/Genomics.py - - - - -scripts/gff2gff.py->CGAT/AGP.py - - - - -scripts/gff2histogram.py - -scripts/gff2histogram.py - - -scripts/gff2histogram.py->CGAT/Experiment.py - - - - -scripts/gff2histogram.py->CGAT/Bed.py - - - - -scripts/gff2histogram.py->CGAT/Stats.py - - - - -scripts/gff2histogram.py->CGAT/GTF.py - - - - -scripts/gff2histogram.py->CGAT/Histogram.py - - - - -scripts/gff2plot.py - -scripts/gff2plot.py - - -scripts/gff2plot.py->CGAT/Experiment.py - - - - -scripts/gff2plot.py->CGAT/IOTools.py - - - - -scripts/gff2psl.py - -scripts/gff2psl.py - - -scripts/gff2psl.py->CGAT/Experiment.py - - - - -scripts/gff2psl.py->CGAT/GTF.py - - - - -scripts/gff2psl.py->CGAT/IndexedFasta.py - - - - -scripts/gff2psl.py->CGAT/Intervals.py - - - - -scripts/gff2psl.py->CGAT/Blat.py - - - - -scripts/gff2stats.py - -scripts/gff2stats.py - - -scripts/gff2stats.py->CGAT/Experiment.py - - - - -scripts/gff2stats.py->CGAT/IOTools.py - - - - -scripts/gff2stats.py->CGAT/Stats.py - - - - -scripts/gff2stats.py->CGAT/GTF.py - - - - -scripts/gff2stats.py->CGAT/Intervals.py - - - - -scripts/gff2table.py - -scripts/gff2table.py - - -scripts/gff2table.py->CGAT/Experiment.py - - - - -scripts/gff2table.py->CGAT/IndexedGenome.py - - - - -scripts/gff2table.py->CGAT/Stats.py - - - - -scripts/gff2table.py->CGAT/GTF.py - - - - -scripts/gff2table.py->CGAT/IndexedFasta.py - - - - -scripts/gff2table.py->CGAT/Intervals.py - - - - -scripts/gff2table.py->CGAT/Genomics.py - - - - -scripts/gff2view.py - -scripts/gff2view.py - - -scripts/gff2view.py->CGAT/Experiment.py - - - - -scripts/gff2view.py->CGAT/GTF.py - - - - -scripts/gff2view.py->CGAT/IndexedFasta.py - - - - -scripts/gff32gtf.py - -scripts/gff32gtf.py - - -scripts/gff32gtf.py->CGAT/Experiment.py - - - - -scripts/gff32gtf.py->CGAT/IOTools.py - - - - -scripts/gff32gtf.py->CGAT/GTF.py - - - - -scripts/gff32gtf.py->CGAT/GFF3.py - - - - -scripts/gff_compare.py - -scripts/gff_compare.py - - -scripts/gff_compare.py->CGAT/Experiment.py - - - - -scripts/gff_decorate.py - -scripts/gff_decorate.py - - -scripts/gff_decorate.py->CGAT/Experiment.py - - - - -scripts/gff_decorate.py->CGAT/IndexedGenome.py - - - - -scripts/gff_decorate.py->CGAT/Stats.py - - - - -scripts/gff_decorate.py->CGAT/IndexedFasta.py - - - - -scripts/gff_decorate.py->CGAT/Intervals.py - - - - -scripts/gff_decorate.py->CGAT/Genomics.py - - - - -scripts/gi2parents.py - -scripts/gi2parents.py - - -scripts/gi2parents.py->CGAT/Experiment.py - - - - -scripts/gi2parents.py->CGAT/IOTools.py - - - - -scripts/go2plot.py - -scripts/go2plot.py - - -scripts/go2plot.py->CGAT/Experiment.py - - - - -scripts/go2svg.py - -scripts/go2svg.py - - -scripts/go2svg.py->CGAT/Experiment.py - - - - -scripts/go2svg.py->CGAT/Stats.py - - - - -scripts/go2svg.py->CGAT/CorrespondenceAnalysis.py - - - - -scripts/go2svg.py->CGAT/SVGdraw.py - - - - -scripts/gtf2alleles.py - -scripts/gtf2alleles.py - - -scripts/gtf2alleles.py->CGAT/Experiment.py - - - - -scripts/gtf2alleles.py->CGAT/IOTools.py - - - - -scripts/gtf2alleles.py->CGAT/GTF.py - - - - -scripts/gtf2alleles.py->CGAT/IndexedFasta.py - - - - -scripts/gtf2alleles.py->CGAT/Genomics.py - - - - -scripts/gtf2alleles.py->CGAT/Blat.py - - - - -scripts/gtf2alleles.py->CGAT/Variants.py - - - - -scripts/gtf2fasta.py - -scripts/gtf2fasta.py - - -scripts/gtf2fasta.py->CGAT/Experiment.py - - - - -scripts/gtf2fasta.py->CGAT/GTF.py - - - - -scripts/gtf2fasta.py->CGAT/IndexedFasta.py - - - - -scripts/gtf2fasta.py->CGAT/Intervals.py - - - - -scripts/gtf2fasta.py->CGAT/Genomics.py - - - - -scripts/gtf2gff.py - -scripts/gtf2gff.py - - -scripts/gtf2gff.py->CGAT/Experiment.py - - - - -scripts/gtf2gff.py->CGAT/IOTools.py - - - - -scripts/gtf2gff.py->CGAT/GTF.py - - - - -scripts/gtf2gff.py->CGAT/IndexedFasta.py - - - - -scripts/gtf2gff.py->CGAT/Intervals.py - - - - -scripts/gtf2gff.py->CGAT/Genomics.py - - - - -scripts/gtf2gtf.py - -scripts/gtf2gtf.py - - -scripts/gtf2gtf.py->CGAT/Experiment.py - - - - -scripts/gtf2gtf.py->CGAT/IOTools.py - - - - -scripts/gtf2gtf.py->CGAT/GTF.py - - - - -scripts/gtf2gtf.py->CGAT/Intervals.py - - - - -scripts/gtf2gtf.py->CGAT/Genomics.py - - - - -scripts/gtf2overlap.py - -scripts/gtf2overlap.py - - -scripts/gtf2overlap.py->CGAT/Experiment.py - - - - -scripts/gtf2overlap.py->CGAT/IOTools.py - - - - -scripts/gtf2overlap.py->CGAT/GTF.py - - - - -scripts/gtf2reads.py - -scripts/gtf2reads.py - - -scripts/gtf2reads.py->CGAT/Experiment.py - - - - -scripts/gtf2reads.py->CGAT/GTF.py - - - - -scripts/gtf2reads.py->CGAT/IndexedFasta.py - - - - -scripts/gtf2reads.py->CGAT/Genomics.py - - - - -scripts/gtf2reads.py->CGAT/Iterators.py - - - - -scripts/gtf2reads.py->CGAT/SequencePairProperties.py - - - - -scripts/gtf2tsv.py - -scripts/gtf2tsv.py - - -scripts/gtf2tsv.py->CGAT/Experiment.py - - - - -scripts/gtf2tsv.py->CGAT/GTF.py - - - - -scripts/gtfs2graph.py - -scripts/gtfs2graph.py - - -scripts/gtfs2graph.py->CGAT/Experiment.py - - - - -scripts/gtfs2graph.py->CGAT/IOTools.py - - - - -scripts/gtfs2graph.py->CGAT/GTF.py - - - - -scripts/gtfs2tsv.py - -scripts/gtfs2tsv.py - - -scripts/gtfs2tsv.py->CGAT/Experiment.py - - - - -scripts/gtfs2tsv.py->CGAT/IOTools.py - - - - -scripts/gtfs2tsv.py->CGAT/GTF.py - - - - -scripts/histogram2histogram.py - -scripts/histogram2histogram.py - - -scripts/histogram2histogram.py->CGAT/Experiment.py - - - - -scripts/histogram2histogram.py->CGAT/IOTools.py - - - - -scripts/histograms2kl.py - -scripts/histograms2kl.py - - -scripts/histograms2kl.py->CGAT/Experiment.py - - - - -scripts/histograms2kl.py->CGAT/IOTools.py - - - - -scripts/index2bed.py - -scripts/index2bed.py - - -scripts/index2bed.py->CGAT/Experiment.py - - - - -scripts/index2bed.py->CGAT/IndexedFasta.py - - - - -scripts/index2gff.py - -scripts/index2gff.py - - -scripts/index2gff.py->CGAT/Experiment.py - - - - -scripts/index2gff.py->CGAT/IndexedFasta.py - - - - -scripts/index_fasta.py - -scripts/index_fasta.py - - -scripts/index_fasta.py->CGAT/Experiment.py - - - - -scripts/index_fasta.py->CGAT/IndexedFasta.py - - - - -scripts/intervaltable2bed.py - -scripts/intervaltable2bed.py - - -scripts/intervaltable2bed.py->CGAT/Experiment.py - - - - -scripts/join_tables.py - -scripts/join_tables.py - - -scripts/join_tables.py->CGAT/Experiment.py - - - - -scripts/lca2table.py - -scripts/lca2table.py - - -scripts/lca2table.py->CGAT/Experiment.py - - - - -scripts/lca2table.py->CGAT/LCA.py - - - - -scripts/liftover.py - -scripts/liftover.py - - -scripts/liftover.py->CGAT/Experiment.py - - - - -scripts/liftover.py->CGAT/IOTools.py - - - - -scripts/list_overlap.py - -scripts/list_overlap.py - - -scripts/list_overlap.py->CGAT/Experiment.py - - - - -scripts/maf2psl.py - -scripts/maf2psl.py - - -scripts/maf2psl.py->CGAT/Experiment.py - - - - -scripts/maf2psl.py->CGAT/Blat.py - - - - -scripts/maq2assembly.py - -scripts/maq2assembly.py - - -scripts/maq2assembly.py->CGAT/Experiment.py - - - - -scripts/maq2assembly.py->CGAT/Stats.py - - - - -scripts/maq2assembly.py->CGAT/GTF.py - - - - -scripts/maq2psl.py - -scripts/maq2psl.py - - -scripts/maq2psl.py->CGAT/Experiment.py - - - - -scripts/maq2psl.py->CGAT/IndexedFasta.py - - - - -scripts/maq2psl.py->CGAT/Blat.py - - - - -scripts/maq2psl.py->CGAT/Maq.py - - - - -scripts/mask_fasta.py - -scripts/mask_fasta.py - - -scripts/mask_fasta.py->CGAT/Experiment.py - - - - -scripts/matrix2matrix.py - -scripts/matrix2matrix.py - - -scripts/matrix2matrix.py->CGAT/Experiment.py - - - - -scripts/matrix2matrix.py->CGAT/IOTools.py - - - - -scripts/matrix2matrix.py->CGAT/CorrespondenceAnalysis.py - - - - -scripts/matrix2matrix.py->CGAT/MatlabTools.py - - - - -scripts/matrix2stats.py - -scripts/matrix2stats.py - - -scripts/matrix2stats.py->CGAT/Experiment.py - - - - -scripts/matrix2stats.py->CGAT/IOTools.py - - - - -scripts/matrix2stats.py->CGAT/Stats.py - - - - -scripts/matrix2stats.py->CGAT/MatlabTools.py - - - - -scripts/medip_merge_intervals.py - -scripts/medip_merge_intervals.py - - -scripts/medip_merge_intervals.py->CGAT/Experiment.py - - - - -scripts/medip_merge_intervals.py->CGAT/IOTools.py - - - - -scripts/merge_tables.py - -scripts/merge_tables.py - - -scripts/merge_tables.py->CGAT/Experiment.py - - - - -scripts/metaphlan2table.py - -scripts/metaphlan2table.py - - -scripts/metaphlan2table.py->CGAT/Experiment.py - - - - -scripts/metaphlan2table.py->CGAT/Metaphlan.py - - - - -scripts/modify_table.py - -scripts/modify_table.py - - -scripts/modify_table.py->CGAT/Experiment.py - - - - -scripts/numbers2rgb.py - -scripts/numbers2rgb.py - - -scripts/numbers2rgb.py->CGAT/Experiment.py - - - - -scripts/plot_data.py - -scripts/plot_data.py - - -scripts/plot_data.py->CGAT/Experiment.py - - - - -scripts/plot_histogram.py - -scripts/plot_histogram.py - - -scripts/plot_histogram.py->CGAT/Experiment.py - - - - -scripts/plot_histogram.py->CGAT/IOTools.py - - - - -scripts/plot_matrix.py - -scripts/plot_matrix.py - - -scripts/plot_matrix.py->CGAT/Experiment.py - - - - -scripts/plot_matrix.py->CGAT/MatlabTools.py - - - - -scripts/png2svg.py - -scripts/png2svg.py - - -scripts/png2svg.py->CGAT/Experiment.py - - - - -scripts/png2svg.py->CGAT/SVGdraw.py - - - - -scripts/probeset2gene.py - -scripts/probeset2gene.py - - -scripts/probeset2gene.py->CGAT/Experiment.py - - - - -scripts/psl2assembly.py - -scripts/psl2assembly.py - - -scripts/psl2assembly.py->CGAT/Experiment.py - - - - -scripts/psl2assembly.py->CGAT/Stats.py - - - - -scripts/psl2assembly.py->CGAT/IndexedFasta.py - - - - -scripts/psl2assembly.py->CGAT/Genomics.py - - - - -scripts/psl2assembly.py->CGAT/Blat.py - - - - -scripts/psl2assembly.py->CGAT/Mali.py - - - - -scripts/psl2chain.py - -scripts/psl2chain.py - - -scripts/psl2chain.py->CGAT/Experiment.py - - - - -scripts/psl2chain.py->CGAT/Blat.py - - - - -scripts/psl2fasta.py - -scripts/psl2fasta.py - - -scripts/psl2fasta.py->CGAT/Experiment.py - - - - -scripts/psl2fasta.py->CGAT/IndexedFasta.py - - - - -scripts/psl2fasta.py->CGAT/Genomics.py - - - - -scripts/psl2fasta.py->CGAT/Blat.py - - - - -scripts/psl2gff.py - -scripts/psl2gff.py - - -scripts/psl2gff.py->CGAT/Experiment.py - - - - -scripts/psl2gff.py->CGAT/IOTools.py - - - - -scripts/psl2gff.py->CGAT/GTF.py - - - - -scripts/psl2gff.py->CGAT/Blat.py - - - - -scripts/psl2map.py - -scripts/psl2map.py - - -scripts/psl2map.py->CGAT/Experiment.py - - - - -scripts/psl2map.py->CGAT/GTF.py - - - - -scripts/psl2map.py->CGAT/IndexedFasta.py - - - - -scripts/psl2map.py->CGAT/Intervals.py - - - - -scripts/psl2map.py->CGAT/Blat.py - - - - -scripts/psl2map.py->CGAT/Histogram.py - - - - -scripts/psl2psl.py - -scripts/psl2psl.py - - -scripts/psl2psl.py->CGAT/Experiment.py - - - - -scripts/psl2psl.py->CGAT/IOTools.py - - - - -scripts/psl2psl.py->CGAT/IndexedGenome.py - - - - -scripts/psl2psl.py->CGAT/GTF.py - - - - -scripts/psl2psl.py->CGAT/IndexedFasta.py - - - - -scripts/psl2psl.py->CGAT/Genomics.py - - - - -scripts/psl2psl.py->CGAT/Blat.py - - - - -scripts/psl2stats.py - -scripts/psl2stats.py - - -scripts/psl2stats.py->CGAT/Experiment.py - - - - -scripts/psl2stats.py->CGAT/Blat.py - - - - -scripts/psl2table.py - -scripts/psl2table.py - - -scripts/psl2table.py->CGAT/Experiment.py - - - - -scripts/psl2table.py->CGAT/Blat.py - - - - -scripts/psl2table.py->CGAT/SequencePairProperties.py - - - - -scripts/psl2table.py->CGAT/WrapperCodeML.py - - - - -scripts/psl2table.py->CGAT/SequenceProperties.py - - - - -scripts/psl2wiggle.py - -scripts/psl2wiggle.py - - -scripts/psl2wiggle.py->CGAT/Experiment.py - - - - -scripts/psl2wiggle.py->CGAT/IOTools.py - - - - -scripts/psl2wiggle.py->CGAT/IndexedFasta.py - - - - -scripts/psl2wiggle.py->CGAT/Blat.py - - - - -scripts/quality2fasta.py - -scripts/quality2fasta.py - - -scripts/quality2fasta.py->CGAT/Experiment.py - - - - -scripts/quality2fasta.py->CGAT/IndexedFasta.py - - - - -scripts/quality2fasta.py->CGAT/FastaIterator.py - - - - -scripts/quality2masks.py - -scripts/quality2masks.py - - -scripts/quality2masks.py->CGAT/Experiment.py - - - - -scripts/quality2masks.py->CGAT/IndexedFasta.py - - - - -scripts/quality2masks.py->CGAT/Blat.py - - - - -scripts/quality2masks.py->CGAT/Iterators.py - - - - -scripts/r_compare_distributions.py - -scripts/r_compare_distributions.py - - -scripts/r_compare_distributions.py->CGAT/Experiment.py - - - - -scripts/r_compare_distributions.py->CGAT/IOTools.py - - - - -scripts/r_compare_distributions.py->CGAT/Stats.py - - - - -scripts/r_mann_whitney_u.py - -scripts/r_mann_whitney_u.py - - -scripts/r_mann_whitney_u.py->CGAT/Experiment.py - - - - -scripts/r_mann_whitney_u.py->CGAT/IOTools.py - - - - -scripts/r_table2scatter.py - -scripts/r_table2scatter.py - - -scripts/r_table2scatter.py->CGAT/Experiment.py - - - - -scripts/r_table2scatter.py->CGAT/Stats.py - - - - -scripts/r_table2scatter.py->CGAT/MatlabTools.py - - - - -scripts/r_test.py - -scripts/r_test.py - - -scripts/r_test.py->CGAT/Experiment.py - - - - -scripts/r_test.py->CGAT/IOTools.py - - - - -scripts/r_test.py->CGAT/Stats.py - - - - -scripts/rename_links.py - -scripts/rename_links.py - - -scripts/rename_links.py->CGAT/Experiment.py - - - - -scripts/revigo.py - -scripts/revigo.py - - -scripts/revigo.py->CGAT/Experiment.py - - - - -scripts/revigo.py->CGAT/IOTools.py - - - - -scripts/revigo.py->CGAT/GO.py - - - - -scripts/rnaseq_junction_bam2bam.py - -scripts/rnaseq_junction_bam2bam.py - - -scripts/rnaseq_junction_bam2bam.py->CGAT/Experiment.py - - - - -scripts/rnaseq_junction_bam2bam.py->CGAT/IOTools.py - - - - -scripts/runExpression.py - -scripts/runExpression.py - - -scripts/runExpression.py->CGAT/Experiment.py - - - - -scripts/runExpression.py->CGAT/Expression.py - - - - -scripts/runGO.py - -scripts/runGO.py - - -scripts/runGO.py->CGAT/Experiment.py - - - - -scripts/runGO.py->CGAT/IOTools.py - - - - -scripts/runGO.py->CGAT/GO.py - - - - -scripts/runMEDIPS.py - -scripts/runMEDIPS.py - - -scripts/runMEDIPS.py->CGAT/Experiment.py - - - - -scripts/runMEDIPS.py->CGAT/IOTools.py - - - - -scripts/runMEDIPS.py->CGAT/BamTools.py - - - - -scripts/runMEDIPS.py->CGAT/CSV.py - - - - -scripts/runMEDIPS.py->CGAT/IndexedFasta.py - - - - -scripts/runMEDIPS.py->CGAT/Expression.py - - - - -scripts/runSPP.py - -scripts/runSPP.py - - -scripts/runSPP.py->CGAT/Experiment.py - - - - -scripts/runZinba.py - -scripts/runZinba.py - - -scripts/runZinba.py->CGAT/Experiment.py - - - - -scripts/runZinba.py->CGAT/IOTools.py - - - - -scripts/runZinba.py->CGAT/BamTools.py - - - - -scripts/set_diff.py - -scripts/set_diff.py - - -scripts/set_diff.py->CGAT/Experiment.py - - - - -scripts/set_diff.py->CGAT/IOTools.py - - - - -scripts/simulate_function.py - -scripts/simulate_function.py - - -scripts/simulate_function.py->CGAT/Experiment.py - - - - -scripts/snp2counts.py - -scripts/snp2counts.py - - -scripts/snp2counts.py->CGAT/Experiment.py - - - - -scripts/snp2counts.py->CGAT/IOTools.py - - - - -scripts/snp2counts.py->CGAT/IndexedGenome.py - - - - -scripts/snp2counts.py->CGAT/GTF.py - - - - -scripts/snp2counts.py->CGAT/IndexedFasta.py - - - - -scripts/snp2counts.py->CGAT/Genomics.py - - - - -scripts/snp2maf.py - -scripts/snp2maf.py - - -scripts/snp2maf.py->CGAT/Experiment.py - - - - -scripts/snp2maf.py->CGAT/GTF.py - - - - -scripts/snp2maf.py->CGAT/IndexedFasta.py - - - - -scripts/snp2maf.py->CGAT/Genomics.py - - - - -scripts/snp2maf.py->CGAT/Variants.py - - - - -scripts/snp2snp.py - -scripts/snp2snp.py - - -scripts/snp2snp.py->CGAT/Experiment.py - - - - -scripts/snp2table.py - -scripts/snp2table.py - - -scripts/snp2table.py->CGAT/Experiment.py - - - - -scripts/snp2table.py->CGAT/IndexedGenome.py - - - - -scripts/snp2table.py->CGAT/IndexedFasta.py - - - - -scripts/snp2table.py->CGAT/Genomics.py - - - - -scripts/solexa2stats.py - -scripts/solexa2stats.py - - -scripts/solexa2stats.py->CGAT/Experiment.py - - - - -scripts/sparse2full.py - -scripts/sparse2full.py - - -scripts/sparse2full.py->CGAT/Experiment.py - - - - -scripts/split_fasta.py - -scripts/split_fasta.py - - -scripts/split_fasta.py->CGAT/Experiment.py - - - - -scripts/split_fasta.py->CGAT/IOTools.py - - - - -scripts/split_fasta.py->CGAT/FastaIterator.py - - - - -scripts/split_file.py - -scripts/split_file.py - - -scripts/split_file.py->CGAT/Experiment.py - - - - -scripts/split_genome.py - -scripts/split_genome.py - - -scripts/split_genome.py->CGAT/Experiment.py - - - - -scripts/split_genomic_fasta_file.py - -scripts/split_genomic_fasta_file.py - - -scripts/split_genomic_fasta_file.py->CGAT/Experiment.py - - - - -scripts/split_gff.py - -scripts/split_gff.py - - -scripts/split_gff.py->CGAT/Experiment.py - - - - -scripts/split_gff.py->CGAT/IOTools.py - - - - -scripts/split_gff.py->CGAT/GTF.py - - - - -scripts/split_links.py - -scripts/split_links.py - - -scripts/split_links.py->CGAT/Experiment.py - - - - -scripts/substitute_tokens.py - -scripts/substitute_tokens.py - - -scripts/substitute_tokens.py->CGAT/Experiment.py - - - - -scripts/substitute_tokens.py->CGAT/IOTools.py - - - - -scripts/table2graph.py - -scripts/table2graph.py - - -scripts/table2graph.py->CGAT/Experiment.py - - - - -scripts/table2table.py - -scripts/table2table.py - - -scripts/table2table.py->CGAT/Experiment.py - - - - -scripts/table2table.py->CGAT/CSV.py - - - - -scripts/table2table.py->CGAT/Stats.py - - - - -scripts/tfbs2enrichment.py - -scripts/tfbs2enrichment.py - - -scripts/tfbs2enrichment.py->CGAT/Experiment.py - - - - -scripts/tfbs2enrichment.py->CGAT/IOTools.py - - - - -scripts/timeseries2diffgenes.py - -scripts/timeseries2diffgenes.py - - -scripts/timeseries2diffgenes.py->CGAT/Experiment.py - - - - -scripts/timeseries2diffgenes.py->CGAT/Timeseries - - - - -scripts/transfac2transfac.py - -scripts/transfac2transfac.py - - -scripts/transfac2transfac.py->CGAT/Experiment.py - - - - -scripts/vcf2vcf.py - -scripts/vcf2vcf.py - - -scripts/vcf2vcf.py->CGAT/Experiment.py - - - - -scripts/vcf2vcf.py->CGAT/VCF.py - - - - -scripts/vcfstats2db.py - -scripts/vcfstats2db.py - - -scripts/vcfstats2db.py->CGAT/Experiment.py - - - - -scripts/vcfstats2db.py->CGAT/IOTools.py - - - - -scripts/version.py - -scripts/version.py - - -scripts/wig2bed.py - -scripts/wig2bed.py - - -scripts/wig2bed.py->CGAT/Experiment.py - - - - -scripts/wig2bed.py->CGAT/IOTools.py - - - - -scripts/wig2bed.py->CGAT/IndexedFasta.py - - - - -scripts/wig2wig.py - -scripts/wig2wig.py - - -scripts/wig2wig.py->CGAT/Experiment.py - - - - -scripts/wig2wig.py->CGAT/IndexedFasta.py - - - - - diff --git a/dependency_graph/graph.py b/dependency_graph/graph.py deleted file mode 100644 index 815d76715..000000000 --- a/dependency_graph/graph.py +++ /dev/null @@ -1,116 +0,0 @@ -""" -Read snakefood dependencies and output a visual graph. -""" -# This file is part of the Snakefood open source package. -# See http://furius.ca/snakefood/ for licensing details. - -# Modified by AH to colour nodes according to subdir. - -import sys -import os - -from snakefood.depends import read_depends, eliminate_redundant_depends - -prefix = ''' -# This file was generated by sfood-graph. - -strict digraph "dependencies" { - graph [ - rankdir = "LR", - overlap = "scale", - size = "8,10", - ratio = "fill", - fontsize = "16", - fontname = "Helvetica", - clusterrank = "local" - ] - - node [ - fontsize=%s - shape=ellipse - // style=filled - // shape=box - ]; - -''' -postfix = ''' - -} -''' - -COLORS = ["#999999", "#E69F00", "#56B4E9", "#009E73", - "#F0E442", "#0072B2", "#D55E00", "#CC79A7"] - - -def graph(pairs, write, fontsize, color_map): - "Given (from, to) pairs of (root, fn) files, output a dot graph." - write(prefix % fontsize) - for (froot, f), (troot, t) in pairs: - if opts.pythonify_filenames: - f = normpyfn(f) - t = normpyfn(t) - if opts.full_pathnames: - f = os.path.join(froot, f) - if troot: - t = os.path.join(troot, t) - if troot is None: - dn = os.path.dirname(f) - if dn not in color_map: - color_map[dn] = COLORS[len(color_map) % len(COLORS)] - write('"%s" [style=filled, color="%s"];\n' % (f, color_map[dn])) - else: - write('"%s" -> "%s";\n' % (f, t)) - write(postfix) - - -def normpyfn(fn): - "Normalize the python filenames for output." - if fn is None: - return fn - if fn.endswith('.py'): - fn = fn[:-3] - fn = fn.replace(os.sep, '.') - return fn - - -def main(): - import optparse - parser = optparse.OptionParser(__doc__.strip()) - - parser.add_option('-f', '--full-pathnames', '--full', action='store_true', - help="Output the full pathnames, not just the relative.") - - parser.add_option('-p', '--pythonify-filenames', '--remove-extensions', - action='store_true', - help="Remove filename extensions in the graph and " - "replace slashes with dots.") - - parser.add_option('-r', '--redundant', action='store_false', default=True, - help="Do not eliminate redundant dependencies.") - - parser.add_option('--fontsize', action='store', type='int', - default=10, - help="The size of the font to use for nodes.") - - global opts - opts, args = parser.parse_args() - - if not args: - args = ['-'] - - color_map = {} - - for fn in args: - if fn == '-': - f = sys.stdin - else: - f = open(fn) - depends = read_depends(f) - if opts.redundant: - depends = eliminate_redundant_depends(depends) - graph(depends, sys.stdout.write, opts.fontsize, color_map) - - -if __name__ == "__main__": - main() - diff --git a/deprecated_scripts.md b/deprecated_scripts.md new file mode 100644 index 000000000..19051fcc8 --- /dev/null +++ b/deprecated_scripts.md @@ -0,0 +1,22 @@ +#Scripts that have been deprecated: +chain2psl +bam2UniquePairs +bam2libtype +bam2peakshape +bed2annotator +bed2plot +cat_tables +cgat_fasta2cDNA +combine_tables +csv_interestion +csv_rename +csv_select +csv_set +medip_merge_intervals +rndomize_lines +transfac2transfac + +# Warnings for deprecation in the next release +AGP.py (its used once in gff2gff to parse agp files) +Blat.py +gff2psl \ No newline at end of file diff --git a/install.sh b/install.sh deleted file mode 100755 index 55572178f..000000000 --- a/install.sh +++ /dev/null @@ -1,966 +0,0 @@ -#!/usr/bin/env bash - -# References -# http://kvz.io/blog/2013/11/21/bash-best-practices/ -# http://jvns.ca/blog/2017/03/26/bash-quirks/ - -# exit when a command fails -set -o errexit - -# exit if any pipe commands fail -set -o pipefail - -# exit when your script tries to use undeclared variables -#set -o nounset - -# trace what gets executed -#set -o xtrace - -# Bash traps -# http://aplawrence.com/Basics/trapping_errors.html -# https://stelfox.net/blog/2013/11/fail-fast-in-bash-scripts/ - -set -o errtrace - -SCRIPT_NAME="$0" -SCRIPT_PARAMS="$@" - -error_handler() { - echo - echo " ########################################################## " - echo - echo " An error occurred in:" - echo - echo " - line number: ${1}" - shift - echo " - exit status: ${1}" - shift - echo " - command: ${@}" - echo - echo " The script will abort now. User input was: " - echo - echo " ${SCRIPT_NAME} ${SCRIPT_PARAMS}" - echo - echo " Please copy and paste this error and report it via Git Hub: " - echo " https://github.com/cgat-developers/cgat-apps/issues " - print_env_vars - echo " ########################################################## " -} - -trap 'error_handler ${LINENO} $? ${BASH_COMMAND}' ERR INT TERM - -# log installation information -log() { - echo "# install.sh log | `hostname` | `date` | $1 " -} - -# report error and exit -report_error() { - echo - echo $1 - echo - echo "Aborting." - echo - exit 1 -} - -# detect CGAT installation -detect_cgat_installation() { - -if [[ -z "$CGAT_HOME" ]] ; then - - if [[ -d "$HOME/cgat-install/conda-install" ]] ; then - UNINSTALL_DIR="$HOME/cgat-install" - fi - -else - - if [[ -d "$CGAT_HOME/conda-install" ]] ; then - UNINSTALL_DIR="$CGAT_HOME" - fi - -fi - -} # detect_cgat_installation - - -# configure environment variables -# set: CGAT_HOME, CONDA_INSTALL_DIR, CONDA_INSTALL_TYPE_APPS -get_cgat_env() { - -if [[ $TRAVIS_INSTALL ]] ; then - - CGAT_HOME=$TRAVIS_BUILD_DIR - CONDA_INSTALL_TYPE_APPS="cgat-apps.yml" - CONDA_INSTALL_TYPE_CORE="cgat-core.yml" - -elif [[ $JENKINS_INSTALL ]] ; then - - CGAT_HOME=$WORKSPACE - CONDA_INSTALL_TYPE_APPS="cgat-apps.yml" - CONDA_INSTALL_TYPE_CORE="cgat-core.yml" - -else - - if [[ -z $CGAT_HOME ]] ; then - CGAT_HOME=$HOME/cgat-install - fi - - if [[ $INSTALL_PRODUCTION ]] ; then - CONDA_INSTALL_TYPE_APPS="cgat-apps.yml" - CONDA_INSTALL_TYPE_CORE="cgat-core.yml" - elif [[ $INSTALL_DEVEL ]] ; then - CONDA_INSTALL_TYPE_APPS="cgat-apps.yml" - CONDA_INSTALL_TYPE_CORE="cgat-core.yml" - elif [[ $INSTALL_TEST ]] || [[ $INSTALL_UPDATE ]] ; then - if [[ -d $CGAT_HOME/conda-install ]] ; then - AUX=`find $CGAT_HOME/conda-install/envs/cgat-* -maxdepth 0` - CONDA_INSTALL_TYPE_APPS=`basename $AUX` - else - echo - echo " The location of the CGAT code was not found (function: get_cgat_env). " - echo " Please install it first or use --location option with full path to your installation. " - echo - exit 1 - fi - else - echo - echo " Wrong installation type! " - echo " Installation aborted. " - echo - exit 1 - fi # if install type - -fi # if travis install - -CONDA_INSTALL_DIR=$CGAT_HOME/conda-install - -# set conda environment name -[[ ${CONDA_INSTALL_ENV} ]] || CONDA_INSTALL_ENV="cgat-a" - -} # get_cgat_env - - -# setup environment variables -setup_env_vars() { - -export CFLAGS=$CFLAGS" -I$CONDA_INSTALL_DIR/envs/$CONDA_INSTALL_ENV/include -L$CONDA_INSTALL_DIR/envs/$CONDA_INSTALL_ENV/lib" -export CPATH=$CPATH" -I$CONDA_INSTALL_DIR/envs/$CONDA_INSTALL_ENV/include -L$CONDA_INSTALL_DIR/envs/$CONDA_INSTALL_ENV/lib" -export C_INCLUDE_PATH=$C_INCLUDE_PATH:$CONDA_INSTALL_DIR/envs/$CONDA_INSTALL_ENV/include -export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:$CONDA_INSTALL_DIR/envs/$CONDA_INSTALL_ENV/include -export LIBRARY_PATH=$LIBRARY_PATH:$CONDA_INSTALL_DIR/envs/$CONDA_INSTALL_ENV/lib -export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CONDA_INSTALL_DIR/envs/$CONDA_INSTALL_ENV/lib:$CONDA_INSTALL_DIR/envs/$CONDA_INSTALL_ENV/lib/R/lib - -} # setup_env_vars - -# print related environment variables -print_env_vars() { - -echo -echo " Debugging: " -echo " CFLAGS: "$CFLAGS -echo " CPATH: "$CPATH -echo " C_INCLUDE_PATH: "$C_INCLUDE_PATH -echo " CPLUS_INCLUDE_PATH: "$CPLUS_INCLUDE_PATH -echo " LIBRARY_PATH: "$LIBRARY_PATH -echo " LD_LIBRARY_PATH: "$LD_LIBRARY_PATH -echo " CGAT_HOME: "$CGAT_HOME -echo " CONDA_INSTALL_DIR: "$CONDA_INSTALL_DIR -echo " CONDA_INSTALL_TYPE_APPS: "$CONDA_INSTALL_TYPE_APPS -echo " CONDA_INSTALL_TYPE_CORE: "$CONDA_INSTALL_TYPE_CORE -echo " CONDA_INSTALL_ENV: "$CONDA_INSTALL_ENV -echo " PYTHONPATH: "$PYTHONPATH -[[ ! $INSTALL_TEST ]] && echo " INSTALL_BRANCH: "$INSTALL_BRANCH -[[ ! $INSTALL_TEST ]] && echo " CORE_BRANCH: "$CORE_BRANCH -[[ ! $INSTALL_TEST ]] && echo " RELEASE: "$RELEASE -[[ ! $INSTALL_TEST ]] && echo " CODE_DOWNLOAD_TYPE: "$CODE_DOWNLOAD_TYPE -echo - -} # print_env_vars - -# Travis installations are running out of RAM -# with large conda installations. Issue has been submitted here: -# https://github.com/conda/conda/issues/1197 -# While we wait for a response, we'll try to clean up the conda -# installation folder as much as possible -conda_cleanup() { -conda clean --index-cache -conda clean --lock -conda clean --tarballs -y -conda clean --packages -y -} - - -# helper function to install cgat-core -install_cgat_core() { - -log "install cgat core" - -OLDWD=`pwd` -cd $CGAT_HOME - -if [[ $CODE_DOWNLOAD_TYPE -eq 0 ]] ; then - # get the latest version from Git Hub in zip format - curl -LOk https://github.com/cgat-developers/cgat-core/archive/$CORE_BRANCH.zip - unzip $CORE_BRANCH.zip - rm $CORE_BRANCH.zip - if [[ ${RELEASE} ]] ; then - NEW_NAME=`echo $CORE_BRANCH | sed 's/^v//g'` - mv cgat-core-$NEW_NAME/ cgat-core/ - else - mv cgat-core-$CORE_BRANCH/ cgat-core/ - fi -elif [[ $CODE_DOWNLOAD_TYPE -eq 1 ]] ; then - # get latest version from Git Hub with git clone - git clone --branch=$CORE_BRANCH https://github.com/cgat-developers/cgat-core.git -elif [[ $CODE_DOWNLOAD_TYPE -eq 2 ]] ; then - # get latest version from Git Hub with git clone - git clone --branch=$CORE_BRANCH git@github.com:cgat-developers/cgat-core.git -else - report_error " Unknown download type for CGAT core... " -fi - -cd cgat-core/ - -# remove install_requires (no longer required with conda package) -sed -i'' -e '/REPO_REQUIREMENT/,/pass/d' setup.py -sed -i'' -e '/# dependencies/,/dependency_links=dependency_links,/d' setup.py -python setup.py develop - -if [[ $? -ne 0 ]] ; then - echo - echo " There was a problem doing: 'python setup.py develop' " - echo " Installation did not finish properly. " - echo - echo " Please submit this issue via Git Hub: " - echo " https://github.com/cgat-developers/cgat-apps/issues " - echo - print_env_vars - -fi # if-$? - -# revert setup.py if downloaded with git -[[ $CODE_DOWNLOAD_TYPE -ge 1 ]] && git checkout -- setup.py - -# go back to old working directory -cd $OLDWD - -} # install_cgat_core - - -# proceed with conda installation -conda_install() { - -log "installing conda" - -detect_cgat_installation - -if [[ -n "$UNINSTALL_DIR" ]] ; then - - echo - echo " An installation of the CGAT code was found in: $UNINSTALL_DIR" - echo " Please use --location to install CGAT code in a different location " - echo " or uninstall the current version before proceeding." - echo - echo " Installation is aborted." - echo - exit 1 - -fi - -# get environment variables: CGAT_HOME, CONDA_INSTALL_DIR, CONDA_INSTALL_TYPE_APPS -get_cgat_env - -mkdir -p $CGAT_HOME -cd $CGAT_HOME - -# select Miniconda bootstrap script depending on Operating System -MINICONDA= - -if [[ `uname` == "Linux" ]] ; then - - # Conda 4.4 breaks everything again! - # Conda 4.5 looks better - MINICONDA="Miniconda3-latest-Linux-x86_64.sh" - #MINICONDA="Miniconda3-4.3.31-Linux-x86_64.sh" - -elif [[ `uname` == "Darwin" ]] ; then - - # Conda 4.4 breaks everything again! - # Conda 4.5 looks better - MINICONDA="Miniconda3-latest-MacOSX-x86_64.sh" - #MINICONDA="Miniconda3-4.3.31-MacOSX-x86_64.sh" - -else - - echo - echo " Unsupported operating system detected. " - echo - echo " Aborting installation... " - echo - exit 1 - -fi - -log "downloading miniconda" -# download and install conda -wget https://repo.continuum.io/miniconda/${MINICONDA} -O miniconda.sh; - -log "installing miniconda" -bash miniconda.sh -b -p $CONDA_INSTALL_DIR -source ${CONDA_INSTALL_DIR}/bin/activate -hash -r - -# install cgat environment -log "updating conda environment" -# Conda 4.4 breaks everything again! -# Conda 4.5 looks better -#conda install --quiet --yes 'conda=4.3.33' -conda update --all --yes -conda info -a - -log "installing CGAT environment" -# Now using conda environment files: -# https://conda.io/docs/using/envs.html#use-environment-from-file - -[[ -z ${TRAVIS_BRANCH} ]] && TRAVIS_BRANCH=${INSTALL_BRANCH} - -curl -o env-apps.yml -O https://raw.githubusercontent.com/cgat-developers/cgat-apps/${TRAVIS_BRANCH}/conda/environments/${CONDA_INSTALL_TYPE_APPS} - -curl -o env-core.yml -O https://raw.githubusercontent.com/cgat-developers/cgat-core/${CORE_BRANCH}/conda/environments/${CONDA_INSTALL_TYPE_CORE} - -conda env create --quiet --name ${CONDA_INSTALL_ENV} --file env-apps.yml -conda env update --quiet --name ${CONDA_INSTALL_ENV} --file env-core.yml - -conda env export --name ${CONDA_INSTALL_ENV} - -# activate cgat environment -source $CONDA_INSTALL_DIR/bin/activate $CONDA_INSTALL_ENV - -log "installing CGAT code into conda environment" -# if installation is 'devel' (outside of travis), checkout latest version from github -if [[ -z ${TRAVIS_INSTALL} ]] ; then - - DEV_RESULT=0 - - # TO-DO: after code release, INSTALL_PRODUCTION will use pip rather than github - if [[ $INSTALL_PRODUCTION ]] || [[ $INSTALL_DEVEL ]] || [[ $JENKINS_INSTALL ]] ; then - - # install extra deps - curl -o env-extra.yml -O https://raw.githubusercontent.com/cgat-developers/cgat-apps/${TRAVIS_BRANCH}/conda/environments/apps-extra.yml - conda env update --quiet --file env-extra.yml - conda env export --name cgat-a - - # download the code out of jenkins - if [[ -z ${JENKINS_INSTALL} ]] ; then - - # make sure you are in the CGAT_HOME folder - cd $CGAT_HOME - - if [[ $CODE_DOWNLOAD_TYPE -eq 0 ]] ; then - # get the latest version from Git Hub in zip format - curl -LOk https://github.com/cgat-developers/cgat-apps/archive/$INSTALL_BRANCH.zip - unzip $INSTALL_BRANCH.zip - rm $INSTALL_BRANCH.zip - if [[ ${RELEASE} ]] ; then - NEW_NAME=`echo $INSTALL_BRANCH | sed 's/^v//g'` - mv cgat-apps-$NEW_NAME/ cgat-apps/ - else - mv cgat-apps-$INSTALL_BRANCH/ cgat-apps/ - fi - elif [[ $CODE_DOWNLOAD_TYPE -eq 1 ]] ; then - # get latest version from Git Hub with git clone - git clone --branch=$INSTALL_BRANCH https://github.com/cgat-developers/cgat-apps.git - elif [[ $CODE_DOWNLOAD_TYPE -eq 2 ]] ; then - # get latest version from Git Hub with git clone - git clone --branch=$INSTALL_BRANCH git@github.com:cgat-developers/cgat-apps.git - else - report_error " Unknown download type for CGAT code... " - fi - - # make sure you are in the CGAT_HOME/cgat-apps folder - cd $CGAT_HOME/cgat-apps - - fi - - # Set up other environment variables - setup_env_vars - - # install cgat-core - install_cgat_core - - # brute force: modify console_scripts variable/entry point for cgat command - sed -i'' -e 's/CGATScripts/scripts/g' setup.py - - # Python preparation - # remove install_requires (no longer required with conda package) - sed -i'' -e '/REPO_REQUIREMENT/,/pass/d' setup.py - sed -i'' -e '/# dependencies/,/dependency_links=dependency_links,/d' setup.py - python setup.py develop - - if [[ $? -ne 0 ]] ; then - echo - echo " There was a problem doing: 'python setup.py develop' " - echo " Installation did not finish properly. " - echo - echo " Please submit this issue via Git Hub: " - echo " https://github.com/cgat-developers/cgat-apps/issues " - echo - - print_env_vars - - fi # if-$? - - # revert setup.py if downloaded with git - [[ $CODE_DOWNLOAD_TYPE -ge 1 ]] && git checkout -- setup.py - - # environment pinning - # python scripts/conda.py - - fi # if INSTALL_DEVEL - - # check whether conda create went fine - if [[ $DEV_RESULT -ne 0 ]] ; then - echo - echo " There was a problem installing the code with conda. " - echo " Installation did not finish properly. " - echo - echo " Please submit this issue via Git Hub: " - echo " https://github.com/cgat-developers/cgat-apps/issues " - echo - - print_env_vars - - else - clear - echo - echo " The code was successfully installed!" - echo - echo " To activate the CGAT environment type: " - echo " $ source $CONDA_INSTALL_DIR/etc/profile.d/conda.sh" - echo " $ conda activate base" - echo " $ conda activate $CONDA_INSTALL_ENV" - [[ $INSTALL_PRODUCTION ]] && echo " cgat --help" - echo - echo " To deactivate the environment, use:" - echo " $ conda deactivate" - echo - fi # if-$ conda create - -fi # if travis install - -} # conda install - - -# test code with conda install -conda_test() { - -log "starting conda_test" - -# get environment variables: CGAT_HOME, CONDA_INSTALL_DIR, CONDA_INSTALL_TYPE_APPS -get_cgat_env - -setup_env_vars - -# setup environment and run tests -if [[ $TRAVIS_INSTALL ]] || [[ $JENKINS_INSTALL ]] ; then - - # enable Conda env - log "activating CGAT conda environment" - source $CONDA_INSTALL_DIR/bin/activate $CONDA_INSTALL_ENV - - # show conda environment used for testing - conda env export - - # install cgat-core - install_cgat_core - - # python preparation - log "install CGAT code into conda environment" - cd $CGAT_HOME - # remove install_requires (no longer required with conda package) - sed -i'' -e '/REPO_REQUIREMENT/,/pass/d' setup.py - sed -i'' -e '/# dependencies/,/dependency_links=dependency_links,/d' setup.py - python setup.py develop - - log "starting tests" - # run nosetests - if [[ $TEST_ALL ]] ; then - log "test_import.py" && nosetests -v tests/test_import.py && \ - log "test_style.py" && nosetests -v tests/test_style.py && \ - echo -e "restrict:\n manifest:\n" > tests/_test_commandline.yml && \ - log "test_commandline" && nosetests -v tests/test_commandline.py && \ - log "test_scripts" && nosetests -v tests/test_scripts.py ; - elif [[ $TEST_IMPORT ]] ; then - nosetests -v tests/test_import.py ; - elif [[ $TEST_STYLE ]] ; then - nosetests -v tests/test_style.py ; - elif [[ $TEST_CMDLINE ]] ; then - echo -e "restrict:\n manifest:\n" > tests/_test_commandline.yml - nosetests -v tests/test_commandline.py ; - elif [[ $TEST_PRODUCTION_SCRIPTS ]] ; then - echo -e "restrict:\n manifest:\n" > tests/_test_scripts.yml - nosetests -v tests/test_scripts.py ; - else - nosetests -v tests/test_scripts.py ; - fi - -else - - source $CONDA_INSTALL_DIR/bin/activate $CONDA_INSTALL_ENV - RET=$( (conda list | grep cgat-scripts) || true ) - - if [[ -z "${RET}" ]] ; then - # this is "cgat-devel" so tests can be run - - # make sure you are in the CGAT_HOME/cgat-apps folder - cd $CGAT_HOME/cgat-apps - - # remove install_requires (no longer required with conda package) - sed -i'' -e '/REPO_REQUIREMENT/,/pass/d' setup.py - sed -i'' -e '/# dependencies/,/dependency_links=dependency_links,/d' setup.py - python setup.py develop - OUTPUT_DIR=`pwd` - - # run tests - /usr/bin/time -o test_import.time -v nosetests -v tests/test_import.py >& test_import.out - if [[ $? -eq 0 ]] ; then - echo - echo " test_import.py passed successfully! " - echo - else - echo - echo " test_import.py failed. Please see $OUTPUT_DIR/test_import.out file for detailed output. " - echo - - print_env_vars - - fi - - /usr/bin/time -o test_scripts.time -v nosetests -v tests/test_scripts.py >& test_scripts.out - if [[ $? -eq 0 ]] ; then - echo - echo " test_scripts.py passed successfully! " - echo - else - echo - echo " test_scripts.py failed. Please see $OUTPUT_DIR/test_scripts.out file for detailed output. " - echo - - print_env_vars - - fi - - else - # in this case, the installation found was "cgat-scripts" so no need to run tests - echo - echo " You installed the cgat-scripts, which has been properly tested before. " - echo " No need to test. Exiting now... " - echo - - exit 0 - fi - -fi # if travis or jenkins - -} # conda_test - - -# update conda installation -conda_update() { - -# get environment variables: CGAT_HOME, CONDA_INSTALL_DIR, CONDA_INSTALL_TYPE_APPS -get_cgat_env - -source $CONDA_INSTALL_DIR/bin/activate $CONDA_INSTALL_ENV -conda update --all - -if [[ ! $? -eq 0 ]] ; then - - echo - echo " There was a problem updating the installation. " - echo - echo " Please submit this issue via Git Hub: " - echo " https://github.com/cgat-developers/cgat-apps/issues " - echo - -else - - echo - echo " All packages were succesfully updated. " - echo - -fi - -} # conda_update - - -# unistall CGAT code collection -uninstall() { - -detect_cgat_installation - -if [[ -z "$UNINSTALL_DIR" ]] ; then - - echo - echo " The location of the CGAT code was not found. " - echo " Please uninstall manually." - echo - exit 1 - -else - - rm -rf $UNINSTALL_DIR - if [[ $? -eq 0 ]] ; then - echo - echo " CGAT code successfully uninstalled." - echo - exit 0 - else - echo - echo " There was a problem uninstalling the CGAT code." - echo " Please uninstall manually." - echo - exit 1 - fi -fi - -} - - -# test whether --git and --git-ssh download is doable -test_git() { - git --version >& /dev/null || GIT_AVAIL=$? - if [[ $GIT_AVAIL -ne 0 ]] ; then - echo - echo " Git is not available but --git or --git-ssh option was given." - echo " Please rerun this script on a computer with git installed " - echo " or try again without --git or --git-ssh" - report_error " " - fi -} - - -# test whether --git-ssh download is doable -test_git_ssh() { - ssh-add -L >& /dev/null || SSH_KEYS_LOADED=$? - if [[ $SSH_KEYS_LOADED -ne 0 ]] ; then - echo - echo " Please load your ssh keys for GitHub before proceeding!" - echo - echo " Try: " - echo " 1. eval \$(ssh-agent)" - echo " 2. ssh-add ~/.ssh/id_rsa # or the file where your private key is" - report_error " and run this script again. " - fi -} - - -# don't mix branch and release options together -test_mix_branch_release() { - # don't mix branch and release options together - if [[ $RELEASE ]] ; then - if [[ "$INSTALL_BRANCH" != "master" ]] ; then - echo - echo " You cannot mix git branches and releases for the installation." - echo - echo " Your input was: "$SCRIPT_PARAMS - report_error " Please either use branches or releases but not both." - fi - fi -} - - -# test whether a branch exists in the cgat-core repository -# https://stackoverflow.com/questions/12199059/how-to-check-if-an-url-exists-with-the-shell-and-probably-curl -test_core_branch() { - RELEASE_TEST=0 - curl --output /dev/null --silent --head --fail https://raw.githubusercontent.com/cgat-developers/cgat-core/${CORE_BRANCH}/README.md || RELEASE_TEST=$? - if [[ ${RELEASE_TEST} -ne 0 ]] ; then - echo - echo " The branch provided for cgat-core does not exist: ${CORE_BRANCH}" - echo - echo " Please have a look at valid branches here: " - echo " https://github.com/cgat-developers/cgat-core/branches" - echo - report_error " Please use a valid branch and try again." - fi -} - - -# test whether a release exists or not -# https://stackoverflow.com/questions/12199059/how-to-check-if-an-url-exists-with-the-shell-and-probably-curl -test_release() { - RELEASE_TEST=0 - curl --output /dev/null --silent --head --fail https://raw.githubusercontent.com/cgat-developers/cgat-apps/${RELEASE}/README.rst || RELEASE_TEST=$? - if [[ ${RELEASE_TEST} -ne 0 ]] ; then - echo - echo " The release number provided does not exist: ${RELEASE}" - echo - echo " Please have a look at valid releases here: " - echo " https://github.com/cgat-developers/cgat-apps/releases" - echo - echo " An example of valid release is: --release v0.4.0" - report_error " Please use a valid release and try again." - fi -} - - -# test whether a C/C++ compiler is available -test_compilers() { - which gcc &> /dev/null || report_error " C compiler not found " - which g++ &> /dev/null || report_error " C++ compiler not found " -} - - -# clean up environment -# deliberately use brute force -cleanup_env() { - set +e - source deactivate >& /dev/null || true - source deactivate >& /dev/null || true - unset -f conda || true - unset PYTHONPATH || true - # Next actions disabled. Please see: - # https://github.com/cgat-developers/cgat-core/issues/44 - #module purge >& /dev/null || true - #mymodule purge >& /dev/null || true - set -e -} - - -# function to display help message -help_message() { -echo -echo " This script uses Conda to install cgat-apps. To proceed, please type:" -echo " ./install.sh --devel [--location ]" -echo -echo " The default install folder will be: $HOME/cgat-install" -echo -echo " It will create a new Conda environment ready to run the CGAT code." -echo -echo " It is also possible to install/test a specific branch of the code on github:" -echo " ./install.sh --devel --branch [--location ]" -echo -echo " By default, cgat-apps will install the master branch of cgat-core:" -echo " https://github.com/cgat-developers/cgat-core" -echo -echo " Change that with:" -echo " ./install.sh --devel --core-branch " -echo -echo " To test the installation:" -echo " ./install.sh --test [--location ]" -echo -echo " To update the Conda packages:" -echo " ./install.sh --update [--location ]" -echo -echo " To uninstall the CGAT code:" -echo " ./install.sh --uninstall [--location ]" -echo -echo " Please submit any issues via Git Hub:" -echo " https://github.com/cgat-developers/cgat-apps/issues" -echo -exit 1 -} # help_message - -# the script starts here - -cleanup_env -test_compilers - -if [[ $# -eq 0 ]] ; then - - help_message - -fi - -# travis execution -TRAVIS_INSTALL= -# jenkins testing -JENKINS_INSTALL= -# conda installation type -INSTALL_PRODUCTION= -INSTALL_DEVEL= -# test current installation -INSTALL_TEST= -# update current installation -INSTALL_UPDATE= -# uninstall CGAT code -UNINSTALL= -UNINSTALL_DIR= -# where to install CGAT code -CGAT_HOME= -# how to download CGAT code: -# 0 = as zip (default) -# 1 = git clone with https -# 2 = git clone with ssh -CODE_DOWNLOAD_TYPE=0 -# which github branch to use (default: master) -INSTALL_BRANCH="master" -# which github branch to use for cgat-core (default: master) -CORE_BRANCH="master" -# rename conda environment -CONDA_INSTALL_ENV= -# type of installation -CONDA_INSTALL_TYPE_APPS= -CONDA_INSTALL_TYPE_CORE= -# Install a released version? -RELEASE= - -# parse input parameters -# https://stackoverflow.com/questions/402377/using-getopts-in-bash-shell-script-to-get-long-and-short-command-line-options -# https://stackoverflow.com/questions/192249/how-do-i-parse-command-line-arguments-in-bash - -while [[ $# -gt 0 ]] -do -key="$1" - -case $key in - - --help) - help_message - ;; - - --travis) - TRAVIS_INSTALL=1 - shift # past argument - ;; - - --jenkins) - JENKINS_INSTALL=1 - shift # past argument - ;; - - --zip) - CODE_DOWNLOAD_TYPE=0 - shift - ;; - - --git) - CODE_DOWNLOAD_TYPE=1 - shift - test_git - ;; - - --git-ssh) - CODE_DOWNLOAD_TYPE=2 - shift - test_git - test_git_ssh - ;; - - --production) - INSTALL_PRODUCTION=1 - shift - ;; - - --devel) - INSTALL_DEVEL=1 - shift - ;; - - --test) - INSTALL_TEST=1 - shift - ;; - - --update) - INSTALL_UPDATE=1 - shift - ;; - - --uninstall) - UNINSTALL=1 - shift - ;; - - --location) - CGAT_HOME="$2" - shift 2 - ;; - - --branch) - INSTALL_BRANCH="$2" - test_mix_branch_release - shift 2 - ;; - - --core-branch) - CORE_BRANCH="$2" - test_core_branch - shift 2 - ;; - - --release) - RELEASE="$2" - test_mix_branch_release - test_release - INSTALL_BRANCH="$2" - shift 2 - ;; - - --env-name) - CONDA_INSTALL_ENV="$2" - shift 2 - ;; - - *) - echo - echo - echo " Wrong input: ${SCRIPT_NAME} ${SCRIPT_PARAMS}" - echo - help_message - ;; - -esac -done - -# sanity check 1: don't mix production and development installs -if [[ $INSTALL_PRODUCTION ]] && [[ $INSTALL_DEVEL ]] ; then - - report_error " Incorrect input arguments: mixing --production and --devel is not permitted. " - -fi - -# sanity check 2: make sure one installation option is selected -if [[ -z $INSTALL_TEST ]] && \ - [[ -z $INSTALL_PRODUCTION ]] && \ - [[ -z $INSTALL_DEVEL ]] && \ - [[ -z $TRAVIS_INSTALL ]] && \ - [[ -z $JENKINS_INSTALL ]] ; then - - report_error " You need to select either --devel or --production. " - -fi - -# sanity check 3: make sure there is space available in the destination folder (10 GB) in 512-byte blocks -[[ -z ${TRAVIS_INSTALL} ]] && \ -mkdir -p ${CGAT_HOME} && \ -[[ `df -P ${CGAT_HOME} | awk '/\// {print $4}'` -lt 20971520 ]] && \ - report_error " Not enough disk space available on the installation folder: "$CGAT_HOME - -# perform actions according to the input parameters processed -if [[ $TRAVIS_INSTALL ]] || [[ $JENKINS_INSTALL ]] ; then - - conda_install - conda_test - -else - - if [[ $INSTALL_PRODUCTION ]] || [[ $INSTALL_DEVEL ]] ; then - conda_install - fi - - if [[ $INSTALL_TEST ]] ; then - conda_test - fi - - if [[ $INSTALL_UPDATE ]] ; then - conda_update - fi - - if [[ $UNINSTALL ]] ; then - uninstall - fi - -fi # if-variables diff --git a/requires.txt b/requires.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/setup.py b/setup.py index adb4ccd73..cd7a2ef0d 100644 --- a/setup.py +++ b/setup.py @@ -137,37 +137,6 @@ def is_exe(fpath): HTTPS_REQUIREMENT = re.compile( r'^-e (?P.*).+#(?P.+)-(?P\d(?:\.\d)*)$') install_requires = [] -dependency_links = [] - -for requirement in ( - l.strip() for l in open('requires.txt') if not l.startswith("#")): - match = REPO_REQUIREMENT.match(requirement) - if match: - assert which(match.group('vcs')) is not None, \ - ("VCS '%(vcs)s' must be installed in order to " - "install %(link)s" % match.groupdict()) - install_requires.append("%(package)s==%(version)s" % match.groupdict()) - dependency_links.append(match.group('link')) - continue - - if requirement.startswith("https"): - install_requires.append(requirement) - continue - - match = HTTPS_REQUIREMENT.match(requirement) - if match: - install_requires.append("%(package)s>=%(version)s" % match.groupdict()) - dependency_links.append(match.group('link')) - continue - - install_requires.append(requirement) - -if major == 2: - install_requires.extend(['web.py>=0.37', - 'xlwt>=0.7.4', - 'matplotlib-venn>=0.5']) -elif major == 3: - pass cgat_packages = find_packages() cgat_package_dirs = {'cgat': 'cgat'} @@ -317,7 +286,6 @@ def is_exe(fpath): }, # dependencies install_requires=install_requires, - dependency_links=dependency_links, # extension modules ext_modules=extensions, cmdclass={'build_ext': build_ext}, diff --git a/tests/test_commandline.py b/tests/test_commandline.py index 68e8d124f..0feb1d953 100644 --- a/tests/test_commandline.py +++ b/tests/test_commandline.py @@ -1,5 +1,6 @@ -'''test_commandline - test coding style confirmation of CGAT code -=========================================================== +''' +test_commandline - Tests coding style conformity of CGAT code collection. +========================================================================== :Author: Andreas Heger :Release: $Id$ @@ -8,24 +9,18 @@ Purpose ------- - -This script test the command line usage of all scripts in the -CGAT code collection. - -This script is best run within nosetests:: +This script tests the command line usage of all scripts in the CGAT code collection. +It's recommended to run this within nosetests for efficiency and coverage: nosetests tests/test_commandline.py --nocapture +Before running these tests, ensure to execute: -.. note:: - - Make sure to run:: - - python setup.py develop - - Before running these tests. + python setup.py develop +to make all package scripts available for import and testing. ''' + import glob import os import importlib @@ -33,217 +28,160 @@ import re import sys import copy -import platform +import argparse from nose.tools import ok_ import cgatcore.experiment as E import cgatcore.iotools as iotools import TestUtils -# handle to original E.Start function -ORIGINAL_START = None +# Preserve the original E.Start function for later restoration +ORIGINAL_START = E.start -# Parser object collected from child script +# Placeholders for parser object and tested script's module PARSER = None +TESTED_MODULE = None -# DIRECTORIES to examine for python modules/scripts +# Directories to examine for Python modules/scripts EXPRESSIONS = ( - ('tools', 'cgat/tools/*.py'),) + ('tools', 'cgat/tools/*.py'), +) +# Files to exclude from checks EXCLUDE = [ "__init__.py", "version.py", "cgat.py", - "gtf2table.py", # fails with pysam include issue - "bed2table.py", # fails with pysam include issue - "fasta2bed.py", # fails because of pybedtools rebuild + "gtf2table.py", # Fails with pysam include issue + "bed2table.py", # Fails with pysam include issue + "fasta2bed.py", # Fails due to pybedtools rebuild requirements ] -# Filename with the black/white list of options. -# The file is a tab-separated with the first column -# an option name and the second field a marker. -# Possible markers are: -# ok = whitelist - this option is ok. -# 'bad', 'rename', '?', '' - this option is not ok. +# Filename for the black/white list of options FILENAME_OPTIONLIST = "tests/option_list.tsv" class DummyError(Exception): + """Custom exception for controlling test flow.""" pass def filter_files(files): - '''filter list of files according to filters set in - configuration file tests/_test_commandline.yml''' - - # directory location of tests + '''Filter list of files according to filters set in the configuration file tests/_test_commandline.yml''' testing_dir = TestUtils.get_tests_directory() - - # the config file config_file = os.path.join(testing_dir, "_test_commandline.yml") if os.path.exists(config_file): - config = yaml.safe_load(open(config_file)) - if config is not None: - if "restrict" in config and config["restrict"]: + with open(config_file) as cf: + config = yaml.safe_load(cf) + if config and "restrict" in config: values = config["restrict"] if "manifest" in values: - # take scripts defined in the MANIFEST.in file - scriptdirs = [x for x in open("MANIFEST.in") - if x.startswith("include CGAT/tools") and - x.endswith(".py\n")] - - take = set([re.sub("include\s*", "", - x[:-1]) for x in scriptdirs]) + scriptdirs = [x.strip() for x in open("MANIFEST.in") + if x.startswith("include CGAT/tools") and x.endswith(".py\n")] + take = set(re.sub("include\s*", "", x) for x in scriptdirs) files = [x for x in files if x in take] - if "regex" in values: rx = re.compile(values["regex"]) - files = filter(rx.search, files) + files = list(filter(rx.search, files)) return files def LocalStart(parser, *args, **kwargs): - '''stub for E.start - set return_parser argument to true''' + '''Stub for E.start - captures the parser for inspection.''' global PARSER - d = copy.copy(kwargs) - d.update({'return_parser': True}) - PARSER = ORIGINAL_START(parser, **d) + kwargs.update({'return_parser': True}) + PARSER = ORIGINAL_START(parser, **kwargs) raise DummyError() def load_script(script_name): + '''Attempts to import a script as a module for inspection.''' + script_path = os.path.splitext(script_name)[0] + script_dir, script_base = os.path.split(script_path) + module_name = ".".join(filter(None, [script_dir.replace(os.sep, '.'), script_base])) - # call other script - prefix, suffix = os.path.splitext(script_name) - - dirname = os.path.relpath(os.path.dirname(script_name)) - basename = os.path.basename(script_name)[:-3] + # Remove compiled files to ensure fresh import + compiled_script = script_path + ".pyc" + if os.path.exists(compiled_script): + os.remove(compiled_script) - if os.path.exists(prefix + ".pyc"): - try: - os.remove(prefix + ".pyc") - except OSError: - pass - - modulename = ".".join((re.sub("/", ".", dirname), basename)) try: - module = importlib.import_module(modulename) - except ImportError as msg: - sys.stderr.write('could not import %s - skipped: %s\n' % - (modulename, msg)) - module = None - - return module, modulename + module = importlib.import_module(module_name) + except ImportError as e: + sys.stderr.write(f'ImportError for {module_name}: {e}\n') + return None, None - -def check_option(option, script_name, map_option2action): - '''import script and get command line options. - - Test command line options for conformity. - ''' - if option in map_option2action: - ok_(option in map_option2action, - 'option %s:%s unknown') - ok_(map_option2action[option] == "ok", - 'option %s:%s wrong: action="%s"' % - (script_name, option, map_option2action[option])) - - -def fail_(msg): - '''create test that fails with *msg*.''' - ok_(False, msg) + return module, module_name def test_cmdline(): - '''test style of scripts - ''' - - # start script in order to build the command line parser + '''Test command line interfaces of scripts for style and conformity.''' global ORIGINAL_START - if ORIGINAL_START is None: - ORIGINAL_START = E.start - # read the first two columns - map_option2action = iotools.read_map( + + # Load option actions from list + option_actions = iotools.read_map( iotools.open_file(FILENAME_OPTIONLIST), columns=(0, 1), - has_header=True) - - files = [] - for label, expression in EXPRESSIONS: - f = glob.glob(expression) - files.extend(sorted(f)) + has_header=True + ) + # Compile list of scripts to test + files = [f for label, expr in EXPRESSIONS for f in glob.glob(expr)] files = filter_files(files) - # make sure to use the current working directory as - # primary lookup. + # Prioritise the current directory for module lookup sys.path.insert(0, ".") - # files = [ - # 'scripts/check_db.py', - # 'scripts/cgat_build_report_page.py'] - - for f in files: - if os.path.isdir(f): - continue - if os.path.basename(f) in EXCLUDE: + for script in files: + if os.path.isdir(script) or os.path.basename(script) in EXCLUDE: continue - script_name = os.path.abspath(f) - pyxfile = (os.path.join(os.path.dirname(f), "_") + - os.path.basename(f) + "x") - - fail_.description = script_name - # check if script contains getopt - with iotools.open_file(script_name) as inf: - if "getopt" in inf.read(): - yield (fail_, - "script uses getopt directly: %s" % script_name) - continue - - module, modulename = load_script(script_name) - if module is None: - yield (fail_, - "module could not be imported: %s\n" % script_name) + script_name = os.path.abspath(script) + module, module_name = load_script(script) + if not module: + yield fail_, f"Module {script_name} could not be imported." continue + + # Replace the start function to capture parser E.start = LocalStart + # Attempt to run script's main function to access its parser try: - module.main(argv=["dummy", "--help"]) - except AttributeError: - yield (fail_, - "no main method in %s\n" % script_name) - ok_(False, "no main method in %s" % script_name) - except SystemExit: - yield (fail_, - "script does not use E.start() %s\n" % script_name) + module.main(argv=["--help"]) except DummyError: + # Expected flow interruption by LocalStart pass + except Exception as e: + yield fail_, f"Error invoking main of {script_name}: {e}" + continue + + if PARSER: + for action in PARSER._actions: # Iterate through the actions stored in the parser + if isinstance(action, argparse._HelpAction): # Skip help actions + continue + opt_strings = action.option_strings # Get the list of CLI flags + if not opt_strings: # This skips positional arguments + continue + for opt_string in opt_strings: + if opt_string.startswith("--"): + opt_string = opt_string[2:] + yield check_option, opt_string, script_name, option_actions - for option in PARSER.parse_args(parser): - print("=================") - print(option) - # ignore options added by optparse - if option.dest is None: - continue + # Reset module to avoid conflicts + if module_name in sys.modules: + del sys.modules[module_name] - optstring = option.get_opt_string() - if optstring.startswith("--"): - optstring = optstring[2:] - check_option.description = script_name + ":" + optstring +def check_option(option, script_name, option_actions): + print(f"Checking option: {option} in script: {script_name}") # Diagnostic print + assert option in option_actions, f"Option {option} in script {script_name} is unknown or not allowed." + assert option_actions[option] == "ok", f"Option {option} in script {script_name} is not allowed." - yield(check_option, optstring, os.path.abspath(f), - map_option2action) - # clear up - del sys.modules[modulename] +def fail_(msg): + '''Generate a failing test with the provided message.''' + ok_(False, msg) - # scripts with pyximport need special handling. - # - # Multiple imports of pyximport seems to create - # some confusion - here, clear up sys.meta_path after - # each script - if os.path.exists(pyxfile): - sys.meta_path = [] +# Reset E.start to its original function after testing +E.start = ORIGINAL_START