diff --git a/ansible/roles/backend/tasks/main.yml b/ansible/roles/backend/tasks/main.yml index c35fe89..91b2d7f 100644 --- a/ansible/roles/backend/tasks/main.yml +++ b/ansible/roles/backend/tasks/main.yml @@ -248,8 +248,6 @@ environment_variables: JOB_QUEUE_NAME: "{{ project }}-{{ deployment_group }}-job-q" OUTPUT_BUCKET: "{{ project }}-{{ deployment_group }}-output" - FARGATE_CLUSTER: "{{ project }}-{{ deployment_group }}-cluster" - FARGATE_SERVICE: "{{ project }}-{{ deployment_group }}-fargate-service" tags: Deployment: "{{ deployment_group }}" tags: diff --git a/lambda_services/__init__.py b/lambda_services/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lambda_services/job_service/job_service.py b/lambda_services/job_service/job_service.py index 7cc43a5..f685517 100644 --- a/lambda_services/job_service/job_service.py +++ b/lambda_services/job_service/job_service.py @@ -9,10 +9,9 @@ from .launcher.utils import _LOGGER OUTPUT_BUCKET = getenv("OUTPUT_BUCKET") -FARGATE_CLUSTER = getenv("FARGATE_CLUSTER") -FARGATE_SERVICE = getenv("FARGATE_SERVICE") # Could use SQS URL below instead of a queue name; whichever is easier SQS_QUEUE_NAME = getenv("JOB_QUEUE_NAME") +JOB_QUEUE_REGION = getenv("JOB_QUEUE_REGION", "us-west-2") JOB_MAX_RUNTIME = int(getenv("JOB_MAX_RUNTIME", 2000)) # Initialize logger @@ -125,7 +124,7 @@ def build_status_dict( def upload_status_file(object_filename: str, initial_status_dict: dict): """Upload the initial status object to S3 - :param object_filename str: the name of the file to download + :param object_filename str: the S3 object key of the file to download :param initial_status_dict dict: a JSON-compatible dictionary containing initial status info of the job """ @@ -235,7 +234,7 @@ def interpret_job_submission(event: dict, context): "command_line_args": job_command_line_args, "max_run_time": timeout_seconds, } - sqs_client = resource("sqs") + sqs_client = resource("sqs", JOB_QUEUE_REGION) queue = sqs_client.get_queue_by_name(QueueName=SQS_QUEUE_NAME) _LOGGER.info("%s Sending message to queue: %s", job_tag, sqs_json) queue.send_message(MessageBody=dumps(sqs_json)) diff --git a/lambda_services/job_service/launcher/utils.py b/lambda_services/job_service/launcher/utils.py index 5f09083..33ba889 100644 --- a/lambda_services/job_service/launcher/utils.py +++ b/lambda_services/job_service/launcher/utils.py @@ -125,9 +125,9 @@ def s3_object_exists(bucket_name: str, object_name: str) -> bool: ) return True except ClientError as err: - if err.response["Error"]["Message"] == "NoSuchKey": + if err.response["Error"]["Code"] == "404": # "NoSuchKey" error return False - elif err.response["Error"]["Message"] == "Forbidden": + elif err.response["Error"]["Code"] == "403": job_tag: str = _extract_job_tag_from_objectname(object_name) _LOGGER.warning( "%s Received '%s' (%d) message on object HEAD: %s", diff --git a/lambda_services/tests/__init__.py b/lambda_services/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lambda_services/tests/expected_data/template-output.json b/lambda_services/tests/expected_data/template-output.json new file mode 100644 index 0000000..19b5e5c --- /dev/null +++ b/lambda_services/tests/expected_data/template-output.json @@ -0,0 +1,7 @@ +[ + { + "name": "", + "sqs_message": {}, + "initial_status": {} + } +] diff --git a/lambda_services/tests/expected_data/test-job_service-output.json b/lambda_services/tests/expected_data/test-job_service-output.json new file mode 100644 index 0000000..a1835ea --- /dev/null +++ b/lambda_services/tests/expected_data/test-job_service-output.json @@ -0,0 +1,93 @@ +[ + { + "name": "apbs-direct", + "sqs_message": { + "job_id": "sampleId", + "job_type": "apbs", + "job_date": "2021-05-16", + "job_tag": "2021-05-16/sampleId", + "bucket_name": "pytest_input_bucket", + "input_files": [ + "2021-05-16/sampleId/1fas.in", + "2021-05-16/sampleId/1fas.pqr" + ], + "command_line_args": "1fas.in", + "max_run_time": 7200 + }, + "initial_status": { + "jobid": "sampleId", + "jobtype": "apbs", + "apbs": { + "status": "pending", + "startTime": 1623172892.2588568, + "endTime": null, + "subtasks": [], + "inputFiles": [ + "2021-05-16/sampleId/1fas.in", + "2021-05-16/sampleId/1fas.pqr" + ], + "outputFiles": [] + } + } + }, + { + "name": "apbs-post_pdb2pqr", + "sqs_message": { + "job_id": "sampleId", + "job_type": "apbs", + "job_date": "2021-05-16", + "job_tag": "2021-05-16/sampleId", + "bucket_name": "pytest_input_bucket", + "input_files": [ + "2021-05-16/sampleId/1fas.pqr", + "2021-05-16/sampleId/apbsinput.in" + ], + "command_line_args": "apbsinput.in", + "max_run_time": 7200 + }, + "initial_status": { + "jobid": "sampleId", + "jobtype": "apbs", + "apbs": { + "status": "pending", + "startTime": 1623172892.2588568, + "endTime": null, + "subtasks": [], + "inputFiles": [ + "2021-05-16/sampleId/1fas.pqr", + "2021-05-16/sampleId/apbsinput.in" + ], + "outputFiles": [] + } + } + }, + { + "name": "pdb2pqr-v1-basic", + "sqs_message": { + "job_date": "2021-05-16", + "job_id": "sampleId", + "job_tag": "2021-05-16/sampleId", + "job_type": "pdb2pqr", + "bucket_name": "pytest_input_bucket", + "input_files": [ + "https://files.rcsb.org/download/1fas.pdb" + ], + "command_line_args": "--with-ph=7.0 --ph-calc-method=propka --drop-water --apbs-input --ff=parse --verbose 1fas.pdb sampleId.pqr", + "max_run_time": 2700 + }, + "initial_status": { + "jobid": "sampleId", + "jobtype": "pdb2pqr", + "pdb2pqr": { + "status": "pending", + "startTime": 1623261174.8676486, + "endTime": null, + "subtasks": [], + "inputFiles": [ + "https://files.rcsb.org/download/1fas.pdb" + ], + "outputFiles": [] + } + } + } +] diff --git a/lambda_services/tests/input_data/1fas.in b/lambda_services/tests/input_data/1fas.in new file mode 100644 index 0000000..5304629 --- /dev/null +++ b/lambda_services/tests/input_data/1fas.in @@ -0,0 +1,27 @@ +read + mol pqr 1fas.pqr +end +elec + mg-auto + dime 129 97 97 + cglen 63.1108 45.7300 61.4601 + fglen 57.1240 45.7300 56.1530 + cgcent mol 1 + fgcent mol 1 + mol 1 + lpbe + bcfl sdh + pdie 2.0000 + sdie 78.5400 + srfm smol + chgm spl2 + sdens 10.00 + srad 1.40 + swin 0.30 + temp 298.15 + calcenergy total + calcforce no + write pot dx 1fas.pqr +end +print elecEnergy 1 end +quit diff --git a/lambda_services/tests/input_data/1fas.pqr b/lambda_services/tests/input_data/1fas.pqr new file mode 100644 index 0000000..4e7f7e2 --- /dev/null +++ b/lambda_services/tests/input_data/1fas.pqr @@ -0,0 +1,931 @@ +REMARK 1 PQR file generated by PDB2PQR (Version master) +REMARK 1 +REMARK 1 Command line used to generate this file: +REMARK 1 --with-ph=7.0 --ph-calc-method=propka --drop-water --apbs-input --ff=parse --verbose 1fas.pdb 1fas.pqr +REMARK 1 +REMARK 1 Forcefield Used: PARSE +REMARK 1 +REMARK 1 pKas calculated by propka and assigned using pH 7.00 +REMARK 1 +REMARK 5 WARNING: multiple occupancies found in THR A 1, +REMARK 5 at least one of the instances is being ignored. +REMARK 5 WARNING: multiple occupancies found in SER A 5, +REMARK 5 at least one of the instances is being ignored. +REMARK 5 +REMARK 6 Total charge on this protein: 4.0000 e +REMARK 6 +ATOM 1 N THR 1 46.148 16.581 2.104 -0.3200 2.0000 +ATOM 2 CA THR 1 44.862 15.936 2.105 0.3300 2.0000 +ATOM 3 C THR 1 43.983 16.642 1.087 0.5500 1.7000 +ATOM 4 O THR 1 44.150 17.855 0.925 -0.5500 1.4000 +ATOM 5 CB THR 1 44.293 16.088 3.528 0.0000 2.0000 +ATOM 6 OG1 THR 1 45.409 15.915 4.403 -0.4900 1.4000 +ATOM 7 CG2 THR 1 43.175 15.110 3.826 0.0000 2.0000 +ATOM 8 HG22 THR 1 43.156 14.387 3.129 0.0000 0.0000 +ATOM 9 H2 THR 1 46.672 16.314 1.287 0.3300 0.0000 +ATOM 10 H3 THR 1 46.037 17.581 2.102 0.3300 0.0000 +ATOM 11 HB THR 1 43.940 17.022 3.639 0.0000 0.0000 +ATOM 12 H THR 1 46.671 16.318 2.922 0.3300 0.0000 +ATOM 13 HG21 THR 1 43.317 14.690 4.727 0.0000 0.0000 +ATOM 14 HG23 THR 1 42.291 15.587 3.825 0.0000 0.0000 +ATOM 15 HA THR 1 44.971 14.986 1.819 0.0000 0.0000 +ATOM 16 HG1 THR 1 45.246 15.149 5.034 0.4900 1.0000 +ATOM 17 N MET 2 43.095 15.880 0.429 -0.4000 1.5000 +ATOM 18 CA MET 2 42.043 16.449 -0.402 -0.0000 2.0000 +ATOM 19 C MET 2 40.905 16.678 0.608 0.5500 1.7000 +ATOM 20 O MET 2 40.580 15.751 1.373 -0.5500 1.4000 +ATOM 21 CB MET 2 41.482 15.465 -1.413 0.0000 2.0000 +ATOM 22 CG MET 2 42.439 14.993 -2.493 0.2650 2.0000 +ATOM 23 SD MET 2 42.845 16.400 -3.552 -0.5300 1.8500 +ATOM 24 CE MET 2 41.289 17.057 -4.054 0.2650 2.0000 +ATOM 25 HG2 MET 2 43.268 14.622 -2.061 0.0000 0.0000 +ATOM 26 HE1 MET 2 41.309 17.298 -5.030 0.0000 0.0000 +ATOM 27 HE2 MET 2 40.559 16.381 -3.907 0.0000 0.0000 +ATOM 28 HE3 MET 2 41.071 17.884 -3.524 0.0000 0.0000 +ATOM 29 HB2 MET 2 41.135 14.643 -0.918 0.0000 0.0000 +ATOM 30 HG3 MET 2 42.002 14.261 -3.026 0.0000 0.0000 +ATOM 31 H MET 2 43.228 14.856 0.568 0.4000 1.0000 +ATOM 32 HA MET 2 42.333 17.321 -0.726 0.0000 0.0000 +ATOM 33 HB3 MET 2 40.673 15.886 -1.870 0.0000 0.0000 +ATOM 34 N CYS 3 40.248 17.802 0.586 -0.4000 1.5000 +ATOM 35 CA CYS 3 39.209 18.135 1.542 -0.0000 2.0000 +ATOM 36 C CYS 3 37.962 18.602 0.826 0.5500 1.7000 +ATOM 37 O CYS 3 38.007 19.100 -0.321 -0.5500 1.4000 +ATOM 38 CB CYS 3 39.687 19.276 2.433 0.2900 2.0000 +ATOM 39 SG CYS 3 41.285 18.930 3.230 -0.2900 1.8500 +ATOM 40 HB3 CYS 3 39.014 19.422 3.147 0.0000 0.0000 +ATOM 41 H CYS 3 40.531 18.460 -0.188 0.4000 1.0000 +ATOM 42 HA CYS 3 38.981 17.305 2.064 0.0000 0.0000 +ATOM 43 HB2 CYS 3 39.792 20.089 1.876 0.0000 0.0000 +ATOM 44 N TYR 4 36.814 18.454 1.482 -0.4000 1.5000 +ATOM 45 CA TYR 4 35.591 19.079 0.970 -0.0000 2.0000 +ATOM 46 C TYR 4 35.756 20.586 1.188 0.5500 1.7000 +ATOM 47 O TYR 4 36.446 21.024 2.114 -0.5500 1.4000 +ATOM 48 CB TYR 4 34.373 18.592 1.741 0.1250 2.0000 +ATOM 49 CG TYR 4 33.893 17.219 1.276 -0.1250 1.7000 +ATOM 50 CD1 TYR 4 33.331 17.067 0.025 -0.1250 1.7000 +ATOM 51 CD2 TYR 4 34.012 16.153 2.144 -0.1250 1.7000 +ATOM 52 CE1 TYR 4 32.895 15.803 -0.341 -0.1250 1.7000 +ATOM 53 CE2 TYR 4 33.566 14.909 1.785 -0.1250 1.7000 +ATOM 54 CZ TYR 4 33.012 14.742 0.547 0.0550 1.7000 +ATOM 55 OH TYR 4 32.540 13.498 0.200 -0.4900 1.4000 +ATOM 56 HA TYR 4 35.535 18.912 -0.002 0.0000 0.0000 +ATOM 57 HE1 TYR 4 32.495 15.652 -1.250 0.1250 1.0000 +ATOM 58 HE2 TYR 4 33.644 14.138 2.416 0.1250 1.0000 +ATOM 59 H TYR 4 36.857 17.891 2.338 0.4000 1.0000 +ATOM 60 HD2 TYR 4 34.429 16.293 3.042 0.1250 1.0000 +ATOM 61 HD1 TYR 4 33.239 17.826 -0.591 0.1250 1.0000 +ATOM 62 HB3 TYR 4 33.630 19.234 1.605 0.0000 0.0000 +ATOM 63 HB2 TYR 4 34.609 18.522 2.701 0.0000 0.0000 +ATOM 64 HH TYR 4 31.769 13.263 0.790 0.4350 1.0000 +ATOM 65 N SER 5 35.183 21.415 0.351 -0.4000 1.5000 +ATOM 66 CA SER 5 35.369 22.844 0.489 -0.0000 2.0000 +ATOM 67 C SER 5 34.055 23.585 0.623 0.5500 1.7000 +ATOM 68 O SER 5 34.078 24.809 0.496 -0.5500 1.4000 +ATOM 69 CB SER 5 36.143 23.279 -0.759 0.0000 2.0000 +ATOM 70 OG SER 5 35.456 23.027 -1.989 -0.4900 1.4000 +ATOM 71 H SER 5 34.607 20.978 -0.390 0.4000 1.0000 +ATOM 72 HA SER 5 35.908 23.012 1.332 0.0000 0.0000 +ATOM 73 HB3 SER 5 37.022 22.789 -0.782 0.0000 0.0000 +ATOM 74 HB2 SER 5 36.330 24.266 -0.697 0.0000 0.0000 +ATOM 75 HG SER 5 34.509 23.326 -1.901 0.4900 1.0000 +ATOM 76 N HIS 6 32.889 22.953 0.735 -0.4000 1.5000 +ATOM 77 CA HIS 6 31.659 23.744 0.748 -0.0000 2.0000 +ATOM 78 C HIS 6 30.798 23.343 1.936 0.5500 1.7000 +ATOM 79 O HIS 6 31.194 22.404 2.625 -0.5500 1.4000 +ATOM 80 CB HIS 6 30.933 23.526 -0.586 0.1250 2.0000 +ATOM 81 CG HIS 6 31.716 24.056 -1.802 0.1550 1.7000 +ATOM 82 H HIS 6 32.929 21.939 0.806 0.4000 1.0000 +ATOM 83 HA HIS 6 31.905 24.711 0.847 0.0000 0.0000 +ATOM 84 HB3 HIS 6 30.053 24.000 -0.570 0.0000 0.0000 +ATOM 85 HB2 HIS 6 30.783 22.548 -0.731 0.0000 0.0000 +ATOM 86 CD2 HIS 6 31.452 25.269 -2.402 -0.1250 1.7000 +ATOM 87 HE2 HIS 6 32.418 26.204 -4.003 0.4000 1.0000 +ATOM 88 HE1 HIS 6 33.895 24.234 -4.040 0.1250 1.0000 +ATOM 89 CE1 HIS 6 33.138 24.368 -3.404 0.1550 1.7000 +ATOM 90 ND1 HIS 6 32.770 23.528 -2.458 -0.5600 1.5000 +ATOM 91 NE2 HIS 6 32.340 25.409 -3.364 -0.4000 1.5000 +ATOM 92 HD2 HIS 6 30.719 25.889 -2.126 0.1250 1.0000 +ATOM 93 N THR 7 29.679 24.025 2.229 -0.4000 1.5000 +ATOM 94 CA THR 7 28.828 23.658 3.344 -0.0000 2.0000 +ATOM 95 C THR 7 27.969 22.462 2.973 0.5500 1.7000 +ATOM 96 O THR 7 27.379 21.849 3.867 -0.5500 1.4000 +ATOM 97 CB THR 7 27.952 24.834 3.723 0.0000 2.0000 +ATOM 98 OG1 THR 7 27.357 25.295 2.510 -0.4900 1.4000 +ATOM 99 CG2 THR 7 28.734 25.939 4.402 0.0000 2.0000 +ATOM 100 HA THR 7 29.409 23.401 4.123 0.0000 0.0000 +ATOM 101 HG22 THR 7 29.174 26.522 3.713 0.0000 0.0000 +ATOM 102 HG21 THR 7 28.118 26.503 4.960 0.0000 0.0000 +ATOM 103 H THR 7 29.488 24.824 1.592 0.4000 1.0000 +ATOM 104 HB THR 7 27.214 24.520 4.338 0.0000 0.0000 +ATOM 105 HG23 THR 7 29.442 25.545 4.995 0.0000 0.0000 +ATOM 106 HG1 THR 7 27.251 24.535 1.858 0.4900 1.0000 +ATOM 107 N THR 8 27.815 22.152 1.675 -0.4000 1.5000 +ATOM 108 CA THR 8 27.185 20.909 1.295 -0.0000 2.0000 +ATOM 109 C THR 8 28.267 20.039 0.634 0.5500 1.7000 +ATOM 110 O THR 8 29.258 20.563 0.089 -0.5500 1.4000 +ATOM 111 CB THR 8 26.016 21.201 0.330 0.0000 2.0000 +ATOM 112 OG1 THR 8 26.555 21.884 -0.792 -0.4900 1.4000 +ATOM 113 CG2 THR 8 24.903 22.004 1.003 0.0000 2.0000 +ATOM 114 HA THR 8 26.869 20.437 2.109 0.0000 0.0000 +ATOM 115 HG22 THR 8 24.901 21.818 1.987 0.0000 0.0000 +ATOM 116 HG21 THR 8 25.055 22.983 0.851 0.0000 0.0000 +ATOM 117 H THR 8 28.174 22.856 1.016 0.4000 1.0000 +ATOM 118 HB THR 8 25.627 20.320 0.019 0.0000 0.0000 +ATOM 119 HG23 THR 8 24.017 21.742 0.615 0.0000 0.0000 +ATOM 120 HG1 THR 8 27.542 22.047 -0.669 0.4900 1.0000 +ATOM 121 N THR 9 28.115 18.714 0.658 -0.4000 1.5000 +ATOM 122 CA THR 9 29.068 17.779 0.078 -0.0000 2.0000 +ATOM 123 C THR 9 28.599 17.194 -1.255 0.5500 1.7000 +ATOM 124 O THR 9 29.205 16.285 -1.818 -0.5500 1.4000 +ATOM 125 CB THR 9 29.327 16.642 1.117 0.0000 2.0000 +ATOM 126 OG1 THR 9 28.075 16.121 1.544 -0.4900 1.4000 +ATOM 127 CG2 THR 9 30.071 17.152 2.333 0.0000 2.0000 +ATOM 128 HA THR 9 29.942 18.270 -0.085 0.0000 0.0000 +ATOM 129 HG22 THR 9 30.992 16.752 2.366 0.0000 0.0000 +ATOM 130 HG21 THR 9 30.152 18.152 2.292 0.0000 0.0000 +ATOM 131 H THR 9 27.233 18.400 1.140 0.4000 1.0000 +ATOM 132 HB THR 9 29.850 15.904 0.654 0.0000 0.0000 +ATOM 133 HG23 THR 9 29.576 16.899 3.170 0.0000 0.0000 +ATOM 134 HG1 THR 9 27.339 16.409 0.920 0.4900 1.0000 +ATOM 135 N SER 10 27.521 17.733 -1.807 -0.4000 1.5000 +ATOM 136 CA SER 10 26.893 17.198 -3.007 -0.0000 2.0000 +ATOM 137 C SER 10 27.679 17.367 -4.305 0.5500 1.7000 +ATOM 138 O SER 10 27.722 16.508 -5.199 -0.5500 1.4000 +ATOM 139 CB SER 10 25.528 17.876 -3.187 0.0000 2.0000 +ATOM 140 OG SER 10 24.980 18.337 -1.946 -0.4900 1.4000 +ATOM 141 H SER 10 27.158 18.579 -1.305 0.4000 1.0000 +ATOM 142 HA SER 10 26.750 16.191 -2.863 0.0000 0.0000 +ATOM 143 HB3 SER 10 24.893 17.219 -3.590 0.0000 0.0000 +ATOM 144 HB2 SER 10 25.634 18.659 -3.798 0.0000 0.0000 +ATOM 145 HG SER 10 25.401 19.209 -1.708 0.4900 1.0000 +ATOM 146 N ARG 11 28.232 18.569 -4.408 -0.4000 1.5000 +ATOM 147 CA ARG 11 28.877 19.008 -5.631 -0.0000 2.0000 +ATOM 148 C ARG 11 30.240 18.375 -5.786 0.5500 1.7000 +ATOM 149 O ARG 11 31.019 18.275 -4.831 -0.5500 1.4000 +ATOM 150 CB ARG 11 28.934 20.531 -5.596 0.0000 2.0000 +ATOM 151 CG ARG 11 27.508 21.051 -5.683 0.0000 2.0000 +ATOM 152 CD ARG 11 27.410 22.535 -5.420 0.3500 2.0000 +ATOM 153 NE ARG 11 26.031 22.962 -5.590 -0.3500 1.5000 +ATOM 154 CZ ARG 11 25.702 23.994 -6.370 0.3500 1.7000 +ATOM 155 NH1 ARG 11 26.629 24.686 -7.033 -0.7000 1.5000 +ATOM 156 NH2 ARG 11 24.421 24.336 -6.491 -0.7000 1.5000 +ATOM 157 HG3 ARG 11 26.941 20.574 -5.007 0.0000 0.0000 +ATOM 158 HA ARG 11 28.302 18.739 -6.417 0.0000 0.0000 +ATOM 159 HE ARG 11 25.311 22.475 -5.114 0.4500 1.0000 +ATOM 160 HG2 ARG 11 27.145 20.869 -6.600 0.0000 0.0000 +ATOM 161 HH22 ARG 11 24.166 25.118 -7.057 0.4000 1.0000 +ATOM 162 HH21 ARG 11 23.716 23.810 -6.016 0.4000 1.0000 +ATOM 163 H ARG 11 28.163 19.155 -3.551 0.4000 1.0000 +ATOM 164 HD3 ARG 11 27.984 23.005 -6.071 0.0000 0.0000 +ATOM 165 HD2 ARG 11 27.697 22.707 -4.491 0.0000 0.0000 +ATOM 166 HH12 ARG 11 26.358 25.465 -7.595 0.4000 1.0000 +ATOM 167 HH11 ARG 11 27.589 24.422 -6.966 0.4000 1.0000 +ATOM 168 HB3 ARG 11 29.422 20.844 -6.374 0.0000 0.0000 +ATOM 169 HB2 ARG 11 29.311 20.810 -4.746 0.0000 0.0000 +ATOM 170 N ALA 12 30.495 17.954 -7.023 -0.4000 1.5000 +ATOM 171 CA ALA 12 31.698 17.196 -7.349 -0.0000 2.0000 +ATOM 172 C ALA 12 32.986 18.029 -7.429 0.5500 1.7000 +ATOM 173 O ALA 12 33.698 17.951 -8.444 -0.5500 1.4000 +ATOM 174 CB ALA 12 31.456 16.461 -8.694 0.0000 2.0000 +ATOM 175 H ALA 12 29.772 18.209 -7.726 0.4000 1.0000 +ATOM 176 HA ALA 12 31.832 16.475 -6.636 0.0000 0.0000 +ATOM 177 HB1 ALA 12 30.657 15.876 -8.599 0.0000 0.0000 +ATOM 178 HB3 ALA 12 31.303 17.139 -9.405 0.0000 0.0000 +ATOM 179 HB2 ALA 12 32.259 15.914 -8.908 0.0000 0.0000 +ATOM 180 N ILE 13 33.279 18.775 -6.339 -0.4000 1.5000 +ATOM 181 CA ILE 13 34.410 19.694 -6.234 -0.0000 2.0000 +ATOM 182 C ILE 13 35.084 19.631 -4.855 0.5500 1.7000 +ATOM 183 O ILE 13 34.458 19.676 -3.789 -0.5500 1.4000 +ATOM 184 CB ILE 13 33.905 21.151 -6.577 0.0000 2.0000 +ATOM 185 CG1 ILE 13 35.054 22.186 -6.550 0.0000 2.0000 +ATOM 186 CG2 ILE 13 32.863 21.578 -5.568 0.0000 2.0000 +ATOM 187 CD1 ILE 13 35.108 23.009 -7.866 0.0000 2.0000 +ATOM 188 HA ILE 13 35.097 19.377 -6.900 0.0000 0.0000 +ATOM 189 HG22 ILE 13 32.519 22.484 -5.814 0.0000 0.0000 +ATOM 190 HG21 ILE 13 32.112 20.919 -5.572 0.0000 0.0000 +ATOM 191 HB ILE 13 33.534 21.123 -7.500 0.0000 0.0000 +ATOM 192 HG12 ILE 13 34.907 22.805 -5.802 0.0000 0.0000 +ATOM 193 HG13 ILE 13 35.907 21.706 -6.453 0.0000 0.0000 +ATOM 194 HD13 ILE 13 34.244 23.486 -7.971 0.0000 0.0000 +ATOM 195 H ILE 13 32.593 18.626 -5.547 0.4000 1.0000 +ATOM 196 HD12 ILE 13 35.858 23.655 -7.798 0.0000 0.0000 +ATOM 197 HG23 ILE 13 33.279 21.610 -4.659 0.0000 0.0000 +ATOM 198 HD11 ILE 13 35.254 22.381 -8.620 0.0000 0.0000 +ATOM 199 N LEU 14 36.404 19.532 -4.872 -0.4000 1.5000 +ATOM 200 CA LEU 14 37.221 19.365 -3.694 -0.0000 2.0000 +ATOM 201 C LEU 14 38.345 20.404 -3.717 0.5500 1.7000 +ATOM 202 O LEU 14 38.581 21.057 -4.739 -0.5500 1.4000 +ATOM 203 CB LEU 14 37.839 17.968 -3.703 0.0000 2.0000 +ATOM 204 CG LEU 14 36.895 16.755 -3.856 0.0000 2.0000 +ATOM 205 CD1 LEU 14 37.739 15.499 -3.989 0.0000 2.0000 +ATOM 206 CD2 LEU 14 35.922 16.696 -2.667 0.0000 2.0000 +ATOM 207 HD22 LEU 14 35.383 17.535 -2.644 0.0000 0.0000 +ATOM 208 HD23 LEU 14 35.318 15.910 -2.777 0.0000 0.0000 +ATOM 209 HD21 LEU 14 36.444 16.606 -1.822 0.0000 0.0000 +ATOM 210 H LEU 14 36.816 19.587 -5.847 0.4000 1.0000 +ATOM 211 HD13 LEU 14 38.306 15.387 -3.172 0.0000 0.0000 +ATOM 212 HD12 LEU 14 37.142 14.702 -4.089 0.0000 0.0000 +ATOM 213 HD11 LEU 14 38.329 15.574 -4.794 0.0000 0.0000 +ATOM 214 HA LEU 14 36.664 19.528 -2.880 0.0000 0.0000 +ATOM 215 HG LEU 14 36.347 16.880 -4.671 0.0000 0.0000 +ATOM 216 HB3 LEU 14 38.334 17.842 -2.840 0.0000 0.0000 +ATOM 217 HB2 LEU 14 38.493 17.923 -4.464 0.0000 0.0000 +ATOM 218 N THR 15 39.054 20.578 -2.622 -0.4000 1.5000 +ATOM 219 CA THR 15 40.189 21.504 -2.572 -0.0000 2.0000 +ATOM 220 C THR 15 41.356 20.609 -2.145 0.5500 1.7000 +ATOM 221 O THR 15 41.249 19.683 -1.309 -0.5500 1.4000 +ATOM 222 CB THR 15 39.912 22.662 -1.548 0.0000 2.0000 +ATOM 223 OG1 THR 15 40.975 23.567 -1.758 -0.4900 1.4000 +ATOM 224 CG2 THR 15 39.813 22.256 -0.064 0.0000 2.0000 +ATOM 225 HA THR 15 40.367 21.836 -3.473 0.0000 0.0000 +ATOM 226 HG22 THR 15 39.483 23.034 0.470 0.0000 0.0000 +ATOM 227 HG21 THR 15 39.176 21.491 0.027 0.0000 0.0000 +ATOM 228 H THR 15 38.750 20.013 -1.802 0.4000 1.0000 +ATOM 229 HB THR 15 39.048 23.095 -1.802 0.0000 0.0000 +ATOM 230 HG23 THR 15 40.717 21.982 0.264 0.0000 0.0000 +ATOM 231 HG1 THR 15 41.522 23.682 -0.918 0.4900 1.0000 +ATOM 232 N ASN 16 42.476 20.800 -2.824 -0.4000 1.5000 +ATOM 233 CA ASN 16 43.659 20.013 -2.495 -0.0000 2.0000 +ATOM 234 C ASN 16 44.452 20.879 -1.528 0.5500 1.7000 +ATOM 235 O ASN 16 45.123 21.845 -1.915 -0.5500 1.4000 +ATOM 236 CB ASN 16 44.483 19.714 -3.751 0.0000 2.0000 +ATOM 237 CG ASN 16 45.592 18.732 -3.476 0.5500 1.7000 +ATOM 238 HA ASN 16 43.356 19.220 -1.994 0.0000 0.0000 +ATOM 239 H ASN 16 42.441 21.510 -3.561 0.4000 1.0000 +ATOM 240 HB3 ASN 16 44.879 20.567 -4.073 0.0000 0.0000 +ATOM 241 HB2 ASN 16 43.875 19.331 -4.438 0.0000 0.0000 +ATOM 242 OD1 ASN 16 46.060 18.595 -2.326 -0.5500 1.4000 +ATOM 243 ND2 ASN 16 46.113 17.979 -4.457 -0.7800 1.5000 +ATOM 244 HD22 ASN 16 46.816 17.342 -4.308 0.3900 1.0000 +ATOM 245 HD21 ASN 16 45.734 18.102 -5.398 0.3900 1.0000 +ATOM 246 N CYS 17 44.366 20.538 -0.263 -0.4000 1.5000 +ATOM 247 CA CYS 17 45.035 21.300 0.777 -0.0000 2.0000 +ATOM 248 C CYS 17 46.523 21.031 0.867 0.5500 1.7000 +ATOM 249 O CYS 17 47.233 21.724 1.619 -0.5500 1.4000 +ATOM 250 CB CYS 17 44.330 21.005 2.132 0.2900 2.0000 +ATOM 251 SG CYS 17 42.615 21.616 2.050 -0.2900 1.8500 +ATOM 252 HB3 CYS 17 44.796 21.494 2.828 0.0000 0.0000 +ATOM 253 H CYS 17 43.790 19.693 -0.070 0.4000 1.0000 +ATOM 254 HA CYS 17 44.905 22.291 0.576 0.0000 0.0000 +ATOM 255 HB2 CYS 17 44.308 20.044 2.259 0.0000 0.0000 +ATOM 256 N GLY 18 47.070 20.071 0.114 -0.4000 1.5000 +ATOM 257 CA GLY 18 48.487 19.780 0.177 -0.0000 2.0000 +ATOM 258 C GLY 18 48.838 19.216 1.539 0.5500 1.7000 +ATOM 259 O GLY 18 48.175 18.271 2.017 -0.5500 1.4000 +ATOM 260 H GLY 18 46.401 19.571 -0.500 0.4000 1.0000 +ATOM 261 HA2 GLY 18 48.728 19.111 -0.533 0.0000 0.0000 +ATOM 262 HA3 GLY 18 49.013 20.621 0.018 0.0000 0.0000 +ATOM 263 N GLU 19 49.809 19.846 2.179 -0.4000 1.5000 +ATOM 264 CA GLU 19 50.280 19.351 3.460 -0.0000 2.0000 +ATOM 265 C GLU 19 49.443 19.830 4.635 0.5500 1.7000 +ATOM 266 O GLU 19 49.663 19.435 5.771 -0.5500 1.4000 +ATOM 267 CB GLU 19 51.739 19.754 3.715 0.0000 2.0000 +ATOM 268 CG GLU 19 52.735 19.186 2.709 -0.0000 2.0000 +ATOM 269 CD GLU 19 52.843 17.659 2.571 0.1000 1.7000 +ATOM 270 OE1 GLU 19 52.257 16.891 3.362 -0.5500 1.4000 +ATOM 271 OE2 GLU 19 53.545 17.228 1.647 -0.5500 1.4000 +ATOM 272 HG2 GLU 19 52.496 19.541 1.801 0.0000 0.0000 +ATOM 273 HA GLU 19 50.289 18.333 3.448 0.0000 0.0000 +ATOM 274 HG3 GLU 19 53.650 19.518 2.955 0.0000 0.0000 +ATOM 275 H GLU 19 50.184 20.682 1.708 0.4000 1.0000 +ATOM 276 HB3 GLU 19 51.991 19.418 4.605 0.0000 0.0000 +ATOM 277 HB2 GLU 19 51.791 20.736 3.663 0.0000 0.0000 +ATOM 278 N ASN 20 48.456 20.640 4.395 -0.4000 1.5000 +ATOM 279 CA ASN 20 47.634 21.200 5.440 -0.0000 2.0000 +ATOM 280 C ASN 20 46.432 20.306 5.771 0.5500 1.7000 +ATOM 281 O ASN 20 45.998 19.524 4.907 -0.5500 1.4000 +ATOM 282 CB ASN 20 47.157 22.556 4.956 0.0000 2.0000 +ATOM 283 CG ASN 20 46.666 23.465 6.047 0.5500 1.7000 +ATOM 284 HA ASN 20 48.195 21.248 6.280 0.0000 0.0000 +ATOM 285 H ASN 20 48.302 20.856 3.376 0.4000 1.0000 +ATOM 286 HB3 ASN 20 46.410 22.412 4.298 0.0000 0.0000 +ATOM 287 HB2 ASN 20 47.919 23.009 4.480 0.0000 0.0000 +ATOM 288 OD1 ASN 20 46.641 23.156 7.254 -0.5500 1.4000 +ATOM 289 ND2 ASN 20 46.275 24.662 5.579 -0.7800 1.5000 +ATOM 290 HD22 ASN 20 45.928 25.353 6.256 0.3900 1.0000 +ATOM 291 HD21 ASN 20 46.317 24.873 4.622 0.3900 1.0000 +ATOM 292 N SER 21 45.861 20.491 6.971 -0.4000 1.5000 +ATOM 293 CA SER 21 44.695 19.746 7.370 -0.0000 2.0000 +ATOM 294 C SER 21 43.428 20.249 6.670 0.5500 1.7000 +ATOM 295 O SER 21 43.424 21.326 6.049 -0.5500 1.4000 +ATOM 296 CB SER 21 44.502 19.853 8.895 0.0000 2.0000 +ATOM 297 OG SER 21 44.337 21.186 9.337 -0.4900 1.4000 +ATOM 298 H SER 21 46.332 21.203 7.561 0.4000 1.0000 +ATOM 299 HA SER 21 44.823 18.779 7.103 0.0000 0.0000 +ATOM 300 HB3 SER 21 45.307 19.457 9.343 0.0000 0.0000 +ATOM 301 HB2 SER 21 43.691 19.321 9.148 0.0000 0.0000 +ATOM 302 HG SER 21 44.921 21.792 8.797 0.4900 1.0000 +ATOM 303 N CYS 22 42.398 19.425 6.790 -0.4000 1.5000 +ATOM 304 CA CYS 22 41.025 19.811 6.412 -0.0000 2.0000 +ATOM 305 C CYS 22 40.324 20.344 7.659 0.5500 1.7000 +ATOM 306 O CYS 22 40.568 19.819 8.761 -0.5500 1.4000 +ATOM 307 CB CYS 22 40.185 18.643 5.995 0.2900 2.0000 +ATOM 308 SG CYS 22 40.805 17.585 4.676 -0.2900 1.8500 +ATOM 309 HB3 CYS 22 39.271 18.994 5.709 0.0000 0.0000 +ATOM 310 H CYS 22 42.631 18.484 7.172 0.4000 1.0000 +ATOM 311 HA CYS 22 41.083 20.546 5.746 0.0000 0.0000 +ATOM 312 HB2 CYS 22 40.023 18.057 6.814 0.0000 0.0000 +ATOM 313 N TYR 23 39.405 21.296 7.560 -0.4000 1.5000 +ATOM 314 CA TYR 23 38.577 21.597 8.725 -0.0000 2.0000 +ATOM 315 C TYR 23 37.090 21.509 8.380 0.5500 1.7000 +ATOM 316 O TYR 23 36.695 21.618 7.210 -0.5500 1.4000 +ATOM 317 CB TYR 23 38.822 23.022 9.295 0.1250 2.0000 +ATOM 318 CG TYR 23 38.336 24.202 8.453 -0.1250 1.7000 +ATOM 319 CD1 TYR 23 37.008 24.639 8.477 -0.1250 1.7000 +ATOM 320 CD2 TYR 23 39.256 24.802 7.607 -0.1250 1.7000 +ATOM 321 CE1 TYR 23 36.609 25.674 7.646 -0.1250 1.7000 +ATOM 322 CE2 TYR 23 38.845 25.826 6.781 -0.1250 1.7000 +ATOM 323 CZ TYR 23 37.548 26.244 6.810 0.0550 1.7000 +ATOM 324 OH TYR 23 37.199 27.281 5.970 -0.4900 1.4000 +ATOM 325 HA TYR 23 38.772 20.913 9.438 0.0000 0.0000 +ATOM 326 HE1 TYR 23 35.669 25.998 7.654 0.1250 1.0000 +ATOM 327 HE2 TYR 23 39.506 26.261 6.158 0.1250 1.0000 +ATOM 328 H TYR 23 39.333 21.766 6.660 0.4000 1.0000 +ATOM 329 HD2 TYR 23 40.196 24.498 7.599 0.1250 1.0000 +ATOM 330 HD1 TYR 23 36.355 24.208 9.087 0.1250 1.0000 +ATOM 331 HB3 TYR 23 39.814 23.129 9.433 0.0000 0.0000 +ATOM 332 HB2 TYR 23 38.369 23.074 10.192 0.0000 0.0000 +ATOM 333 HH TYR 23 36.716 26.911 5.179 0.4350 1.0000 +ATOM 334 N ARG 24 36.231 21.349 9.378 -0.4000 1.5000 +ATOM 335 CA ARG 24 34.789 21.409 9.230 -0.0000 2.0000 +ATOM 336 C ARG 24 34.311 22.302 10.381 0.5500 1.7000 +ATOM 337 O ARG 24 34.560 22.000 11.565 -0.5500 1.4000 +ATOM 338 CB ARG 24 34.181 20.022 9.372 0.0000 2.0000 +ATOM 339 CG ARG 24 32.650 19.958 9.273 0.0000 2.0000 +ATOM 340 CD ARG 24 32.322 18.524 9.703 0.3500 2.0000 +ATOM 341 NE ARG 24 30.933 18.204 9.505 -0.3500 1.5000 +ATOM 342 CZ ARG 24 29.976 18.469 10.395 0.3500 1.7000 +ATOM 343 NH1 ARG 24 30.223 19.085 11.565 -0.7000 1.5000 +ATOM 344 NH2 ARG 24 28.737 18.038 10.119 -0.7000 1.5000 +ATOM 345 HG3 ARG 24 32.380 20.071 8.356 0.0000 0.0000 +ATOM 346 HA ARG 24 34.562 21.847 8.379 0.0000 0.0000 +ATOM 347 HE ARG 24 30.658 17.754 8.648 0.4500 1.0000 +ATOM 348 HG2 ARG 24 32.258 20.565 9.908 0.0000 0.0000 +ATOM 349 HH22 ARG 24 28.003 18.211 10.786 0.4000 1.0000 +ATOM 350 HH21 ARG 24 28.550 17.559 9.272 0.4000 1.0000 +ATOM 351 H ARG 24 36.698 21.170 10.310 0.4000 1.0000 +ATOM 352 HD3 ARG 24 32.558 18.442 10.670 0.0000 0.0000 +ATOM 353 HD2 ARG 24 32.895 17.911 9.162 0.0000 0.0000 +ATOM 354 HH12 ARG 24 29.492 19.246 12.204 0.4000 1.0000 +ATOM 355 HH11 ARG 24 31.158 19.376 11.773 0.4000 1.0000 +ATOM 356 HB3 ARG 24 34.439 19.650 10.265 0.0000 0.0000 +ATOM 357 HB2 ARG 24 34.553 19.435 8.651 0.0000 0.0000 +ATOM 358 N LYS 25 33.659 23.425 10.088 -0.4000 1.5000 +ATOM 359 CA LYS 25 33.186 24.265 11.177 -0.0000 2.0000 +ATOM 360 C LYS 25 31.680 24.251 11.202 0.5500 1.7000 +ATOM 361 O LYS 25 31.052 24.150 10.147 -0.5500 1.4000 +ATOM 362 CB LYS 25 33.716 25.704 11.042 0.0000 2.0000 +ATOM 363 CG LYS 25 33.436 26.520 9.851 0.0000 2.0000 +ATOM 364 CD LYS 25 34.213 27.859 9.978 0.0000 2.0000 +ATOM 365 CE LYS 25 33.845 28.656 8.704 0.3300 2.0000 +ATOM 366 NZ LYS 25 34.169 30.096 8.804 -0.3200 2.0000 +ATOM 367 HA LYS 25 33.533 23.898 12.044 0.0000 0.0000 +ATOM 368 HE2 LYS 25 34.343 28.249 7.928 0.0000 0.0000 +ATOM 369 HE3 LYS 25 32.857 28.541 8.540 0.0000 0.0000 +ATOM 370 HG2 LYS 25 33.754 26.070 9.028 0.0000 0.0000 +ATOM 371 HG3 LYS 25 32.473 26.741 9.787 0.0000 0.0000 +ATOM 372 HZ1 LYS 25 35.154 30.228 8.683 0.3300 0.0000 +ATOM 373 HZ3 LYS 25 33.677 30.601 8.093 0.3300 0.0000 +ATOM 374 HZ2 LYS 25 33.897 30.440 9.704 0.3300 0.0000 +ATOM 375 HD3 LYS 25 35.157 27.673 9.965 0.0000 0.0000 +ATOM 376 HD2 LYS 25 33.885 28.336 10.747 0.0000 0.0000 +ATOM 377 H LYS 25 33.532 23.626 9.097 0.4000 1.0000 +ATOM 378 HB3 LYS 25 34.743 25.647 11.175 0.0000 0.0000 +ATOM 379 HB2 LYS 25 33.385 26.214 11.881 0.0000 0.0000 +ATOM 380 N SER 26 31.130 24.221 12.410 -0.4000 1.5000 +ATOM 381 CA SER 26 29.690 24.119 12.612 -0.0000 2.0000 +ATOM 382 C SER 26 29.293 24.854 13.890 0.5500 1.7000 +ATOM 383 O SER 26 30.151 25.213 14.714 -0.5500 1.4000 +ATOM 384 CB SER 26 29.328 22.653 12.721 0.0000 2.0000 +ATOM 385 OG SER 26 30.179 22.014 13.667 -0.4900 1.4000 +ATOM 386 H SER 26 31.813 24.276 13.198 0.4000 1.0000 +ATOM 387 HA SER 26 29.232 24.570 11.843 0.0000 0.0000 +ATOM 388 HB3 SER 26 29.451 22.218 11.838 0.0000 0.0000 +ATOM 389 HB2 SER 26 28.389 22.567 13.029 0.0000 0.0000 +ATOM 390 HG SER 26 30.977 22.589 13.834 0.4900 1.0000 +ATOM 391 N ARG 27 28.005 25.111 14.029 -0.4000 1.5000 +ATOM 392 CA ARG 27 27.474 25.631 15.278 -0.0000 2.0000 +ATOM 393 C ARG 27 27.705 24.572 16.362 0.5500 1.7000 +ATOM 394 O ARG 27 27.400 23.375 16.215 -0.5500 1.4000 +ATOM 395 CB ARG 27 25.994 25.895 15.127 0.0000 2.0000 +ATOM 396 CG ARG 27 25.493 27.228 14.595 0.0000 2.0000 +ATOM 397 CD ARG 27 23.919 27.260 14.531 0.3500 2.0000 +ATOM 398 NE ARG 27 23.320 26.867 15.807 -0.3500 1.5000 +ATOM 399 CZ ARG 27 22.938 27.723 16.767 0.3500 1.7000 +ATOM 400 NH1 ARG 27 23.060 29.039 16.648 -0.7000 1.5000 +ATOM 401 NH2 ARG 27 22.378 27.247 17.880 -0.7000 1.5000 +ATOM 402 HG3 ARG 27 25.819 27.376 13.672 0.0000 0.0000 +ATOM 403 HA ARG 27 27.971 26.454 15.531 0.0000 0.0000 +ATOM 404 HE ARG 27 23.183 25.884 15.981 0.4500 1.0000 +ATOM 405 HG2 ARG 27 25.770 27.966 15.194 0.0000 0.0000 +ATOM 406 HH22 ARG 27 22.109 27.874 18.605 0.4000 1.0000 +ATOM 407 HH21 ARG 27 22.230 26.264 17.982 0.4000 1.0000 +ATOM 408 H ARG 27 27.422 24.915 13.194 0.4000 1.0000 +ATOM 409 HD3 ARG 27 23.650 26.628 13.818 0.0000 0.0000 +ATOM 410 HD2 ARG 27 23.661 28.188 14.304 0.0000 0.0000 +ATOM 411 HH12 ARG 27 22.784 29.638 17.385 0.4000 1.0000 +ATOM 412 HH11 ARG 27 23.435 29.427 15.800 0.4000 1.0000 +ATOM 413 HB3 ARG 27 25.552 25.752 16.043 0.0000 0.0000 +ATOM 414 HB2 ARG 27 25.602 25.163 14.521 0.0000 0.0000 +ATOM 415 N ARG 28 28.320 25.001 17.448 -0.4000 1.5000 +ATOM 416 CA ARG 28 28.568 24.134 18.577 -0.0000 2.0000 +ATOM 417 C ARG 28 27.251 23.681 19.214 0.5500 1.7000 +ATOM 418 O ARG 28 27.155 22.556 19.696 -0.5500 1.4000 +ATOM 419 CB ARG 28 29.360 24.856 19.646 0.0000 2.0000 +ATOM 420 CG ARG 28 29.916 23.998 20.802 0.0000 2.0000 +ATOM 421 CD ARG 28 30.900 24.670 21.743 0.3500 2.0000 +ATOM 422 NE ARG 28 32.114 25.112 21.041 -0.3500 1.5000 +ATOM 423 CZ ARG 28 33.154 24.329 20.685 0.3500 1.7000 +ATOM 424 NH1 ARG 28 33.202 22.996 20.951 -0.7000 1.5000 +ATOM 425 NH2 ARG 28 34.224 24.904 20.088 -0.7000 1.5000 +ATOM 426 HG3 ARG 28 30.370 23.179 20.404 0.0000 0.0000 +ATOM 427 HA ARG 28 29.065 23.315 18.266 0.0000 0.0000 +ATOM 428 HE ARG 28 32.181 26.095 20.800 0.4500 1.0000 +ATOM 429 HG2 ARG 28 29.132 23.658 21.355 0.0000 0.0000 +ATOM 430 HH22 ARG 28 34.997 24.337 19.842 0.4000 1.0000 +ATOM 431 HH21 ARG 28 34.217 25.880 19.906 0.4000 1.0000 +ATOM 432 H ARG 28 28.606 26.004 17.419 0.4000 1.0000 +ATOM 433 HD3 ARG 28 31.153 24.016 22.449 0.0000 0.0000 +ATOM 434 HD2 ARG 28 30.454 25.461 22.149 0.0000 0.0000 +ATOM 435 HH12 ARG 28 33.983 22.479 20.690 0.4000 1.0000 +ATOM 436 HH11 ARG 28 32.422 22.575 21.413 0.4000 1.0000 +ATOM 437 HB3 ARG 28 28.775 25.563 20.061 0.0000 0.0000 +ATOM 438 HB2 ARG 28 30.147 25.312 19.213 0.0000 0.0000 +ATOM 439 N HIS 29 26.233 24.528 19.268 -0.4000 1.5000 +ATOM 440 CA HIS 29 24.981 24.221 19.961 -0.0000 2.0000 +ATOM 441 C HIS 29 23.882 23.906 18.957 0.5500 1.7000 +ATOM 442 O HIS 29 23.903 24.446 17.842 -0.5500 1.4000 +ATOM 443 CB HIS 29 24.635 25.417 20.826 0.1250 2.0000 +ATOM 444 CG HIS 29 25.736 25.621 21.859 -0.1250 1.7000 +ATOM 445 H HIS 29 26.398 25.436 18.774 0.4000 1.0000 +ATOM 446 HA HIS 29 25.128 23.410 20.535 0.0000 0.0000 +ATOM 447 HB3 HIS 29 23.793 25.251 21.312 0.0000 0.0000 +ATOM 448 HB2 HIS 29 24.585 26.232 20.274 0.0000 0.0000 +ATOM 449 CD2 HIS 29 26.676 26.621 21.756 0.1550 1.7000 +ATOM 450 HD1 HIS 29 25.527 24.138 23.329 0.4000 1.0000 +ATOM 451 HE1 HIS 29 27.519 25.175 24.377 0.1250 1.0000 +ATOM 452 CE1 HIS 29 27.083 25.477 23.534 0.1550 1.7000 +ATOM 453 ND1 HIS 29 26.021 24.930 22.973 -0.4000 1.5000 +ATOM 454 NE2 HIS 29 27.464 26.491 22.787 -0.5600 1.5000 +ATOM 455 HD2 HIS 29 26.705 27.293 21.015 0.1250 1.0000 +ATOM 456 N PRO 30 22.930 23.005 19.239 -0.5600 1.5000 +ATOM 457 CA PRO 30 21.913 22.630 18.280 0.2800 2.0000 +ATOM 458 C PRO 30 21.114 23.844 17.863 0.5500 1.7000 +ATOM 459 O PRO 30 20.931 24.735 18.697 -0.5500 1.4000 +ATOM 460 CB PRO 30 21.042 21.564 18.962 0.0000 2.0000 +ATOM 461 CG PRO 30 21.962 21.028 20.046 0.0000 2.0000 +ATOM 462 CD PRO 30 22.788 22.243 20.486 0.2800 2.0000 +ATOM 463 HG2 PRO 30 21.430 20.672 20.808 0.0000 0.0000 +ATOM 464 HA PRO 30 22.320 22.176 17.479 0.0000 0.0000 +ATOM 465 HD3 PRO 30 23.675 21.957 20.836 0.0000 0.0000 +ATOM 466 HD2 PRO 30 22.300 22.769 21.175 0.0000 0.0000 +ATOM 467 HG3 PRO 30 22.554 20.317 19.678 0.0000 0.0000 +ATOM 468 HB3 PRO 30 20.797 20.844 18.326 0.0000 0.0000 +ATOM 469 HB2 PRO 30 20.232 21.971 19.364 0.0000 0.0000 +ATOM 470 N PRO 31 20.640 23.905 16.612 -0.5600 1.5000 +ATOM 471 CA PRO 31 20.942 22.973 15.518 0.2800 2.0000 +ATOM 472 C PRO 31 22.391 23.092 15.044 0.5500 1.7000 +ATOM 473 O PRO 31 22.830 24.197 14.687 -0.5500 1.4000 +ATOM 474 CB PRO 31 19.959 23.353 14.466 0.0000 2.0000 +ATOM 475 CG PRO 31 19.828 24.848 14.632 0.0000 2.0000 +ATOM 476 CD PRO 31 19.821 25.015 16.138 0.2800 2.0000 +ATOM 477 HG2 PRO 31 20.605 25.311 14.227 0.0000 0.0000 +ATOM 478 HA PRO 31 20.735 22.023 15.793 0.0000 0.0000 +ATOM 479 HD3 PRO 31 18.888 24.956 16.501 0.0000 0.0000 +ATOM 480 HD2 PRO 31 20.220 25.895 16.403 0.0000 0.0000 +ATOM 481 HG3 PRO 31 18.978 25.167 14.235 0.0000 0.0000 +ATOM 482 HB3 PRO 31 19.070 22.914 14.605 0.0000 0.0000 +ATOM 483 HB2 PRO 31 20.292 23.139 13.545 0.0000 0.0000 +ATOM 484 N LYS 32 23.131 21.983 14.993 -0.4000 1.5000 +ATOM 485 CA LYS 32 24.559 22.046 14.674 -0.0000 2.0000 +ATOM 486 C LYS 32 24.785 22.140 13.167 0.5500 1.7000 +ATOM 487 O LYS 32 25.322 21.230 12.533 -0.5500 1.4000 +ATOM 488 CB LYS 32 25.270 20.802 15.266 0.0000 2.0000 +ATOM 489 CG LYS 32 25.263 20.798 16.781 0.0000 2.0000 +ATOM 490 CD LYS 32 26.042 19.604 17.350 0.0000 2.0000 +ATOM 491 CE LYS 32 26.032 19.680 18.871 0.3300 2.0000 +ATOM 492 NZ LYS 32 26.932 18.693 19.489 -0.3200 2.0000 +ATOM 493 HA LYS 32 24.953 22.864 15.111 0.0000 0.0000 +ATOM 494 HE2 LYS 32 26.310 20.609 19.147 0.0000 0.0000 +ATOM 495 HE3 LYS 32 25.089 19.525 19.193 0.0000 0.0000 +ATOM 496 HG2 LYS 32 25.686 21.640 17.118 0.0000 0.0000 +ATOM 497 HG3 LYS 32 24.320 20.745 17.110 0.0000 0.0000 +ATOM 498 HZ1 LYS 32 27.843 19.093 19.610 0.3300 0.0000 +ATOM 499 HZ3 LYS 32 26.572 18.418 20.383 0.3300 0.0000 +ATOM 500 HZ2 LYS 32 27.004 17.884 18.901 0.3300 0.0000 +ATOM 501 HD3 LYS 32 26.972 19.653 17.034 0.0000 0.0000 +ATOM 502 HD2 LYS 32 25.596 18.774 17.069 0.0000 0.0000 +ATOM 503 H LYS 32 22.625 21.107 15.191 0.4000 1.0000 +ATOM 504 HB3 LYS 32 26.208 20.812 14.948 0.0000 0.0000 +ATOM 505 HB2 LYS 32 24.792 19.999 14.940 0.0000 0.0000 +ATOM 506 N MET 33 24.354 23.209 12.519 -0.4000 1.5000 +ATOM 507 CA MET 33 24.526 23.368 11.086 -0.0000 2.0000 +ATOM 508 C MET 33 25.987 23.627 10.692 0.5500 1.7000 +ATOM 509 O MET 33 26.760 24.297 11.392 -0.5500 1.4000 +ATOM 510 CB MET 33 23.590 24.500 10.615 0.0000 2.0000 +ATOM 511 CG MET 33 23.602 25.904 11.250 0.2650 2.0000 +ATOM 512 SD MET 33 22.000 26.814 11.296 -0.5300 1.8500 +ATOM 513 CE MET 33 20.839 25.518 11.013 0.2650 2.0000 +ATOM 514 HG2 MET 33 23.987 25.816 12.212 0.0000 0.0000 +ATOM 515 HE1 MET 33 20.078 25.848 10.444 0.0000 0.0000 +ATOM 516 HE2 MET 33 21.282 24.748 10.540 0.0000 0.0000 +ATOM 517 HE3 MET 33 20.466 25.186 11.886 0.0000 0.0000 +ATOM 518 HB2 MET 33 23.732 24.628 9.588 0.0000 0.0000 +ATOM 519 HG3 MET 33 24.319 26.473 10.755 0.0000 0.0000 +ATOM 520 H MET 33 23.884 23.922 13.121 0.4000 1.0000 +ATOM 521 HA MET 33 24.236 22.511 10.632 0.0000 0.0000 +ATOM 522 HB3 MET 33 22.608 24.148 10.670 0.0000 0.0000 +ATOM 523 N VAL 34 26.378 23.042 9.557 -0.4000 1.5000 +ATOM 524 CA VAL 34 27.724 23.196 9.040 -0.0000 2.0000 +ATOM 525 C VAL 34 27.815 24.624 8.475 0.5500 1.7000 +ATOM 526 O VAL 34 26.916 25.134 7.800 -0.5500 1.4000 +ATOM 527 CB VAL 34 28.004 22.141 7.938 0.0000 2.0000 +ATOM 528 CG1 VAL 34 29.398 22.389 7.353 0.0000 2.0000 +ATOM 529 CG2 VAL 34 27.880 20.727 8.536 0.0000 2.0000 +ATOM 530 HA VAL 34 28.365 23.130 9.791 0.0000 0.0000 +ATOM 531 HG11 VAL 34 29.883 21.519 7.277 0.0000 0.0000 +ATOM 532 HG21 VAL 34 26.969 20.374 8.340 0.0000 0.0000 +ATOM 533 HB VAL 34 27.355 22.290 7.210 0.0000 0.0000 +ATOM 534 HG12 VAL 34 29.307 22.803 6.449 0.0000 0.0000 +ATOM 535 HG13 VAL 34 29.903 23.004 7.955 0.0000 0.0000 +ATOM 536 H VAL 34 25.640 22.477 9.089 0.4000 1.0000 +ATOM 537 HG23 VAL 34 28.572 20.141 8.121 0.0000 0.0000 +ATOM 538 HG22 VAL 34 28.022 20.782 9.521 0.0000 0.0000 +ATOM 539 N LEU 35 28.863 25.335 8.837 -0.4000 1.5000 +ATOM 540 CA LEU 35 29.038 26.730 8.429 -0.0000 2.0000 +ATOM 541 C LEU 35 30.176 26.839 7.444 0.5500 1.7000 +ATOM 542 O LEU 35 30.336 27.902 6.849 -0.5500 1.4000 +ATOM 543 CB LEU 35 29.327 27.626 9.661 0.0000 2.0000 +ATOM 544 CG LEU 35 28.192 27.674 10.722 0.0000 2.0000 +ATOM 545 CD1 LEU 35 28.625 28.545 11.874 0.0000 2.0000 +ATOM 546 CD2 LEU 35 26.896 28.176 10.110 0.0000 2.0000 +ATOM 547 HD22 LEU 35 26.615 27.565 9.369 0.0000 0.0000 +ATOM 548 HD23 LEU 35 26.180 28.199 10.809 0.0000 0.0000 +ATOM 549 HD21 LEU 35 27.031 29.098 9.745 0.0000 0.0000 +ATOM 550 H LEU 35 29.554 24.830 9.433 0.4000 1.0000 +ATOM 551 HD13 LEU 35 28.814 29.474 11.548 0.0000 0.0000 +ATOM 552 HD12 LEU 35 27.899 28.583 12.565 0.0000 0.0000 +ATOM 553 HD11 LEU 35 29.456 28.170 12.293 0.0000 0.0000 +ATOM 554 HA LEU 35 28.192 27.037 7.984 0.0000 0.0000 +ATOM 555 HG LEU 35 28.022 26.747 11.036 0.0000 0.0000 +ATOM 556 HB3 LEU 35 29.465 28.548 9.339 0.0000 0.0000 +ATOM 557 HB2 LEU 35 30.131 27.272 10.111 0.0000 0.0000 +ATOM 558 N GLY 36 31.025 25.816 7.238 -0.4000 1.5000 +ATOM 559 CA GLY 36 32.086 25.960 6.246 -0.0000 2.0000 +ATOM 560 C GLY 36 33.000 24.764 6.335 0.5500 1.7000 +ATOM 561 O GLY 36 33.051 24.081 7.363 -0.5500 1.4000 +ATOM 562 H GLY 36 30.864 24.986 7.806 0.4000 1.0000 +ATOM 563 HA2 GLY 36 31.683 26.012 5.333 0.0000 0.0000 +ATOM 564 HA3 GLY 36 32.602 26.796 6.430 0.0000 0.0000 +ATOM 565 N ARG 37 33.761 24.532 5.289 -0.4000 1.5000 +ATOM 566 CA ARG 37 34.719 23.436 5.250 -0.0000 2.0000 +ATOM 567 C ARG 37 35.876 23.981 4.419 0.5500 1.7000 +ATOM 568 O ARG 37 35.611 24.823 3.541 -0.5500 1.4000 +ATOM 569 CB ARG 37 34.130 22.227 4.555 0.0000 2.0000 +ATOM 570 CG ARG 37 33.056 21.471 5.311 0.0000 2.0000 +ATOM 571 CD ARG 37 32.729 20.190 4.542 0.3500 2.0000 +ATOM 572 NE ARG 37 31.797 19.361 5.278 -0.3500 1.5000 +ATOM 573 CZ ARG 37 30.462 19.458 5.075 0.3500 1.7000 +ATOM 574 NH1 ARG 37 29.914 20.336 4.196 -0.7000 1.5000 +ATOM 575 NH2 ARG 37 29.650 18.645 5.745 -0.7000 1.5000 +ATOM 576 HG3 ARG 37 32.236 22.013 5.362 0.0000 0.0000 +ATOM 577 HA ARG 37 35.040 23.251 6.159 0.0000 0.0000 +ATOM 578 HE ARG 37 32.126 18.713 5.939 0.4500 1.0000 +ATOM 579 HG2 ARG 37 33.388 21.216 6.202 0.0000 0.0000 +ATOM 580 HH22 ARG 37 28.664 18.722 5.616 0.4000 1.0000 +ATOM 581 HH21 ARG 37 30.026 17.964 6.370 0.4000 1.0000 +ATOM 582 H ARG 37 33.624 25.194 4.491 0.4000 1.0000 +ATOM 583 HD3 ARG 37 33.581 19.697 4.401 0.0000 0.0000 +ATOM 584 HD2 ARG 37 32.331 20.454 3.671 0.0000 0.0000 +ATOM 585 HH12 ARG 37 28.947 20.381 4.099 0.4000 1.0000 +ATOM 586 HH11 ARG 37 30.524 20.921 3.663 0.4000 1.0000 +ATOM 587 HB3 ARG 37 34.877 21.580 4.356 0.0000 0.0000 +ATOM 588 HB2 ARG 37 33.734 22.527 3.678 0.0000 0.0000 +ATOM 589 N GLY 38 37.147 23.617 4.649 -0.4000 1.5000 +ATOM 590 CA GLY 38 38.217 24.097 3.780 -0.0000 2.0000 +ATOM 591 C GLY 38 39.583 23.617 4.283 0.5500 1.7000 +ATOM 592 O GLY 38 39.663 22.654 5.061 -0.5500 1.4000 +ATOM 593 H GLY 38 37.287 22.999 5.456 0.4000 1.0000 +ATOM 594 HA2 GLY 38 38.072 23.756 2.846 0.0000 0.0000 +ATOM 595 HA3 GLY 38 38.209 25.102 3.758 0.0000 0.0000 +ATOM 596 N CYS 39 40.667 24.314 3.943 -0.4000 1.5000 +ATOM 597 CA CYS 39 42.029 23.921 4.332 -0.0000 2.0000 +ATOM 598 C CYS 39 42.394 24.698 5.591 0.5500 1.7000 +ATOM 599 O CYS 39 42.029 25.878 5.698 -0.5500 1.4000 +ATOM 600 CB CYS 39 43.097 24.310 3.298 0.2900 2.0000 +ATOM 601 SG CYS 39 42.663 23.603 1.692 -0.2900 1.8500 +ATOM 602 HB3 CYS 39 43.952 23.933 3.581 0.0000 0.0000 +ATOM 603 H CYS 39 40.468 25.168 3.373 0.4000 1.0000 +ATOM 604 HA CYS 39 42.022 22.953 4.552 0.0000 0.0000 +ATOM 605 HB2 CYS 39 43.108 25.282 3.216 0.0000 0.0000 +ATOM 606 N GLY 40 43.126 24.061 6.472 -0.4000 1.5000 +ATOM 607 CA GLY 40 43.629 24.719 7.675 -0.0000 2.0000 +ATOM 608 C GLY 40 42.855 24.234 8.889 0.5500 1.7000 +ATOM 609 O GLY 40 42.227 23.175 8.884 -0.5500 1.4000 +ATOM 610 H GLY 40 43.319 23.062 6.251 0.4000 1.0000 +ATOM 611 HA2 GLY 40 44.601 24.506 7.791 0.0000 0.0000 +ATOM 612 HA3 GLY 40 43.521 25.711 7.583 0.0000 0.0000 +ATOM 613 N CYS 41 42.928 24.997 9.970 -0.4000 1.5000 +ATOM 614 CA CYS 41 42.296 24.610 11.219 -0.0000 2.0000 +ATOM 615 C CYS 41 42.065 25.880 12.056 0.5500 1.7000 +ATOM 616 O CYS 41 42.802 26.154 13.033 -0.5500 1.4000 +ATOM 617 CB CYS 41 43.224 23.595 11.953 0.2900 2.0000 +ATOM 618 SG CYS 41 42.446 22.935 13.453 -0.2900 1.8500 +ATOM 619 HB3 CYS 41 44.046 24.072 12.208 0.0000 0.0000 +ATOM 620 H CYS 41 43.466 25.878 9.847 0.4000 1.0000 +ATOM 621 HA CYS 41 41.406 24.212 11.020 0.0000 0.0000 +ATOM 622 HB2 CYS 41 43.401 22.851 11.336 0.0000 0.0000 +ATOM 623 N PRO 42 41.075 26.712 11.694 -0.5600 1.5000 +ATOM 624 CA PRO 42 40.756 27.950 12.392 0.2800 2.0000 +ATOM 625 C PRO 42 40.315 27.675 13.838 0.5500 1.7000 +ATOM 626 O PRO 42 39.912 26.549 14.161 -0.5500 1.4000 +ATOM 627 CB PRO 42 39.690 28.590 11.534 0.0000 2.0000 +ATOM 628 CG PRO 42 38.938 27.407 10.999 0.0000 2.0000 +ATOM 629 CD PRO 42 40.082 26.455 10.651 0.2800 2.0000 +ATOM 630 HG2 PRO 42 38.358 27.013 11.692 0.0000 0.0000 +ATOM 631 HA PRO 42 41.537 28.586 12.380 0.0000 0.0000 +ATOM 632 HD3 PRO 42 40.450 26.661 9.743 0.0000 0.0000 +ATOM 633 HD2 PRO 42 39.771 25.505 10.675 0.0000 0.0000 +ATOM 634 HG3 PRO 42 38.430 27.648 10.190 0.0000 0.0000 +ATOM 635 HB3 PRO 42 40.091 29.118 10.789 0.0000 0.0000 +ATOM 636 HB2 PRO 42 39.088 29.173 12.076 0.0000 0.0000 +ATOM 637 N PRO 43 40.420 28.641 14.755 -0.5600 1.5000 +ATOM 638 CA PRO 43 39.969 28.506 16.132 0.2800 2.0000 +ATOM 639 C PRO 43 38.453 28.509 16.319 0.5500 1.7000 +ATOM 640 O PRO 43 37.737 29.298 15.679 -0.5500 1.4000 +ATOM 641 CB PRO 43 40.669 29.672 16.841 0.0000 2.0000 +ATOM 642 CG PRO 43 40.679 30.743 15.755 0.0000 2.0000 +ATOM 643 CD PRO 43 41.133 29.904 14.552 0.2800 2.0000 +ATOM 644 HG2 PRO 43 39.778 31.095 15.613 0.0000 0.0000 +ATOM 645 HA PRO 43 40.375 27.667 16.561 0.0000 0.0000 +ATOM 646 HD3 PRO 43 42.120 29.770 14.571 0.0000 0.0000 +ATOM 647 HD2 PRO 43 40.862 30.339 13.700 0.0000 0.0000 +ATOM 648 HG3 PRO 43 41.336 31.435 15.964 0.0000 0.0000 +ATOM 649 HB3 PRO 43 41.593 29.433 17.097 0.0000 0.0000 +ATOM 650 HB2 PRO 43 40.148 29.980 17.623 0.0000 0.0000 +ATOM 651 N GLY 44 37.983 27.587 17.183 -0.4000 1.5000 +ATOM 652 CA GLY 44 36.599 27.594 17.605 -0.0000 2.0000 +ATOM 653 C GLY 44 36.470 28.504 18.823 0.5500 1.7000 +ATOM 654 O GLY 44 37.461 29.064 19.327 -0.5500 1.4000 +ATOM 655 H GLY 44 38.689 26.901 17.500 0.4000 1.0000 +ATOM 656 HA2 GLY 44 36.019 27.943 16.872 0.0000 0.0000 +ATOM 657 HA3 GLY 44 36.312 26.671 17.853 0.0000 0.0000 +ATOM 658 N ASP 45 35.249 28.620 19.318 -0.4000 1.5000 +ATOM 659 CA ASP 45 34.932 29.339 20.547 -0.0000 2.0000 +ATOM 660 C ASP 45 33.614 28.764 21.075 0.5500 1.7000 +ATOM 661 O ASP 45 33.224 27.668 20.706 -0.5500 1.4000 +ATOM 662 CB ASP 45 34.811 30.862 20.269 0.0000 2.0000 +ATOM 663 CG ASP 45 33.995 31.265 19.057 0.1000 1.7000 +ATOM 664 OD1 ASP 45 32.942 30.690 18.821 -0.5500 1.4000 +ATOM 665 OD2 ASP 45 34.397 32.195 18.356 -0.5500 1.4000 +ATOM 666 H ASP 45 34.507 28.140 18.740 0.4000 1.0000 +ATOM 667 HA ASP 45 35.632 29.116 21.213 0.0000 0.0000 +ATOM 668 HB3 ASP 45 35.747 31.219 20.165 0.0000 0.0000 +ATOM 669 HB2 ASP 45 34.403 31.281 21.090 0.0000 0.0000 +ATOM 670 N ASP 46 32.850 29.487 21.881 -0.4000 1.5000 +ATOM 671 CA ASP 46 31.578 28.996 22.402 -0.0000 2.0000 +ATOM 672 C ASP 46 30.498 28.787 21.351 0.5500 1.7000 +ATOM 673 O ASP 46 29.583 27.975 21.521 -0.5500 1.4000 +ATOM 674 CB ASP 46 31.078 29.989 23.459 0.0000 2.0000 +ATOM 675 CG ASP 46 30.819 31.378 22.886 0.1000 1.7000 +ATOM 676 OD1 ASP 46 31.776 32.103 22.615 -0.5500 1.4000 +ATOM 677 OD2 ASP 46 29.654 31.719 22.677 -0.5500 1.4000 +ATOM 678 H ASP 46 33.232 30.431 22.111 0.4000 1.0000 +ATOM 679 HA ASP 46 31.762 28.084 22.825 0.0000 0.0000 +ATOM 680 HB3 ASP 46 31.770 30.061 24.165 0.0000 0.0000 +ATOM 681 HB2 ASP 46 30.229 29.637 23.834 0.0000 0.0000 +ATOM 682 N TYR 47 30.541 29.618 20.314 -0.4000 1.5000 +ATOM 683 CA TYR 47 29.577 29.510 19.230 -0.0000 2.0000 +ATOM 684 C TYR 47 30.009 28.482 18.179 0.5500 1.7000 +ATOM 685 O TYR 47 29.182 27.688 17.704 -0.5500 1.4000 +ATOM 686 CB TYR 47 29.391 30.866 18.520 0.1250 2.0000 +ATOM 687 CG TYR 47 28.231 30.807 17.510 -0.1250 1.7000 +ATOM 688 CD1 TYR 47 26.915 30.895 17.980 -0.1250 1.7000 +ATOM 689 CD2 TYR 47 28.466 30.672 16.149 -0.1250 1.7000 +ATOM 690 CE1 TYR 47 25.853 30.856 17.098 -0.1250 1.7000 +ATOM 691 CE2 TYR 47 27.388 30.632 15.255 -0.1250 1.7000 +ATOM 692 CZ TYR 47 26.094 30.730 15.740 0.0550 1.7000 +ATOM 693 OH TYR 47 24.996 30.688 14.877 -0.4900 1.4000 +ATOM 694 HA TYR 47 28.694 29.205 19.616 0.0000 0.0000 +ATOM 695 HE1 TYR 47 24.911 30.920 17.436 0.1250 1.0000 +ATOM 696 HE2 TYR 47 27.556 30.533 14.277 0.1250 1.0000 +ATOM 697 H TYR 47 31.296 30.323 20.347 0.4000 1.0000 +ATOM 698 HD2 TYR 47 29.390 30.605 15.803 0.1250 1.0000 +ATOM 699 HD1 TYR 47 26.749 30.986 18.959 0.1250 1.0000 +ATOM 700 HB3 TYR 47 30.212 31.076 18.025 0.0000 0.0000 +ATOM 701 HB2 TYR 47 29.172 31.545 19.193 0.0000 0.0000 +ATOM 702 HH TYR 47 25.266 30.219 14.042 0.4350 1.0000 +ATOM 703 N LEU 48 31.298 28.475 17.829 -0.4000 1.5000 +ATOM 704 CA LEU 48 31.751 27.729 16.678 -0.0000 2.0000 +ATOM 705 C LEU 48 32.625 26.531 17.045 0.5500 1.7000 +ATOM 706 O LEU 48 33.633 26.697 17.768 -0.5500 1.4000 +ATOM 707 CB LEU 48 32.505 28.716 15.833 0.0000 2.0000 +ATOM 708 CG LEU 48 33.033 28.211 14.539 0.0000 2.0000 +ATOM 709 CD1 LEU 48 31.889 28.190 13.514 0.0000 2.0000 +ATOM 710 CD2 LEU 48 34.169 29.140 14.071 0.0000 2.0000 +ATOM 711 HD22 LEU 48 34.892 29.142 14.757 0.0000 0.0000 +ATOM 712 HD23 LEU 48 34.527 28.805 13.203 0.0000 0.0000 +ATOM 713 HD21 LEU 48 33.809 30.063 13.956 0.0000 0.0000 +ATOM 714 H LEU 48 31.916 29.036 18.441 0.4000 1.0000 +ATOM 715 HD13 LEU 48 31.534 29.116 13.400 0.0000 0.0000 +ATOM 716 HD12 LEU 48 32.237 27.852 12.642 0.0000 0.0000 +ATOM 717 HD11 LEU 48 31.164 27.589 13.845 0.0000 0.0000 +ATOM 718 HA LEU 48 30.940 27.381 16.173 0.0000 0.0000 +ATOM 719 HG LEU 48 33.380 27.284 14.643 0.0000 0.0000 +ATOM 720 HB3 LEU 48 33.280 29.053 16.374 0.0000 0.0000 +ATOM 721 HB2 LEU 48 31.888 29.485 15.636 0.0000 0.0000 +ATOM 722 N GLU 49 32.265 25.354 16.524 -0.4000 1.5000 +ATOM 723 CA GLU 49 33.000 24.127 16.737 -0.0000 2.0000 +ATOM 724 C GLU 49 33.850 23.896 15.486 0.5500 1.7000 +ATOM 725 O GLU 49 33.323 24.036 14.374 -0.5500 1.4000 +ATOM 726 CB GLU 49 31.993 22.994 16.967 0.0000 2.0000 +ATOM 727 CG GLU 49 32.636 21.621 17.036 -0.0000 2.0000 +ATOM 728 CD GLU 49 31.834 20.579 17.833 0.1000 1.7000 +ATOM 729 OE1 GLU 49 30.606 20.551 17.757 -0.5500 1.4000 +ATOM 730 OE2 GLU 49 32.452 19.808 18.566 -0.5500 1.4000 +ATOM 731 HG2 GLU 49 32.729 21.270 16.117 0.0000 0.0000 +ATOM 732 HA GLU 49 33.593 24.211 17.527 0.0000 0.0000 +ATOM 733 HG3 GLU 49 33.516 21.706 17.479 0.0000 0.0000 +ATOM 734 H GLU 49 31.390 25.405 15.940 0.4000 1.0000 +ATOM 735 HB3 GLU 49 31.366 22.995 16.212 0.0000 0.0000 +ATOM 736 HB2 GLU 49 31.549 23.161 17.826 0.0000 0.0000 +ATOM 737 N VAL 50 35.135 23.559 15.589 -0.4000 1.5000 +ATOM 738 CA VAL 50 35.978 23.385 14.383 -0.0000 2.0000 +ATOM 739 C VAL 50 36.690 22.033 14.564 0.5500 1.7000 +ATOM 740 O VAL 50 37.413 21.829 15.552 -0.5500 1.4000 +ATOM 741 CB VAL 50 37.028 24.508 14.259 0.0000 2.0000 +ATOM 742 CG1 VAL 50 37.821 24.287 12.950 0.0000 2.0000 +ATOM 743 CG2 VAL 50 36.372 25.878 14.196 0.0000 2.0000 +ATOM 744 HA VAL 50 35.384 23.316 13.603 0.0000 0.0000 +ATOM 745 HG11 VAL 50 38.757 24.599 13.084 0.0000 0.0000 +ATOM 746 HG21 VAL 50 36.656 26.342 13.357 0.0000 0.0000 +ATOM 747 HB VAL 50 37.672 24.408 14.996 0.0000 0.0000 +ATOM 748 HG12 VAL 50 37.812 23.316 12.728 0.0000 0.0000 +ATOM 749 HG13 VAL 50 37.389 24.808 12.220 0.0000 0.0000 +ATOM 750 H VAL 50 35.487 23.432 16.548 0.4000 1.0000 +ATOM 751 HG23 VAL 50 35.378 25.769 14.200 0.0000 0.0000 +ATOM 752 HG22 VAL 50 36.654 26.417 14.990 0.0000 0.0000 +ATOM 753 N LYS 51 36.383 21.078 13.710 -0.4000 1.5000 +ATOM 754 CA LYS 51 37.058 19.795 13.748 -0.0000 2.0000 +ATOM 755 C LYS 51 38.117 19.852 12.655 0.5500 1.7000 +ATOM 756 O LYS 51 37.862 20.414 11.559 -0.5500 1.4000 +ATOM 757 CB LYS 51 36.070 18.671 13.450 0.0000 2.0000 +ATOM 758 CG LYS 51 34.832 18.601 14.298 0.0000 2.0000 +ATOM 759 CD LYS 51 35.365 18.280 15.666 0.0000 2.0000 +ATOM 760 CE LYS 51 34.293 18.078 16.734 0.3300 2.0000 +ATOM 761 NZ LYS 51 33.482 16.901 16.462 -0.3200 2.0000 +ATOM 762 HA LYS 51 37.507 19.684 14.622 0.0000 0.0000 +ATOM 763 HE2 LYS 51 34.751 17.985 17.625 0.0000 0.0000 +ATOM 764 HE3 LYS 51 33.713 18.900 16.757 0.0000 0.0000 +ATOM 765 HG2 LYS 51 34.396 19.470 14.315 0.0000 0.0000 +ATOM 766 HG3 LYS 51 34.264 17.875 13.992 0.0000 0.0000 +ATOM 767 HZ1 LYS 51 32.755 16.812 17.151 0.3300 0.0000 +ATOM 768 HZ3 LYS 51 33.057 16.973 15.554 0.3300 0.0000 +ATOM 769 HZ2 LYS 51 34.051 16.073 16.486 0.3300 0.0000 +ATOM 770 HD3 LYS 51 35.968 19.029 15.971 0.0000 0.0000 +ATOM 771 HD2 LYS 51 35.916 17.436 15.617 0.0000 0.0000 +ATOM 772 H LYS 51 35.639 21.316 13.028 0.4000 1.0000 +ATOM 773 HB3 LYS 51 36.569 17.792 13.538 0.0000 0.0000 +ATOM 774 HB2 LYS 51 35.788 18.758 12.479 0.0000 0.0000 +ATOM 775 N CYS 52 39.293 19.275 12.893 -0.4000 1.5000 +ATOM 776 CA CYS 52 40.389 19.322 11.932 -0.0000 2.0000 +ATOM 777 C CYS 52 40.941 17.911 11.804 0.5500 1.7000 +ATOM 778 O CYS 52 41.056 17.195 12.804 -0.5500 1.4000 +ATOM 779 CB CYS 52 41.484 20.268 12.394 0.2900 2.0000 +ATOM 780 SG CYS 52 40.865 21.958 12.689 -0.2900 1.8500 +ATOM 781 HB3 CYS 52 42.179 20.319 11.691 0.0000 0.0000 +ATOM 782 H CYS 52 39.360 18.793 13.814 0.4000 1.0000 +ATOM 783 HA CYS 52 40.023 19.596 11.050 0.0000 0.0000 +ATOM 784 HB2 CYS 52 41.860 19.931 13.244 0.0000 0.0000 +ATOM 785 N CYS 53 41.184 17.437 10.576 -0.4000 1.5000 +ATOM 786 CA CYS 53 41.650 16.075 10.340 -0.0000 2.0000 +ATOM 787 C CYS 53 42.667 16.074 9.223 0.5500 1.7000 +ATOM 788 O CYS 53 42.683 16.992 8.370 -0.5500 1.4000 +ATOM 789 CB CYS 53 40.450 15.201 9.977 0.2900 2.0000 +ATOM 790 SG CYS 53 39.525 15.851 8.552 -0.2900 1.8500 +ATOM 791 HB3 CYS 53 39.837 15.172 10.753 0.0000 0.0000 +ATOM 792 H CYS 53 41.011 18.124 9.811 0.4000 1.0000 +ATOM 793 HA CYS 53 42.096 15.747 11.176 0.0000 0.0000 +ATOM 794 HB2 CYS 53 40.778 14.298 9.744 0.0000 0.0000 +ATOM 795 N THR 54 43.607 15.134 9.243 -0.4000 1.5000 +ATOM 796 CA THR 54 44.645 15.150 8.231 -0.0000 2.0000 +ATOM 797 C THR 54 44.524 13.921 7.352 0.5500 1.7000 +ATOM 798 O THR 54 45.215 13.876 6.318 -0.5500 1.4000 +ATOM 799 CB THR 54 46.053 15.237 8.914 0.0000 2.0000 +ATOM 800 OG1 THR 54 46.171 14.169 9.833 -0.4900 1.4000 +ATOM 801 CG2 THR 54 46.243 16.511 9.680 0.0000 2.0000 +ATOM 802 HA THR 54 44.523 15.965 7.657 0.0000 0.0000 +ATOM 803 HG22 THR 54 46.634 16.320 10.588 0.0000 0.0000 +ATOM 804 HG21 THR 54 46.867 17.128 9.187 0.0000 0.0000 +ATOM 805 H THR 54 43.532 14.443 9.993 0.4000 1.0000 +ATOM 806 HB THR 54 46.757 15.134 8.190 0.0000 0.0000 +ATOM 807 HG23 THR 54 45.361 16.981 9.804 0.0000 0.0000 +ATOM 808 HG1 THR 54 45.438 13.490 9.691 0.4900 1.0000 +ATOM 809 N SER 55 43.749 12.908 7.732 -0.4000 1.5000 +ATOM 810 CA SER 55 43.468 11.805 6.843 -0.0000 2.0000 +ATOM 811 C SER 55 42.202 11.092 7.333 0.5500 1.7000 +ATOM 812 O SER 55 41.769 11.388 8.462 -0.5500 1.4000 +ATOM 813 CB SER 55 44.637 10.806 6.808 0.0000 2.0000 +ATOM 814 OG SER 55 44.902 10.414 8.127 -0.4900 1.4000 +ATOM 815 H SER 55 43.378 12.985 8.698 0.4000 1.0000 +ATOM 816 HA SER 55 43.276 12.167 5.933 0.0000 0.0000 +ATOM 817 HB3 SER 55 45.423 11.260 6.430 0.0000 0.0000 +ATOM 818 HB2 SER 55 44.365 10.026 6.275 0.0000 0.0000 +ATOM 819 HG SER 55 45.305 11.178 8.635 0.4900 1.0000 +ATOM 820 N PRO 56 41.578 10.182 6.551 -0.5600 1.5000 +ATOM 821 CA PRO 56 41.846 10.026 5.125 0.2800 2.0000 +ATOM 822 C PRO 56 41.371 11.221 4.298 0.5500 1.7000 +ATOM 823 O PRO 56 41.011 12.275 4.859 -0.5500 1.4000 +ATOM 824 CB PRO 56 41.179 8.715 4.772 0.0000 2.0000 +ATOM 825 CG PRO 56 40.010 8.695 5.714 0.0000 2.0000 +ATOM 826 CD PRO 56 40.484 9.321 7.011 0.2800 2.0000 +ATOM 827 HG2 PRO 56 39.239 9.218 5.329 0.0000 0.0000 +ATOM 828 HA PRO 56 42.833 9.853 4.962 0.0000 0.0000 +ATOM 829 HD3 PRO 56 40.817 8.628 7.644 0.0000 0.0000 +ATOM 830 HD2 PRO 56 39.762 9.857 7.435 0.0000 0.0000 +ATOM 831 HG3 PRO 56 39.700 7.748 5.870 0.0000 0.0000 +ATOM 832 HB3 PRO 56 41.781 7.943 4.943 0.0000 0.0000 +ATOM 833 HB2 PRO 56 40.868 8.709 3.827 0.0000 0.0000 +ATOM 834 N ASP 57 41.428 11.128 2.966 -0.4000 1.5000 +ATOM 835 CA ASP 57 40.933 12.225 2.141 -0.0000 2.0000 +ATOM 836 C ASP 57 39.460 12.394 2.417 0.5500 1.7000 +ATOM 837 O ASP 57 38.785 11.437 2.769 -0.5500 1.4000 +ATOM 838 CB ASP 57 41.098 11.962 0.647 0.0000 2.0000 +ATOM 839 CG ASP 57 42.521 12.123 0.110 0.1000 1.7000 +ATOM 840 OD1 ASP 57 43.324 12.912 0.619 -0.5500 1.4000 +ATOM 841 OD2 ASP 57 42.828 11.435 -0.859 -0.5500 1.4000 +ATOM 842 H ASP 57 41.830 10.261 2.599 0.4000 1.0000 +ATOM 843 HA ASP 57 41.394 13.055 2.449 0.0000 0.0000 +ATOM 844 HB3 ASP 57 40.502 12.598 0.151 0.0000 0.0000 +ATOM 845 HB2 ASP 57 40.798 11.023 0.461 0.0000 0.0000 +ATOM 846 N LYS 58 39.000 13.634 2.338 -0.4000 1.5000 +ATOM 847 CA LYS 58 37.597 14.038 2.560 -0.0000 2.0000 +ATOM 848 C LYS 58 37.116 13.759 3.980 0.5500 1.7000 +ATOM 849 O LYS 58 35.908 13.663 4.274 -0.5500 1.4000 +ATOM 850 CB LYS 58 36.666 13.329 1.534 0.0000 2.0000 +ATOM 851 CG LYS 58 36.969 13.815 0.117 0.0000 2.0000 +ATOM 852 CD LYS 58 35.966 13.269 -0.854 0.0000 2.0000 +ATOM 853 CE LYS 58 36.600 12.181 -1.656 0.3300 2.0000 +ATOM 854 NZ LYS 58 35.556 11.598 -2.490 -0.3200 2.0000 +ATOM 855 HA LYS 58 37.520 15.032 2.378 0.0000 0.0000 +ATOM 856 HE2 LYS 58 37.313 12.565 -2.227 0.0000 0.0000 +ATOM 857 HE3 LYS 58 36.968 11.492 -1.046 0.0000 0.0000 +ATOM 858 HG2 LYS 58 36.934 14.813 0.109 0.0000 0.0000 +ATOM 859 HG3 LYS 58 37.884 13.507 -0.137 0.0000 0.0000 +ATOM 860 HZ1 LYS 58 34.650 11.831 -2.124 0.3300 0.0000 +ATOM 861 HZ3 LYS 58 35.625 11.949 -3.429 0.3300 0.0000 +ATOM 862 HZ2 LYS 58 35.648 10.598 -2.512 0.3300 0.0000 +ATOM 863 HD3 LYS 58 35.675 13.994 -1.464 0.0000 0.0000 +ATOM 864 HD2 LYS 58 35.197 12.896 -0.352 0.0000 0.0000 +ATOM 865 H LYS 58 39.746 14.348 2.093 0.4000 1.0000 +ATOM 866 HB3 LYS 58 35.741 13.560 1.758 0.0000 0.0000 +ATOM 867 HB2 LYS 58 36.841 12.367 1.583 0.0000 0.0000 +ATOM 868 N CYS 59 38.071 13.726 4.912 -0.4000 1.5000 +ATOM 869 CA CYS 59 37.763 13.428 6.309 -0.0000 2.0000 +ATOM 870 C CYS 59 36.916 14.504 6.990 0.5500 1.7000 +ATOM 871 O CYS 59 36.331 14.275 8.053 -0.5500 1.4000 +ATOM 872 CB CYS 59 39.067 13.234 7.103 0.2900 2.0000 +ATOM 873 SG CYS 59 40.203 14.652 7.069 -0.2900 1.8500 +ATOM 874 HB3 CYS 59 39.544 12.442 6.722 0.0000 0.0000 +ATOM 875 H CYS 59 39.026 13.926 4.565 0.4000 1.0000 +ATOM 876 HA CYS 59 37.241 12.557 6.338 0.0000 0.0000 +ATOM 877 HB2 CYS 59 38.823 13.051 8.054 0.0000 0.0000 +ATOM 878 N ASN 60 36.803 15.696 6.376 -0.4000 1.5000 +ATOM 879 CA ASN 60 35.997 16.771 6.954 -0.0000 2.0000 +ATOM 880 C ASN 60 34.525 16.770 6.502 0.5500 1.7000 +ATOM 881 O ASN 60 33.854 17.817 6.555 -0.5500 1.4000 +ATOM 882 CB ASN 60 36.644 18.128 6.629 0.0000 2.0000 +ATOM 883 CG ASN 60 36.682 18.481 5.138 0.5500 1.7000 +ATOM 884 HA ASN 60 35.990 16.632 7.961 0.0000 0.0000 +ATOM 885 H ASN 60 37.322 15.776 5.488 0.4000 1.0000 +ATOM 886 HB3 ASN 60 37.586 18.117 6.972 0.0000 0.0000 +ATOM 887 HB2 ASN 60 36.130 18.844 7.107 0.0000 0.0000 +ATOM 888 OD1 ASN 60 36.709 17.583 4.296 -0.5500 1.4000 +ATOM 889 ND2 ASN 60 36.748 19.777 4.782 -0.7800 1.5000 +ATOM 890 HD22 ASN 60 36.768 20.039 3.848 0.3900 1.0000 +ATOM 891 HD21 ASN 60 36.777 20.473 5.512 0.3900 1.0000 +ATOM 892 N TYR 61 34.020 15.622 6.059 -0.4000 1.5000 +ATOM 893 CA TYR 61 32.574 15.459 5.819 -0.0000 2.0000 +ATOM 894 C TYR 61 31.815 15.738 7.152 0.1000 1.7000 +ATOM 895 O TYR 61 30.835 16.463 7.151 -0.5500 1.4000 +ATOM 896 CB TYR 61 32.380 14.022 5.339 0.1250 2.0000 +ATOM 897 CG TYR 61 30.931 13.586 5.176 -0.1250 1.7000 +ATOM 898 CD1 TYR 61 30.227 13.024 6.250 -0.1250 1.7000 +ATOM 899 CD2 TYR 61 30.339 13.745 3.938 -0.1250 1.7000 +ATOM 900 CE1 TYR 61 28.913 12.617 6.036 -0.1250 1.7000 +ATOM 901 CE2 TYR 61 29.031 13.360 3.723 -0.1250 1.7000 +ATOM 902 CZ TYR 61 28.348 12.804 4.768 0.0550 1.7000 +ATOM 903 OH TYR 61 27.044 12.421 4.520 -0.4900 1.4000 +ATOM 904 OXT TYR 61 32.205 15.225 8.193 -0.5500 1.4000 +ATOM 905 HA TYR 61 32.283 16.141 5.160 0.0000 0.0000 +ATOM 906 HE1 TYR 61 28.382 12.203 6.765 0.1250 1.0000 +ATOM 907 HE2 TYR 61 28.604 13.485 2.836 0.1250 1.0000 +ATOM 908 H TYR 61 34.709 14.868 5.900 0.4000 1.0000 +ATOM 909 HD2 TYR 61 30.864 14.145 3.187 0.1250 1.0000 +ATOM 910 HD1 TYR 61 30.649 12.920 7.128 0.1250 1.0000 +ATOM 911 HB3 TYR 61 32.812 13.407 6.001 0.0000 0.0000 +ATOM 912 HB2 TYR 61 32.833 13.922 4.451 0.0000 0.0000 +ATOM 913 HH TYR 61 26.716 12.894 3.706 0.4350 1.0000 +TER +END \ No newline at end of file diff --git a/lambda_services/tests/input_data/apbs-direct-job.json b/lambda_services/tests/input_data/apbs-direct-job.json new file mode 100644 index 0000000..492b0f9 --- /dev/null +++ b/lambda_services/tests/input_data/apbs-direct-job.json @@ -0,0 +1,9 @@ +{ + "form": { + "support_files": [ + "1fas.pqr" + ], + "filename": "1fas.in" + }, + "metadata": {} +} diff --git a/lambda_services/tests/input_data/apbs-direct-s3_trigger.json b/lambda_services/tests/input_data/apbs-direct-s3_trigger.json new file mode 100644 index 0000000..a609d16 --- /dev/null +++ b/lambda_services/tests/input_data/apbs-direct-s3_trigger.json @@ -0,0 +1,14 @@ +{ + "Records": [ + { + "s3": { + "bucket": { + "name": "pytest_input_bucket" + }, + "object": { + "key": "2021-05-16/sampleId/apbs-direct-job.json" + } + } + } + ] +} diff --git a/lambda_services/tests/input_data/invalid-job.json b/lambda_services/tests/input_data/invalid-job.json new file mode 100644 index 0000000..53ea100 --- /dev/null +++ b/lambda_services/tests/input_data/invalid-job.json @@ -0,0 +1,7 @@ +{ + "form": { + "field1": "we should never read this" + }, + "metadata": { + } +} diff --git a/lambda_services/tests/input_data/invalid_job-s3_trigger.json b/lambda_services/tests/input_data/invalid_job-s3_trigger.json new file mode 100644 index 0000000..7839362 --- /dev/null +++ b/lambda_services/tests/input_data/invalid_job-s3_trigger.json @@ -0,0 +1,14 @@ +{ + "Records": [ + { + "s3": { + "bucket": { + "name": "pytest_input_bucket" + }, + "object": { + "key": "2021-05-16/sampleId/invalidJobType-sample-job.json" + } + } + } + ] +} diff --git a/lambda_services/tests/input_data/sampleId.in b/lambda_services/tests/input_data/sampleId.in new file mode 100644 index 0000000..d9038d4 --- /dev/null +++ b/lambda_services/tests/input_data/sampleId.in @@ -0,0 +1,27 @@ +read + mol pqr 1fas.pqr +end +elec + mg-auto + dime 129 97 97 + cglen 63.1108 45.7300 61.4601 + fglen 57.1240 45.7300 56.1530 + cgcent mol 1 + fgcent mol 1 + mol 1 + lpbe + bcfl sdh + pdie 2.0000 + sdie 78.5400 + srfm smol + chgm spl2 + sdens 10.00 + srad 1.40 + swin 0.30 + temp 298.15 + calcenergy total + calcforce no + write pot dx sampleId.pqr +end +print elecEnergy 1 end +quit diff --git a/lambda_services/tests/input_data/sample_web-pdb2pqr-job.json b/lambda_services/tests/input_data/sample_web-pdb2pqr-job.json new file mode 100644 index 0000000..af7b2fa --- /dev/null +++ b/lambda_services/tests/input_data/sample_web-pdb2pqr-job.json @@ -0,0 +1,29 @@ +{ + "form": { + "PDBFILE": "", + "USERFFFILE": "", + "NAMESFILE": "", + "LIGANDFILE": "", + "PDBID": "1fas", + "PDBSOURCE": "ID", + "PH": 7, + "PKACALCMETHOD": "propka", + "FF": "parse", + "FFOUT": "internal", + "OPTIONS": [ + "atomsnotclose", + "optimizeHnetwork", + "makeapbsin", + "removewater" + ], + "DEBUMP": "atomsnotclose", + "OPT": "optimizeHnetwork", + "INPUT": "makeapbsin", + "DROPWATER": "removewater" + }, + "metadata": { + "cli": { + "command": "python pdb2pqr.py --ph-calc-method=propka --with-ph=7 --ff=parse --apbs-input --drop-water 1fas.pdb 1fas.pqr" + } + } +} diff --git a/lambda_services/tests/input_data/sample_web-pdb2pqr-s3_trigger.json b/lambda_services/tests/input_data/sample_web-pdb2pqr-s3_trigger.json new file mode 100644 index 0000000..271582f --- /dev/null +++ b/lambda_services/tests/input_data/sample_web-pdb2pqr-s3_trigger.json @@ -0,0 +1,14 @@ +{ + "Records": [ + { + "s3": { + "bucket": { + "name": "pytest_input_bucket" + }, + "object": { + "key": "2021-05-16/sampleId/pdb2pqr-sample-job.json" + } + } + } + ] +} diff --git a/lambda_services/tests/input_data/template-input.json b/lambda_services/tests/input_data/template-input.json new file mode 100644 index 0000000..1d83ad0 --- /dev/null +++ b/lambda_services/tests/input_data/template-input.json @@ -0,0 +1,8 @@ +[ + { + "name": "", + "type": "", + "trigger": {}, + "job": {} + } + ] diff --git a/lambda_services/tests/input_data/test-job_service-input.json b/lambda_services/tests/input_data/test-job_service-input.json new file mode 100644 index 0000000..9734029 --- /dev/null +++ b/lambda_services/tests/input_data/test-job_service-input.json @@ -0,0 +1,168 @@ +[ + { + "name": "apbs-direct", + "type": "apbs", + "upload": { + "input": [ + "1fas.pqr", + "1fas.in" + ], + "output": [] + }, + "trigger": { + "Records": [ + { + "s3": { + "bucket": { + "name": "pytest_input_bucket" + }, + "object": { + "key": "2021-05-16/sampleId/apbs-direct-job.json" + } + } + } + ] + }, + "job": { + "form": { + "support_files": [ + "1fas.pqr" + ], + "filename": "1fas.in" + }, + "metadata": {} + } + }, + { + "name": "apbs-post_pdb2pqr", + "type": "apbs", + "upload": { + "input": [], + "output": [ + "1fas.pqr", + "sampleId.in" + ] + }, + "trigger": { + "Records": [ + { + "s3": { + "bucket": { + "name": "pytest_input_bucket" + }, + "object": { + "key": "2021-05-16/sampleId/apbs-post_pdb2pqr-job.json" + } + } + } + ] + }, + "job": { + "form": { + "type": "mg-auto", + "calcenergy": "total", + "calcforce": "no", + "output_scalar": [ + "writepot" + ], + "writeformat": "dx", + "hiddencheck": "local", + "mol": "1", + "pdb2pqrid": "7sytp83mi5", + "cgcent": "mol", + "fgcent": "mol", + "solvetype": "lpbe", + "bcfl": "sdh", + "chgm": "spl2", + "srfm": "smol", + "charge0": "", + "charge1": "", + "charge2": "", + "conc0": "", + "conc1": "", + "conc2": "", + "radius0": "", + "radius1": "", + "radius2": "", + "pdie": 2, + "sdie": 78.54, + "sdens": 10, + "srad": 1.4, + "swin": 0.3, + "temp": 298.15, + "dimenx": 129, + "dimeny": 97, + "dimenz": 97, + "fglenx": 57.123999999999995, + "fgleny": 45.73, + "fglenz": 56.153, + "cglenx": 63.11079999999999, + "cgleny": 45.73, + "cglenz": 61.4601, + "fgcentid": 1, + "cgcentid": 1, + "ofrac": 0.1, + "glenx": 63.11079999999999, + "gleny": 45.73, + "glenz": 61.4601, + "pdimex": 1, + "pdimey": 1, + "pdimez": 1, + "gcent": "" + }, + "metadata": {} + } + }, + { + "name": "pdb2pqr-v1-basic", + "type": "pdb2pqr", + "upload": { + "input": [], + "output": [] + }, + "trigger": { + "Records": [ + { + "s3": { + "bucket": { + "name": "pytest_input_bucket" + }, + "object": { + "key": "2021-05-16/sampleId/pdb2pqr-sample-job.json" + } + } + } + ] + }, + "job": { + "form": { + "invoke_method": "v1", + "PDBFILE": "", + "USERFFFILE": "", + "NAMESFILE": "", + "LIGANDFILE": "", + "PDBID": "1fas", + "PDBSOURCE": "ID", + "PH": 7, + "PKACALCMETHOD": "propka", + "FF": "parse", + "FFOUT": "internal", + "OPTIONS": [ + "atomsnotclose", + "optimizeHnetwork", + "makeapbsin", + "removewater" + ], + "DEBUMP": "atomsnotclose", + "OPT": "optimizeHnetwork", + "INPUT": "makeapbsin", + "DROPWATER": "removewater" + }, + "metadata": { + "cli": { + "command": "python pdb2pqr.py --ph-calc-method=propka --with-ph=7 --ff=parse --apbs-input --drop-water 1fas.pdb 1fas.pqr" + } + } + } + } +] diff --git a/lambda_services/tests/test_api_service.py b/lambda_services/tests/test_api_service.py index 5de1246..00e8513 100644 --- a/lambda_services/tests/test_api_service.py +++ b/lambda_services/tests/test_api_service.py @@ -1,8 +1,10 @@ """Tests for the generating unique IDs and S3 tokens.""" from copy import copy from lambda_services.api_service.api_service import generate_id_and_tokens +from moto import mock_s3 +@mock_s3 def test_generate_id_and_tokens(): """Test token request with no existing Job ID.""" test_api_gateway_event_without_jobid = { @@ -15,6 +17,7 @@ def test_generate_id_and_tokens(): assert "job_id" in response, "Service did not generate new Job ID" assert "urls" in response, "Service did not generate the presigned URLs" + assert "date" in response, "Service did not generate date for Job ID" assert len(response["urls"]) == len( test_api_gateway_event_without_jobid["file_list"] ), ( diff --git a/lambda_services/tests/test_job_service.py b/lambda_services/tests/test_job_service.py index b3ff54a..902d913 100644 --- a/lambda_services/tests/test_job_service.py +++ b/lambda_services/tests/test_job_service.py @@ -1,5 +1,130 @@ """Tests for interpreting and handling job configuration submissions.""" -from lambda_services.job_service.job_service import build_status_dict +# NOTE: importing entire job_service us to modify module's global variables +from lambda_services.job_service import job_service +from typing import Union +from time import time +from datetime import date +from json import dumps, load, loads +from moto import mock_s3, mock_sqs +from boto3 import client +import pytest + + +@pytest.fixture +def initialize_input_bucket(): + """Create an input bucket to perform test. Returns name of bucket""" + bucket_name = "pytest_input_bucket" + with mock_s3(): + s3_client = client("s3") + s3_client.create_bucket( + Bucket=bucket_name, + CreateBucketConfiguration={ + "LocationConstraint": "us-west-2", + }, + ) + yield s3_client, bucket_name + + +@pytest.fixture +def initialize_output_bucket(): + """Create an output bucket to perform test. Returns name of bucket""" + bucket_name = "pytest_output_bucket" + with mock_s3(): + s3_client = client("s3") + s3_client.create_bucket( + Bucket=bucket_name, + CreateBucketConfiguration={ + "LocationConstraint": "us-west-2", + }, + ) + yield s3_client, bucket_name + + +@pytest.fixture +def initialize_input_and_output_bucket(): + """ + Create S3 input/output buckets to perform test. + Returns client and bucket names + """ + input_bucket_name = "pytest_input_bucket" + output_bucket_name = "pytest_output_bucket" + with mock_s3(): + s3_client = client("s3") + s3_client.create_bucket( + Bucket=input_bucket_name, + CreateBucketConfiguration={ + "LocationConstraint": "us-west-2", + }, + ) + s3_client.create_bucket( + Bucket=output_bucket_name, + CreateBucketConfiguration={ + "LocationConstraint": "us-west-2", + }, + ) + yield s3_client, input_bucket_name, output_bucket_name + + +@pytest.fixture +def initialize_job_queue(): + """ + Create an job queue queue to perform test. + Returns client and name of bucket + """ + queue_name = "pytest_sqs_job_queue" + region_name = "us-west-2" + with mock_sqs(): + sqs_client = client("sqs", region_name=region_name) + sqs_client.create_queue(QueueName=queue_name) + yield sqs_client, queue_name, region_name + + +def upload_data(s3_client, bucket_name: str, object_name: str, data): + """ + Use S3 PUT to upload object data. + """ + s3_client.put_object( + Bucket=bucket_name, + Key=object_name, + Body=data, + ) + + +def download_data( + s3_client, bucket_name: str, object_name: str +) -> Union[str, bytes]: + """ + Use S3 GET to download object data. + Returns the data in string or bytes. + """ + s3_resp: dict = s3_client.get_object(Bucket=bucket_name, Key=object_name) + return s3_resp["Body"].read() + + +def test_get_job_info(initialize_input_bucket): + # Retrieve initialized AWS client and bucket name + s3_client, bucket_name = initialize_input_bucket + + # Read sample input JSON file into dict + input_name = "lambda_services/tests/input_data/sample_web-pdb2pqr-job.json" + expected_pdb2pqr_job_info: dict + with open(input_name) as fin: + expected_pdb2pqr_job_info = load(fin) + + # Upload json for job config file + object_name = "pytest/sample_web-pdb2pqr-job.json" + upload_data( + s3_client, bucket_name, object_name, dumps(expected_pdb2pqr_job_info) + ) + + # Download using get_job_info() + job_info: dict = job_service.get_job_info( + "2021-05-21/sampleId", bucket_name, object_name + ) + + # Verify output is dictionary and contents match input + # TODO: Eo300 - check if '==' comparison is sufficient + assert job_info == expected_pdb2pqr_job_info def test_build_status_dict_valid_job(): @@ -12,7 +137,7 @@ def test_build_status_dict_valid_job(): input_files = ["sampleId.in", "1fas.pqr"] output_files = [] job_status = "pending" - status_dict: dict = build_status_dict( + status_dict: dict = job_service.build_status_dict( job_id, job_tag, job_type, @@ -22,7 +147,7 @@ def test_build_status_dict_valid_job(): message=None, ) assert "jobid" in status_dict - assert "jobtag" in status_dict + # assert "jobtag" in status_dict assert "jobtype" in status_dict assert job_type in status_dict assert "status" in status_dict[job_type] @@ -44,7 +169,7 @@ def test_build_status_dict_invalid_job(): output_files = None job_status = "invalid" invalid_message = "Invalid job type" - status_dict: dict = build_status_dict( + status_dict: dict = job_service.build_status_dict( job_id, job_tag, job_type, @@ -60,3 +185,279 @@ def test_build_status_dict_invalid_job(): assert status_dict[job_type]["inputFiles"] is None assert status_dict[job_type]["outputFiles"] is None # assert status_dict[job_type]["subtasks"] == None + + +def test_upload_status_file(initialize_output_bucket): + # Retrieve initialized AWS client and bucket name + s3_client, bucket_name = initialize_output_bucket + + # Retrieve original global variable names from module + original_OUTPUT_BUCKET = job_service.OUTPUT_BUCKET + + # Create sample status dict + job_id = "sampleId" + job_type = "pdb2pqr" + current_date = date.today().isoformat() + sample_status: dict = { + "jobid": job_id, + "jobtype": job_type, + job_type: { + "status": "pending", + "startTime": time(), + "endTime": None, + "subtasks": [], + "inputFiles": [f"{current_date}/{job_id}/1fas.pdb"], + "outputFiles": [], + }, + } + + # Upload dict to S3 as JSON + status_objectname: str = f"{current_date}/{job_id}/{job_type}-status.json" + job_service.OUTPUT_BUCKET = bucket_name + job_service.upload_status_file(status_objectname, sample_status) + + # Download JSON from S3, parse into dict + downloaded_object_data: str = loads( + download_data(s3_client, bucket_name, status_objectname) + ) + + # Compare downloaded dict with expected (sample dict) + assert downloaded_object_data == sample_status + + # Reset module global variables to original state + job_service.OUTPUT_BUCKET = original_OUTPUT_BUCKET + + +def test_interpret_job_submission_invalid( + initialize_input_and_output_bucket, initialize_job_queue +): + # Retrieve initialized AWS client and bucket name + ( + s3_client, + input_bucket_name, + output_bucket_name, + ) = initialize_input_and_output_bucket + sqs_client, queue_name, region_name = initialize_job_queue + + # Retrieve original global variable names from module + original_OUTPUT_BUCKET = job_service.OUTPUT_BUCKET + original_SQS_QUEUE_NAME = job_service.SQS_QUEUE_NAME + original_JOB_QUEUE_REGION = job_service.JOB_QUEUE_REGION + + # Initialize job variables + job_id = "sampleId" + job_type = "invalidJobType" + job_date = "2021-05-16" + + # Upload JSON for invalid jobtype + input_name = "lambda_services/tests/input_data/invalid-job.json" + invalid_job_info: dict + with open(input_name) as fin: + invalid_job_info = load(fin) + job_object_name = f"{job_date}/{job_id}/{job_type}-sample-job.json" + upload_data( + s3_client, input_bucket_name, job_object_name, dumps(invalid_job_info) + ) + + # Setup dict with expected S3 trigger content + s3_event: dict + s3_event_filepath = ( + "lambda_services/tests/input_data/invalid_job-s3_trigger.json" + ) + with open(s3_event_filepath) as fin: + s3_event = load(fin) + + # Set module globals and inTerpret invalid job trigger + job_service.SQS_QUEUE_NAME = queue_name + job_service.OUTPUT_BUCKET = output_bucket_name + job_service.JOB_QUEUE_REGION = region_name + job_service.interpret_job_submission(s3_event, None) + + # Obtain SQS message + queue_url: str = sqs_client.get_queue_url(QueueName=queue_name)["QueueUrl"] + queue_message_response = sqs_client.receive_message( + QueueUrl=queue_url, MaxNumberOfMessages=1 + ) + + """Job type invalid: there should be no messages in queue""" + assert "Messages" not in queue_message_response + + # Get status from output bucket + status_object_name = f"{job_date}/{job_id}/{job_type}-status.json" + status_object_data: dict = loads( + download_data(s3_client, output_bucket_name, status_object_name) + ) + + """Check for expected values if invalid jobtype""" + assert status_object_data["jobid"] == "sampleId" + assert status_object_data["jobtype"] == job_type + assert job_type in status_object_data + assert "message" in status_object_data[job_type] + assert status_object_data[job_type]["status"] == "invalid" + assert status_object_data[job_type]["inputFiles"] is None + assert status_object_data[job_type]["outputFiles"] is None + assert status_object_data[job_type]["startTime"] is None + assert status_object_data[job_type]["endTime"] is None + + # Reset module global variables to original state + job_service.SQS_QUEUE_NAME = original_SQS_QUEUE_NAME + job_service.OUTPUT_BUCKET = original_OUTPUT_BUCKET + job_service.JOB_QUEUE_REGION = original_JOB_QUEUE_REGION + + +def initialize_s3_and_sqs_clients( + input_bucket_name: str, + output_bucket_name: str, + queue_name: str, + region_name: str, +): + + sqs_client = client("sqs", region_name=region_name) + sqs_client.create_queue(QueueName=queue_name) + + s3_client = client("s3") + s3_client.create_bucket( + Bucket=input_bucket_name, + CreateBucketConfiguration={ + "LocationConstraint": region_name, + }, + ) + s3_client.create_bucket( + Bucket=output_bucket_name, + CreateBucketConfiguration={ + "LocationConstraint": region_name, + }, + ) + + return s3_client, sqs_client + + +INPUT_JOB_LIST: list = [] +EXPECTED_OUTPUT_LIST: list = [] +with open( + "lambda_services/tests/input_data/test-job_service-input.json" +) as fin: + INPUT_JOB_LIST = load(fin) +with open( + "lambda_services/tests/expected_data/test-job_service-output.json" +) as fin: + EXPECTED_OUTPUT_LIST = load(fin) + + +@mock_s3 +@mock_sqs +@pytest.mark.parametrize( + "apbs_test_job,expected_output", + list(zip(INPUT_JOB_LIST, EXPECTED_OUTPUT_LIST)), +) +def test_interpret_job_submission_success( + apbs_test_job: dict, expected_output: dict +): + s3_event: dict = apbs_test_job["trigger"] + job_info: dict = apbs_test_job["job"] + expected_sqs_message: dict = expected_output["sqs_message"] + expected_status: dict = expected_output["initial_status"] + + input_bucket_name = "pytest_input_bucket" + output_bucket_name = "pytest_output_bucket" + queue_name = "pytest_sqs_job_queue" + region_name = "us-west-2" + + job_tag: str = expected_sqs_message["job_tag"] + job_type: str = expected_sqs_message["job_type"] + + s3_client, sqs_client = initialize_s3_and_sqs_clients( + input_bucket_name, output_bucket_name, queue_name, region_name + ) + + # Retrieve original global variable names from module + original_OUTPUT_BUCKET = job_service.OUTPUT_BUCKET + original_SQS_QUEUE_NAME = job_service.SQS_QUEUE_NAME + original_JOB_QUEUE_REGION = job_service.JOB_QUEUE_REGION + + # Upload job JSON to input bucket + job_object_name: str = s3_event["Records"][0]["s3"]["object"]["key"] + upload_data( + s3_client, + input_bucket_name, + job_object_name, + dumps(job_info), + ) + + # Upload additional input data to input bucket + if "upload" in apbs_test_job: + for file_name in apbs_test_job["upload"]["input"]: + file_contents: str = open( + f"lambda_services/tests/input_data/{file_name}" + ).read() + upload_data( + s3_client, + input_bucket_name, + f"{job_tag}/{file_name}", + file_contents, + ) + for file_name in apbs_test_job["upload"]["output"]: + file_contents: str = open( + f"lambda_services/tests/input_data/{file_name}" + ).read() + upload_data( + s3_client, + output_bucket_name, + f"{job_tag}/{file_name}", + file_contents, + ) + + # Set module globals and interpret PDB2PQR job trigger + job_service.SQS_QUEUE_NAME = queue_name + job_service.OUTPUT_BUCKET = output_bucket_name + job_service.JOB_QUEUE_REGION = region_name + job_service.interpret_job_submission(s3_event, None) + + # Obtain message from SQS and status from S3 + queue_url: str = sqs_client.get_queue_url(QueueName=queue_name)["QueueUrl"] + queue_message_response = sqs_client.receive_message( + QueueUrl=queue_url, MaxNumberOfMessages=1 + ) + + # TODO: adjust assertion to handle invalid cases + assert "Messages" in queue_message_response + queue_message = queue_message_response["Messages"][0] + message_contents: dict = loads(queue_message["Body"]) + message_receipt_handle = queue_message["ReceiptHandle"] + + """Compare queue contents with expected""" + assert message_contents == expected_sqs_message + + # job_id: str = expected_sqs_message["job_id"] + # job_date: str = expected_sqs_message["job_date"] + status_object_name: str = f"{job_tag}/{job_type}-status.json" + status_object_data: dict = loads( + download_data(s3_client, output_bucket_name, status_object_name) + ) + + """Check that status contains expected values""" + assert status_object_data["jobid"] == expected_status["jobid"] + assert status_object_data["jobtype"] == expected_status["jobtype"] + assert job_type in status_object_data + assert status_object_data[job_type]["status"] == "pending" + assert ( + status_object_data[job_type]["inputFiles"] + == expected_status[job_type]["inputFiles"] + ) + assert ( + status_object_data[job_type]["outputFiles"] + == expected_status[job_type]["outputFiles"] + ) + # Checking type here since startTime is determined at runtime + assert isinstance(status_object_data[job_type]["startTime"], float) + assert status_object_data[job_type]["endTime"] is None + + # Delete message from SQS queue + sqs_client.delete_message( + QueueUrl=queue_url, ReceiptHandle=message_receipt_handle + ) + + # Reset module global variables to original state + job_service.SQS_QUEUE_NAME = original_SQS_QUEUE_NAME + job_service.OUTPUT_BUCKET = original_OUTPUT_BUCKET + job_service.JOB_QUEUE_REGION = original_JOB_QUEUE_REGION diff --git a/requirements-dev.txt b/requirements-dev.txt index 68d7884..86c078a 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,3 +1,9 @@ boto3==1.17.8 pytest==6.2.2 +pytest-cov==2.12.1 urllib3==1.26.3 +moto==2.0.7 +docker==5.0.0 +flake8==3.9.2 +black==21.5b2 +pylint==2.8.3