From 019fb0943f5f6a931335a96ae6f0677d07126de0 Mon Sep 17 00:00:00 2001 From: Stuart McNicholas Date: Thu, 29 Jan 2026 11:09:28 +0000 Subject: [PATCH 01/12] Bare-bones areaimol for one molecule. --- core/CDataManagerCache.json | 6 +- core/CachedLookups.json | 62 +++++++++++++++++++ qticons/CachedPixmapPaths.json | 2 +- wrappers/areaimol/__init__.py | 0 wrappers/areaimol/script/CTaskareaimol.py | 29 +++++++++ wrappers/areaimol/script/__init__.py | 0 wrappers/areaimol/script/areaimol.def.xml | 47 ++++++++++++++ wrappers/areaimol/script/areaimol.medline.txt | 3 + wrappers/areaimol/script/areaimol.py | 61 ++++++++++++++++++ wrappers/areaimol/script/areaimol_report.py | 22 +++++++ 10 files changed, 228 insertions(+), 4 deletions(-) create mode 100644 wrappers/areaimol/__init__.py create mode 100644 wrappers/areaimol/script/CTaskareaimol.py create mode 100644 wrappers/areaimol/script/__init__.py create mode 100644 wrappers/areaimol/script/areaimol.def.xml create mode 100644 wrappers/areaimol/script/areaimol.medline.txt create mode 100644 wrappers/areaimol/script/areaimol.py create mode 100644 wrappers/areaimol/script/areaimol_report.py diff --git a/core/CDataManagerCache.json b/core/CDataManagerCache.json index eb5911e19..2dfd07a90 100644 --- a/core/CDataManagerCache.json +++ b/core/CDataManagerCache.json @@ -1409,9 +1409,9 @@ "clsName": "CCustomTaskParamListView" }, "CData": { - "class": "qtgui.CCP4CustomTaskManagerGuiCMiniMtzRequiredContentWidget", - "clsModule": "qtgui.CCP4CustomTaskManagerGui", - "clsName": "CMiniMtzRequiredContentWidget" + "class": "qtgui.CCP4ModelWidgetsCEnsembleView", + "clsModule": "qtgui.CCP4ModelWidgets", + "clsName": "CEnsembleView" }, "CDataFile": { "class": "qtgui.CCP4WidgetsCDataFileView", diff --git a/core/CachedLookups.json b/core/CachedLookups.json index 38bf77ab5..698f75ac5 100644 --- a/core/CachedLookups.json +++ b/core/CachedLookups.json @@ -120,6 +120,7 @@ "gesamt", "coordinate_selector", "add_fractional_coords", + "areaimol", "editbfac", "modelASUCheck", "pdbset_ui", @@ -604,6 +605,15 @@ ] } }, + "areaimol": { + "0.0.0": { + "MAINTAINER": "Nobody", + "class": "wrappers.areaimol.script.areaimol_reportareaimol_report", + "clsModule": "wrappers.areaimol.script.areaimol_report", + "clsName": "areaimol_report", + "modes": [] + } + }, "arp_warp_classic": { "0.0.0": { "MAINTAINER": "andrey.lebedev@stfc.ac.uk", @@ -2211,6 +2221,19 @@ "subTasks": [] } }, + "areaimol": { + "0.0": { + "DESCRIPTION": null, + "INTERRUPTLABEL": null, + "MAINTAINER": "Nobody", + "TASKTITLE": "Solvent accessible surface - Areaimol", + "class": "wrappers.areaimol.script.areaimolareaimol", + "clsModule": "wrappers.areaimol.script.areaimol", + "clsName": "areaimol", + "internal": false, + "subTasks": [] + } + }, "arp_warp_classic": { "0.0": { "DESCRIPTION": null, @@ -4058,6 +4081,7 @@ "AUSPEX": "qticons/AUSPEX.png", "AcedrgLink": "qticons/ccp4.png", "AlternativeImportXIA2": "qticons/AlternativeImportXIA2.png", + "Lidia": "qticons/ccp4.png", "LidiaAcedrg": "qticons/LidiaAcedrg.png", "LidiaAcedrgNew": "qticons/LidiaAcedrgNew.png", "MakeLink": "qticons/MakeLink.png", @@ -4078,16 +4102,21 @@ "TestObsConversions": "qticons/TestObsConversions.png", "ZZPipelineNameZZ": "qticons/ccp4.png", "ZZPluginNameZZ": "qticons/ccp4.png", + "acedrg": "qticons/ccp4.png", + "acedrgNew": "qticons/ccp4.png", "acorn": "qticons/acorn.png", "add_fractional_coords": "qticons/add_fractional_coords.png", "adding_stats_to_mmcif_i2": "qticons/adding_stats_to_mmcif_i2.png", "aimless_pipe": "qticons/aimless_pipe.png", "alpha_fold": "qticons/alpha_fold.png", "arcimboldo": "qticons/arcimboldo.png", + "areaimol": "qticons/ccp4.png", "arp_warp_classic": "qticons/arp_warp_classic.png", + "baverage": "qticons/ccp4.png", "bigpipes": "qticons/ccp4.png", "bioinformatics": "qticons/bioinformatics.png", "buccaneer_build_refine_mr": "qticons/buccaneer_build_refine_mr.png", + "buccaneer_mr": "qticons/ccp4.png", "buster": "qticons/buster.png", "ccp4mg_edit_model": "qticons/ccp4mg_edit_model.png", "ccp4mg_edit_nomrbump": "qticons/ccp4mg_edit_nomrbump.png", @@ -4098,6 +4127,7 @@ "clustalw": "qticons/clustalw.png", "cmapcoeff": "qticons/cmapcoeff.png", "comit": "qticons/ccp4.png", + "convert2mtz": "qticons/convert2mtz.png", "coordinate_selector": "qticons/coordinate_selector.png", "coot1": "qticons/coot1.png", "coot_find_waters": "qticons/coot_find_waters.png", @@ -4105,8 +4135,10 @@ "coot_rsr_morph": "qticons/coot_rsr_morph.png", "coot_script_lines": "qticons/coot_script_lines.png", "cpatterson": "qticons/cpatterson.png", + "cphasematch": "qticons/cphasematch.png", "crank2": "qticons/crank2.png", "crank2_comb_phdmmb": "qticons/ccp4.png", + "crank2_createfree": "qticons/ccp4.png", "crank2_dmfull": "qticons/ccp4.png", "crank2_faest": "qticons/ccp4.png", "crank2_handdet": "qticons/ccp4.png", @@ -4121,6 +4153,9 @@ "data_entry": "qticons/data_entry.png", "data_processing": "qticons/data_processing.png", "data_reduction": "qticons/data_reduction.png", + "demo": "qticons/ccp4.png", + "demo_copycell": "qticons/ccp4.png", + "demo_multi_mtzdump": "qticons/ccp4.png", "density_calculator": "qticons/density_calculator.png", "density_modification": "qticons/density_modification.png", "developer_tools": "qticons/developer_tools.png", @@ -4134,6 +4169,7 @@ "export": "qticons/export.png", "expt_data_utility": "qticons/expt_data_utility.png", "expt_phasing": "qticons/expt_phasing.png", + "fft": "qticons/ccp4.png", "findmyseq": "qticons/findmyseq.png", "freerflag": "qticons/freerflag.png", "gesamt": "qticons/gesamt.png", @@ -4144,6 +4180,7 @@ "import_mosflm": "qticons/import_mosflm.png", "import_serial": "qticons/ccp4.png", "import_serial_pipe": "qticons/ccp4.png", + "libcheck": "qticons/ccp4.png", "ligands": "qticons/ligands.png", "lorestr_i2": "qticons/lorestr_i2.png", "matthews": "qticons/matthews.png", @@ -4163,11 +4200,15 @@ "mrbump_basic": "qticons/mrbump_basic.png", "mrbump_model_prep": "qticons/ccp4.png", "mrparse": "qticons/mrparse.png", + "mtzdump": "qticons/ccp4.png", + "mtzheader": "qticons/ccp4.png", "mtzutils": "qticons/ccp4.png", "nautilus_build_refine": "qticons/nautilus_build_refine.png", "pairef": "qticons/pairef.png", "parrot": "qticons/parrot.png", + "pdb_extract_wrapper": "qticons/ccp4.png", "pdb_redo_api": "qticons/pdb_redo_api.png", + "pdbset": "qticons/ccp4.png", "pdbset_ui": "qticons/ccp4.png", "pdbview_edit": "qticons/pdbview_edit.png", "phaser_EP": "qticons/phaser_EP.png", @@ -4175,7 +4216,9 @@ "phaser_EP_LLG": "qticons/phaser_EP_LLG.png", "phaser_MR_AUTO": "qticons/phaser_MR_AUTO.png", "phaser_MR_RNP": "pipelines/phaser_pipeline/wrappers/phaser_MR_RNP/script/phaser_MR_RNP.png", + "phaser_analysis": "qticons/ccp4.png", "phaser_ensembler": "qticons/phaser_ensembler.png", + "phaser_mr": "qticons/ccp4.png", "phaser_phil": "qticons/ccp4.png", "phaser_pipeline": "qticons/phaser_pipeline.png", "phaser_rnp_pipeline": "qticons/phaser_rnp_pipeline.png", @@ -4190,8 +4233,11 @@ "pyphaser_mr": "qticons/ccp4.png", "qtpisa": "qticons/qtpisa.png", "refinement": "qticons/refinement.png", + "refmac": "qticons/ccp4.png", "scaleit": "qticons/scaleit.png", + "scalepack2mtz": "qticons/ccp4.png", "sculptor": "qticons/sculptor.png", + "servalcat": "qticons/ccp4.png", "servalcat_pipe": "qticons/servalcat_pipe.png", "sheetbend": "qticons/ccp4.png", "shelx": "qticons/shelx.png", @@ -4200,10 +4246,12 @@ "splitMtz": "qticons/splitMtz.png", "tableone": "qticons/tableone.png", "test": "qticons/ccp4.png", + "uniqueify": "qticons/ccp4.png", "validate_protein": "qticons/validate_protein.png", "validation": "qticons/validation.png", "workflow": "qticons/ccp4.png", "wrappers": "qticons/ccp4.png", + "x2mtz": "qticons/ccp4.png", "xia2_dials": "qticons/xia2_dials.png", "xia2_multiplex": "qticons/xia2_multiplex.png", "xia2_ssx_reduce": "qticons/xia2_ssx_reduce.png", @@ -4904,6 +4952,20 @@ "taskVersion": 0.1 } }, + "areaimol": { + "0.0.0": { + "DESCRIPTION": "Solvent accessible surface calculation the areaimol program", + "MAINTAINER": "Nobody", + "RANK": null, + "TASKTITLE": "Solvent accessible surface - Areaimol", + "class": "wrappers.areaimol.script.CTaskareaimolCTaskAreaimolUI", + "clsModule": "wrappers.areaimol.script.CTaskareaimol", + "clsName": "CTaskAreaimolUI", + "shortTitle": "AREAIMOL", + "taskName": "areaimol", + "taskVersion": 0.0 + } + }, "arp_warp_classic": { "0.0.0": { "DESCRIPTION": "Build model (ARP/wARP classic)", diff --git a/qticons/CachedPixmapPaths.json b/qticons/CachedPixmapPaths.json index 44e17be3d..03e87c522 100644 --- a/qticons/CachedPixmapPaths.json +++ b/qticons/CachedPixmapPaths.json @@ -1 +1 @@ -{"phaser_singleMR_96": "phaser_singleMR_96.png", "file_info": "file_info.png", "chltofom_96": "chltofom_96.png", "freerflag": "freerflag.png", "pause": "pause.png", "red-cross": "red-cross.png", "EnsemblePdbDataFile": "EnsemblePdbDataFile.png", "model_building": "model_building.png", "parrot": "parrot.png", "buster": "buster.png", "coot1": "coot1.png", "greenarrowsup": "greenarrowsup.png", "TestObsConversions": "TestObsConversions.png", "running": "running.png", "matthews_96": "matthews_96.png", "PdbDataFile": "PdbDataFile.png", "xia2_dials_96": "xia2_dials_96.png", "editbfac": "editbfac.png", "qtpisa": "qtpisa.png", "ShelxCECompareHands_96": "ShelxCECompareHands_96.png", "list_add": "list_add.png", "MakeLink_96": "MakeLink_96.png", "import_merged": "import_merged.png", "list_delete": "list_delete.png", "xia2_ssx_reduce_96": "xia2_ssx_reduce_96.png", "redarrowright": "redarrowright.png", "ccp4mg_general_96": "ccp4mg_general_96.png", "up_96": "up_96.png", "servalcat_pipe": "servalcat_pipe.png", "AlternativeImportXIA2_96": "AlternativeImportXIA2_96.png", "phaser_simple_96": "phaser_simple_96.png", "gears": "gears.png", "crank2_96": "crank2_96.png", "up": "up.png", "tab-close": "tab-close.png", "phaser_EP_AUTO": "phaser_EP_AUTO.png", "showi2run": "showi2run.png", "bioinformatics": "bioinformatics.png", "gesamt_96": "gesamt_96.png", "fileopen": "fileopen.png", "ccp4mg_edit_nomrbump_96": "ccp4mg_edit_nomrbump_96.png", "file": "file.png", "help_96": "help_96.png", "bullet_arrow_down": "bullet_arrow_down.png", "PrepareDeposit_96": "PrepareDeposit_96.png", "coordinate_selector_96": "coordinate_selector_96.png", "AsuDataFile_96": "AsuDataFile_96.png", "SeqDataFile": "SeqDataFile.png", "import_mosflm_96": "import_mosflm_96.png", "density_modification": "density_modification.png", "pdbview_edit": "pdbview_edit.png", "ProvideAsuContents_96": "ProvideAsuContents_96.png", "refln_data_analysis": "refln_data_analysis.png", "forward_96": "forward_96.png", "csymmatch_96": "csymmatch_96.png", "coot_find_waters": "coot_find_waters.png", "modelcraft": "modelcraft.png", "validation_96": "validation_96.png", "SIMBAD_96": "SIMBAD_96.png", "data_processing": "data_processing.png", "file_manager": "file_manager.png", "ProvideSequence_96": "ProvideSequence_96.png", "green-tick": "green-tick.png", "phaser_ensembler": "phaser_ensembler.png", "taskmenu_96": "taskmenu_96.png", "bioinformatics_96": "bioinformatics_96.png", "running_dark": "running_dark.png", "shelx_96": "shelx_96.png", "cell": "cell.png", "imosflm": "imosflm.png", "molrep_pipe": "molrep_pipe.png", "clone": "clone.png", "undone": "undone.png", "chainsaw_96": "chainsaw_96.png", "greenarrowsupshadow": "greenarrowsupshadow.png", "add_fractional_coords": "add_fractional_coords.png", "buccaneer_build_refine_EP_96": "buccaneer_build_refine_EP_96.png", "splitMtz_96": "splitMtz_96.png", "coot_script_lines": "coot_script_lines.png", "help-highlight_96": "help-highlight_96.png", "crank2": "crank2.png", "ccp4mg_edit_model_96": "ccp4mg_edit_model_96.png", "ProvideTLS_96": "ProvideTLS_96.png", "Mol2DataFile": "Mol2DataFile.png", "back": "back.png", "CootHistoryDataFile": "CootHistoryDataFile.png", "adding_stats_to_mmcif_i2": "adding_stats_to_mmcif_i2.png", "ProvideAsuContents": "ProvideAsuContents.png", "coordinate_selector": "coordinate_selector.png", "back_96": "back_96.png", "aimless_pipe": "aimless_pipe.png", "DictDataFile": "DictDataFile.png", "phaser_simple": "phaser_simple.png", "MakeProjectsAndDoLigandPipeline": "MakeProjectsAndDoLigandPipeline.png", "DataFile": "DataFile.png", "ccp4mg_edit_nomrbump": "ccp4mg_edit_nomrbump.png", "validate_protein_96": "validate_protein_96.png", "csymmatch": "csymmatch.png", "developer_tools_96": "developer_tools_96.png", "phaser_MR_AUTO_96": "phaser_MR_AUTO_96.png", "MakeProjectsAndDoLigandPipeline_96": "MakeProjectsAndDoLigandPipeline_96.png", "nautilus": "nautilus.png", "AMPLE_96": "AMPLE_96.png", "clone_96": "clone_96.png", "PhaserSolDataFile": "PhaserSolDataFile.png", "prosmart_refmac": "prosmart_refmac.png", "view_forward": "view_forward.png", "ShelxCD_96": "ShelxCD_96.png", "list_delete_red": "list_delete_red.png", "listLine": "listLine.png", "newtab_96": "newtab_96.png", "ctruncate": "ctruncate.png", "matthews": "matthews.png", "arcimboldo_96": "arcimboldo_96.png", "clustalw": "clustalw.png", "buster_96": "buster_96.png", "splitMtz": "splitMtz.png", "ShelxCD": "ShelxCD.png", "forward": "forward.png", "edstats_96": "edstats_96.png", "MiniMtzDataFile": "MiniMtzDataFile.png", "ShelxCE_96": "ShelxCE_96.png", "pdb_redo_api": "pdb_redo_api.png", "LidiaAcedrg_96": "LidiaAcedrg_96.png", "phaser_EP": "phaser_EP.png", "xia2_xds_96": "xia2_xds_96.png", "xia2_xds": "xia2_xds.png", "MDLMolDataFile": "MDLMolDataFile.png", "unsatisfactory": "unsatisfactory.png", "MakeLink": "MakeLink.png", "List": "List.png", "model_building_96": "model_building_96.png", "tableone": "tableone.png", "youtube": "youtube.png", "import_processed": "import_processed.png", "validate_protein": "validate_protein.png", "Mol2DataFile_96": "Mol2DataFile_96.png", "freerflag_96": "freerflag_96.png", "toc-plus": "toc-plus.png", "search-plus": "search-plus.png", "dials_image": "dials_image.png", "ccp4_96": "ccp4_96.png", "dials_rlattice_96": "dials_rlattice_96.png", "ccp4": "ccp4.png", "bullet_arrow_right": "bullet_arrow_right.png", "pisapipe": "pisapipe.png", "lorestr_i2_96": "lorestr_i2_96.png", "new_project": "new_project.png", "gesamt": "gesamt.png", "AsuDataFile": "AsuDataFile.png", "ccp4mg_general": "ccp4mg_general.png", "ccp4i2": "ccp4i2.png", "convert2mtz": "convert2mtz.png", "export_arrow_new_96": "export_arrow_new_96.png", "mrparse": "mrparse.png", "ShelxCE": "ShelxCE.png", "convert2mtz_96": "convert2mtz_96.png", "AlternativeImportXIA2": "AlternativeImportXIA2.png", "download_96": "download_96.png", "adding_stats_to_mmcif_i2_96": "adding_stats_to_mmcif_i2_96.png", "coot_script_lines_96": "coot_script_lines_96.png", "qtpisa_96": "qtpisa_96.png", "acorn": "acorn.png", "LidiaAcedrgNew_96": "LidiaAcedrgNew_96.png", "simple_xia2": "simple_xia2.png", "pdbview_edit_96": "pdbview_edit_96.png", "MTZDataFile_96": "MTZDataFile_96.png", "SubstituteLigand": "SubstituteLigand.png", "dustbin": "dustbin.png", "showlogfile_96": "showlogfile_96.png", "molrep_den_96": "molrep_den_96.png", "pointless_reindexToMatch": "pointless_reindexToMatch.png", "SceneDataFile": "SceneDataFile.png", "ctruncate_96": "ctruncate_96.png", "sculptor_96": "sculptor_96.png", "prosmart_refmac_96": "prosmart_refmac_96.png", "imosflm_96": "imosflm_96.png", "buccaneer_build_refine_mr_96": "buccaneer_build_refine_mr_96.png", "fileopen_96": "fileopen_96.png", "coot_rebuild_96": "coot_rebuild_96.png", "data_entry_96": "data_entry_96.png", "book": "book.png", "density_calculator": "density_calculator.png", "zoom_96": "zoom_96.png", "SIMBAD": "SIMBAD.png", "mrparse_96": "mrparse_96.png", "SubstituteLigand_96": "SubstituteLigand_96.png", "MDLMolDataFile_96": "MDLMolDataFile_96.png", "dials_image_96": "dials_image_96.png", "MapDataFile": "MapDataFile.png", "help": "help.png", "dui": "dui.png", "acorn_96": "acorn_96.png", "data_processing_96": "data_processing_96.png", "LidiaAcedrg": "LidiaAcedrg.png", "AMPLE": "AMPLE.png", "fragon_96": "fragon_96.png", "privateer": "privateer.png", "ProvideAlignment_96": "ProvideAlignment_96.png", "sculptor": "sculptor.png", "toc-minus": "toc-minus.png", "nautilus_build_refine": "nautilus_build_refine.png", "expt_data_utility": "expt_data_utility.png", "export": "export.png", "ProvideTLS": "ProvideTLS.png", "import_xia2_96": "import_xia2_96.png", "down_96": "down_96.png", "zanuda_96": "zanuda_96.png", "molrep_selfrot_96": "molrep_selfrot_96.png", "file_96": "file_96.png", "aimless_96": "aimless_96.png", "expt_data_utility_96": "expt_data_utility_96.png", "help-no-highlight_96": "help-no-highlight_96.png", "findmyseq": "findmyseq.png", "phaser_ensembler_96": "phaser_ensembler_96.png", "xia2_dials": "xia2_dials.png", "importRefnData": "importRefnData.png", "i2Dimple_96": "i2Dimple_96.png", "phaser_EP_LLG_96": "phaser_EP_LLG_96.png", "newtab": "newtab.png", "mergeMtz": "mergeMtz.png", "privateer_96": "privateer_96.png", "import_merged_96": "import_merged_96.png", "scaleit": "scaleit.png", "book_96": "book_96.png", "coot1_96": "coot1_96.png", "developer_tools": "developer_tools.png", "importRefnData_96": "importRefnData_96.png", "AUSPEX": "AUSPEX.png", "phaser_rnp_pipeline_96": "phaser_rnp_pipeline_96.png", "rosette": "rosette.png", "SyncToDjango_96": "SyncToDjango_96.png", "ligands_96": "ligands_96.png", "export_arrow_new": "export_arrow_new.png", "thought": "thought.png", "molrep_selfrot": "molrep_selfrot.png", "reload": "reload.png", "help-highlight": "help-highlight.png", "job": "job.png", "phaser_pipeline": "phaser_pipeline.png", "biblio": "biblio.png", "tab-close-highlight": "tab-close-highlight.png", "clustalw_96": "clustalw_96.png", "MakeMonster_96": "MakeMonster_96.png", "database": "database.png", "xia2_multiplex_96": "xia2_multiplex_96.png", "arp_warp_classic": "arp_warp_classic.png", "chltofom": "chltofom.png", "ligands": "ligands.png", "file_manager2": "file_manager2.png", "molecular_replacement": "molecular_replacement.png", "search": "search.png", "lorestr_i2": "lorestr_i2.png", "phaser_EP_LLG": "phaser_EP_LLG.png", "ObsDataFile": "ObsDataFile.png", "chainsaw": "chainsaw.png", "blank": "blank.png", "alpha_fold": "alpha_fold.png", "mrbump_basic": "mrbump_basic.png", "slicendice": "slicendice.png", "error_star": "error_star.png", "arcimboldo": "arcimboldo.png", "SeqAlignDataFile": "SeqAlignDataFile.png", "xia2_ssx_reduce": "xia2_ssx_reduce.png", "help-no-highlight": "help-no-highlight.png", "MakeMonster": "MakeMonster.png", "dials_rlattice": "dials_rlattice.png", "ShowList": "ShowList.png", "editbfac_96": "editbfac_96.png", "import_mosflm": "import_mosflm.png", "import_xia2": "import_xia2.png", "undo_96": "undo_96.png", "ShelxCECompareHands": "ShelxCECompareHands.png", "PhsDataFile": "PhsDataFile.png", "cphasematch": "cphasematch.png", "dui_96": "dui_96.png", "data_entry": "data_entry.png", "import_processed_96": "import_processed_96.png", "phaser_EP_AUTO_96": "phaser_EP_AUTO_96.png", "servalcat_pipe_96": "servalcat_pipe_96.png", "List_grey": "List_grey.png", "aimless": "aimless.png", "list_delete_grey": "list_delete_grey.png", "phaser_singleMR": "phaser_singleMR.png", "i2Dimple": "i2Dimple.png", "fragon": "fragon.png", "shelx": "shelx.png", "model_data_utility_96": "model_data_utility_96.png", "TestObsConversions_96": "TestObsConversions_96.png", "UnmergedDataFile": "UnmergedDataFile.png", "refinement_96": "refinement_96.png", "edstats": "edstats.png", "cmapcoeff_96": "cmapcoeff_96.png", "project": "project.png", "phaser_rnp_pipeline": "phaser_rnp_pipeline.png", "biblio_96": "biblio_96.png", "view_forward_96": "view_forward_96.png", "question": "question.png", "pairef_96": "pairef_96.png", "morda_i2": "morda_i2.png", "phaser_MR_AUTO": "phaser_MR_AUTO.png", "tableone_96": "tableone_96.png", "showlogfile": "showlogfile.png", "down": "down.png", "slicendice_96": "slicendice_96.png", "morda_i2_96": "morda_i2_96.png", "job_interrupted": "job_interrupted.png", "SyncToDjango": "SyncToDjango.png", "phaser_pipeline_96": "phaser_pipeline_96.png", "pisapipe_96": "pisapipe_96.png", "refinement": "refinement.png", "import_arrow_new_96": "import_arrow_new_96.png", "reload_96": "reload_96.png", "undo": "undo.png", "data_reduction": "data_reduction.png", "findmyseq_96": "findmyseq_96.png", "RefmacKeywordFile": "RefmacKeywordFile.png", "sad": "sad.png", "ProvideSequence": "ProvideSequence.png", "list_add_grey": "list_add_grey.png", "gears2": "gears2.png", "export_96": "export_96.png", "zanuda": "zanuda.png", "molecular_replacement_96": "molecular_replacement_96.png", "list_add_red": "list_add_red.png", "simple_xia2_96": "simple_xia2_96.png", "expt_phasing_96": "expt_phasing_96.png", "Annotation": "Annotation.png", "PrepareDeposit": "PrepareDeposit.png", "greendot": "greendot.png", "download": "download.png", "import_arrow": "import_arrow.png", "PhaserRFileDataFile": "PhaserRFileDataFile.png", "backgroundJobTitle": "backgroundJobTitle.png", "molrep_den": "molrep_den.png", "zoom": "zoom.png", "data_reduction_96": "data_reduction_96.png", "cpatterson": "cpatterson.png", "density_modification_96": "density_modification_96.png", "ResidueRange": "ResidueRange.png", "shelxeMR_96": "shelxeMR_96.png", "validation": "validation.png", "pointless_reindexToMatch_96": "pointless_reindexToMatch_96.png", "taskmenu": "taskmenu.png", "redarrowrightshadow": "redarrowrightshadow.png", "pairef": "pairef.png", "shelxeMR": "shelxeMR.png", "buccaneer_build_refine_mr": "buccaneer_build_refine_mr.png", "MTZDataFile": "MTZDataFile.png", "coot_rsr_morph": "coot_rsr_morph.png", "expt_phasing": "expt_phasing.png", "LidiaAcedrgNew": "LidiaAcedrgNew.png", "FreeRDataFile": "FreeRDataFile.png", "refln_data_analysis_96": "refln_data_analysis_96.png", "coot_find_waters_96": "coot_find_waters_96.png", "cphasematch_96": "cphasematch_96.png", "parrot_96": "parrot_96.png", "molrep_pipe_96": "molrep_pipe_96.png", "MapCoeffsDataFile": "MapCoeffsDataFile.png", "buccaneer_build_refine_EP": "buccaneer_build_refine_EP.png", "coot_rebuild": "coot_rebuild.png", "import_arrow_new": "import_arrow_new.png", "ProvideAlignment": "ProvideAlignment.png", "model_data_utility": "model_data_utility.png", "ccp4mg_edit_model": "ccp4mg_edit_model.png", "mergeMtz_96": "mergeMtz_96.png", "cmapcoeff": "cmapcoeff.png", "new_project_96": "new_project_96.png", "aimless_pipe_96": "aimless_pipe_96.png", "xia2_multiplex": "xia2_multiplex.png"} \ No newline at end of file +{"parrot": "parrot.png", "list_delete_grey": "list_delete_grey.png", "LidiaAcedrgNew": "LidiaAcedrgNew.png", "pdbview_edit": "pdbview_edit.png", "mrparse_96": "mrparse_96.png", "dui": "dui.png", "phaser_simple": "phaser_simple.png", "xia2_ssx_reduce": "xia2_ssx_reduce.png", "MakeProjectsAndDoLigandPipeline_96": "MakeProjectsAndDoLigandPipeline_96.png", "help_96": "help_96.png", "undo_96": "undo_96.png", "fileopen": "fileopen.png", "showi2run": "showi2run.png", "rosette": "rosette.png", "ProvideAlignment_96": "ProvideAlignment_96.png", "buccaneer_build_refine_mr_96": "buccaneer_build_refine_mr_96.png", "imosflm_96": "imosflm_96.png", "phaser_EP": "phaser_EP.png", "coordinate_selector": "coordinate_selector.png", "data_reduction_96": "data_reduction_96.png", "AsuDataFile_96": "AsuDataFile_96.png", "gears2": "gears2.png", "export_arrow_new": "export_arrow_new.png", "nautilus": "nautilus.png", "new_project_96": "new_project_96.png", "greenarrowsupshadow": "greenarrowsupshadow.png", "slicendice_96": "slicendice_96.png", "model_building": "model_building.png", "coot_find_waters_96": "coot_find_waters_96.png", "ProvideAsuContents_96": "ProvideAsuContents_96.png", "mergeMtz_96": "mergeMtz_96.png", "splitMtz_96": "splitMtz_96.png", "gears": "gears.png", "MakeMonster": "MakeMonster.png", "fileopen_96": "fileopen_96.png", "buccaneer_build_refine_EP_96": "buccaneer_build_refine_EP_96.png", "ShowList": "ShowList.png", "MakeMonster_96": "MakeMonster_96.png", "book": "book.png", "coot1": "coot1.png", "taskmenu_96": "taskmenu_96.png", "ProvideTLS": "ProvideTLS.png", "density_modification": "density_modification.png", "phaser_EP_AUTO_96": "phaser_EP_AUTO_96.png", "FreeRDataFile": "FreeRDataFile.png", "SIMBAD": "SIMBAD.png", "pdb_redo_api": "pdb_redo_api.png", "download": "download.png", "file_info": "file_info.png", "shelxeMR": "shelxeMR.png", "phaser_ensembler_96": "phaser_ensembler_96.png", "new_project": "new_project.png", "ccp4mg_edit_nomrbump_96": "ccp4mg_edit_nomrbump_96.png", "morda_i2_96": "morda_i2_96.png", "i2Dimple": "i2Dimple.png", "UnmergedDataFile": "UnmergedDataFile.png", "ccp4mg_edit_nomrbump": "ccp4mg_edit_nomrbump.png", "xia2_ssx_reduce_96": "xia2_ssx_reduce_96.png", "shelx": "shelx.png", "help-highlight_96": "help-highlight_96.png", "scaleit": "scaleit.png", "dustbin": "dustbin.png", "simple_xia2_96": "simple_xia2_96.png", "MapCoeffsDataFile": "MapCoeffsDataFile.png", "MiniMtzDataFile": "MiniMtzDataFile.png", "privateer_96": "privateer_96.png", "AMPLE_96": "AMPLE_96.png", "pairef_96": "pairef_96.png", "sad": "sad.png", "tableone_96": "tableone_96.png", "zoom": "zoom.png", "dui_96": "dui_96.png", "validation_96": "validation_96.png", "MTZDataFile": "MTZDataFile.png", "developer_tools_96": "developer_tools_96.png", "phaser_EP_LLG": "phaser_EP_LLG.png", "import_merged": "import_merged.png", "MapDataFile": "MapDataFile.png", "ShelxCE_96": "ShelxCE_96.png", "expt_phasing": "expt_phasing.png", "sculptor_96": "sculptor_96.png", "buster_96": "buster_96.png", "mergeMtz": "mergeMtz.png", "matthews": "matthews.png", "ccp4mg_edit_model_96": "ccp4mg_edit_model_96.png", "imosflm": "imosflm.png", "file_96": "file_96.png", "question": "question.png", "up": "up.png", "import_arrow": "import_arrow.png", "coordinate_selector_96": "coordinate_selector_96.png", "toc-plus": "toc-plus.png", "molecular_replacement": "molecular_replacement.png", "chltofom": "chltofom.png", "PhsDataFile": "PhsDataFile.png", "cmapcoeff": "cmapcoeff.png", "blank": "blank.png", "greendot": "greendot.png", "molrep_selfrot": "molrep_selfrot.png", "xia2_multiplex": "xia2_multiplex.png", "help-no-highlight": "help-no-highlight.png", "bullet_arrow_down": "bullet_arrow_down.png", "pisapipe_96": "pisapipe_96.png", "model_building_96": "model_building_96.png", "showlogfile": "showlogfile.png", "dials_image": "dials_image.png", "file": "file.png", "ShelxCECompareHands_96": "ShelxCECompareHands_96.png", "SceneDataFile": "SceneDataFile.png", "servalcat_pipe": "servalcat_pipe.png", "database": "database.png", "chainsaw": "chainsaw.png", "ctruncate": "ctruncate.png", "DictDataFile": "DictDataFile.png", "MDLMolDataFile": "MDLMolDataFile.png", "ProvideSequence_96": "ProvideSequence_96.png", "coot1_96": "coot1_96.png", "chainsaw_96": "chainsaw_96.png", "freerflag_96": "freerflag_96.png", "shelxeMR_96": "shelxeMR_96.png", "down": "down.png", "export": "export.png", "adding_stats_to_mmcif_i2_96": "adding_stats_to_mmcif_i2_96.png", "tab-close": "tab-close.png", "PrepareDeposit_96": "PrepareDeposit_96.png", "refinement_96": "refinement_96.png", "tableone": "tableone.png", "phaser_rnp_pipeline": "phaser_rnp_pipeline.png", "ObsDataFile": "ObsDataFile.png", "import_arrow_new": "import_arrow_new.png", "PhaserRFileDataFile": "PhaserRFileDataFile.png", "clone_96": "clone_96.png", "bullet_arrow_right": "bullet_arrow_right.png", "greenarrowsup": "greenarrowsup.png", "refln_data_analysis_96": "refln_data_analysis_96.png", "file_manager": "file_manager.png", "zanuda": "zanuda.png", "acorn_96": "acorn_96.png", "convert2mtz_96": "convert2mtz_96.png", "buccaneer_build_refine_mr": "buccaneer_build_refine_mr.png", "SubstituteLigand": "SubstituteLigand.png", "ProvideAsuContents": "ProvideAsuContents.png", "ccp4_96": "ccp4_96.png", "ShelxCECompareHands": "ShelxCECompareHands.png", "qtpisa_96": "qtpisa_96.png", "thought": "thought.png", "undone": "undone.png", "expt_data_utility": "expt_data_utility.png", "error_star": "error_star.png", "splitMtz": "splitMtz.png", "coot_rsr_morph": "coot_rsr_morph.png", "SyncToDjango": "SyncToDjango.png", "density_calculator": "density_calculator.png", "import_mosflm_96": "import_mosflm_96.png", "data_entry": "data_entry.png", "AMPLE": "AMPLE.png", "aimless": "aimless.png", "lorestr_i2": "lorestr_i2.png", "privateer": "privateer.png", "ccp4i2": "ccp4i2.png", "phaser_MR_AUTO_96": "phaser_MR_AUTO_96.png", "List": "List.png", "import_xia2": "import_xia2.png", "model_data_utility_96": "model_data_utility_96.png", "arcimboldo": "arcimboldo.png", "dials_rlattice": "dials_rlattice.png", "phaser_singleMR": "phaser_singleMR.png", "ccp4mg_general": "ccp4mg_general.png", "List_grey": "List_grey.png", "search": "search.png", "clone": "clone.png", "LidiaAcedrgNew_96": "LidiaAcedrgNew_96.png", "cell": "cell.png", "molrep_den_96": "molrep_den_96.png", "Annotation": "Annotation.png", "mrparse": "mrparse.png", "aimless_96": "aimless_96.png", "listLine": "listLine.png", "ProvideTLS_96": "ProvideTLS_96.png", "project": "project.png", "coot_find_waters": "coot_find_waters.png", "phaser_singleMR_96": "phaser_singleMR_96.png", "edstats": "edstats.png", "edstats_96": "edstats_96.png", "prosmart_refmac_96": "prosmart_refmac_96.png", "list_delete": "list_delete.png", "toc-minus": "toc-minus.png", "qtpisa": "qtpisa.png", "expt_data_utility_96": "expt_data_utility_96.png", "modelcraft": "modelcraft.png", "arp_warp_classic": "arp_warp_classic.png", "adding_stats_to_mmcif_i2": "adding_stats_to_mmcif_i2.png", "import_processed_96": "import_processed_96.png", "importRefnData": "importRefnData.png", "Mol2DataFile": "Mol2DataFile.png", "refinement": "refinement.png", "arcimboldo_96": "arcimboldo_96.png", "help": "help.png", "forward": "forward.png", "simple_xia2": "simple_xia2.png", "export_arrow_new_96": "export_arrow_new_96.png", "matthews_96": "matthews_96.png", "Mol2DataFile_96": "Mol2DataFile_96.png", "book_96": "book_96.png", "biblio_96": "biblio_96.png", "molrep_selfrot_96": "molrep_selfrot_96.png", "down_96": "down_96.png", "phaser_EP_AUTO": "phaser_EP_AUTO.png", "prosmart_refmac": "prosmart_refmac.png", "cpatterson": "cpatterson.png", "sculptor": "sculptor.png", "freerflag": "freerflag.png", "pause": "pause.png", "nautilus_build_refine": "nautilus_build_refine.png", "pointless_reindexToMatch_96": "pointless_reindexToMatch_96.png", "MakeLink": "MakeLink.png", "zanuda_96": "zanuda_96.png", "ShelxCD_96": "ShelxCD_96.png", "phaser_simple_96": "phaser_simple_96.png", "bioinformatics": "bioinformatics.png", "molrep_pipe": "molrep_pipe.png", "taskmenu": "taskmenu.png", "import_arrow_new_96": "import_arrow_new_96.png", "AlternativeImportXIA2_96": "AlternativeImportXIA2_96.png", "coot_script_lines": "coot_script_lines.png", "cphasematch": "cphasematch.png", "AlternativeImportXIA2": "AlternativeImportXIA2.png", "buster": "buster.png", "list_delete_red": "list_delete_red.png", "PrepareDeposit": "PrepareDeposit.png", "DataFile": "DataFile.png", "LidiaAcedrg_96": "LidiaAcedrg_96.png", "help-no-highlight_96": "help-no-highlight_96.png", "gesamt_96": "gesamt_96.png", "phaser_ensembler": "phaser_ensembler.png", "import_xia2_96": "import_xia2_96.png", "convert2mtz": "convert2mtz.png", "MakeProjectsAndDoLigandPipeline": "MakeProjectsAndDoLigandPipeline.png", "mrbump_basic": "mrbump_basic.png", "MDLMolDataFile_96": "MDLMolDataFile_96.png", "dials_rlattice_96": "dials_rlattice_96.png", "LidiaAcedrg": "LidiaAcedrg.png", "undo": "undo.png", "SyncToDjango_96": "SyncToDjango_96.png", "crank2_96": "crank2_96.png", "morda_i2": "morda_i2.png", "PhaserSolDataFile": "PhaserSolDataFile.png", "editbfac": "editbfac.png", "ShelxCE": "ShelxCE.png", "back_96": "back_96.png", "RefmacKeywordFile": "RefmacKeywordFile.png", "list_add": "list_add.png", "add_fractional_coords": "add_fractional_coords.png", "molecular_replacement_96": "molecular_replacement_96.png", "import_merged_96": "import_merged_96.png", "cmapcoeff_96": "cmapcoeff_96.png", "molrep_den": "molrep_den.png", "shelx_96": "shelx_96.png", "ShelxCD": "ShelxCD.png", "ccp4mg_general_96": "ccp4mg_general_96.png", "green-tick": "green-tick.png", "findmyseq": "findmyseq.png", "density_modification_96": "density_modification_96.png", "export_96": "export_96.png", "unsatisfactory": "unsatisfactory.png", "phaser_pipeline": "phaser_pipeline.png", "fragon_96": "fragon_96.png", "AsuDataFile": "AsuDataFile.png", "data_processing_96": "data_processing_96.png", "biblio": "biblio.png", "redarrowrightshadow": "redarrowrightshadow.png", "gesamt": "gesamt.png", "findmyseq_96": "findmyseq_96.png", "download_96": "download_96.png", "servalcat_pipe_96": "servalcat_pipe_96.png", "phaser_pipeline_96": "phaser_pipeline_96.png", "list_add_grey": "list_add_grey.png", "lorestr_i2_96": "lorestr_i2_96.png", "import_processed": "import_processed.png", "ProvideSequence": "ProvideSequence.png", "import_mosflm": "import_mosflm.png", "validation": "validation.png", "ccp4mg_edit_model": "ccp4mg_edit_model.png", "file_manager2": "file_manager2.png", "youtube": "youtube.png", "aimless_pipe_96": "aimless_pipe_96.png", "importRefnData_96": "importRefnData_96.png", "SeqAlignDataFile": "SeqAlignDataFile.png", "coot_script_lines_96": "coot_script_lines_96.png", "molrep_pipe_96": "molrep_pipe_96.png", "SIMBAD_96": "SIMBAD_96.png", "xia2_dials_96": "xia2_dials_96.png", "phaser_EP_LLG_96": "phaser_EP_LLG_96.png", "SeqDataFile": "SeqDataFile.png", "redarrowright": "redarrowright.png", "running": "running.png", "view_forward": "view_forward.png", "pairef": "pairef.png", "xia2_xds_96": "xia2_xds_96.png", "job": "job.png", "MTZDataFile_96": "MTZDataFile_96.png", "validate_protein": "validate_protein.png", "acorn": "acorn.png", "pdbview_edit_96": "pdbview_edit_96.png", "alpha_fold": "alpha_fold.png", "aimless_pipe": "aimless_pipe.png", "job_interrupted": "job_interrupted.png", "data_processing": "data_processing.png", "ctruncate_96": "ctruncate_96.png", "zoom_96": "zoom_96.png", "coot_rebuild_96": "coot_rebuild_96.png", "pisapipe": "pisapipe.png", "phaser_MR_AUTO": "phaser_MR_AUTO.png", "model_data_utility": "model_data_utility.png", "clustalw_96": "clustalw_96.png", "pointless_reindexToMatch": "pointless_reindexToMatch.png", "xia2_xds": "xia2_xds.png", "TestObsConversions": "TestObsConversions.png", "list_add_red": "list_add_red.png", "data_reduction": "data_reduction.png", "view_forward_96": "view_forward_96.png", "fragon": "fragon.png", "running_dark": "running_dark.png", "showlogfile_96": "showlogfile_96.png", "xia2_dials": "xia2_dials.png", "newtab_96": "newtab_96.png", "tab-close-highlight": "tab-close-highlight.png", "phaser_rnp_pipeline_96": "phaser_rnp_pipeline_96.png", "expt_phasing_96": "expt_phasing_96.png", "cphasematch_96": "cphasematch_96.png", "ResidueRange": "ResidueRange.png", "slicendice": "slicendice.png", "CootHistoryDataFile": "CootHistoryDataFile.png", "TestObsConversions_96": "TestObsConversions_96.png", "coot_rebuild": "coot_rebuild.png", "i2Dimple_96": "i2Dimple_96.png", "validate_protein_96": "validate_protein_96.png", "search-plus": "search-plus.png", "back": "back.png", "data_entry_96": "data_entry_96.png", "editbfac_96": "editbfac_96.png", "dials_image_96": "dials_image_96.png", "crank2": "crank2.png", "red-cross": "red-cross.png", "xia2_multiplex_96": "xia2_multiplex_96.png", "MakeLink_96": "MakeLink_96.png", "csymmatch": "csymmatch.png", "backgroundJobTitle": "backgroundJobTitle.png", "EnsemblePdbDataFile": "EnsemblePdbDataFile.png", "ligands_96": "ligands_96.png", "bioinformatics_96": "bioinformatics_96.png", "newtab": "newtab.png", "developer_tools": "developer_tools.png", "parrot_96": "parrot_96.png", "reload_96": "reload_96.png", "chltofom_96": "chltofom_96.png", "ccp4": "ccp4.png", "refln_data_analysis": "refln_data_analysis.png", "ligands": "ligands.png", "forward_96": "forward_96.png", "buccaneer_build_refine_EP": "buccaneer_build_refine_EP.png", "reload": "reload.png", "help-highlight": "help-highlight.png", "clustalw": "clustalw.png", "SubstituteLigand_96": "SubstituteLigand_96.png", "PdbDataFile": "PdbDataFile.png", "up_96": "up_96.png", "AUSPEX": "AUSPEX.png", "ProvideAlignment": "ProvideAlignment.png", "csymmatch_96": "csymmatch_96.png"} \ No newline at end of file diff --git a/wrappers/areaimol/__init__.py b/wrappers/areaimol/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/wrappers/areaimol/script/CTaskareaimol.py b/wrappers/areaimol/script/CTaskareaimol.py new file mode 100644 index 000000000..c7dde2887 --- /dev/null +++ b/wrappers/areaimol/script/CTaskareaimol.py @@ -0,0 +1,29 @@ + + +from PySide2 import QtGui, QtWidgets,QtCore +from qtgui import CCP4TaskWidget +from qtgui import CCP4Widgets + +class CTaskAreaimolUI(CCP4TaskWidget.CTaskWidget): + +# Subclass CTaskWidget to give specific task window + TASKNAME = 'areaimol' + TASKVERSION = 0.0 + TASKMODULE='model_data_utility' + TASKTITLE='Solvent accessible surface - Areaimol' + SHORTTASKTITLE='AREAIMOL' + WHATNEXT = [] + PROGRAMHELP = 'areaimol' + DESCRIPTION='Solvent accessible surface calculation the areaimol program' + + def drawContents(self): + + self.setProgramHelpFile('areaimol') + + folder = self.openFolder(folderFunction='inputData',title='Input Data',followFrom=False) + + self.createLine( [ 'subtitle', 'Input Structure' ] ) + self.createLine( ['tip', 'This is the structure which the area will be calculated.', 'widget', 'XYZIN'] ) + self.createLine( [ 'subtitle', 'Keywords' ] ) + self.createLine( ['tip', 'Script'] ) + self.createLine( ['widget', '-guiMode','multiLine', 'EXTRA_AREAIMOL_KEYWORDS'] ) diff --git a/wrappers/areaimol/script/__init__.py b/wrappers/areaimol/script/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/wrappers/areaimol/script/areaimol.def.xml b/wrappers/areaimol/script/areaimol.def.xml new file mode 100644 index 000000000..62e2af94d --- /dev/null +++ b/wrappers/areaimol/script/areaimol.def.xml @@ -0,0 +1,47 @@ + + + + DEF + + stuart + 10:06 29/Jan/26 + + 0.0.1 + + areaimol + Solvent accessible surface - Areaimol + + + + + + CPdbDataFile + + True + False + False + True + + + + + + CPdbDataFile + + True + False + + + + + + CString + + END + + + + + + + diff --git a/wrappers/areaimol/script/areaimol.medline.txt b/wrappers/areaimol/script/areaimol.medline.txt new file mode 100644 index 000000000..b04b5e54d --- /dev/null +++ b/wrappers/areaimol/script/areaimol.medline.txt @@ -0,0 +1,3 @@ +AU - P. Brick +AU - P. Briggs +AU - I. Tickle diff --git a/wrappers/areaimol/script/areaimol.py b/wrappers/areaimol/script/areaimol.py new file mode 100644 index 000000000..151d73a83 --- /dev/null +++ b/wrappers/areaimol/script/areaimol.py @@ -0,0 +1,61 @@ +from __future__ import print_function + +import os +import tempfile + +from core.CCP4PluginScript import CPluginScript +from core import CCP4Utils +import pathlib + +class areaimol(CPluginScript): + + TASKTITLE='Solvent accessible surface - Areaimol' + TASKNAME = 'areaimol' + TASKMODULE= 'model_data_utility' + TASKCOMMAND = 'areaimol' + TASKVERSION= 0.0 + COMLINETEMPLATE = None + COMTEMPLATE = None + + def makeCommandAndScript(self): + + inp = self.container.inputData + out = self.container.outputData + + if inp.XYZIN.fullPath.isSet(): + xyzin_target_file = str( inp.XYZIN.fullPath ) + self.appendCommandLine( [ "XYZIN",xyzin_target_file ] ) + + if out.XYZOUT.fullPath.isSet(): + xyzout_target_file = str( out.XYZOUT.fullPath ) + self.appendCommandLine( [ "XYZOUT",xyzout_target_file ] ) + + s = "" + if self.container.controlParameters.EXTRA_AREAIMOL_KEYWORDS.isSet(): + for kwLine in str(self.container.controlParameters.EXTRA_AREAIMOL_KEYWORDS).split('\n'): + kw = kwLine.lstrip().rstrip() + if len(kw)>0: + if str(kw)[0] != '#': + if kw == "END": + break + s += kw + "\n" + + print("Keyword script:",kw) + + self.appendCommandScript( s+"\nEND\n" ) + + return CPluginScript.SUCCEEDED + + def processOutputFiles(self): + from lxml import etree + import sys + import base64 + with open(self.makeFileName("PROGRAMXML"),"w") as programXMLFile: + xmlStructure = etree.Element("areaimol") + logText = etree.SubElement(xmlStructure,"LogText") + with open(self.makeFileName("LOG"),"rb") as logFile: + logText.text = base64.b64encode(logFile.read()) + CCP4Utils.writeXML(programXMLFile,etree.tostring(xmlStructure)) + + return CPluginScript.SUCCEEDED + diff --git a/wrappers/areaimol/script/areaimol_report.py b/wrappers/areaimol/script/areaimol_report.py new file mode 100644 index 000000000..0b905c251 --- /dev/null +++ b/wrappers/areaimol/script/areaimol_report.py @@ -0,0 +1,22 @@ +from report.CCP4ReportParser import * +import sys +import base64 + +class areaimol_report(Report): + # Specify which gui task and/or pluginscript this applies to + TASKNAME = 'areaimol' + RUNNING = False + def __init__(self, xmlnode=None, jobInfo={}, jobStatus=None, **kw): + Report.__init__( + self, xmlnode=xmlnode, jobInfo=jobInfo, jobStatus=jobStatus, **kw + ) + self.addDiv(style="clear:both;") + if jobStatus in ["Running", "Running remotely"]: + self.append("

The job is currently running.

") + + fold = self.addFold(label="Log file") + if len(self.xmlnode.findall(".//LogText"))>0: + xmlPath = './/LogText' + xmlNodes = self.xmlnode.findall(xmlPath) + for node in xmlNodes: + fold.addPre(text=base64.b64decode(node.text).decode()) From 36fd1986fc2bf036c5460a29c8c74b4af396695d Mon Sep 17 00:00:00 2001 From: Stuart McNicholas Date: Wed, 11 Feb 2026 09:17:10 +0000 Subject: [PATCH 02/12] Produce an output file in simplest areaimol case. --- wrappers/areaimol/script/areaimol.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/wrappers/areaimol/script/areaimol.py b/wrappers/areaimol/script/areaimol.py index 151d73a83..e15d17dbc 100644 --- a/wrappers/areaimol/script/areaimol.py +++ b/wrappers/areaimol/script/areaimol.py @@ -42,6 +42,7 @@ def makeCommandAndScript(self): print("Keyword script:",kw) + self.appendCommandScript( s+"\nOUTPUT\n" ) self.appendCommandScript( s+"\nEND\n" ) return CPluginScript.SUCCEEDED @@ -56,6 +57,7 @@ def processOutputFiles(self): with open(self.makeFileName("LOG"),"rb") as logFile: logText.text = base64.b64encode(logFile.read()) CCP4Utils.writeXML(programXMLFile,etree.tostring(xmlStructure)) + self.container.outputData.XYZOUT.annotation = "Coordinates with atom surface area in 'B-factor' column" return CPluginScript.SUCCEEDED From 3e580199353d7484911f8d30b51be668e783cf89 Mon Sep 17 00:00:00 2001 From: Stuart McNicholas Date: Wed, 11 Feb 2026 13:35:50 +0000 Subject: [PATCH 03/12] Compare 2 structures and intermolecular modes work for areaimol task. --- wrappers/areaimol/script/CTaskareaimol.py | 21 +++++++---- wrappers/areaimol/script/areaimol.def.xml | 44 +++++++++++++++++------ wrappers/areaimol/script/areaimol.py | 16 ++++++++- 3 files changed, 63 insertions(+), 18 deletions(-) diff --git a/wrappers/areaimol/script/CTaskareaimol.py b/wrappers/areaimol/script/CTaskareaimol.py index c7dde2887..f8082eea6 100644 --- a/wrappers/areaimol/script/CTaskareaimol.py +++ b/wrappers/areaimol/script/CTaskareaimol.py @@ -1,5 +1,3 @@ - - from PySide2 import QtGui, QtWidgets,QtCore from qtgui import CCP4TaskWidget from qtgui import CCP4Widgets @@ -15,15 +13,24 @@ class CTaskAreaimolUI(CCP4TaskWidget.CTaskWidget): WHATNEXT = [] PROGRAMHELP = 'areaimol' DESCRIPTION='Solvent accessible surface calculation the areaimol program' - + def drawContents(self): self.setProgramHelpFile('areaimol') - + folder = self.openFolder(folderFunction='inputData',title='Input Data',followFrom=False) + self.createLine(['subtitle','Input']) + self.openSubFrame( frame=[True]) + self.createLine( [ 'subtitle', 'Input Structure' ] ) self.createLine( ['tip', 'This is the structure which the area will be calculated.', 'widget', 'XYZIN'] ) - self.createLine( [ 'subtitle', 'Keywords' ] ) - self.createLine( ['tip', 'Script'] ) - self.createLine( ['widget', '-guiMode','multiLine', 'EXTRA_AREAIMOL_KEYWORDS'] ) + self.createLine( ['tip', 'This keyword controls the program function, the data required, and how it is processed and analysed', 'widget', 'DIFFMODE'] ) + self.createLine( ['label', 'The symmetry of the molecule, e.g. P212121', 'widget', 'SYMMETRY'] , toggle=[ 'DIFFMODE', 'open' , ['IMOL'] ] ) + self.createLine( [ 'subtitle', 'Second structure to compare with' ] , toggle=[ 'DIFFMODE', 'open' , ['COMPARE'] ]) + self.createLine( ['tip', 'A second set of input coordinates, and is only used in DIFFMODE COMPARE.', 'widget', 'XYZIN2'] , toggle=[ 'DIFFMODE', 'open' , ['COMPARE'] ] ) + self.closeSubFrame() + + #self.createLine( [ 'subtitle', 'Keywords' ] ) + #self.createLine( ['tip', 'Script'] ) + #self.createLine( ['widget', '-guiMode','multiLine', 'EXTRA_AREAIMOL_KEYWORDS'] ) diff --git a/wrappers/areaimol/script/areaimol.def.xml b/wrappers/areaimol/script/areaimol.def.xml index 62e2af94d..cf1d046bb 100644 --- a/wrappers/areaimol/script/areaimol.def.xml +++ b/wrappers/areaimol/script/areaimol.def.xml @@ -23,6 +23,40 @@ True + + CPdbDataFile + + True + True + False + True + + + + + + CString + + OFF + OFF,IMOL,COMPARE + Off (normal calculation),Intemolecular contact differences,Compare 2 structures + Differences mode + True + + + + CString + + END + + + + + CString + + True + + @@ -33,15 +67,5 @@ - - - CString - - END - - - - - diff --git a/wrappers/areaimol/script/areaimol.py b/wrappers/areaimol/script/areaimol.py index e15d17dbc..ddf14d884 100644 --- a/wrappers/areaimol/script/areaimol.py +++ b/wrappers/areaimol/script/areaimol.py @@ -26,6 +26,10 @@ def makeCommandAndScript(self): xyzin_target_file = str( inp.XYZIN.fullPath ) self.appendCommandLine( [ "XYZIN",xyzin_target_file ] ) + if str(self.container.controlParameters.DIFFMODE) == "COMPARE" and inp.XYZIN2.fullPath.isSet(): + xyzin2_target_file = str( inp.XYZIN2.fullPath ) + self.appendCommandLine( [ "XYZIN2",xyzin2_target_file ] ) + if out.XYZOUT.fullPath.isSet(): xyzout_target_file = str( out.XYZOUT.fullPath ) self.appendCommandLine( [ "XYZOUT",xyzout_target_file ] ) @@ -42,6 +46,16 @@ def makeCommandAndScript(self): print("Keyword script:",kw) + self.appendCommandScript( s+"\nDIFFMODE " + str(self.container.controlParameters.DIFFMODE) + "\n" ) + if str(self.container.controlParameters.DIFFMODE) == "COMPARE" and inp.XYZIN2.fullPath.isSet(): + self.appendCommandScript( s+"\nMATCHUP NOCOORDS\n" ) + if str(self.container.controlParameters.DIFFMODE) == "IMOL" and str(self.container.controlParameters.SYMMETRY) != "": + self.appendCommandScript( s+"\nMODE NOHOH\n") + self.appendCommandScript( s+"\nOUTPUT\n") + self.appendCommandScript( s+"\nSYMMETRY " + str(self.container.controlParameters.SYMMETRY) + "\n" ) + self.appendCommandScript( s+"\nSYMMETRY 19\n") + self.appendCommandScript( s+"\nTRANS 2\n") + self.appendCommandScript( s+"\nOUTPUT\n" ) self.appendCommandScript( s+"\nEND\n" ) @@ -60,4 +74,4 @@ def processOutputFiles(self): self.container.outputData.XYZOUT.annotation = "Coordinates with atom surface area in 'B-factor' column" return CPluginScript.SUCCEEDED - + From 3f8ed29acca1642e9a166dd1530c5fc39a8d0295 Mon Sep 17 00:00:00 2001 From: Stuart McNicholas Date: Wed, 11 Feb 2026 14:02:51 +0000 Subject: [PATCH 04/12] Output mode available; fix for symmetry in IMOL mode. --- wrappers/areaimol/script/CTaskareaimol.py | 2 ++ wrappers/areaimol/script/areaimol.def.xml | 20 ++++++++++++++++++++ wrappers/areaimol/script/areaimol.py | 10 ++++++---- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/wrappers/areaimol/script/CTaskareaimol.py b/wrappers/areaimol/script/CTaskareaimol.py index f8082eea6..350efb211 100644 --- a/wrappers/areaimol/script/CTaskareaimol.py +++ b/wrappers/areaimol/script/CTaskareaimol.py @@ -29,6 +29,8 @@ def drawContents(self): self.createLine( ['label', 'The symmetry of the molecule, e.g. P212121', 'widget', 'SYMMETRY'] , toggle=[ 'DIFFMODE', 'open' , ['IMOL'] ] ) self.createLine( [ 'subtitle', 'Second structure to compare with' ] , toggle=[ 'DIFFMODE', 'open' , ['COMPARE'] ]) self.createLine( ['tip', 'A second set of input coordinates, and is only used in DIFFMODE COMPARE.', 'widget', 'XYZIN2'] , toggle=[ 'DIFFMODE', 'open' , ['COMPARE'] ] ) + self.createLine( ['label', 'Output mode', 'widget', 'OUTPUT_MODE'], toggle=[ 'DIFFMODE', 'open' , ['OFF'] ] ) + self.createLine( ['label', 'Output mode', 'widget', 'OUTPUT_MODE_COMPARE'], toggle=[ 'DIFFMODE', 'open' , ['COMPARE','IMOL'] ] ) self.closeSubFrame() #self.createLine( [ 'subtitle', 'Keywords' ] ) diff --git a/wrappers/areaimol/script/areaimol.def.xml b/wrappers/areaimol/script/areaimol.def.xml index cf1d046bb..0c1a12abe 100644 --- a/wrappers/areaimol/script/areaimol.def.xml +++ b/wrappers/areaimol/script/areaimol.def.xml @@ -44,6 +44,26 @@ True + + CString + + ATOM + ATOM,RESIDUE,GXGRATIO + Area per atom,Area per residue,GXGRATIO (effectively normalised) + Output mode + True + + + + CString + + ATOM + ATOM,RESIDUE + Area per atom,Area per residue + Output mode + True + + CString diff --git a/wrappers/areaimol/script/areaimol.py b/wrappers/areaimol/script/areaimol.py index ddf14d884..b60634099 100644 --- a/wrappers/areaimol/script/areaimol.py +++ b/wrappers/areaimol/script/areaimol.py @@ -51,12 +51,14 @@ def makeCommandAndScript(self): self.appendCommandScript( s+"\nMATCHUP NOCOORDS\n" ) if str(self.container.controlParameters.DIFFMODE) == "IMOL" and str(self.container.controlParameters.SYMMETRY) != "": self.appendCommandScript( s+"\nMODE NOHOH\n") - self.appendCommandScript( s+"\nOUTPUT\n") + self.appendCommandScript( s+"\nSYMMETRY 1\n") self.appendCommandScript( s+"\nSYMMETRY " + str(self.container.controlParameters.SYMMETRY) + "\n" ) - self.appendCommandScript( s+"\nSYMMETRY 19\n") self.appendCommandScript( s+"\nTRANS 2\n") - - self.appendCommandScript( s+"\nOUTPUT\n" ) + + if str(self.container.controlParameters.DIFFMODE) == "OFF" and inp.XYZIN2.fullPath.isSet(): + self.appendCommandScript( s+"\nOUTPUT "+str(self.container.controlParameters.OUTPUT_MODE)+"\n" ) + else: + self.appendCommandScript( s+"\nOUTPUT "+str(self.container.controlParameters.OUTPUT_MODE_COMPARE)+"\n" ) self.appendCommandScript( s+"\nEND\n" ) return CPluginScript.SUCCEEDED From b8a02742ba55fcef02ebe860fbdef81e41f7617d Mon Sep 17 00:00:00 2001 From: Stuart McNicholas Date: Wed, 11 Feb 2026 14:52:42 +0000 Subject: [PATCH 05/12] Smartie extracted summary at top of report. --- wrappers/areaimol/script/CTaskareaimol.py | 7 +++++++ wrappers/areaimol/script/areaimol.py | 18 ++++++++++++++++++ wrappers/areaimol/script/areaimol_report.py | 16 +++++++++++++++- 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/wrappers/areaimol/script/CTaskareaimol.py b/wrappers/areaimol/script/CTaskareaimol.py index 350efb211..107424c20 100644 --- a/wrappers/areaimol/script/CTaskareaimol.py +++ b/wrappers/areaimol/script/CTaskareaimol.py @@ -14,6 +14,11 @@ class CTaskAreaimolUI(CCP4TaskWidget.CTaskWidget): PROGRAMHELP = 'areaimol' DESCRIPTION='Solvent accessible surface calculation the areaimol program' + def updateXYZ2(self): + if self.container.controlParameters.DIFFMODE.isSet(): + if str(self.container.controlParameters.DIFFMODE) != "COMPARE": + self.container.inputData.XYZIN2.unSet() + def drawContents(self): self.setProgramHelpFile('areaimol') @@ -33,6 +38,8 @@ def drawContents(self): self.createLine( ['label', 'Output mode', 'widget', 'OUTPUT_MODE_COMPARE'], toggle=[ 'DIFFMODE', 'open' , ['COMPARE','IMOL'] ] ) self.closeSubFrame() + self.connectDataChanged('DIFFMODE', self.updateXYZ2) + #self.createLine( [ 'subtitle', 'Keywords' ] ) #self.createLine( ['tip', 'Script'] ) #self.createLine( ['widget', '-guiMode','multiLine', 'EXTRA_AREAIMOL_KEYWORDS'] ) diff --git a/wrappers/areaimol/script/areaimol.py b/wrappers/areaimol/script/areaimol.py index b60634099..cbf19fb9b 100644 --- a/wrappers/areaimol/script/areaimol.py +++ b/wrappers/areaimol/script/areaimol.py @@ -6,6 +6,7 @@ from core.CCP4PluginScript import CPluginScript from core import CCP4Utils import pathlib +from smartie import smartie class areaimol(CPluginScript): @@ -72,6 +73,23 @@ def processOutputFiles(self): logText = etree.SubElement(xmlStructure,"LogText") with open(self.makeFileName("LOG"),"rb") as logFile: logText.text = base64.b64encode(logFile.read()) + try: + smartie_text = "" + smartie_logfile = smartie.parselog(self.makeFileName("LOG")) + smartieText = etree.SubElement(xmlStructure,"SummaryText") + for i in range(2,smartie_logfile.nsummaries()-1): + summary = smartie_logfile.summary(i).retrieve().split("\n") + smartie_text += ("\n".join(summary[1:-2])) + "\n" + smartieText.text = base64.b64encode(bytes(smartie_text,"utf-8")) + except: + print("Failed to extract summaries with smartie") + sys.stderr.write("Failed to extract summaries with smartie") + exc_type, exc_value,exc_tb = sys.exc_info()[:3] + sys.stderr.write(str(exc_type)+'\n') + sys.stderr.write(str(exc_value)+'\n') + print(str(exc_type)+'\n') + print(str(exc_value)+'\n') + CCP4Utils.writeXML(programXMLFile,etree.tostring(xmlStructure)) self.container.outputData.XYZOUT.annotation = "Coordinates with atom surface area in 'B-factor' column" diff --git a/wrappers/areaimol/script/areaimol_report.py b/wrappers/areaimol/script/areaimol_report.py index 0b905c251..07573560b 100644 --- a/wrappers/areaimol/script/areaimol_report.py +++ b/wrappers/areaimol/script/areaimol_report.py @@ -14,7 +14,21 @@ def __init__(self, xmlnode=None, jobInfo={}, jobStatus=None, **kw): if jobStatus in ["Running", "Running remotely"]: self.append("

The job is currently running.

") - fold = self.addFold(label="Log file") + if jobStatus not in ["Running", "Running remotely"]: + try: + summaryText = "" + if len(self.xmlnode.findall(".//SummaryText"))>0: + xmlPath = './/SummaryText' + xmlNodes = self.xmlnode.findall(xmlPath) + for node in xmlNodes: + summaryText += base64.b64decode(node.text).decode() + if summaryText: + fold = self.addFold(label="Summary", initiallyOpen=True) + fold.addPre(text=summaryText) + except: + pass + + fold = self.addFold(label="Areaimol log file") if len(self.xmlnode.findall(".//LogText"))>0: xmlPath = './/LogText' xmlNodes = self.xmlnode.findall(xmlPath) From 529b202a15fa992131fb67655dbaac808fee7b20 Mon Sep 17 00:00:00 2001 From: Stuart McNicholas Date: Wed, 11 Feb 2026 17:04:21 +0000 Subject: [PATCH 06/12] Beginnings of work on an area by atom/residue graph. --- wrappers/areaimol/script/areaimol.py | 41 +++++++++++++++++++-- wrappers/areaimol/script/areaimol_report.py | 28 ++++++++++++++ 2 files changed, 65 insertions(+), 4 deletions(-) diff --git a/wrappers/areaimol/script/areaimol.py b/wrappers/areaimol/script/areaimol.py index cbf19fb9b..fe2f0622d 100644 --- a/wrappers/areaimol/script/areaimol.py +++ b/wrappers/areaimol/script/areaimol.py @@ -1,12 +1,12 @@ -from __future__ import print_function - import os import tempfile +import pathlib + +import gemmi +from smartie import smartie from core.CCP4PluginScript import CPluginScript from core import CCP4Utils -import pathlib -from smartie import smartie class areaimol(CPluginScript): @@ -90,6 +90,39 @@ def processOutputFiles(self): print(str(exc_type)+'\n') print(str(exc_value)+'\n') + try: + serNo = 1 + sasValues = etree.SubElement(xmlStructure,"SASValues") + st = gemmi.read_structure(str(self.container.outputData.XYZOUT.fullPath)) + for model in st: + for chain in model: + for residue in chain: + for atom in residue: + sas = etree.SubElement(sasValues,"SAS") + sas_area = etree.SubElement(sas,"area") + sas_name = etree.SubElement(sas,"name") + sas_chain = etree.SubElement(sas,"chain") + sas_resname = etree.SubElement(sas,"resname") + sas_seqNum = etree.SubElement(sas,"seqNum") + sas_insCode = etree.SubElement(sas,"insCode") + sas_serNo = etree.SubElement(sas,"serNo") + sas_area.text = '{0:.2f}'.format(atom.b_iso) + sas_name.text = atom.name + sas_chain.text = chain.name + sas_resname.text = residue.name + sas_seqNum.text = str(residue.seqid.num) + sas_insCode.text = residue.seqid.icode + sas_serNo.text = str(serNo) + serNo += 1 + except: + print("Failed to write area values to program.xml") + sys.stderr.write("Failed to write area values to program.xml") + exc_type, exc_value,exc_tb = sys.exc_info()[:3] + sys.stderr.write(str(exc_type)+'\n') + sys.stderr.write(str(exc_value)+'\n') + print(str(exc_type)+'\n') + print(str(exc_value)+'\n') + CCP4Utils.writeXML(programXMLFile,etree.tostring(xmlStructure)) self.container.outputData.XYZOUT.annotation = "Coordinates with atom surface area in 'B-factor' column" diff --git a/wrappers/areaimol/script/areaimol_report.py b/wrappers/areaimol/script/areaimol_report.py index 07573560b..847d901ba 100644 --- a/wrappers/areaimol/script/areaimol_report.py +++ b/wrappers/areaimol/script/areaimol_report.py @@ -6,6 +6,27 @@ class areaimol_report(Report): # Specify which gui task and/or pluginscript this applies to TASKNAME = 'areaimol' RUNNING = False + + def addProgressGraph(self,parent,xmlnode,internalId="SummaryGraph",tag="SAS"): + print("##################################################") + print("##################################################") + print("addProgressGraph") + if len(xmlnode.findall(tag))>0: + print("YES!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") + progressGraph = parent.addFlotGraph(title="SAS by atom",select=tag,style="height:250px; width:400px;float:left;border:0px;",outputXml=False,internalId=internalId) + progressGraph.addData(title="Atom", select="serNo") + progressGraph.addData(title="Area", select="area") + plot = progressGraph.addPlotObject() + plot.append('title','SAS by atom') + plot.append('plottype','xy') + plot.append('yrange', rightaxis='false') + plot.append( 'xlabel', 'Atom' ) + plot.append( 'xintegral', 'true' ) + plot.append( 'ylabel', 'Area' ) + plotLine = plot.append('plotline',xcol=1,ycol=2,rightaxis='false',colour='blue') + print("##################################################") + print("##################################################") + def __init__(self, xmlnode=None, jobInfo={}, jobStatus=None, **kw): Report.__init__( self, xmlnode=xmlnode, jobInfo=jobInfo, jobStatus=jobStatus, **kw @@ -28,6 +49,13 @@ def __init__(self, xmlnode=None, jobInfo={}, jobStatus=None, **kw): except: pass + """ + fold = self.addFold(label="SAS by atom", initiallyOpen=True) + graphDiv = fold.addDiv(style='width:800px; height:270px;overflow:auto;') + reportNode = self.xmlnode.findall('.//SASValues')[0] + self.addProgressGraph(graphDiv,reportNode,internalId="SummaryGraph",tag="SAS") + """ + fold = self.addFold(label="Areaimol log file") if len(self.xmlnode.findall(".//LogText"))>0: xmlPath = './/LogText' From 9c484fae5278eb9ebb4ea687481a9fb0c203bc8e Mon Sep 17 00:00:00 2001 From: Stuart McNicholas Date: Thu, 12 Feb 2026 10:14:53 +0000 Subject: [PATCH 07/12] A plot of surface area against atom in the produced coordinate file. --- wrappers/areaimol/script/areaimol.py | 16 +++++++++++++-- wrappers/areaimol/script/areaimol_report.py | 22 ++++++--------------- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/wrappers/areaimol/script/areaimol.py b/wrappers/areaimol/script/areaimol.py index fe2f0622d..f97bec1f0 100644 --- a/wrappers/areaimol/script/areaimol.py +++ b/wrappers/areaimol/script/areaimol.py @@ -56,7 +56,7 @@ def makeCommandAndScript(self): self.appendCommandScript( s+"\nSYMMETRY " + str(self.container.controlParameters.SYMMETRY) + "\n" ) self.appendCommandScript( s+"\nTRANS 2\n") - if str(self.container.controlParameters.DIFFMODE) == "OFF" and inp.XYZIN2.fullPath.isSet(): + if str(self.container.controlParameters.DIFFMODE) == "OFF": self.appendCommandScript( s+"\nOUTPUT "+str(self.container.controlParameters.OUTPUT_MODE)+"\n" ) else: self.appendCommandScript( s+"\nOUTPUT "+str(self.container.controlParameters.OUTPUT_MODE_COMPARE)+"\n" ) @@ -124,7 +124,19 @@ def processOutputFiles(self): print(str(exc_value)+'\n') CCP4Utils.writeXML(programXMLFile,etree.tostring(xmlStructure)) - self.container.outputData.XYZOUT.annotation = "Coordinates with atom surface area in 'B-factor' column" + + if str(self.container.controlParameters.DIFFMODE) == "OFF": + if self.container.controlParameters.OUTPUT_MODE == "ATOM": + self.container.outputData.XYZOUT.annotation = "Coordinates with atom surface area in 'B-factor' column" + elif self.container.controlParameters.OUTPUT_MODE == "RESIDUE": + self.container.outputData.XYZOUT.annotation = "Coordinates with residue surface area in 'B-factor' column" + else: + self.container.outputData.XYZOUT.annotation = "Coordinates with GXGRATIO surface area in 'B-factor' column" + else: + if self.container.controlParameters.OUTPUT_MODE_COMPARE == "ATOM": + self.container.outputData.XYZOUT.annotation = "Coordinates with atom surface area in 'B-factor' column" + else: + self.container.outputData.XYZOUT.annotation = "Coordinates with residue surface area in 'B-factor' column" return CPluginScript.SUCCEEDED diff --git a/wrappers/areaimol/script/areaimol_report.py b/wrappers/areaimol/script/areaimol_report.py index 847d901ba..3d90cded5 100644 --- a/wrappers/areaimol/script/areaimol_report.py +++ b/wrappers/areaimol/script/areaimol_report.py @@ -7,25 +7,17 @@ class areaimol_report(Report): TASKNAME = 'areaimol' RUNNING = False - def addProgressGraph(self,parent,xmlnode,internalId="SummaryGraph",tag="SAS"): - print("##################################################") - print("##################################################") - print("addProgressGraph") + def addGraph(self,parent,xmlnode,internalId="SummaryGraph",tag="SAS"): if len(xmlnode.findall(tag))>0: - print("YES!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") - progressGraph = parent.addFlotGraph(title="SAS by atom",select=tag,style="height:250px; width:400px;float:left;border:0px;",outputXml=False,internalId=internalId) + progressGraph = parent.addFlotGraph(xmlnode=xmlnode, title="SAS by atom",select=tag,style="height:250px; width:400px;float:left;border:0px;",outputXml=False,internalId=internalId) progressGraph.addData(title="Atom", select="serNo") progressGraph.addData(title="Area", select="area") plot = progressGraph.addPlotObject() plot.append('title','SAS by atom') plot.append('plottype','xy') - plot.append('yrange', rightaxis='false') - plot.append( 'xlabel', 'Atom' ) - plot.append( 'xintegral', 'true' ) - plot.append( 'ylabel', 'Area' ) - plotLine = plot.append('plotline',xcol=1,ycol=2,rightaxis='false',colour='blue') - print("##################################################") - print("##################################################") + plotLine = plot.append('plotline',xcol=1,ycol=2) + plotLine.append('colour','blue') + plotLine.append('symbolsize','0') def __init__(self, xmlnode=None, jobInfo={}, jobStatus=None, **kw): Report.__init__( @@ -49,12 +41,10 @@ def __init__(self, xmlnode=None, jobInfo={}, jobStatus=None, **kw): except: pass - """ fold = self.addFold(label="SAS by atom", initiallyOpen=True) graphDiv = fold.addDiv(style='width:800px; height:270px;overflow:auto;') reportNode = self.xmlnode.findall('.//SASValues')[0] - self.addProgressGraph(graphDiv,reportNode,internalId="SummaryGraph",tag="SAS") - """ + self.addGraph(graphDiv,reportNode,internalId="SummaryGraph",tag="SAS") fold = self.addFold(label="Areaimol log file") if len(self.xmlnode.findall(".//LogText"))>0: From 689b8fa31c873c1959f2131b04aedc81e7dd4cbd Mon Sep 17 00:00:00 2001 From: Stuart McNicholas Date: Thu, 12 Feb 2026 10:23:02 +0000 Subject: [PATCH 08/12] Only show complete log explicitly if areaimol jos is unsuccessful. The log file still appears in the log files section. --- wrappers/areaimol/script/areaimol_report.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/wrappers/areaimol/script/areaimol_report.py b/wrappers/areaimol/script/areaimol_report.py index 3d90cded5..77738a501 100644 --- a/wrappers/areaimol/script/areaimol_report.py +++ b/wrappers/areaimol/script/areaimol_report.py @@ -41,14 +41,17 @@ def __init__(self, xmlnode=None, jobInfo={}, jobStatus=None, **kw): except: pass + self.addDiv(style="clear:both;") fold = self.addFold(label="SAS by atom", initiallyOpen=True) graphDiv = fold.addDiv(style='width:800px; height:270px;overflow:auto;') reportNode = self.xmlnode.findall('.//SASValues')[0] self.addGraph(graphDiv,reportNode,internalId="SummaryGraph",tag="SAS") - fold = self.addFold(label="Areaimol log file") - if len(self.xmlnode.findall(".//LogText"))>0: - xmlPath = './/LogText' - xmlNodes = self.xmlnode.findall(xmlPath) - for node in xmlNodes: - fold.addPre(text=base64.b64decode(node.text).decode()) + if jobStatus in ['Unknown','Interrupted','Failed','Unsatisfactory']: + self.addDiv(style="clear:both;") + fold = self.addFold(label="Areaimol log file") + if len(self.xmlnode.findall(".//LogText"))>0: + xmlPath = './/LogText' + xmlNodes = self.xmlnode.findall(xmlPath) + for node in xmlNodes: + fold.addPre(text=base64.b64decode(node.text).decode()) From c985b682dfb1ded87a7d161170a40b72d6561ff2 Mon Sep 17 00:00:00 2001 From: Stuart McNicholas Date: Thu, 12 Feb 2026 10:33:01 +0000 Subject: [PATCH 09/12] A break between areaimol summary and graph. --- wrappers/areaimol/script/areaimol_report.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/wrappers/areaimol/script/areaimol_report.py b/wrappers/areaimol/script/areaimol_report.py index 77738a501..238d8462a 100644 --- a/wrappers/areaimol/script/areaimol_report.py +++ b/wrappers/areaimol/script/areaimol_report.py @@ -41,14 +41,16 @@ def __init__(self, xmlnode=None, jobInfo={}, jobStatus=None, **kw): except: pass - self.addDiv(style="clear:both;") + breakDiv = self.addDiv(style="clear:both;") + breakDiv.append('
') fold = self.addFold(label="SAS by atom", initiallyOpen=True) graphDiv = fold.addDiv(style='width:800px; height:270px;overflow:auto;') reportNode = self.xmlnode.findall('.//SASValues')[0] self.addGraph(graphDiv,reportNode,internalId="SummaryGraph",tag="SAS") if jobStatus in ['Unknown','Interrupted','Failed','Unsatisfactory']: - self.addDiv(style="clear:both;") + breakDiv = self.addDiv(style="clear:both;") + breakDiv.append('
') fold = self.addFold(label="Areaimol log file") if len(self.xmlnode.findall(".//LogText"))>0: xmlPath = './/LogText' From e7a1031f5034a152eb4474cc0c7666e23e516b1e Mon Sep 17 00:00:00 2001 From: Stuart McNicholas Date: Thu, 12 Feb 2026 11:23:42 +0000 Subject: [PATCH 10/12] Support areaimol EXCLUDE keyword. --- wrappers/areaimol/script/CTaskareaimol.py | 1 + wrappers/areaimol/script/areaimol.def.xml | 8 ++++++++ wrappers/areaimol/script/areaimol.py | 4 ++++ 3 files changed, 13 insertions(+) diff --git a/wrappers/areaimol/script/CTaskareaimol.py b/wrappers/areaimol/script/CTaskareaimol.py index 107424c20..cb823a89d 100644 --- a/wrappers/areaimol/script/CTaskareaimol.py +++ b/wrappers/areaimol/script/CTaskareaimol.py @@ -36,6 +36,7 @@ def drawContents(self): self.createLine( ['tip', 'A second set of input coordinates, and is only used in DIFFMODE COMPARE.', 'widget', 'XYZIN2'] , toggle=[ 'DIFFMODE', 'open' , ['COMPARE'] ] ) self.createLine( ['label', 'Output mode', 'widget', 'OUTPUT_MODE'], toggle=[ 'DIFFMODE', 'open' , ['OFF'] ] ) self.createLine( ['label', 'Output mode', 'widget', 'OUTPUT_MODE_COMPARE'], toggle=[ 'DIFFMODE', 'open' , ['COMPARE','IMOL'] ] ) + self.createLine( ['label', 'Residue names to exclude (space separated)', 'widget', 'EXCLUDE'] ) self.closeSubFrame() self.connectDataChanged('DIFFMODE', self.updateXYZ2) diff --git a/wrappers/areaimol/script/areaimol.def.xml b/wrappers/areaimol/script/areaimol.def.xml index 0c1a12abe..2c613678b 100644 --- a/wrappers/areaimol/script/areaimol.def.xml +++ b/wrappers/areaimol/script/areaimol.def.xml @@ -34,6 +34,14 @@
+ + CString + + + Space separate list of residue names to exclude + Excluded residues + + CString diff --git a/wrappers/areaimol/script/areaimol.py b/wrappers/areaimol/script/areaimol.py index f97bec1f0..686da102c 100644 --- a/wrappers/areaimol/script/areaimol.py +++ b/wrappers/areaimol/script/areaimol.py @@ -60,6 +60,10 @@ def makeCommandAndScript(self): self.appendCommandScript( s+"\nOUTPUT "+str(self.container.controlParameters.OUTPUT_MODE)+"\n" ) else: self.appendCommandScript( s+"\nOUTPUT "+str(self.container.controlParameters.OUTPUT_MODE_COMPARE)+"\n" ) + + if self.container.controlParameters.EXCLUDE.isSet() and str(self.container.controlParameters.EXCLUDE) != "": + self.appendCommandScript( s+"EXCLUDE "+str(self.container.controlParameters.EXCLUDE)+"\n" ) + self.appendCommandScript( s+"\nEND\n" ) return CPluginScript.SUCCEEDED From bc6da674770de70ceb518167cd027be58dc143eb Mon Sep 17 00:00:00 2001 From: Stuart McNicholas Date: Thu, 12 Feb 2026 11:51:58 +0000 Subject: [PATCH 11/12] Add areaimol i2run test. --- test/i2run/test_areaimol.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 test/i2run/test_areaimol.py diff --git a/test/i2run/test_areaimol.py b/test/i2run/test_areaimol.py new file mode 100644 index 000000000..0c5dc9ed6 --- /dev/null +++ b/test/i2run/test_areaimol.py @@ -0,0 +1,30 @@ +from .urls import rcsb_pdb +from .utils import download, i2run +import gemmi + +def test_from_pdb_rcsb(): + with download(rcsb_pdb("5a3h")) as pdb_5a3h: + args = ["areaimol"] + args += ["--XYZIN", pdb_5a3h] + args += ["--OUTPUT_MODE", "ATOM"] + with i2run(args) as job: + mtz = gemmi.read_structure(str(job / "XYZOUT.pdb")) + +def test_imol_from_pdb_rcsb(): + with download(rcsb_pdb("5a3h")) as pdb_5a3h: + args = ["areaimol"] + args += ["--XYZIN", pdb_5a3h] + args += ["--DIFFMODE", "IMOL"] + args += ["--OUTPUT_MODE", "ATOM"] + with i2run(args) as job: + mtz = gemmi.read_structure(str(job / "XYZOUT.pdb")) + +def test_compare_from_pdb_rcsb(): + with download(rcsb_pdb("5a3h")) as pdb_5a3h, download(rcsb_pdb("8a3h")) as pdb_8a3h: + args = ["areaimol"] + args += ["--XYZIN", pdb_5a3h] + args += ["--XYZIN2", pdb_8a3h] + args += ["--DIFFMODE", "COMPARE"] + args += ["--OUTPUT_MODE", "ATOM"] + with i2run(args) as job: + mtz = gemmi.read_structure(str(job / "XYZOUT.pdb")) From 8d43cd850745a4e5661b104ae041d13c3e8a97ba Mon Sep 17 00:00:00 2001 From: Stuart McNicholas Date: Fri, 13 Feb 2026 09:15:10 +0000 Subject: [PATCH 12/12] Remove erroneous menuText from EXCLUDE parameter in areaimol task. --- wrappers/areaimol/script/areaimol.def.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/wrappers/areaimol/script/areaimol.def.xml b/wrappers/areaimol/script/areaimol.def.xml index 2c613678b..52931a41c 100644 --- a/wrappers/areaimol/script/areaimol.def.xml +++ b/wrappers/areaimol/script/areaimol.def.xml @@ -38,8 +38,7 @@ CString - Space separate list of residue names to exclude - Excluded residues + Space separate list of residue names to exclude